三、编译出厂内核设备树并且以nfs形式挂载根文件系统

编译出厂内核设备树并且以nfs形式挂载根文件系统

介绍

硬件:正点原子MP157开发板

烧录了出厂系统以后按照正点原子的文档测试一下基本的硬件功能是否正常以后就需要自己动手开发一些小东西,比如说添加其他硬件驱动、更换非正点原子的配件或者测试自己的QT小程序等等操作,而这些就需要修改到我们的代码部分了,常改的包括kernel内核 dts配置 或者QT根文件系统等等。因为正点原子出厂的系统相应的驱动支持还比较全面,所以本章节来编译正点原子提供的出厂uboot kernel代码,原子的出厂源码中给了linux5.4.31 uboot tfa三个部分的源码,但是tfa基本不会有修改,所以这个镜像直接使用出厂提供的镜像就好。然后烧录到开发板观察运行是否正常,同时用nfs来挂载根文件系统,为后续开发开一个头。

编译uboot

原子提供的uboot出厂源码路径为:STM32资料\【正点原子】STM32MP157开发板(A盘)-基础资料\01、程序源码\01、正点原子Linux出厂系统源码。将u-boot-stm32mp-2020.01-g00f14581-v1.4.tar.bz2 拷贝到Ubuntu虚拟机,然后解压文件:
tar -vxf u-boot-stm32mp-2020.01-gdb8d2374-v1.0.tar.bz2
在这里插入图片描述
解压后源码目录下有一个build.sh,直接执行即可编译,build.sh其实主要就是配置编译uboot,详细内容如下:
在这里插入图片描述
uboot编译成功以后在uboot代码目录下得到u-boot.stm32,可以使用这个文件替换出厂镜像刷机包里面的uboot镜像,测试能否正常启动。

编译kernel dtb

原子提供的内核出厂源码路径为:STM32资料\【正点原子】STM32MP157开发板(A盘)-基础资料\01、程序源码\01、正点原子Linux出厂系统源码。将linux-5.4.31-g732ac575a-v1.6.tar.bz2 拷贝到Ubuntu虚拟机,然后解压文件:
tar -vxjf linux-5.4.31-gb8d3ec3ac-v1.1.tar.bz2

在这里插入图片描述
源码路径下也有一个build.sh,直接执行编译以后会报错导致编译中断,看build.sh使用的是Yocto SDK里的GCC 9.3.0交叉编译器,怀疑是交叉编译器版本不匹配,不清楚原子他们是怎么编过的,修改build.sh使用arm的交叉编译工具链,然后make后面都添加ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- ,测试能够正常编译并且在kernel根路径下生成tmp文件夹包含我们所需的镜像,下面是修改后的build.sh
在这里插入图片描述
生成的文件在tmp文件夹下:
在这里插入图片描述

NFS挂载根文件系统

在正点原子的出厂镜像里面放置的有QT5.12.9的根文件系统,路径是:E:\STM32资料\【正点原子】STM32MP157开发板(A盘)-基础资料\08、系统镜像\02、出厂系统镜像\06、Qt5.12.9文件系统 ,把atk-image-qt5.12.9-rootfs.tar.bz2这个文件系统拷贝到Ubuntu的nfs挂载路径下,然后接压:
tar -vxjf qt5.12.9-rootfs.tar.bz2

解压以后需要将上面内核编译出来的模块放到根文件系统的lib/modules路径下,这样开机的时候才会自动加载kenrel module。
cp modules.tar.bz2 ~/work/nfs/rootfs/lib/modules
tar -vxjf modules.tar.bz2
如下图:
在这里插入图片描述
这样uboot 内核 根文件系统都有了,下面先将我们的uboot烧进开发板,将我们编译的u-boot.stm32替换掉出厂镜像里面的u-boot.stm32,重新使用STM32CubeProgrammer来烧录固件。使用我的uboot能够成功启动内核,且串口输出的时间也为我编译的时间,2021.11.2晚上21.53。
在这里插入图片描述
下面就需要配置uboot的相关参数 为tftp 下载内核 dtb然后nfs挂载根文件系统。
主要配置如下:

setenv ipaddr 192.168.31.112
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.31.1
setenv netmask 255.255.255.0
setenv serverip 192.168.31.171
setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.31.171:/home/tangtao/work/nfs/rootfs,proto=tcp rw ip=192.168.31.112:192.168.31.171:192.168.31.1:255.255.255.0::eth0:off'
setenv bootcmd  'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
saveenv

注意上述配置中的ip和路径都需要更改为自己的路径,不能直接复用的路径,不然肯定会启动失败。
如果想重新从emmc启动的话只需要修改bootargs 和bootcmd 的配置即可:

setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw'
setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
saveenv

遗留问题:

1.为什么直接使用原子提供的根文件系统?
方便,有现成的就先用,等开发结束了以后可以使用buildroot来制作我们的根文件系统,而且原子的这个文件系统比较大,太占内存,很多模块我们开发产品过程中根本用不到,先用这个验证,最后再说。
2.我的uImage和dtb文件现在是用tftp下载来调试的,怎么刷到emmc中从开发板启动验证呢?
可以将uImage和dtb打包成ext4文件,原子出厂镜像中的atk-image-bootfs.ext4这个其实就是uImage和dtb打包制作完成的,大致步骤如下:

将stm32mp157d-atk.dtb和uimage放入bootfs文件夹并进入文件夹执行如下指令
dd if=/dev/zero of=my-bootfs.ext4 bs=1M count=10
mkfs.ext4 -L bootfs bootfs.ext4

sudo mount my-bootfs.ext4 /mnt/bootfs/
sudo cp uImage  stm32mp157d-atk.dtb /mnt/bootfs/
sudo umount /mnt/bootfs/

即可得到my-bootfs.ext4,根文件系统同理,打包生成即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值