目录
U-Boot命令使用
信息查询命令
环境变量操作命令
内存操作命令
U-Boot命令使用
进入uboot的命令行模式以后输入“help”或者“?”,然后按下回车即可查看当前uboot 所支持的命令,如图所示:
图中只是uboot的一部分命令,具体的命令列表以实际为准。图中的命令并不是uboot所支持的所有命令,前面说过uboot是可配置的,需要什么命令就使能什么命令。uboot支持的命令还有很多,而且,也可以在uboot中自定义命令。这些命令后面都跟有命令说明,用于描述此命令的作用,但是命令具体怎么用呢?我们输入“help(或?)命令名”既可以查看命令的详细用法,以“bootz”这个命令为例,我们输入如下命令即可查看“bootz”这个命令的用法:
信息查询命令
bdinfo此命令用于查看板子信息
从图中可以得出DRAM的起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指针)起始地址等信息。
printenv用于输出环境变量信息
在图中有很多的环境变量,比如baudrate、board_name、board_rec、boot_fdt、bootemd等等。uboot 中的环境变量都是字符串,既然则做环境变量,那么它的作用就和“变量”一样比如bootdelay这个环境变量就表示uboot 时时间,默认 bootdelay=3,也就默认延时 3秒。前面说的3秒倒计时就是由bootdelay定义的,如果将bootdelay改为5的话就会倒计时5s了。uboot中的环境变量是可以修改的,有专门的命令来修改环境变量的值,稍后我们会讲解。
命令version用于查看uboot 的版本号
从图可以看出,当前uboot版本号为2016.03, 2023年4月17日编译的,编译器为arm-poky-linux-gnueabi-gcc,这是 NXP 官方提供的编译器。
环境变量操作命令
1.修改环境变量
环境变量的操作涉及到两个命令:setenv和saveenv,命令setenv用于设置或者修改环境变量的值。命令saveenv用于保存修改后的环境变量,一般环境变量是存放在外部flash中的,uboot启动的时候会将环境变量从flash读取到DRAM中。所以使用命令setenv修改的是DRAM中的环境变量值,修改以后要使用saveenv命令将修改后的环境变量保存到flash中,否则的话uboot下一次重启会继续使用以前的环境变量值。
譬如修改uboot启动时间为5s
在图中,当我们使用命令saveenv保存修改后的环境变量的话会有保存过程提示信息,根据提示可以看出环境变量保存到了MMC(0)中,也就是SD卡中。因为我们现在将 uboot"烧写到了SD卡里面,所以会保存到MMC(0)中。如果烧写到EMMC里面就会提示保存到MMC(1),也就是EMMC设备,同理,如果是NAND版本核心板的话就会提示保存到NAND中。
有时候我们修改的环境变量值可能会有空格,比如bootemd,bootargs等,这个时候环境变量值就得用单引号括起来,比如下面修改环境变量 bootargs的值:
上面命令设置bootargs的值为"console=ttymxc0,115200 root-/dev/mmeblk1p2 rootwaitrw",其中"console=ttymxc0,115200"、"root=/dev/mmeblk1p2"、"rootwait"和"rw"相当于四组"值",这四组值之间用空格隔开,所以需要使用单引号‘将其括起来,表示这四组值都属于环境变量bootargs。
2.新建环境变量
命令setenv也可以用于新建命令,用法和修改环境变量一样,比如我们新建一个环境变量author, author的值为yyyyy,那么就可以使用如下命令:
setenv author yyyyy
saveeny
新建命令author完成以后重启uboot,然后使用命令printenv查看当前环境变量,如图所示:
从图中可以看到新建的环境变量: author,其值为: yyyyy
3.删除环境变量
既然可以新建环境变量,肯定也可以删除环境变量,删除环境变量也是使用命令seteny,要删除一个环境变量只要给这个环境变量赋空值即可,比如我们删除掉上面新建的author这个环境变量,命令如下:
setenv author
saveenv
上面命令中通过setenv给author赋空值,也就是什么都不写来删除环境变量author。重启uboot就会发现环境变量author没有了。
内存操作命令
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,也就是20*2=40个字节;如果显示格式为.l的话就表示20个long,也就是20*4=80个字节。另外要注意:
uboot命令中的数字都是十六进制的!不是十进制的!
比如你想查看以0x80000000开始的20个字节的内存值,显示格式为.b的话,应该使用如下所示命令:
md.b 80000000 14
上面说了, uboot命令里面的数字都是十六进制的,所以可以不用写“0x”前缀,十进制的20其十六进制为0x14,所以命令md后面的个数应该是14,如果写成20的话就表示查看32(十六进制为0x20)个字节的数据。
2.nm命令
nm命令用于修改指定地址的内存值,命令格式如下:
nm [.b, .w, .I] address
nm命令同样可以以.b..w和.l来指定操作格式,比如现在以.l格式修改0x80000000地址1的数据为0x12345678输入命令
nm.l 80000000
输入上述命令以后如图所示:
在图中,80000000表示现在要修改的内存地址,0000a1ff表示地址0x80000000现在的数据, ?后面就可以输入要修改后的数据0x12345678,输入完成以后按下回车,然后再输入‘q’即可退出,如图所示:
修改完成以后在使用命令md来查看一下有没有修改成功,如图所示:
3.mm命令
mm命令也是修改指定地址内存值的,使用mm修改内存值的时候地址会自增,而使用命今nm的话地址不会自增。比如以.l格式修改从地址0x80000000 开始的连续3个内存块(3*4=12个字节)的数据为0x05050505,操作如图所示:
从图可以看出,修改了地址0x80000000,0x80000004和0x8000000C的内容为0x05050505.使用命令md查看修改后的值,结果如图所示:
4.mw命令
命令mw用于使用一个指定的数据填充一段内存,命令格式如下:
mw [.b, .w, .I] address value [count]
mw命令同样可以以.b..w和.l来指定操作格式, address表示要填充的内存起始地址, value为要填充的数据, count是填充的长度。比如使用.l格式将以0x80000000为起始地址的0x10个内存块(0x10*4=64字节)填充为0X0A0A0A0A.命今如下:
5.cp命令
cp 是数据拷贝命令,用于将DRAM中的数据从一段内存拷贝到另一段内存中,或者把 NorFlash中的数据拷贝到DRAM中。命令格式如下:
cp [.b,.w, .I] source target count
cp命令同样可以以.b..w和.l来指定操作格式, source为源地址,target为目的地址, count为拷贝的长度,使用.l格式将0x80000000处的地址拷贝到0x80000100处,长度为0x10个内存块(0x10*4=64个字节),命令如下所示:
сp.l 80000000 80000100 10
6.cmp命令
cmp是比较命令,用于比较两段内存的数据是否相等,命令格式如下:
cmp [.b,.w, .l] addr1 addr2 count
cmp命令同样可以以.b .w和.l来指定操作格式,addrl为第一段内存首地址,addr2为第二段内存首地址, count为要比较的长度。我们使用l格式来比较0x80000000和0x80000100这两个地址数据是否相等,比较长度为0x10个内存块(16*4=64个字节),命令如下所示:
从图中可以看出两段内存的数据相等。我们再随便挑两段内存比较一下,比如地址0x80002000和0x800003000,长度为0x10,比较结果如图所示:
从图中可以看出, 0x80002000处的数据和0x80003000处的数据就不一样。