buildroot制作树莓派CM3的系统

之前我写过一篇文章讲如何通过buildroot制作树莓派CM3的系统镜像文件,整个的编译过程按照之前的文章进行可以顺利的得到一个镜像文件(sdcard.img)。但是这个文件烧录到sd卡后可以在树莓派3+的板子上正常启动但是换到实际的树莓派CM3的板子上时却无法启动。
我查阅了网上的许多资料,但是真正涉及到CM3的内容很少。我甚至只能搜索到自己的文章,经过很长时间的研究我终于成功的编译并运行。下面把解决过程记录如下:

1.为什么树莓派3+和CM3的CPU是相同的编译的系统在前者可以启动却在后者无法启动?

这个疑问从最初遇到这个问题时就在我的大脑中萦绕着,我知道只要找到这个问题的答案问题或许就可以解决了。于是我将自己编译的系统烧录到SD卡另外将官网的系统烧录到另一张SD卡中,在windows系统中对比两者的不同。
明显的不同就是官方系统中有bcm2710-rpi-cm3.dtb文件我们自己制作的系统中没有这个文件。
经过查阅资料我了解到,*.dtb文件在Linux系统启动过程中的作用就是定义了板级的设备树,说的明白点就是这个文件就是告诉CPU我当前要启动的系统都包含那些外设,有几个I2C,UART等。虽然CPU相同,但是树莓派3+和CM3的外设不同。所以在系统启动过程中uboot加载的设备树文件不同。于是在启动我们自己制作的系统时uboot无法找到bcm2710-rpi-cm3.dtb这个文件。
那我把官方系统的bcm2710-rpi-cm3.dtb文件拷贝到自己编译的系统中可以吗?
答案是不可以,如果可以就没有下面的内容了,我尝试了事实证明不可以。原因是,设备树在overload文件夹中有一系列的文件支持。事实上我们缺少的不仅仅是bcm2710-rpi-cm3.dtb一个文件,而是相关联的一系列的文件来定义CM3的外部设备。
那如何解决这个问题呢?难道buildroot就不能制作CM3的系统吗?

2.寻找出路

我们在编译系统时执行的第一个命令
make raspberrypi3_64_defconfig
我猜测相关的配置可能在raspberrypi3_64_defconfig这个配置文件有所体现。于是我查看了这个文件。

BR2_aarch64=y
BR2_cortex_a53=y
BR2_ARM_FPU_VFPV4=y

BR2_TOOLCHAIN_BUILDROOT_CXX=y

BR2_SYSTEM_DHCP="eth0"

# Linux headers same as kernel, a 5.4 series
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_5_4=y

BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,raspberrypi,linux,9a1dd17906692f1ab76e45b9f59976b063b37034)/linux-9a1dd17906692f1ab76e45b9f59976b063b37034.tar.gz"
BR2_LINUX_KERNEL_DEFCONFIG="bcmrpi3"

# Build the DTB from the kernel sources
BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_INTREE_DTS_NAME="broadcom/bcm2710-rpi-3-b broadcom/bcm2710-rpi-3-b-plus broadcom/bcm2837-rpi-3-b"

BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y

BR2_PACKAGE_RPI_FIRMWARE=y

# Required tools to create the SD image
BR2_PACKAGE_HOST_DOSFSTOOLS=y
BR2_PACKAGE_HOST_GENIMAGE=y
BR2_PACKAGE_HOST_MTOOLS=y

# Filesystem / image
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_ROOTFS_EXT2_SIZE="120M"
# BR2_TARGET_ROOTFS_TAR is not set
BR2_ROOTFS_POST_BUILD_SCRIPT="board/raspberrypi3-64/post-build.sh"
BR2_ROOTFS_POST_IMAGE_SCRIPT="board/raspberrypi3-64/post-image.sh"
BR2_ROOTFS_POST_SCRIPT_ARGS="--aarch64 --add-miniuart-bt-overlay"

于是我就发现在这个文件中确实有相关的定义,于是我在我拷贝到buildroot根目录下的此文件中添加了broadcom/bcm2837-rpi-cm3.重新配置编译。但是还是没有成功,发现编译出的文件中还是没有bcm2710-rpi-cm3.dtb这个文件。

3.一度放弃使用buildroot

我一度放弃了使用buildroot,我转而尝试重新编译树莓派内核然后给官方系统升级内核的方式来达到内核模块的裁剪的效果。如果读者想了解这方面的内容可以查看官网的相关教程:https://www.raspberrypi.org/documentation/linux/kernel/building.md
我在尝试上面的教程是发现了下面的步骤:

sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image mnt/fat32/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4

于是我了解到,系统编译完成后再内核源码的arch/arm64/dts/broadcom/的下面就以及生成了所有的dtb,只是在制作镜像的过程中选择包含哪些设备树。受到这个启发,我意识到在第二步中自己的操作是没有问题的,只是在操作过程中一定存在某些问题导致了最后的失败。

4.意外的发现

我在尝试重新配置buildroot时,执行make menuconfig后
在kernel下发现了raspberrypi3_64_defconfig配置文件的路径时在buildroot根目录下的configs目录下的raspberrypi3_64_defconfig文件。也就是说我们执行make raspberrypi3_64_defconfig这个命令时起作用的配置文件在configs目录下,我之前改根目录下的raspberrypi3_64_defconfig文件并没有起作用。重新尝试终于成功了!!

5.总结buildroot制作树莓派CM3的步骤

1.更改configs目录下的raspberrypi3_64_defconfig文件更改后的文件如下面的内容:

BR2_aarch64=y
BR2_cortex_a53=y
BR2_ARM_FPU_VFPV4=y

BR2_TOOLCHAIN_BUILDROOT_CXX=y

BR2_SYSTEM_DHCP="eth0"

# Linux headers same as kernel, a 5.4 series
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_5_4=y

BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,raspberrypi,linux,9a1dd17906692f1ab76e45b9f59976b063b37034)/linux-9a1dd17906692f1ab76e45b9f59976b063b37034.tar.gz"
BR2_LINUX_KERNEL_DEFCONFIG="bcmrpi3"

# Build the DTB from the kernel sources
BR2_LINUX_KERNEL_DTS_SUPPORT=y
#在这个参数的后面添加broadcom/bcm2837-rpi-cm3
BR2_LINUX_KERNEL_INTREE_DTS_NAME="broadcom/bcm2710-rpi-3-b broadcom/bcm2710-rpi-3-b-plus broadcom/bcm2837-rpi-3-b broadcom/bcm2837-rpi-cm3"

BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y

BR2_PACKAGE_RPI_FIRMWARE=y

# Required tools to create the SD image
BR2_PACKAGE_HOST_DOSFSTOOLS=y
BR2_PACKAGE_HOST_GENIMAGE=y
BR2_PACKAGE_HOST_MTOOLS=y

# Filesystem / image
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_ROOTFS_EXT2_SIZE="120M"
# BR2_TARGET_ROOTFS_TAR is not set
BR2_ROOTFS_POST_BUILD_SCRIPT="board/raspberrypi3-64/post-build.sh"
BR2_ROOTFS_POST_IMAGE_SCRIPT="board/raspberrypi3-64/post-image.sh"
BR2_ROOTFS_POST_SCRIPT_ARGS="--aarch64 --add-miniuart-bt-overlay"

2.在buildroot根目录下执行make raspberrypi3_64_defconfig.
3.执行make menuconfig按照我之前的博客进行操作即可
https://blog.youkuaiyun.com/BLUCEJIE/article/details/104653770

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南波儿万

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值