本篇内容主要来自正点原子手册《【正点原子】STM32MP1嵌入式Linux驱动开发指南V2.0.pdf》10.3 U-Boot 命令使用,视频是第6.1讲到第6.6讲。
目录
1、下载第三方库
2、基础命令
2.1 修改环境命令
2.2 md 命令
2.3 nm命令
2.4 MM 命令
2.5 mw 命令
2.6 CP 命令
2.7 CMP 命令
2.8 mmc
3、网络类命令
4、nfs命令
5、从网络获取内核和设备树文件,并加载到ddr中再启动内核(用单个命令实现):
6、从mmc的文件系统中获取内核和设备树文件,并加载到ddr中再启动内核(用单个命令实现):
7、boot和bootm命令
8、uboot镜像中静态配置ip serverip等地址:
9、bootcmd和bootargs命令
从文件系统格式的mmc中加载内核镜像和设备树文件,并启动(用bootcmd实现):
网络下载,从虚拟机中获取内核镜像和设备树文件,并加载启动(用bootcmd实现):
10、MII命令:
11、其他命令
11.1 ums
11.2 reset:
11.3 go:
11.4 run:
11.5 mtest
1、下载第三方库
首先需要在 Ubuntu 中安装一些库,否则编译 uboot 会报错,安装命令如下:
sudo apt-get install libncurses5-dev bison flex
2、基础命令
2.1 修改环境命令
setenv bootdelay 5 #uboot等待键盘响应的时间设置为5秒
saveenv #保存环境变量
2.2 md 命令
用于显示内存值
md.b C0100000 10 #查看从地址0xC0100000k开始的内存数据,16个字节,10是0x10
md.w C0100000 10 #查看从地址0xC0100000k开始的内存数据,16个字(一个字是两个字节)
md.l C0100000 10 #查看从地址0xC0100000k开始的内存数据,16个双字
2.3 nm命令
nm
命令用于修改指定地址的内存值
C0100000
表示现在要修改的内存地址,
ea0000b8
表示地址
0xc0100000 现在的数据,‘?’后面就可以输入要修改后的数据 0x12345678
,输入完成以后按下回车,然 后再输入‘q’即可退出。
2.4 MM 命令
mm
命令也是修改指定地址内存值的,使用
mm
修改内存值的时候地址会自增,而使用
nm
命令的话地址不会自增。
以
.l
格式修改从地址
0XC0100000
开始的连续
3
个内存块
(3*4=12 个字节)
的数据为
0X05050505
2.5 mw 命令
命令 mw 用于使用一个指定的数据填充一段内存。
比如使用
.l
格式将以
0XC0100000
为起始地址的
0x10
个 内存块(0x10 * 4=64
字节
)
填充为
0X0A0A0A0A
,命令如下:
mw.l C0100000 0A0A0A0A 10
2.6 CP 命令
cp
是数据拷贝命令,用于将
DRAM
中的数据从一段内存拷贝到另一段内存中,或者把 NorFlash 中的数据拷贝到
DRAM
中。
使用
.l
格式将
0xC0100000
处的地址拷贝到
0xC0100100
处,长度为
0x10
个 内存块(0x10 * 4=64
个字节
)
,命令如下所示:
cp.l c0100000 c0100100 10
2.7 CMP 命令
cmp
是比较命令,用于比较两段内存的数据是否相等。
我们使用
.l
格式来比较
0xC0100000
和
0xC0100100
这两 个地址数据是否相等,比较长度为 0x10
个内存块
(16 * 4=64
个字节
)
,命令如下所示:
cmp.l c0100000 c0100100 10
2.8 mmc
uboot
支持
EMMC
和
SD
卡,因此也要提供
EMMC
和
SD
卡的操作命令。一般认为
EMMC 和 SD
卡是同一个东西.
mmc
是一系列的命令,其后可以跟不同的参数,输入“?
mmc
”即可查看
mmc
有关的命 令.
3、网络类命令
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
dhcp
用于从路由器获取
IP
地址,前提是开发板得连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp
命令就会失效。
执行完dhcp后,再ping serverip:ping 192.168.2.129
说明:与开发板相连的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博客
4、nfs命令
nfs C2000000 192.168.2.129:/home/wang/linux/nfs/uImage
从192.168.2.129的ubuntu虚拟机中下载文件/home/wang/linux/nfs/uImage到开发板起始地址处:C2000000
5、从网络获取内核和设备树文件,并加载到ddr中再启动内核(用单个命令实现):
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
6、从mmc的文件系统中获取内核和设备树文件,并加载到ddr中再启动内核(用单个命令实现):
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
7、boot和bootm命令
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命令使能*/
8、uboot镜像中静态配置ip serverip等地址:
在文件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地址。
9、bootcmd和bootargs命令
bootcmd 保存着 uboot 默认命令,uboot 倒计时结束以后就会执行 bootcmd 中的命令。
bootargs 保存着 uboot 传递给 Linux 内核的参数,比如指定 Linux 内核所使用的 console、指定根文件系统所在的分区等。
从文件系统格式的mmc中加载内核镜像和设备树文件,并启动(用bootcmd实现):
setenv bootcmd 'ext4load mmc 1:2 C2000000 uImage;ext4load mmc 1:2 C4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
saveenv
boot
网络下载,从虚拟机中获取内核镜像和设备树文件,并加载启动(用bootcmd实现):
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
saveenv
boot
10、MII命令:
在 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
11、其他命令
11.1 ums
在 uboot 下我们可以将开发板虚拟成一个 U 盘:
ums 0 mmc 1
11.2 reset:
重启uboot
11.3 go:
跳转到制定地址处运行命令
11.4 run:
运行命令,例:
setenv mycmd 'ext4load mmc 1:2 C2000000 uImage;ext4load mmc 1:2 C4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000' #创建了名为mycmd的命令
run mycmd
11.5 mtest
mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR.例:
mtest c1000000 c2000000 #反复测试ddr地址范围c1000000-c2000000内的读写
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)