ポータブル Wi-Fi 用の Debian システム ファームウェアのコンパイル

ポータブル Wi-Fi 用の Debian システム ファームウェアをコンパイルする

システムの準備

  1. Ubuntu 22.04.2 LTSをインストールする
  2. パッケージをインストールする
1
sudo apt install binfmt-support qemu-user-static gcc-10-aarch64-linux-gnu kernel-package fakeroot simg2img img2simg mkbootimg bison flex gcc-aarch64-linux-gnu pkg-config libncurses-dev libssl-dev unzip git

ダウンロードコード

リポジトリコードのクローンを作成する

1
git clone https://github.com/OpenStick/linux.git --depth=1

カーネルのコンパイル

コアのオーバークロック

ファイル linux/drivers/clk/qcom/a53-pll.c を変更します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
static const struct pll_freq_tbl a53pll_freq[] = {
	{  998400000, 52, 0x0, 0x1, 0 },
	{ 1094400000, 57, 0x0, 0x1, 0 },
	{ 1152000000, 62, 0x0, 0x1, 0 },
	{ 1209600000, 63, 0x0, 0x1, 0 },
	{ 1248000000, 65, 0x0, 0x1, 0 },
	{ 1363200000, 71, 0x0, 0x1, 0 },
	{ 1401600000, 73, 0x0, 0x1, 0 },
	{ 1621600000, 84, 0x0, 0x1, 0 },
	{ 1841600000, 96, 0x0, 0x1, 0 },
	{ 1951600000, 103, 0x0, 0x1, 0 },
	{ }
};

最初の列は動作周波数、2 番目の列は電源電圧です。

これまでのルールによれば、200Mhz増加ごとに電圧値が10ずつ増加すると大まかに判断できます。ただし、チップの設計周波数を超えているため、消費電力と発熱を同時に考慮する必要があるため、後から増やす場合は電圧値を若干上げる必要があります。 1401600000以降のデータは上記のルールに従って追加されます。

ファイル linux/arch/arm64/boot/dts/qcom/msm8916.dtsi を変更します。デフォルトの周波数は 220 行目あたりに表示されます。その後、周波数を上げます。増加した周波数を前のファイルに追加する必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
        opp-1363200000 {
			opp-hz = /bits/ 64 <1363200000>;
		};
		opp-1401600000 {
			opp-hz = /bits/ 64 <1401600000>;
		};
		opp-1621600000 {
			opp-hz = /bits/ 64 <1621600000>;
		};
		opp-1841600000 {
			opp-hz = /bits/ 64 <1841600000>;
		};
		opp-1951600000 {
			opp-hz = /bits/ 64 <1951600000>;
		};

コンパイル設定

1
2
3
4
5
cd linux
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
make msm8916_defconfig 
make menuconfig

make msm8916_defconfig はプリセットのコンパイルパラメータをインポートします make menuconfig 構成オプション

Klipper USBシリアルポートドライバーを追加

USB デバイスは見つかるが、/dev でシリアル ディレクトリとデバイスが見つからない問題に適用されます。

  1. lsubをインストールする sudo apt-get install usbutils
  2. USB ポートをホスト モードに切り替えます (root として実行) echo host > /sys/kernel/debug/usb/ci_hdrc.0/role
  3. USB デバイスを表示する lsusb コマンドを実行すると、対応する USB デバイスが表示されるはずです。対応する USB デバイスがない場合は、通信の問題、ファームウェアの問題、またはボード自体の異常が考えられます。
  4. 上記の問題をすべて解決したら、シリアル ポート ドライバーを追加します。
1
2
3
4
5
Device Drivers  --->  [*] USB support  --->  <*>   USB Modem (CDC ACM) support 
Device Drivers  --->  [*] USB support  --->  <*>   USB Serial Converter support  --->   [*]   USB Serial Console device support  
Device Drivers  --->  [*] USB support  --->  <*>   USB Serial Converter support  --->   [*]   USB Generic Serial Driver
Device Drivers  --->  [*] USB support  --->  <*>   USB Serial Converter support  --->   <*>   USB Serial Simple Driver   
其他根据设备种类选择                                                                                             

コンパイルを開始する

1
make -j`nproc` bindeb-pkg

上記のコマンドは、1 ステップで deb ファイル パッケージを直接生成します。 ls ../ と入力して表示します。

Ubuntu 22.04では、make-kpkgに対応するソフトウェアパッケージをアップデートできません。公式声明では、あまりにも長い間維持されていなかったため、削除されたとのことです。したがって、次のコマンドは実行できません。一部の以前のバージョンでは可能な場合があります。

1
2
make -j-j`nproc`
fakeroot make-kpkg  --initrd --cross-compile aarch64-linux-gnu- --arch arm64  kernel_image kernel_headers

コンパイルが完了すると、ファイルの 3 つの部分が生成されます

  1. ヘッダーとイメージを含むカーネル deb パッケージ linux-headers-5.15.0-handsomekernel+_5.15.0-handsomekernel+-7_arm64.deb および linux-image-5.15.0-handsomekernel+_5.15.0-handsomekernel+-7_arm64.deb は、コンパイル ディレクトリ ../ の 1 レベル上にあります。

  2. Image.gz linux/arch/arm64/boot/Image.gz

  3. デバイスツリーdtb linux/arch/arm64/boot/dts/qcom/msm8916-handsome-openstick-xxxxxxxx、デバイスに応じて選択してください

1
2
3
4
-rw-rw-r-- 1 knightli knightli 49312  8月  5 18:32 linux/arch/arm64/boot/dts/qcom/msm8916-handsome-openstick-sp970.dtb
-rw-rw-r-- 1 knightli knightli 49480  8月  5 18:32 linux/arch/arm64/boot/dts/qcom/msm8916-handsome-openstick-ufi001b.dtb
-rw-rw-r-- 1 knightli knightli 49652  8月  5 18:32 linux/arch/arm64/boot/dts/qcom/msm8916-handsome-openstick-ufi001c.dtb
-rw-rw-r-- 1 knightli knightli 49312  8月  5 18:32 linux/arch/arm64/boot/dts/qcom/msm8916-handsome-openstick-uz801.dtb

rootfs、ルートパーティションの処理中

変更は、元の openstick プロジェクトによってリリースされたルート パーティション パッケージに基づいて完了します。

オリジナルの openstick debian 基本パッケージをダウンロードする

1
2
3
4
mkdir ~/rootfs
cd ~/rootfs
wget https://github.com/OpenStick/OpenStick/releases/download/v1/debian.zip && unzip debian.zip
mv ./debian/rootfs.img ~/rootfs

debian.zip パッケージでは、rootfs.img はルート パーティションの img ファイルです。

simg2imgを使用してマウント可能な形式に変換します

1
simg2img rootfs.img root.img

chroot は rootfs を処理します

mount root.img

1
2
3
4
5
sudo mount root.img /mnt
sudo mount --bind /proc /mnt/proc 
sudo mount --bind /dev /mnt/dev
sudo mount --bind /dev/pts /mnt/dev/pts
sudo mount --bind /sys /mnt/sys

最新のコンパイル済みカーネルをインストールする

1
2
sudo cp xxx/linux-headers-5.15.0-handsomekernel+_5.15.0-handsomekernel+-7_arm64.deb /mnt
sudo cp xxx/linux-image-5.15.0-handsomekernel+_5.15.0-handsomekernel+-7_arm64.deb /mnt

chroot を使用してマウントされたシステムに入り、システム内の元の linux-image パッケージを削除し、生成されたばかりの deb ソフトウェア パッケージをインストールします。インストール後はdebファイルを削除してください。

1
2
3
4
sudo chroot /mnt
dpkg -l | grep -E "linux-headers|linux-image" |awk '{print $2}'|xargs dpkg -P
dpkg -i *.deb
rm linux-*.deb 

rc.localブートスクリプトを作成する

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
cat>>/etc/systemd/system/rc-local.service<<EOF
[Unit]
Description=/etc/rc.local
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target
EOF

cat <<EOF >/etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#

exit 0
EOF

systemctl daemon-reload && systemctl enable rc-local

ロケールを再構成する

OpenStickで使用されているdebianは効率化されているため、エラーメッセージが表示される場合があります。 warning: setlocale: LC_ALL: cannot change locale (en_US)

次の方法でこの問題を解決できます

1
2
$ sudo apt install locales
$ sudo dpkg-reconfigure locales

en_US.UTF-8 を選択できます

適切なソース修正

/etc/apt/sources.list.d/mobian.list は無効なので、直接削除できます

後続のブート パーティションに必要なファイルを抽出します

ファイル:/mnt/boot/initrd**.img 事前にコピーしておいてください

chroot の終了 umount の終了

出口から出口へ直接入力

1
2
3
4
5
sudo umount /mnt/proc 
sudo umount /mnt/dev/pts
sudo umount /mnt/dev
sudo umount /mnt/sys
sudo umount /mnt

simg2img を使用して逆変換します

フラッシュ用に boot.img を rootfs.img 形式に変換します

1
img2simg root.img rootfs.img

rootfs.img は、最終処理後のルート パーティション イメージ ファイルです。

ブートパーティションのハンドル

以下では ufi001c デバイスを例として取り上げますが、他のデバイスも類推できます。

必要書類一覧

  1. コンパイル中に生成される Image.gz (linux/arch/arm64/boot/Image.gz)
  2. コンパイルプロセス中に生成されるデバイスツリー dtb (linux/arch/arm64/boot/dts/qcom/msm8916-handsome-openstick-ufi001c.dtb) は、デバイスに応じて選択されます。
  3. rootfs の変更後に生成される /boot/initrd**.img

ブートの生成

1
2
3
cat Image.gz msm8916-handsome-openstick-ufi001c.dtb > ufi001c-kernel-dtb
mv initrd.img-* initrd.img
mkbootimg --base 0x80000000 --kernel_offset 0x00080000 --ramdisk_offset 0x02000000 --tags_offset 0x01e00000 --pagesize 2048 --second_offset 0x00f00000 --ramdisk initrd.img --cmdline "earlycon root=PARTUUID=a7ab80e8-e9d1-e8cd-f157-93f69b1d141e console=ttyMSM0,115200 no_framebuffer=true rw" --kernel ufi001c-kernel-dtb -o ufi001c-boot.img

ufi001c-boot.img は、最終的に生成されたブート パーティション イメージ ファイルです。

この時点で、rootfs.img ufi001c-boot.img が生成されています。 debian.zip フラッシュ パッケージ内の rootfs.img boot.img を置き換えてフラッシュするだけです。

记录并分享
Hugo で構築されています。
テーマ StackJimmy によって設計されています。