STM32MP157_uboot_命令使用
前言:
进入 uboot 的命令行模式以后输入“help”或者“?”,然后按下回车即可查看当前 uboot 所支持的命令,图 中只是 uboot 的一部分命令,具体的命令列表以实际为准。图中的命令并不是 uboot 所支持的所有命令,说过 uboot 是可配置的,需要什么命令就使能什么命令。所以图中的命令是正点原子提供的 uboot 中使能的命令,uboot 支持的命令还有很多,而且也可以在 uboot 中自定义命令
1、查询指令
bdinfo
2、输出环境变量信息
STM32MP1 系列的环境变量有很多,比如baudrate、board、board_name、boot_device、bootcmd、bootdelay 等等。uboot 中的环境变量都是字符串,既然叫做环境变量,那么它的作用就和“变量”一样。比如 bootdelay 这个环境变量就表示 uboot 启动延时时间,默认 bootdelay=1,也就默认延时 1 秒。前面说的 1 秒倒计时就是由 bootdelay 定义的,如果将 bootdelay 改为 5 的话就会倒计时 5s 了。uboot 中的环境变量是可以修改的,有专门的命令来修改环境变量的值
printenv
3、查看 uboot 的版本号
version
4、修改环境变量(uboot 启动倒计时变为了 5 秒)
环境变量的操作涉及到两个命令:setenv 和 saveenv,setenv 命令用于设置或者修改环境变量的值。命令 saveenv 用于保存修改后的环境变量,一般环境变量存放在外部 flash 中,uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中。所以使用命令 setenv 修改的是 DRAM中的环境变量值,修改以后要使用 saveenv 命令将修改后的环境变量保存到 flash 中,否则uboot 下一次重启会继续使用以前的环境变量值
setenv bootdelay 5
saveenv
5、新建环境变量
设置 author 的值为“console=ttySTM0,11520 root=/dev/mmcblk2p2 rootwait rw”,其中“console=ttySTM0,115200”、“root=/dev/mmcblk2p2”、“rootwait”和“rw”相当于四组“值”,这四组“值”之间用空格隔开,所以需要使用单引号‘’将其括起来,表示这四组“值”都属于环境变量 author
setenv author 'console=ttySTM0,11520 root=/dev/mmcblk2p2 rootwait rw '
saveenv
6、删除环境变量
既然可以新建环境变量,那么就可以删除环境变量,删除环境变量也是使用命令 setenv,要删除一个环境变量只要给这个环境变量赋空值即可,比如我们删除掉上面新建的 author 环境变量
setenv author
saveenv
7、内存操作指令(uboot 命令中的数字都是十六进制的!不是十进制的!)
内存操作命令就是用于直接对 DRAM 进行读写操作的,常用的内存操作命令有 md、nm、mm、mw、cp 和 cmp。
//md 命令用于显示内存值
//查看 0XC0100000 开始的 20 个字节的内存值
//md[.b, .w, .l] address [# of objects]
//命令中的[.b .w .l]对应 byte、word 和 long,也就是分别以 1 个字节、2 个字节、4 个字节来显示内存值
md.b C0100000 14
//nm 命令用于修改指定地址的内存值
//现在以.l 格式修改 0XC0100000 地址的数据为 0x12345678
nm.l C0100000
//C0100000 表示现在要修改的内存地址,ea0000b8 表示地址 0xc0100000 现在的数据,‘?’后面就可以输入要修改后的数据 0x12345678,输入完成以后按下回车,然
后再输入‘q’即可退出
//mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用 nm 命令的话地址不会自增
//以.l 格式修改从地址 0XC0100000 开始的连续 3 个内存块(3*4=12个字节)的数据为 0X05050505
//mw 用于使用一个指定的数据填充一段内存
//使用.l 格式将以 0XC0100000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A
mw.l C0100000 0A0A0A0A 10
//cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把NorFlash 中的数据拷贝到 DRAM 中
//使用.l 格式将 0xC0100000 处的地址拷贝到 0xC0100100 处,长度为 0x10 个内存块(0x10 * 4=64 个字节)
cp.l c0100000 c0100100 10
//cmp 是比较命令,用于比较两段内存的数据是否相等
//使用.l 格式来比较 0xC0100000 和 0xC0100100 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节)
cmp.l c0100000 c0100100 10
8、网络操作指令
uboot 是支持网络的,我们在移植 uboot 的时候一般都要调通网络功能,因为在移植 linuxkernel 的时候需要使用到 uboot 的网络功能做调试。uboot 支持大量的网络相关命令,比如 dhcp、ping、nfs 和 tftpboot
环境变量 | 描述 |
---|---|
ipaddr | 开发板 ip 地址,可以不设置,使用 dhcp 命令来从路由器获取 IP 地址 |
ethaddr | 开发板的 MAC 地址,一定要设置 |
gatewayip | 网关地址 |
netmask | 子网掩码 |
serverip | 服务器 IP 地址,也就是 Ubuntu 主机 IP 地址,用于调试代码 |
setenv ipaddr 192.168.0.222
setenv ethaddr b8:ae:1d:01:01:00
setenv gatewayip 192.168.0.1
setenv netmask 255.255.255.0
setenv serverip 192.168.0.124
saveenv
//ping 命令,开发板的网络能否使用,是否可以和服务器(Ubuntu 主机)进行通信
ping 192.168.0.124
//dhcp 用于从路由器获取 IP 地址
dhcp
//nfs 命令,通过 nfs 可以在计算机之间通过网络来分享资源
//比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中
//使用 nfs 命令来将 uImage 下载到开发板 DRAM 的 0XC2000000 地址处
nfs C2000000 192.168.1.249:/home/zuozhongkai/linux/nfs/uImage
//tftp 命令,tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中
//和 nfs 命令的区别在于,tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可
//比如我们现在将 tftpboot 文件夹里面的 uImage 文件下载到开发板 DRAM 的 0XC2000000 地址处
tftp C2000000 uImage
9、EMMC 和 SD 卡操作命令
uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西
命令 | 描述 |
---|---|
mmc info | 输出 MMC 设备信息 |
mmc read | 读取 MMC 中的数据。 |
mmc wirte | 向 MMC 设备写入数据。 |
mmc rescan | 扫描 MMC 设备。 |
mmc part | 列出 MMC 设备的分区。 |
mmc dev | 切换 MMC 设备。 |
mmc list | 列出当前有效的所有 MMC 设备。 |
mmc hwpartition | 设置 MMC 设备的分区。 |
mmc bootbus…… | 设置指定 MMC 设备的 BOOT_BUS_WIDTH 域的值。 |
mmc bootpart…… | 设置指定 MMC 设备的 boot 和 RPMB 分区的大小。 |
mmc partconf…… | 设置指定 MMC 设备的 PARTITION_CONFG 域的值。 |
mmc rst | 复位 MMC 设备 |
mmc setdsr | 设置 DSR 寄存器的值 |
//mmc info 命令用于输出当前选中的 mmc info 设备的信息
mmc info
//mmc rescan 命令用于扫描当前开发板上所有的 MMC 设备
mmc rescan
//mmc list 命令用于来查看当前开发板一共有几个 MMC 设备
mmc list
//mmc dev 命令用于切换当前 MMC 设备
mmc dev 0
//切换到 SD 卡,0 为 SD 卡,1 为 eMMC
//查看 EMMC 分区
mmc part
第一个分区为名字为“ssbl”,用来存放 uboot 镜像,范围为:扇区 0x400~0x13ff。第二个分区名字为“boot”,用来存放 linux 内核镜像,范围为:扇区 0x1400~0x213ff。第三个分区名字为“rootfs”,这个是根文件系统分区,占用了剩余的所有扇区,也就是扇区 0x21400~0xe8fbff
//将 EMMC 的分区 2 设置为当前 MMC 设置分区
mmc dev 1 2
//mmc read 命令用于读取 mmc 设备的数据
//从 EMMC 的第 1024(0x400)个块开始,读取 16(0x10)个块的数据到 DRAM 的0XC0000000 地址处
//切换到 EMMC
mmc dev 1
//读取数据
mmc read c0000000 400 10
10、EXT 格式文件系统操作命令
uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令,STM32MP1 的系统镜像都是 ext4格式的,所以我们重点讲解一下和 ext4 有关的三个命令:ext4ls、ext4load 和 ext4write。注意,由STM32MP1 嵌入式 Linux 驱动开发指南于只有 linux 内核、设备树和根文件系统是以 ext4 格式存放在 EMMC 中的
//ext4ls 命令用于查询 EXT4 格式设备的目录和文件信息
//查询 EMMC 分区 2 中的所有的目录和文件
//命令 mmc 设备号:分区号
ext4ls mmc 1:2
//extload 命令用于将指定的文件读取到 DRAM 中
//EMMC 分区 2 中的 uImage 文件读取到DRAM 中的 0XC2000000 地址处
//命令 mmc 设备号:分区号 DRAM地址 分区中文件名
ext4load mmc 1:2 C2000000 uImage
//ext4wirte 命令用于将 DRAM 中的数据写入到 MMC 设备中
//DRAM中的0XC2000000地址处的数据大小为7313888(0X6F99E0)个字节,读到EMMC分区2写入的文件命名为test_uImage
//命令 mmc 设备号:分区号 DRAM地址 分区中文件名 数据长度
ext4write mmc 1:2 c0000000 /test_uImage 0x6f99e0
11、BOOT 操作命令
uboot 的本质工作是引导 Linux,所以 uboot 肯定有相关的 boot(引导)命令来启动 Linux。常用的跟 boot 有关的命令有:bootm、bootz 和 boot
//使用 tftp命令将 uImage 下载到 DRAM 的 0XC2000000 地址处,然后将设备树 stm32mp157d-atk.dtb 下载到 DRAM 中的 0XC400000 地址处,最后使用命令 bootm 启动
tftp c2000000 uImage
tftp c4000000 stm32mp157d-atk.dtb
bootm c2000000 - c4000000
//使用命令 ext4load 将 uImage 和 stm32mp157d-atk.dtb 文件拷贝到 DRAM 中,地址分别为0XC2000000 和 0XC4000000,最后使用 bootm 启动
ext4load mmc 1:2 c2000000 uImage
ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb
bootm c2000000 - c4000000
//使用 tftp 命令从网络启动 Linux 那么就可以设置bootcmd 为“tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000”,然后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动 Linux 系统
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 -c4000000'
saveenv
boot
//从 EMMC 启动系统,那就设置 bootcmd 环境变量为“ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000”,然后使用boot 命令启动即可
setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157datk.dtb;bootm c2000000 - c4000000'
saveenv
boot
12、UMS 命令
在 uboot 下我们可以将开发板虚拟成一个 U 盘,我们可以选择使用哪个 Flash 作为这个 U盘的存储器,比如将正点原子 STM32MP157 开发板上的 EMMC 或者 SD 卡虚拟成 U 盘。当我们将 EMMC 虚拟成 U 盘以后就可以直接在电脑上向开发板拷贝文件了,比如我们在产品开发阶段,就可以直接在 uboot 下将某个文件拷贝到开发板的根文件系统中,这样就不需要进入系统或者通过网络来替换文件
//将开发板的EMMC 挂载到电脑上,首先使用USB Type-C线将开发板的USB_OTG口与电脑连接起来,然后用以下命令启动。
//ums usb 接口索引 mmc Devtype 是要挂载的设备
ums 0 mmc 1
//注意,在 Windows 下这三个 U 盘是无法操作的,因为这三个 U 盘是 ext4 格式的,而 Windows
是不支持 ext4 格式!所以大家在操作的时候发现 Windows 报出 U 盘识别有问题,让格式化的,
千万不要格式化!负责开发板整个 Linux 系统都会被格式化掉!
//我们可以将其挂载到 Ubuntu 下,这样就可以正常操作这三个 U 盘了。
如果要结束挂载,在终端下运行先按住 CTRL+C 键就能结束这个挂载
12、MII 命令使用说明
用于读取网络 PHY 芯片寄存器
13、其他常用命令
uboot 中还有其他一些常用的命令,比如 reset、go、run 和 mtest 等
//reset 命令顾名思义就是复位的,输入“reset”即可复位重启
reset
//go 命令用于跳到指定的地址处执行应用
go addr [arg ...]
//addr 是应用在 DRAM 中的首地址
//run 命令用于运行环境变量中定义的命令
//run 命令最大的作用在于运行我们自定义的环境变量。在后面调试 Linux 系统的时候常常要在网络启动和 EMMC 启动之间来回切换,而 bootcmd 只能保存一种启动方式,如果要换另外一种启动方式的话就得重写 bootcmd,会很麻烦。这里我们就可以通过自定义环境变量来实现不同的启动方式,比如定义环境变量 mybootemmc 表示从 emmc 启动,定义mybootnet 表示从网络启动。如果要切换启动方式的话只需要运行“run mybootxxx(xxx 为 emmc或 net)”即可
setenv mybootemmc 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
setenv mybootnet 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
saveenv
run mybootemmc 或者 run mybootnet
//mtest 命令是一个简单的内存读写测试命令
//我们测试0XC0000000~0XC0001000这段内存,输入“mtest C0000000 C0001000”
//结束测试就按下键盘上的“Ctrl+C”键