本篇内容主要来自正点原子手册《【正点原子】STM32MP1嵌入式Linux驱动开发指南V2.0.pdf》10.3 U-Boot 命令使用,视频是第6.1讲到第6.6讲。
目录
5、从网络获取内核和设备树文件,并加载到ddr中再启动内核(用单个命令实现):
6、从mmc的文件系统中获取内核和设备树文件,并加载到ddr中再启动内核(用单个命令实现):
从文件系统格式的mmc中加载内核镜像和设备树文件,并启动(用bootcmd实现):
网络下载,从虚拟机中获取内核镜像和设备树文件,并加载启动(用bootcmd实现):
首先需要在 Ubuntu 中安装一些库,否则编译 uboot 会报错,安装命令如下:
sudo apt-get install libncurses5-dev bison flex
- setenv bootdelay 5 #uboot等待键盘响应的时间设置为5秒
- saveenv #保存环境变量
- md.b C0100000 10 #查看从地址0xC0100000k开始的内存数据,16个字节,10是0x10
- md.w C0100000 10 #查看从地址0xC0100000k开始的内存数据,16个字(一个字是两个字节)
- md.l C0100000 10 #查看从地址0xC0100000k开始的内存数据,16个双字
命令 mw 用于使用一个指定的数据填充一段内存。
mw.l C0100000 0A0A0A0A 10
cp.l c0100000 c0100100 10
cmp.l c0100000 c0100100 10
uboot网络配置:
- setenv ipaddr 192.168.2.20
- setenv ethaddr b8:ae:1d:01:01:00 #设置mac地址
- setenv gateway 192.168.2.1
- setenv netmask 255.255.255.0
- setenv serverip 192.168.2.129 #这是pc ubuntu虚拟机的ip地址
- saveenv
- dhcp
说明:与开发板相连的pc端网卡口和vm虚拟出来的网卡同网段,并将他们桥接起来,这样在开发板uboot中才能ping同vm虚拟机。
我的连接图大概是这样的:

我的虚拟机仅仅增加了NAT网络适配器,没有添加桥接模式。此时虚拟机便能ping通百度了,如果不通,请执行udhcpc -i ens33,重新学习一个ip(其实ip地址不会变化),或者重启网络(/etc/init.d/network-manager restart),再ping。
网卡VMware Network Adapter VMnet8和网卡“以太网”选择桥接之后,两个各自的IP地址便消失了,新生成的网卡“网桥”自动生成一个地址,该地址如果和虚拟机不是同网段,我们可以静态指定为同网段。
pc端使用桥接方式可能导致win10系统经常蓝屏,报错bridge.sys,不建议使用该方式。有另一个方案可行且没风险,见链接:
stm32mp157开发板平通pc虚拟机ubuntu系统,方便nfs挂载根文件系统_汉尼拔勇闯天涯的博客-CSDN博客
nfs C2000000 192.168.2.129:/home/wang/linux/nfs/uImage
从192.168.2.129的ubuntu虚拟机中下载文件/home/wang/linux/nfs/uImage到开发板起始地址处:C2000000
- mmc dev 1
- tftp C2000000 uImage #从虚拟机下载内核镜像文件uImage到开发板DDR中,ddr首地址是C2000000
- tftp C4000000 stm32mp157d-atk.dtb #从虚拟机下载设备树二进制文件stm32mp157d-atk.dtb到开发板DDR中,ddr首地址是C4000000
- bootm C2000000 - C4000000 #启动内核,内核首地址是C2000000,initrd地址没有设置,设备树地址为C4000000
- mmc dev 1
- ext4ls mmc 1:2 #查看文件在dev 1的2分区中是否有文件uImage和stm32mp157d-atk.dtb
- ext4load mmc 1:2 C2000000 uImage
- ext4load mmc 1:2 C4000000 stm32mp157d-atk.dtb
- bootm C2000000 - C4000000
ST 官方 uboot 并没有使能 boot 和 bootd 这两个命令,需要自行配置 uboot 来启动这两个命令,正点原子出厂系统已经使能了这两个命令。
boot和bootd是同一个命令。
bootm和bootz也是同一个命令,bootm针对uImage镜像内核,bootz针对zImage镜像内核。
uboot文件include\configs\stm32mp1.h中定义该宏,即是打开了bootm和boot命令:
#define CONFIG_CMD_BOOTD /*boot和bootd命令使能*/
#define CONFIG_CMD_BOOTD /*boot和bootd命令使能*/
在文件include\configs\stm32mp1.h中增加如下宏就行,虽然搜不到这些宏被调用的地方,但是不耽误他们编入镜像中。
- #define CONFIG_IPADDR 192.168.2.20
- #define CONFIG_GATEWAYIP 192.168.2.1
- #define CONFIG_NETMASK 255.255.255.0
- #define CONFIG_SERVERIP 192.168.2.129
- #define CONFIG_NET_RANDOM_ETHADDR /*随机生成mac地址*/
uboot启动时自动生成mac地址,但是该地址不会写入uboot参数中,即敲print命令看不到mac地址。
bootcmd 保存着 uboot 默认命令,uboot 倒计时结束以后就会执行 bootcmd 中的命令。
bootargs 保存着 uboot 传递给 Linux 内核的参数,比如指定 Linux 内核所使用的 console、指定根文件系统所在的分区等。
- setenv bootcmd 'ext4load mmc 1:2 C2000000 uImage;ext4load mmc 1:2 C4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
- saveenv
- boot
-
- setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
- saveenv
- boot
在 STM32MP157 上是不能读取的,原因是 ST 官方提供的 uboot 中,每次网络通信完成以后会关闭 ETHMAC 时钟,所以 MII 命令就会无法工作。
解决这个方法很简单,每次使用 MII 或者 MDIO 命令来操作 PHY 芯片的时候,先使能 ETHMAC 时钟。
这样操作之后才能适用mii命令:
- STM32MP> mm 0x50000218
- 50000218: 00030000 ? 0x00030700
- 5000021c: 00030700 ? q
- STM32MP> mii info 0x4
- PHY 0x04: OUI = 0x0000, Model = 0x10, Rev = 0x0A, 100baseT, FDX
在 uboot 下我们可以将开发板虚拟成一个 U 盘:
ums 0 mmc 1
重启uboot
跳转到制定地址处运行命令
运行命令,例:
- setenv mycmd 'ext4load mmc 1:2 C2000000 uImage;ext4load mmc 1:2 C4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000' #创建了名为mycmd的命令
- run mycmd
mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR.例:
mtest c1000000 c2000000 #反复测试ddr地址范围c1000000-c2000000内的读写