最近在调试基于树莓派CM4的PCIE WIFI网卡发射AP的功能,由于供应商提供的网卡驱动有内核版本的限制,且在尝试下确实出现了不兼容的情况,不得已对树莓派进行编译替换内核版本的操作。

操作的软硬件环境如下:

树莓派硬件信息:树莓派CM4 4G+32G v1.1

树莓派系统镜像:2023-02-21-raspios-bullseye-arm64_lite.img

linux kernel:5.15.84-v8 -> 5.15.92-v8

⽬标主机,编译主机为同⼀块树莓派CM4,不采⽤交叉编译的⽅式

获取linux内核版本信息

在终端执⾏如下指令获取系统内核版本。

1
uname -r

操作结果如下图,可知树莓派升级前实际使⽤内核版本为5.15.84 。

linux内核源码编译

下载内核源码

树莓派对应的内核源码在https://github.com/raspberrypi/linux 上进⾏管理,需要使用git工具将内核源码下载。

如果使用的是lite版本系统,默认未安装git工具,通过apt-get安装git工具。

1
apt-get install git

执行clone拉去对应版本的内核源码(如下拉取 kernel 5.15的内核源码)

1
git clone --depth=1 --branch rpi-5.15.y https://github.com/raspberrypi/linux

执行结果如图:

如果遇到下载过程中报错,可以尝试通过网页上打包下载的方式下载源码,并拷贝到树莓派进行解压缩。

编译内核源码

生成.config编译配置文件

进入源码目录,并执行如下指令指定编译工具链及相关配置信息。

1
2
cd linux
ARCH=arm64 KERNEL=kernel8 make bcm2711_defconfig

执行成功结果如下;

异常解决:

如果提示“flex:not found”,则需要安装flex。

执行如下指令安装flex。

1
apt-get install flex

如果提示“bison:not found”,则需要安装bison。

执行如下指令安装bison。

1
apt-get install bison

编译dtb

执行如下编译指令编译生成dtb相关文件。

1
make -j4 dtbs

正常执行结果如下:

编译modules

执行如下指令编译内核modules。

1
make -j4 modules

该步骤编译执行时间较长,正常执行结果如下图。

异常解决:

如果在编译过程中报错“fatal error: openssl/bio.h: No such file or directory”及相关openssl内容,考虑系统未安装openssl。

可通过如下指令安装openssl

1
apt-get install opensssl-dev

如果在编译过程中报错“bc: not found“,考虑系统未安装bc工具

可通过如下指令安装bc

1
apt-get install bc

编译Image

1
make -j4 Image

编译完成后终端显示内容如下:

替换内核文件

安装modules

在内核源码根目录下执行如下指令,安装modules到系统

1
sudo make modules_install

安装项目较多,install结束后终端显示内容如下:

替换设备树相关文件

在内核源码根目录下执行如下操作,替换编译⽣成的dtb⾄设备boot文件夹。

1
2
3
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/overlays/

替换内核镜像文件

在内核编译根⽬录执⾏如下操作,备份并且替换内核img⽂件。

1
2
sudo cp /boot/kernel8.img /boot/kernel8_old.img
sudo cp arch/arm64/boot/Image /boot/kernel8.img

执行上述替换指令后对系统进行重启。

1
sudo reboot

确认更新后内核版本

在终端执⾏如下指令获取系统内核版本 。

1
uname -r

操作结果如下图,可知树莓派CM4内核版本已更新为5.15.92,内核更新成功。

本文参考