隨身wifi的Debian系統固件編譯

編譯隨身wifi的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 },
	{ }
};

第一列為運行頻率,第二列則為供電電壓。

根據前面的規律,大致可以判斷為每提升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下找不到serial目錄及設備的問題

  1. 安裝lsub sudo apt-get install usbutils
  2. 切換usb口到host模式(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

以上命令直接一步生成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包, 包括heades和image 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 在編譯目錄的上一級 ../

  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項目發行的root分區包的基礎上修改完成

下載原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轉化成可以mount的格式

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

重新配置 locale

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

apt源修改

/etc/apt/sources.list.d/mobian.list 已失效,可直接刪除即可

提取後續boot分區需要的文件

文件:/mnt/boot/initrd**.img 提前複製出來即可

結束chroot 結束umount

直接輸入exit退出

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 是 最終處理完成後的 root分區鏡像文件

處理 boot 分區

以下以 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

生成boot

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 是最終生成的 boot分區 鏡像文件

至此 rootfs.img ufi001c-boot.img 均已生成, 替換debian.zip刷機包中的 rootfs.img boot.img 刷機即可

记录并分享
Built with Hugo
Theme Stack designed by Jimmy