第15章 内核移植
内核初编译
编译原子出厂内核
安装库和mkimage工具
sudo apt-get update
sudo apt-get install lzop
sudo apt-get install libssl-dev
sudo apt-get install u-boot-tools
编译内核
新建alientek_linux,将网盘的出厂内核源码拷贝至此
mkdir ~/linux/atk-mp1/alientek_linux -p
网盘路径:开发板光盘A-基础资料\1、程序源码\1、正点原子Linux出厂系统源码\linux-5.4.31-g8a0e32567-v1.2.tar.bz2
解压得到内核源码目录
tar vxf linux-5.4.31-g8a0e32567-v1.2.tar.bz2
新建stm32mp157d_atk.sh脚本,内容如下
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- stm32mp1_atk_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- uImage dtbs LOADADDR=0XC2000040 -j16
赋予权限后执行脚本进行编译,编译期间弹出图形配置界面,按两下ESC键退出并继续编译
chmod 777 stm32mp157d_atk.sh
./ stm32mp157d_atk.sh
编译得到 arch/arm/boot/uImage 和 arch/arm/boot/dts/stm32mp157d-atk.dtb
如果想单独编译内核或者设备树,或者打开图形配置界面,可以执行以下指令
make uImage LOADADDR=0XC2000040 //编译内核
make dtbs //编译设备树
make menuconfig //打开图形配置界面
测试
将编译得到的内核和设备树使用TFTP来挂载到板子上启动,在虚拟机执行拷贝指令
cp arch/arm/boot/uImage ~/linux/tftp/
cp arch/arm/boot/dts/stm32mp157d-atk.dtb ~/linux/tftp/
在开发板uboot命令行设置环境变量bootcmd来引导启动
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
saveenv
boot
最终运行到下面这里,因为还没有做文件系统

编译ST官方内核
ST官方内核源码打补丁
获取ST官方内核源码
之前已经得到了ST官方的SDK工具包,里面有内核源码工具包,直接进入。
cd ~/linux/atk-mp1/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0

解压ST官方内核源码包 linux-5.4.31.tar.xz,得到 linux-5.4.31 内核源码文件夹
tar -vxf linux-5.4.31.tar.xz
内核打补丁
进入 linux-5.4.31 内核文件夹,打补丁
cd linux-5.4.31
for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
生成默认配置文件
make ARCH=arm multi_v7_defconfig "fragment*.config"

生成 .config文件后继续打补丁,将以“fragment”开头的.config 文件(默认配置文件的补丁文件)打进去,生成默认配置文件。执行以下两条指令。
for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
yes '' | make ARCH=arm oldconfig
复制一份.config文件作为默认配置文件
cp .config ./arch/arm/configs/stm32mp1_atk_defconfig
拷贝内核源码来移植
新建my_linux文件夹,将打完补丁的内核源码拷贝至此,用于移植。
mkdir ~/linux/atk-mp1/my_linux -p
cp * ~/linux/atk-mp1/my_linux/ -rf

接下来的操作就基于这个my_linux文件夹,可以使用vscode打开
编译ST官方源码
修改Makefile

创建stm32mp157d_atk.sh 编译脚本,内容如下
#!/bin/sh
make distclean
make stm32mp1_atk_defconfig
make menuconfig
make uImage dtbs LOADADDR=0XC2000040 -j16
赋予脚本权限后执行
chmod 777 stm32mp157d_atk.sh
./stm32mp157d_atk.sh
编译成功会生成 arch/arm/boot/uImage 和 arch/arm/boot/dts/stm32mp157d-ed1.dtb
这个就是ST官方的内核和设备树,用TFTP挂载好后发现可以运行但有错误,因此需要移植。
在内核源码中添加自己的开发板
添加开发板对应的默认配置文件
默认配置文件 stm32mp1_atk_defconfig
添加开发板对应的设备树
添加设备树
拷贝一份 stm32mp157d-ed1.dts ,重命名为 stm32mp157d-atk.dts
cd ~/linux/atk-mp1/my_linux/arch/arm/boot/dts
cp stm32mp157d-ed1.dts stm32mp157d-atk.dts
接下来就是修改stm32mp157d-atk.dts

修改stm32mp157d-atk.dtsi 文件
拷贝一份stm32mp15xx-edx.dtsi 文件,重命名为 stm32mp157d-atk.dtsi
cp stm32mp15xx-edx.dtsi stm32mp157d-atk.dtsi
修改 stm32mp157d-atk.dtsi,删除掉PMIC芯片,添加电源节点信息,最后结果见附录
编译stm32mp157d-atk.dts 设备树
在 arch/arm/boot/dts/Makefile 文件的 dtb-$(CONFIG_ARCH_STM32) 中添加 stm32mp157d-atk.dtb 的配置项

关闭内核模块验证
修改默认配置文件 arch/arm/configs/stm32mp1_atk_defconfig,屏蔽掉如下

此文件也是图形配置的文件,因此可以在内核图形界面配置

取消对“Module signature verification”选项的选中
此时只是保存在 .config 配置文件中,在 save 界面可以保存到 stm32mp1_atk_defconfig 中。


因为make clean 会清除 .config 这些临时配置文件,因此要保存到 stm32mp1_atk_defconfig 这种最终的配置文件
关闭内核log信息时间戳

编译测试
使用stm32mp157d_atk.sh 脚本编译(注意:如果之前使用过图形化配置的,请保存好stm32mp1_atk_defconfig)
将编译得到的 arch/arm/boot/uImage 和 arch/arm/boot/dts/stm32mp157d-atk.dtb 拷贝到TFTP进行网络挂载
烧写镜像到EMMC
镜像打包
新建ext4格式磁盘
将 uImage 和 stm32mp157d-atk.dtb 打包为 ext4 格式文件,新建一个 bootfs 文件夹放入这两个文件
mkdir ~/linux/atk-mp1/bootfs
进入到 bootfs 目录下,执行以下指令创建一个名为 bootfs.ext4 磁盘并格式化为ext4格式
dd if=/dev/zero of=bootfs.ext4 bs=1M count=10
mkfs.ext4 -L bootfs bootfs.ext4
将系统镜像拷贝到ext4 磁盘中
创建挂载目录 /mnt/bootfs 来挂载磁盘 bootfs.ext4 ,并进行挂载、拷贝文件、卸载等操作。
sudo mkdir /mnt/bootfs //创建挂载目录
cd ~/linux/atk-mp1/bootfs //去到 mkfs.ext4 磁盘所在的目录下(bootfs目录)
sudo mount bootfs.ext4 /mnt/bootfs //挂载 mkfs.ext4 磁盘到 /mnt/bootfs目录
sudo cp uImage stm32mp157d-atk.dtb /mnt/bootfs //拷贝内核和设备树到挂载目录
sudo umount /mnt/bootfs //拷贝完后卸载挂载目录
至此,uImage 和stm32mp157d-atk.dtb 就已经打包到了 bootfs 文件夹下的 bootfs.ext4
可以在windows下打开 bootfs.ext4 查看。
烧写到EMMC
将 bootfs.ext4 放到 images 文件夹下,修改烧录脚本成如下

烧写完后启动板子,在uboot命令行执行指令查看EMMC分区2,可以看到EMMC里的uImage和设备树文件
ext4ls mmc 1:2

设置从EMMC中读取系统镜像和设备树并启动
setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
saveenv
boot
附件列表