如何为RPi交叉编译特定版本的支持v4l2的.ko以及.dtb


0 背景

我在以前一个版本的64bit树莓派系统上,搭建了很多环境,现在,这个64bit的树莓派系统需要接入IMX385,目前只有v4l2这种方案(64bit的树莓派系统删除了一些库,树莓派原生相机也就不支持)。

但悲催的是,目前veye在Github提供的源码,只支持内核版本为5.10.92-v8+的树莓派,也就是只支持比较新版本的树莓派进行,然而我的树莓派系统内核版本为5.10.63-v8+,veye官方的源码也就不支持。

解决方法一:更换内核版本为5.10.92-v8+的树莓派系统,但有点不太现实,我搭建了很多环境,特别是很多深度学习的推理环境,这样再折腾明显不现实。

解决方法二:交叉编译一个支持5.10.63-v8+的.ko以及.dtb,这个工作量会少很多,接下来就开始。

1 准备工作

开发环境准备,在虚拟机Ubuntu18.04中操作

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
sudo apt install crossbuild-essential-arm64

确认自己的树莓派上的piOS版本,以下动作在树莓派上面完成

uname -r

cd /home/pi/ko_dev

cp /usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz ./

vi changelog.Debian

从下面的连接下载源码

Github源码链接

将获取到的源码放虚拟机上

2 给源代码打补丁

以下动作在虚拟机中进行,打补丁

进入到第一个需要打补丁的地方

cd /home/book/RPi/linux-oldstable_20211201
cd ./drivers/media/i2c/

先删掉要被替换的文件

rm -rf ./Kconfig
rm -rf ./Makefile

将以下文件copy到虚拟机中

继续拷贝文件

进入到第二个需要打补丁的地方

cd /home/book/RPi/linux-oldstable_20211201
cd ./arch/arm/boot/dts/overlays

删除需要被替换的文件

rm -rf ./Makefile

拷贝文件

其中要去替换的Makefile中是多了以下内容

csimx307-dual-cm4.dtbo\
csimx307.dtbo\
cssc132-dual-cm4.dtbo\
cssc132.dtbo\
veye327-dual-cm4.dtbo\
veye327.dtbo\
veyecam2m-dual-cm4.dtbo\
veyecam2m.dtbo

3 开始编译源码

首先是编译准备

cd /home/book/RPi/linux-oldstable_20211201
KERNEL=kernel8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfi

然后是增加编译选项

5.10版本kernel的路径是Device Drivers –> Multimedia Support –> Media ancillary drivers –> Camera sensor devices

cd /home/book/RPi/linux-oldstable_20211201
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

接着是开始编译内核,模块,设备树

cd /home/book/RPi/linux-oldstable_20211201
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j4

4 将编译结果导出

导出模块文件

cd /home/book/RPi/linux-oldstable_20211201
cd ./drivers/media/i2c/

以下为需要导出的文件

导出设备树二进制文件

cd /home/book/RPi/linux-oldstable_20211201
cd ./arch/arm/boot/dts/overlays

以下为需要导出的二进制文件

最终导出的驱动模块文件,设备树二进制文件,放在PC的下列文件夹中

需要将最终导出的文件放到树莓派的Veye V4L2源码的路径下

cd /home/pi/Veye_Camera_V4L2/raspberrypi_v4l2-main/release/driver_bin/5.10.63-v8+

然后通过脚本在树莓派上安装驱动模块以及设备树二进制文件

cd /home/pi/Veye_Camera_V4L2/raspberrypi_v4l2-main/release
sudo ./install_driver.sh veyecam2m
dmesg

此时,重新开机还不能用,只有内核,以及驱动模块,还有设备树二进制文件都替换掉了,才有用,也就是下一步

5 将编译结果导出到TF卡

首先查看tf卡是否正常插入

lsblk 

然后,建立挂载目录

cd /home/book/RPi
mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4

挂载文件

cd /home/book/RPi
sudo mount /dev/sdb1 ./mnt/fat32
sudo mount /dev/sdb2 ./mnt/ext4

安装驱动模块到TF卡


cd /home/book/RPi/linux-oldstable_20211201

sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=../mnt/ext4 modules_install

备份原版kernel


cd /home/book/RPi/mnt/fat32

cp ./kernel8.img ./kernel8_bak.img

安装kernel,以及设备树二进制文件到TF卡


cd /home/book/RPi/linux-oldstable_20211201

sudo cp arch/arm64/boot/Image ../mnt/fat32/kernel8.img -f

sudo cp arch/arm64/boot/dts/broadcom/*.dtb ../mnt/fat32/ -f

sudo cp arch/arm64/boot/dts/overlays/*.dtb* ../mnt/fat32/overlays/ -f

sudo cp arch/arm64/boot/dts/overlays/README ../mnt/fat32/overlays/ -f

卸载挂载的TF卡


cd /home/book/RPi/linux-oldstable_20211201

sudo umount ../mnt/fat32

sudo umount ../mnt/ext4

6 虚拟机,主机弹出TF卡,插入到树莓派

到这一步,即完成IMX385的V4L2的移植了

dmesg


Author: Ruimin Huang
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Ruimin Huang !
  TOC