上一篇已经成功安装了SDK并运行了第一个应该程序。但是对于一些内核修改或者驱动编写来说还是不够用的,因此本篇学习内核的编译 与 部署到开发板。
【编译Iinux内核】
1、官网下载STM32MP1开发者包
St官网下载STM32MP1开发者包en.sources-stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21.tar.gz 下载地址:https://www.st.com/en/embedded-software/stm32mp1dev.html#get-software
2、解压开发者包 tar xvf en.sources-stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21.tar.gz
注意:有时候命令行解压不成功,可以在GUI界面右键进行解压 3、解压Linux内核
进入文件夹stm32mp1-openstlinux-6.1-yocto-mickledore-mp1-v23.06.21/sources/arm-ostl-linux-gnueabi/linux-stm32mp-6.1.28-stm32mp-r1-r0 解压内核 tar xvf linux-6.1.28.tar.xz
4、打ST patches
由于解压出来的内核是Linux官方内核,因此需要打上ST官方补丁后才能正常运行。
1)进入linux-6.1.28文件夹
2)打补丁
for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
3)应用fragments
make ARCH=arm multi_v7_defconfig "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
5、编译Linux内核源码
分成三部分,首先是编译Linux内核和设备树,其次是编译Linux内核模块,最后是生成输出文件。
1)编译内核和设备树
make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040
编译时间比较长,耐心等待
注意:编译之前要先source一下环境,否则编译会报错
source SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
2)编译内核模块
编译时间比较长,耐心等待
3)生成输出文件
mkdir -p $PWD/install_artifact/
make ARCH=arm INSTALL_MOD_PATH="$PWD/install_artifact" modules_install
如果以上操作都没有报错误,那就说明编译工作都成功了。
【在开发板上部署Linux®内核】
1、推送Linux内核到开发板
scp arch/arm/boot/uImage root@<board ip address>:/boot
使用SCP将uImage推送到开发板,<board ip address>替换为开发板IP地址
2、推送设备树到开发板
scp arch/arm/boot/dts/stm32mp1xx*.dtb root@<board ip address>:/boot
使用SCP将.dtb推送到开发板,<board ip address>替换为开发板IP地址,xx替换为35
3、推送内核模块到开发板
1)删除install_artifact/lib/modules/<kernel-version>目录中创建的链接
rm install_artifact/lib/modules/6.1.28/build install_artifact/lib/modules/6.1.28/source
2)剥离内核模块(以减小每个内核模块的大小)【可选】
find install_artifact/ -name "*.ko" | xargs $STRIP --strip-debug --remove-section=.comment --remove-section=.note --preserve-dates
3)复制内核模块到开发板
scp -r install_artifact/lib/modules/* root@<ip of board>:/lib/modules
使用SCP将内核模块推送到开发板,<board ip address>替换为开发板IP地址
4)开发板重新生成模块依赖列表和符号表
5)同步磁盘数据
5)重启开发板
6)查看内核版本及编译时间
重启完成后就可以查看内核版本和编译时间了
到此,就已经完成了linux内核的编译并更新到开发板。
|