Redmi 2#
2015 年初に発売されたスマートフォンで、価格は 699 元、2024 年になってもまだ忘れられていない?
ハードウェアの実力では、Redmi 2 は当時目立った存在ではありませんでした。これは Wentai Technology の ODM 製品で、設計から製造まで Wentai が行い、Qualcomm Snapdragon 410 SoC (MSM8916)、1GB の RAM、8GB のストレージ、4.7 インチの 720P ディスプレイ (312 ppi) を搭載しています。MSM8916 は 28nm プロセスを採用し、CPU は 4 コア 1.2GHz ARM Cortex-A53 で、発売当初から中低価格帯をターゲットにしており、2023 年の Snapdragon フラッグシップと比較すると性能はわずか 1/10 にも満たない貧弱なものでした。スマートフォンとして、Redmi 2 は 2024 年にはすでに実用的価値がなく、闲鱼での価格は 50-100 元の間で取引されています。
ソフトウェアの実力は非常に強力です。Redmi 2 は非常に豊富なサードパーティの Android カスタム ROM があり、出荷時には Android 4.4 が搭載されていましたが、Android 10 の Lineage OS 17.1 (Kernel Version 3.10) にアップグレードすることができます。性能が Android で多くのことを行うには不足している時でも、最新の Linux カーネルや Debian、Ubuntu などの本格的な Linux ディストリビューションを実行することができます。これは、Qualcomm が MSM8916 に基づいて Ubuntu Linux をサポートする DragonBoard 410c 開発ボードを発表したことや、その後のオープンソースコミュニティや組織の努力によるもので、MSM8916 のメインラインカーネル機能はかなり充実しており、UART、USB、ストレージ (eMMC/SD カード)、WiFi/Bluetooth、GPU、ディスプレイ (パネルドライバが必要)、オーディオ、ボタン、バイブレーション、モデム (SMS、音声通話、モバイルデータ) などがサポートされています。
充実した Linux サポートを得た後、Redmi 2 は組み込み Linux 開発プラットフォームとして瞬時に新たな命を吹き込まれました。極めて少ない IO しか必要とせず、豊富なバスインターフェースが不要で、USB や無線通信を利用し、さらには画面インタラクションが必要なシーンにおいて、Raspberry Pi や Orange Pi などの Linux 開発ボードを購入するよりも、スマートフォンで Linux を実行する方がコストパフォーマンスが非常に高くなります。そのため、Redmi 2 は依然として強い生命力を持っており、Bilibili では Redmi 2 を使用した Klipper 3D プリンターのホストの事例が非常に豊富です。同じく MSM8916 SoC を搭載した低価格のポータブル WiFi も Linux をインストールして小型サーバーとして利用されています。
制作プロセス#
デバッグ#
コンソールログがないことはデバッグの悪夢であり、シリアルポートを通じてブートローダーとカーネルの出力を見ることが非常に重要です。そうでなければ、画面が正常に点灯する前にブラックボックスになり、トラブルシューティングの余地がなくなります。しかし、Redmi 2 には完全なピンマップと回路図があり、シリアルポート TP も予備されているため、デバッグは全く問題ありません。
lk2nd#
lk2nd は Qualcomm SoC 向けに開発された Little Kernel ベースの二次ブートローダーで、Linux の起動を簡単に行うことができます。そして、lk2nd 自体は Android の boot.img ファイルに偽装されているため、デバイスの元のブートローダーを変更することなく起動できます。lk2nd は fastboot 互換を提供し、PC で fastboot コマンドを使用して簡単にパーティションの書き込みができます。また、u-boot に似ており、「バックアップ」の役割を果たし、壊れたイメージを書き込んでも完全にブリックになる心配はありません。
プロジェクトのアドレス:msm8916-mainline/lk2nd: Custom bootloader for Qualcomm MSM8916/MSM8226/MSM8974/... devices (github.com)
私たちは直接 Release の 0.15.0 バージョン lk2nd-msm8916.img を使用し、元の fastboot で以下のコマンドを使用して lk2nd をフラッシュします。起動時に画面が点灯した後、音量ダウンボタンを押すことで lk2nd の fastboot に入ることができます。
fastboot flash:raw boot lk2nd-msm8916.img
lk2nd を実行した後、書き込みは以下のコマンドを使用できます。
fastboot flash boot boot.img
fastboot flash userdata rootfs.img
カーネル#
msm8916-mainline/linuxからカーネルを取得し、直接コンパイルします。
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
make msm8916_defconfig
make menuconfig
make -j8
make deb-pkg
コンパイルが完了すると、3 つのファイルが生成されます。
-
arch/arm64/boot/Image.gz 圧縮されたカーネルイメージ
-
arch/arm64/boot/dts/qcom/msm8916-wingtech-wt88047.dtb デバイスツリー dtb、後でカーネルイメージに付加する必要があります
-
../linux-headers-6.7.4-msm8916-dirty_6.7.4-6_arm64.deb と ../linux-image-6.7.4-msm8916-dirty_6.7.4-6_arm64.deb カーネルヘッダーファイルとカーネルの deb パッケージ、後でルートファイルシステムにインストールする必要があります
デバイスツリー dtb をカーネルイメージに付加します。
cat Image.gz msm8916-wingtech-wt88047.dtb > kernel-dtb
Debian rootfs#
まず、debootstrap を使用して Debian のルートファイルシステムを作成します。制作に使用するホストは amd64 アーキテクチャで、ターゲットデバイスは arm64 アーキテクチャのため、debootstrap の —foreign オプションを使用し、arm64 命令セットをシミュレートするために qemu-aarch64-static を準備します。
apt-get install debootstrap qemu-user-static binfmt-support
debootstrap --arch arm64 --foreign bookworm rootfs http://mirrors.tuna.tsinghua.edu.cn/debian
cp -a /usr/bin/qemu-aarch64-static rootfs/usr/bin/qemu-aarch64-static
次に、chroot で先ほど作成したルートファイルシステムに入って、debootstrap の第二段階を完了し、kernel-image と kernel-header をインストールし、自分のルートファイルシステムを自由にカスタマイズします。
mount --bind /dev rootfs/dev
mount --bind /dev/pts rootfs/dev/pts
mount --bind /proc rootfs/proc
chroot rootfs bash
/debootstrap/debootstrap --second-stage
dpkg-reconfigure locales
dpkg -i *.deb #事前にコピーしたlinux-headersとlinux-image
apt update
apt install usbutils network-manager sudo fdisk vim nano openssh-server iputils-ping wget curl iproute2 dialog locales kmod zip unzip u-boot-tools initramfs-tools net-tools htop screenfetch phosh
adduser debian
exit
新しい Linux カーネルパッケージをインストールする際、パッケージマネージャは update-initramfs を呼び出して新しいカーネルに一致する initrd.img ファイルを生成します。initrd には一時的なルートファイルシステムが含まれており、メモリ上でシステムを初期化し、最終的なルートファイルシステムに切り替える役割を担います。/boot ディレクトリにある initrd.img-xxx ファイルを boot.img にコピーする必要があります。
rootfs.img をパッケージ化します。
umount rootfs/dev/pts
umount rootfs/dev
umount rootfs/proc
dd if=/dev/zero of=rootfs.ext4 bs=1M count=4096
mkfs.ext4 rootfs.ext4
mkdir /mnt/rootfs_dd
mount rootfs.ext4 /mnt/rootfs_dd
cp -a rootfs/. /mnt/rootfs_dd/
sync
umount /mnt/rootfs_dd/
img2simg rootfs.ext4 rootfs.img # sparse imageに変換
boot.img をパッケージ化します。カーネルコマンドラインで、UUID を使用して rootfs パーティションを指定する方が安全で、UUID はfile mkfs.ext4
コマンドで確認できます。
mkbootimg --base 0x80000000 \
--kernel_offset 0x00080000 \
--ramdisk_offset 0x02000000 \
--tags_offset 0x01e00000 \
--pagesize 2048 \
--second_offset 0x00f00000 \
--ramdisk initrd.img \
--cmdline "earlycon console=tty0 console=ttyMSM0,115200 root=UUID=b0167571-46ab-432c-9923-46772affcb75 rw loglevel=7"\
--kernel kernel-dtb -o boot.img
Mobian rootfs#
自作の Debian rootfs は起動可能ですが、グラフィカルインターフェースに欠けているものが非常に多いため、他のモデルの Mobian rootfs を修正することにしました。Mobian の公式サイトから現在の最新のイメージをダウンロードし、mobian-qcom-phosh-20240211.rootfs.img を取得し、主に linux-headers と linux-image をインストールします。
simg2img mobian-qcom-phosh-20240211.rootfs.img mobian-rootfs.img
mount mobian-rootfs.img /mnt/rootfs_dd/
sudo mount --bind /proc /mnt/rootfs_dd/proc
sudo mount --bind /dev /mnt/rootfs_dd/dev
sudo mount --bind /dev/pts /mnt/rootfs_dd/dev/pts
sudo mount --bind /sys /mnt/rootfs_dd/sys
cp linux-headers-6.7.4-msm8916-dirty_6.7.4-6_arm64.deb /mnt/rootfs_dd/tmp/
cp linux-image-6.7.4-msm8916-dirty_6.7.4-6_arm64.deb /mnt/rootfs_dd/tmp/
sudo chroot /mnt/rootfs_dd/
dpkg-reconfigure locales
apt remove qcom-support
dpkg -l | grep -E "linux-headers|linux-image" |awk '{print $2}'|xargs dpkg -P
cd /tmp
dpkg -i *.deb
exit
同様のプロセスで rootfs.img と boot.img をパッケージ化し、書き込むことができます。
起動後、無線が動作せず、画面に GUI が表示されないが端末が表示される問題があることに気づきます。その原因は、プライベートファームウェアが不足しているためで、この部分は他の同モデルの rootfs イメージから直接コピーすることで簡単に解決できます。GPU ファームウェアファイルは a300_pm4.fw と a300_pfp.fw で、無線部分には一連の.mbn ファイルと.bxx ファイルがあります。起動後、ネットワークと GUI も正常に動作するようになります。
真のメインライン#
msm8916-mainline/linuxのこのカーネルはメインラインに非常に近いですが、まだ真のメインラインカーネルtorvalds/linuxではなく、多くの未合併の修正があり、バージョンもやや遅れています。それでは、torvalds/linuxは動作するのでしょうか?問題があれば、自分で解決できるのでしょうか?
git ミラーを取得し、いくつかの必要なパッケージをインストールします。
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux-stable.git
git checkout v6.8.0
apt update
apt install -y gcc make gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu libncurses5-dev build-essential pkg-config libc6-dev bison flex libelf-dev lz4 qemu-user-static bc libssl-dev debhelper
メインラインのカーネルには wt88047 のデバイスツリーがあり、まずmsm8916-mainline/linuxプロジェクトの msm8916_defconfig に基づいてカーネルを構成し、カーネルをコンパイルして起動を試みます。シリアルポートからターミナルに入ることができましたが、画面は正常に表示されませんでした。msm8916-mainline/linuxと同バージョンのtorvalds/linuxとの比較を通じて、デバイスツリー dts ファイルの追加と修正が多数行われていることがわかりました。また、主に以下の内容が含まれています:
-
ディスプレイパネルドライバの drm/panel の追加と修正
-
drm と dsi の部分に関する有効化・無効化ロジックの調整
-
タッチスクリーン、pmic などの周辺機器のドライバ追加
-
Qualcomm SoC 周辺機器のドライバと設定調整、qdsp6、memshare、cpuidle などを含む
パネルドライバと表示部分のロジックを重点的に追加し、カーネルをコンパイルすると、このカーネルで起動した後、phosh インターフェースが正常に表示されるようになりました。
まとめ#
先人たちの努力により、Redmi 2 で比較的新しい Linux システムを実行することが非常に簡単になり、メインラインに非常に近く、すべてのドライバ、デバイスツリー、config が準備されており、コンパイルするだけで済みます。エラーすら出ないこともあります。
スマートフォン SoC の急速な進化には驚かされます。スマートフォンチップの性能は、組み込み Linux 開発で一般的に使用されるチップを遥かに凌駕しています。RK3399 が何年もかかってようやく RK3588 が登場し、最新の Raspberry Pi でさえ性能がいまいちで、急速に進化するスマートフォンチップと比較すると、まるで別の世界にいるかのようです。オープンソースの力も感銘を受けます。スマートフォンメーカーはスマートフォンシステムの更新に対するエネルギーが限られており、古いモデルは新しいモデルの更新に対して消極的であることがほぼ必然です。サポート期間が終了した後は、最適化を行わず、計画的に廃棄されることが良い方針です。これは商業的には問題ありませんが、これによりスマートフォンは性能がそれほど劣っていなくても、早期に寿命を迎えることが難しくなります。しかし、オープンソースとコミュニティの力は、スマートフォンがより大きな価値を発揮する道を提供しているようです。Redmi 2 や OnePlus 6T など、今でも活躍している古いモデルは、スマートフォンのライフサイクルを延ばすだけでなく、さらに広い応用シーンを開拓しています。これは一種のより高度な「環境保護」ではないでしょうか。良い兆候として、以前はチップメーカーが資料を隠していたことが多かったですが、最近ではいくつかの企業がオープンソースに関して動き始めているようです。Snapdragon 845、865 などのプロセッサには、より良いメインラインカーネルのサポートがあり、FOSDEM 2024 では Linaro が Qualcomm の新しいフラッグシップチップのメインラインサポートをますます迅速に行っていることが言及されており、オープンな美しい未来が目の前にあるようです。
参考資料#
Qualcomm Snapdragon 410/412 (MSM8916) - postmarketOS
DragonBoard 410c - Qualcomm Developer Network
自分で DIY する pinephone——debian と主線 linux の Redmi 2(msm8916)への移植_Redmi 2 arm linux-CSDN ブログ
自分で DIY する pinephone——debian と主線 linux の Redmi 2(msm8916)への移植 (二)-CSDN ブログ
debootstrap を使用して arm64 ルートファイルシステムを作成 - 掘金 (juejin.cn)
debootstrap を使用してルートファイルシステムを作成_debootstrap 組み込み - CSDN ブログ
ポータブル WiFi の Debian システムファームウェアのコンパイル (knightli.com)
カーネルのコンパイル(debian)・OpenStick プロジェクト・看云 (kancloud.cn)
最も安価な Snapdragon625 Linux スマートフォンを作成する ——Redmi 4 の主線 Linux Mobian Kali Ubuntu への移植_哔哩哔哩_bilibili
ITOP4412----debootstrap を使用してファイルシステムを構築しようとする。 - コード先駆者ネット (codeleading.com)
Project-DragonPi/mobian-wt88047: Mobian の非公式リリース。Project DragonPi からの多くのものを含む。 (github.com)
古い携帯電話の逆向きエンジニアリングと主線 linux 移植の記録 (一)—— 情報収集と Bootloader 移植_msm8909 lk2nd-CSDN ブログ