|
1、解压 进入/home/helloxhy/linux/en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-11-12/stm32mp1-openstlinux-5-4-dunfell-mp1-20-11-12/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.56-r0文件夹,对linux-5.4.56.tar.xz进行解压。 tar -vxf linux-5.4.56.tar.xz
2、 打补丁 进入解压的文件夹打补丁: cd linux-5.4.31/ //进入Linux 源码目录 for p in `ls -1 ../*.patch`; do patch -p1 < $p; done //打补丁 make ARCH=arm multi_v7_defconfig "fragment*.config" //生成fragment config配置文件 for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done //将 fragment config补丁打到.config 文件里面 yes '' | make ARCH=arm oldconfig // oldconfig 的所有选项都选择 yes
Linux 源码根目录下的.config文件就已经保存了所有的配置项,所以只需要复制一 份.config 作为我们的默认配置文件即可: cp .config ./arch/arm/configs/stm32mp1_xhy_defconfig
然后复制到mylinux文件中: cd //退回到主页面 mkdir mylinux //新建mylinux cp linux/stm32mp1-openstlinux-5-4-dunfell-mp1-20-11-12/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.56-r0/linux-5.4.56 mylinux/ -rf //复制linux-5.4.56到mylinux 3、 编译 进入文件夹mylinux/linux-5.4.56 cd mylinux/linux-5.4.56 新建一个sh脚本,名字随便取,比如xhy.sh,输入如下命令: #清除工程 make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- distclean #配 置 工 程,配置文件:stm32mp1_xhy_defconfig make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- stm32mp1_xhy_defconfig # 编译 Linux 内核 make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- uImage dtbs LOADADDR=0XC2000040 -j16
然后赋予权限并执行: chmod 777 xhy.sh ./xhy.sh
4、 测试 这里需要两个文件: /home/helloxhy/linux/en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-11-12/stm32mp1-openstlinux-5-4-dunfell-mp1-20-11-12/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.56-r0/linux-5.4.56/arch/arm/boot中的uImage 和/home/helloxhy/linux/en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-11-12/stm32mp1-openstlinux-5-4-dunfell-mp1-20-11-12/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.56-r0/linux-5.4.56/arch/arm/boot/dts中的stm32mp157a-dk1.dtb(根据板子型号选择)。 cp arch/arm/boot/uImage/home/helloxhy/tftp/ cp arch/arm/boot/dts/stm32mp157a-dk1.dtb/home/helloxhy/tftp/ Linux内核的烧写有两种方式:(1)、通过tftp下载到板子里。(2)、使用STM32CubeProgrammer通过USB烧录到SD卡里。 (1)、通过tftp下载到板子里。 把uImage和stm32mp157a-dk1.dtb复制到home里的tftp文件夹中。 接下来启动板子的boot,如图:
需要这设置的由两个: 网络信息设置: dhcp //dhcp自动获取IP、网关、子网掩码 或者 setenv ipaddr 192.168.16.71 //设置本地IP setenv ethaddr 00:04:9f:04:d2:35 //设置mac地址 setenv gatewayip 192.168.16.1 //设置网关 setenv netmask 255.255.255.0 //设置子网掩码 之后 setenv serverip 192.168.16.70 //设置目标ip即为Ubuntu地址 saveenv //保存设置
然后测试下网络状况,ping下Ubuntu的IP地址: bootcmd环境变量设置,bootcmd保存着 uboot 默认命令,uboot 倒计时结束以 后就会执行 bootcmd 中的命令。 setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157a-dk1.dtb;bootm c2000000 - c4000000' //设置从为tftp获取uImage以及stm32mp157a-dk1.dtb saveenv //保存设置 print bootcmd //读取bootcmd信息
然后重启:
注意:启动成功后会报错,如图:
这是没有找到根文件,下篇来编译根文件,暂时不管他。 (2)、使用STM32CubeProgrammer通过USB烧录到SD卡里。 由入门包中的tsv可以看到linux源码为ext4格式,所以需要把.dtb和uImage打包为ext4格式,在tftp文件夹下新建.sh文件,这里命名为ext4.sh。 chmod 777 ext4.sh ./ ext4.sh
此时tftp文件夹下面生成一个文件:bootfs.ext4,把他复制到windows文件夹下。 然后修改tsv文件。
最后使用STM32CubeProgrammer下载
启动后会有如下报错:
发现linux内核并未启动起来,原因是没有找到uImage和dtb,这个问题困扰了一个星期,最终找到原因和解决方法。分享如下: 由报警信息可知,mmc 0:4,首先查询下mmc 0:4中的ext4文件: ext4ls mmc 0:4
可以找到uImage和dtb,查看bootcmd信息发现为自动查找,既然自动查找失败,那么设置为从mmc 0:4读取: setenv bootcmd 'ext4load mmc 0:4 c2000000 uImage;ext4load mmc 0:4 c4000000 stm32mp157a-dk1.dtb;bootm c2000000 - c4000000' 保存下重启即可。
在此有另外一个问题,入门包所有的板子用的同一个ext4,其为自动搜索为什么可以找到,所以特地重新下载入门包,看下ext4ls和bootcmd信息:
由此可见ext4ls包含了所有板子的树文件,所以大小为64M,bootcmd为run bootcmd_stm32mp,为什么能从sd卡启动,这个问题尚未解决,知道的大神留言。 |
xhy_image.rar
下载8 MB, 下载次数: 3
1
扩展STM32微处理器,实现高性价比、低功耗和灵活性能
STM32MP1 自举程序编程:USB DFU/USART 协议全解析
兔哥心中的ST中文论坛
我心中的ST中文论坛
STM32 开发者指南:ST.com 全新 MCU 产品阵容视觉布局深度解析
深度拆解 STM32MP1 Boot 链路
STM32串口自动识别波特率的原理
STM32MP135 MP157 MP257 CoreMark移植&&跑分对比&&多核心负载不均衡问题排查与解决
STM32--STM32 微控制器详解
为什么学了几天STM32一脸茫然?
微信公众号
手机版