经验分享:如何为树莓派交叉编译特定版本的支持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
从下面的连接下载源码
将获取到的源码放虚拟机上
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
-
非常棒,谢谢你的无私分享~