随身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
主题 StackJimmy 设计