U-Boot 命令使用
启动 U-Boot 以后就可以学习使用 U-Boot 的命令。
进入 uboot 的命令行模式以后输入help或者?,然后按下回车即可查看当前 uboot 所支持的命令,如下图所示
上图只是uboot所支持的一部分指令,具体的命令列表以实际为准。uboot 支持的命令还有很多,而且也可以在 uboot 中自定义命令。这些命令后面都跟有命令说明,我们输入?(help)<指令>就可以查看指令的详细用法。如输入?(这里需要空格)bootz
常用的信息查询命令
1.bdinfo
用于查看板子信息
从
bdinfo
反馈的信息可以得出 DRAM 的起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指针)起始地址等信息。
2.printenv
命令printenv
用于输出环境变量信息,uboot也支持自动补全比如输入pri
后按TAB 键就会自动补全命令printenv
,或者直接输入pri后按回车也是一样的效果。上图有很多的环境变量,比如 baudrate、board_name、board_rec、boot_fdt、bootcmd等等。uboot 中的环境变量都是字符串,既然叫做环境变量,那么它的作用就和“变量”一样。比如 bootdelay 这个环境变量就表示 uboot 启动延时时间,默认 bootdelay=3,也就默认延时 3秒。前面说的 3 秒倒计时就是由 bootdelay 定义的,如果将 bootdelay 改为 5 的话就会倒计时 5s了
3.version
命令 version
用于查看 uboot 的版本号
可以看出,当前 uboot 版本号为 2016.03,2021 年 4 月 7 日编译的,编译器为 arm-linux-gnueabihf-gcc 等信息。
环境变量操作命令
常用的环境变量操作命令有两个:setenv和saveenv
1.setenv
setenv
指令强大,可以修改环境变量,新建环境变量,删除环境变量。
修改:setenv <变量名> <变量值> 例如 setenv bootdelay 5
然后等待时间就变成了5秒
有时候我们修改的环境变量值可能会有空格,这个时候环境变量值就得用单引号括起来,比如下面修改环境变量 bootargs 的值:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
新建:setenv <新变量名> <变量值> 比如:setenv author vsheng
可以看到此时author为vsheng
删除:不给变量幅值即为删除 比如 setenv author
可以看到author已经不见了
2.saveenv
命令saveenv
用于保存修改后的环境变量,一般环境变量是存放在外部 flash 中的,uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中。所以使用命令 setenv
修改的是 DRAM中的环境变量值,修改以后要使用 saveenv
命令将修改后的环境变量保存到 flash 中,否则的话uboot 下一次重启会继续使用以前的环境变量值。
内存操作命令
内存操作命令就是用于直接对 DRAM 进行读写操作的,常用的内存操作命令有 md、nm、mm、mw、cp 和 cmp。
1、md 命令
md 命令用于显示内存值,格式如下:
- md[.b, .w, .l] address [# of objects]
命令中的[.b .w .l]对应 byte、word 和 long,也就是分别以 1 个字节、2 个字节、4 个字节来显示内存值。address 就是要查看的内存起始地址,[# of objects]表示要查看的数据长度,这个数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度为20(十六进制为 0x14),如果显示格式为.b 的话那就表示 20 个字节;如果显示格式为.w 的话就表示 20 个 word,也就是 202=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是204=80 个字节。另外要注意:uboot 命令中的数字都是十六进制的!不是十进制的!
查看以 0X80000000 开始的 20 个字节的内存值,显示格式为.b 的话,应该使用
如下所示命令:md.b 80000000 14
而不是md.b 80000000 20
分析下面三个命令的区别:
md.b 80000000 10
md.w 80000000 10
md.l 80000000 10
上面这三个命令都是查看以 0X80000000 为起始地址的内存数据,第一个命令以.b 格式显示,长度为 0x10,也就是 16 个字节;第二个命令以.w 格式显示,长度为 0x10,也就是 162=32个字节;最后一个命令以.l 格式显示,长度也是 0x10,也就是 164=64 个字节。
2、nm 命令
nm 命令用于修改指定地址的内存值,命令格式如下:
- nm [.b, .w, .l] address
nm 命令同样可以以.b、.w 和.l 来指定操作格式,比如现在以.l 格式修改 0x80000000 地址的数据为 0x12345678。输入命令:
nm.l 80000000
80000000 表示现在要修改的内存地址,ffffff00 表示地址 0x80000000 现
在的数据,?后面就可以输入要修改后的数据 0x00000000,输入完成以后按下回车,然后再输入‘q’即可退出。
3、mm 命令
mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增。比如以.l 格式修改从地址 0x80000000 开始的连续 3 个内存块(3*4=12个字节)的数据为 0X05050505。
4、mw 命令
命令 mw 用于使用一个指定的数据填充一段内存,命令格式如下:
- mw [.b, .w, .l] address value [count]
mw 命令同样可以以.b、.w 和.l 来指定操作格式,address 表示要填充的内存起始地址,value为要填充的数据,count 是填充的长度。比如使用.l 格式将以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X0A0A0A0A,命令如下:
mw.l 80000000 0A0A0A0A 10
然后使用命令 md 来查看
5、cp 命令
cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 Nor Flash 中的数据拷贝到 DRAM 中。命令格式如下:
- cp [.b, .w, .l] source target count
cp 命令同样可以以.b、.w 和.l 来指定操作格式,source 为源地址,target 为目的地址,count为拷贝的长度。
6、cmp 命令
cmp 是比较命令,用于比较两段内存的数据是否相等,命令格式如下:
- cmp [.b, .w, .l] addr1 addr2 count
cmp 命令同样可以以.b、.w 和.l 来指定操作格式,addr1 为第一段内存首地址,addr2 为第二段内存首地址,count 为要比较的长度。
关于uboot指令的学习就先到这里。
不,学习永不停息!
加油,奥里给!!