常用的信息查询命令
信息查询命令主要有3个,分别是bdinfo、printenv和version命令
=>bdinfo
该命令用来查询当前板子的相关信息可通过该命令可以查看板子的DRAM的大小以及DRAM的起始地址、当前使用的网络接口以及IP地址、波特率和
uboot偏移地址以及偏移量等相关信息。
=>printenv
该命令用于查询当前板子的一些相关环境变量。
=>version
该命令用于查询uboot版本和交叉编译工具的相关信息。
环境变量相关命令
环境变量常用的命令主要有两个,分别是setenv和saveenv,setenv命令用来设置或者修改当前环境变量的值,saveenv用来保存环境变量的值,一般环境变量是存放在外部的Flash中的,例如Nand、Flash中,当uboot启动的时候,会将环境变量读取的DRAM中,当我们使用setenv修改了环境变量的值后,需要使用saveenv命令将修改后的环境变量的值保存到Flash中,否则修改无效。
当前的bootdelay为3,我们要将bootdelay环境变量的值设置为5,可以使用下面的命令:
=>setenv bootdelay 5=> saveenv
需要注意的是,当我们修改环境变量有空格值的时候,例如bootcmd或者bootargs等,这个时候的环境变量值需要使用单引号括起来。
setenv可以用来删除环境变量,如下命令可以删除author环境变量:
=>setenv author =>saveenv =>printenv author
内存操作相关命令
内存操作的相关命令用于对DRAM内存进行读写操作,常用的内存操作命令有md、nm、mm、mw、cp、cmp。md命令用法中的[.b, .w, .l]对应着byte、word、long,分别以1个字节、2个字节、4个字节来进行内存值显示,address表示要查看的内存起始地址,[# of objects]表示要查看的数据长度,和显示的数据格式有关, 并且需要注意的是uboot命令中的数字都是十六进制的。
例如,当我们想要查看从地址0x8000000开始的20个字节的内存值,可以使用下面的命令显示:
=>md.b 80000000 14 //or =>md.b 0x80000000 0x14
nm命令同样是使用[.b, .w, .l]来指定内存的操作格式,
例如,想要使用修改0x80000000地址的数据为0x77,可使用下面的命令:
=>nm.b 80000000 //or =>nm.b 0x80000000
mm命令也是可以用来修改内存值,但是使用mm命令修改内存值的时候,地址值将会自增,使用nm命令时,地址值将不会自增。
例如,使用.b格式修改0x80000000开始的连续4个字节数据为0x12345678,使用命令如下:
=>mm.b 80000000
修改的过程中,地址会自增
mw命令用来使用一个指定的数据填充一段内存,该命令同样使用[.b, .w, .l]来指定操作格式,address表示要填充的内存起始地址,value表示要填充的数据,count是要填充的长度。
例如,使用.b格式将以0x80000000为起始地址的0x14个内存块填充为0x33,命令如下:
=>mw.b 80000000 33 14
cp命令是数据拷贝命令,用于将DRAM中的数据从一段内存中拷贝到另一段内存中该命令同样使用[.b, .w, .l]来指定操作格式,source表示为内存源地址,target表示为目标地址,count为拷贝的长度。
例如,使用.b格式将0x80000000开始地址处的0x14个字节拷贝到0x80000100地址处,命令如下所示:
=>cp.b 80000000 80000100 14 //or =>cp.b 0x80000000 0x80000100 14
cmp命令用于比较两段内存的数据是否相等,该命令同样使用[.b, .w, .l]来指定操作格式,addr1为第一段内存首地址,addr2为第二段内存首地址,count表示要比较的长度。
例如,使用.b格式来比较0x80000000和0x80000100两个地址的数据是否相等,比较的长度为0x14个字节,命令如下:
=>cmp.b 80000000 80000100 14
emmc相关操作命令
对于uboot来说是支持emmc或者sd卡,因此也需要提供给用户emmc和sd卡的相关操作命令,uboot中常用于操作mmc设备的命令为"mmc",mmc是一系列的命令,它的后面可以跟不同的参数。
=>mmc info //输出mmc设备的信息 =>mmc read //读取mmc设备中的数据 =>mmc write //向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_CONFIG的值 =>mmc rst mmc //设备复位 =>mmc setdsr //设置mmc设备DSR寄存器的值
mmc info命令用来显示当前选中的mmc设备的信息,直接输入下面的命令即可:
=>mmc info
mmc rescan命令用于扫描当前目标板上所有的mmc设备,包括eMMC和SD卡,命令输入如下:
=>mmc rescan
mmc list命令可用于查看当前目标板共有多少个mmc设备,输入命令如下:
=>mmc list
mmc dev命令可以用来切换当前的mmc设备,命令格式如下:
=>mmc dev [dev] [part]
其中[dev]表示要切换的mmc设备号,[part]是mmc设备的分区号,如果不写分区号,则默认为分区0。
例如,使用命令切换到eMMC设备:
#当0为SD卡,1为eMMC时 =>mmc dev 1
mmc part命令可以用来查看当前mmc设备的分区,例如查看当前sd卡中的分区:
=>mmc dev 0 =>mmc part
mmc read命令可用于读取mmc设备的数据,它的使用格式如下所示:
=>mmc read addr blk# cnt
其中addr是将数据读取到DRAM中的地址,blk是要读取的块起始地址,一块为512字节,cnt则是要读取的块的数量。
例如,从当前的SD卡设备的第2048块开始,读取20个块数据到DRAM的0x80000100地址处,该命令如下:
=>mmc list=> mmc dev 0 =>mmc read 80000100 800 14
mmc write命令可以将DRAM中的数据写入到mmc设备里面,其命令的格式如下所示:
=>mmc write addr blk# cnt
其中addr是要写入到mmc设备中的数据在DRAM中的起始地址,blk是要写入mmc的块起始地址,cnt是要写入的块数量,一个块的大小为512字节。
例如,将DRAM地址0x80000100开始的数据,从mmc设备的2048个块开始烧写,烧写20个块,命令如下:
=>mmc list =>mmc part =>mmc write 80000100 2048 14
mmc erase可以用来擦除mmc设备中指定的块,其使用命令格式如下:
=>mmc erase blk# cnt
其中blk是要擦除的起始块,cnt是要擦除的块数量。
例如,可以使用下面的命令擦除mmc设备从2048个块开始的20个块:
=>mmc list =>mmc part =>mmc erase 800 14
USB设备相关操作命令
=>help usb //查看uboot支持的usb命令 =>usb start //(U盘插入)USB接口挂载U盘设备 =>usb reset //重置(挂载)U盘设备 =>usb dev //查看检测到的USB设备 =>usb info //列出板子上USB主接口的属性 =>usb storage //列出U盘的设备信息 =>usb tree //列出Device Tree =>usb part //列出U盘设备的分区信息 =>usb stop //停止设备(挂载)
uboot模式下,操作U盘中的文件需要借助FAT文件系统,不管是U盘或MMC,或其他存储设备,都可以用FAT文件系统统一操作。
(执行 help 中可以看到有3个fat命令:fatls、 fatinfo、 fatload)
=>fatinfo usb 0 //查看U盘的信息 =>fatls usb 0 //列出U盘上的文件系统目录结构(目录/文件) =>fatload usb 0 x2000000 uboot.bin //将U盘上的uboot.bin文件读到x2000000 的地址处
FAT格式文件系统相关操作命令
当我们需要在uboot中对SD卡或者eMMC设备中存储的文件进行操作时,这个时候就需要用到uboot中文件系统的操作命令,对于FAT格式的文件系统操作相关的命令有fatinfo、fatls、fstype、fatload、fatwrite等。
fatinfo命令用来查询mmc设备中指定分区的文件系统信息,
=>fatinfo <interface> [<dev[:part]>]
用法中, 表示要查看的接口,例如mmc,[]中的dev表示要查询的设备号,part则表示要查询的分区。
例如,当前我的目标板有个sd卡设备,查看sd卡中分区1的文件系统信息,可以使用下面的命令:
=>mmc list =>mmc part =>fatinfo mmc 0:1
fatls命令可以用于查询FAT格式文件系统的目录和文件信息
=>fatls <interface> [<dev[:part]>]
用法中,表示要查询的接口,[]中dev表示要查询的设备号,part表示要查询分区,[directory]表示要查询的目录,如果该参数不输入的话,默认为根目录。
例如,查询我当前sd卡中分区1中的目录和文件,可以输入下面命令:
=>fatls mmc 0:1
当我们再想查看img/目录下的目录或者文件时,可以使用下面的命令:
=>fatls mmc 0:1 img/
fstype命令可以用于查看mmc设备中某个分区的文件系统格式
=>fstype <interface> <dev>:<part>
fstype命令具有两个用法,第一个用来查看mmc设备分区中的文件系统类型,第二个则是用来设置文件系统类型的环境变量,对于第一个命令用法,表示接口,例如mmc,:中dev则表示要查询的设备号,part则是设备的分区。
例如,查看我当前目标板中sd设备的第一个分区的文件系统类型,可以使用下面命令:
=>fstype mmc 0:1
fatload命令用来将指定的文件读取到DRAM内存中
=>fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
用法中,表示设备接口,例如mmc,[中的dev表示设备号,part表示mmc设备的分区,则是文件读取到DRAM中的起始地址,则是要读取的文件的名字,bytes表示要读取多少字节的数据,如果该值为0或者未使用,则表示将要读取整个文件,pos表示要读的文件相对于文件首地址的偏移,如果为0或者未使用,则表示从文件首地址开始读取。
例如,在我当前的目标帮中,将sd卡中第一个分区中的img/u-boot-imx6ul14x14evk_nand.imx文件读取到DRAM中0x80000100起始地址中,可以使用下面的命令:
=>fatls mmc 0:1 img/ =>fatload mmc 0:1 80000100 img/u-boot-imx6ul14x14evk_nand.imx
fatwrite命令需要注意的是,当在uboot的板级配置文件中定义了#define CONFIG_CMD_FAT宏,fatinfo、fatls、fatload命令才会出现在uboot命令中,而fatwrite命令则需要定义#define CONFIG_FAT_WRITE宏才会出现,因此,如果想要在uboot中使用fatwrite命令,则需要定义宏CONFIG_FAT_WRITE。
fatwrite命令可以用于将DRAM中的数据写入到mmc设备中去,该命令的使用格式如下:
=>fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>
命令格式中,表示为接口,例如mmc,中dev表示为设备号,part表示为mmc设备的分区,则为要写入的数据在DRAM中的起始地址,表示写入的数据文件的名字,表示要写入的字节数。
例如,在我的目标板系统中从DRAM地址0x80000100开始写20个字节,在sd卡设备的分区1中生成test.bin文件,可以使用下面命令:(在Linux嵌入式调试中,可以使用该命令进行uboot或者zImage文件的更新)
=>mmc list=> fatls mmc 0:1 =>fatwrite mmc 0:1 80000100 test.bin 14 =>fatls mmc 0:1
EXT格式文件系统相关操作命令
uboot中除了有FAT格式文件系统的相关操作命令外,还有EXT格式文件系统的相关操作命令,这些命令和实现的功能如下所示:
=>ext2load //从Ext2文件系统中加载二进制文件到DRAM中 =>ext2ls //列举目录中的文件 =>ext4load //从Ext4文件系统中加载二进制文件到DRAM中 =>ext4ls //列举目录中的文件 =>ext4size //修改文件大小 =>ext4write //在root目录下新创建文件
以上命令的使用方式和FAT格式文件系统相关命令的使用方式相同。
例如,当前我目标板上的sd卡设备中的分区2是ext2文件系统,可以使用下面命令查询分区2中的目录和文件:
=>mmc list =>mmc part =>ext2ls mmc 0:2
Nand Flash相关操作命令
uboot中除了有emmc子系统外,还具有nand子系统。在uboot中输入下面的命令可以查看nand子系统所支持的所有命令:
=>? nand
nand info 命令可以用来打印目标板上Nand Flash的相关信息:
=>nand info
nand device命令能用于显示Nand Flash的信息,也能用于切换目标板上的Nand Flash,如果目标板支持多块Nand Flash的话,可以使用该命令进行切换。
nand erase 命令可以用于擦除Nand Flash,在对Nand Flash中写入数据之前,必须要先对写的区域进行擦除, 然后才能保证数据能写入进擦除的区域内,nand erase命令的形式有3种,如下:
第一种形式如下:
=>nand erase[.spread][clean] off size //off表示Nand Flash的偏移地址,也就是要擦除区域的起始地址,size表示要擦除的区域大小。
例如,可以使用下面的命令将Nand Flash存储Linux内核镜像zImage的区域进行擦除:
=>nand erase 0x400000 0x1000000
第二种形式如下:
=>nand erase.part [clean] //part表示擦除指定的区域。
第三种形式如下:
=>nand erase.chip [clean] //该形式将会将整个Nand Flash进行擦除,nand erase命令一般是配合nand write命令使用。
nand read命令可以用于从Nand Flash中指定的地址读取指定大小的数据到DRAM中,该命令的使用格式如下:
=>nand read - addr off|partition size
命令使用格式中,addr表示DRAM的地址,off表示要读取的Nand Flash的区域的起始地址,size表示要读取的数据大小。
例如,可以使用下面的命令读取Linux内核镜像zImage文件到DRAM的0x80800000地址处:
=>nand read 0x80800000 0x400000 0x1000000
nand write命令可以用于向Nand Flash中指定的地址写入指定大小的数据,一般和nand erase命令结合使用,还可以用来更新Nand Flash中的boot、kernel和dtb等文件,该命令的使用格式如下:
=>nand write [addr][off] [partition][size]
和nand read命令类似,addr表示要写入的数据的开始地址,off表示Nand Flash中写入的起始地址,size表示要写入的数据大小。
例如,使用该命令并结合fatload命令进行Linux内核镜像zImage和dtb文件更新,将我们需要更新的文件放入到SD卡中,使用fatload命令将需要更新的zImage和dtb写入到DRAM中,然后使用nand write命令更新到Nand Flash中,如下:
将需要更新的zImage镜像文件读入到DRAM中:
=>fatload mmc 0:1 0x80800000 img/zImage
擦除Nand Flash中存储zImage的区域,并将DRAM中的zImage更新到Nand Flash中:
=>nand erase 0x400000 0x1000000 =>nand write 0x80800000 0x400000 0x1000000
将需要更新的dtb设备树文件读入到DRAM中:
=>fatload mmc 0:1 0x83000000 img/imx6ul-14x14-evk.dtb
擦除Nand Flash中存储dtb设备树的区域,并将DRAM中的dtb文件更新到Nand Flash中:
=>nand erase 0x1400000 0x80000 =>nand write 0x83000000 0x1400000 0x80000
还可以使用bootz命令启动Linux内核,使用下面命令即可:
=>bootz 0x80800000 - 0x83000000
i2c操作
在uboot环境下直接输入i2c可获取i2c命令帮助
=> i2c i2c - I2C sub-system Usage: i2c bus [muxtype:muxaddr:muxchannel] - show I2C bus info crc32 chip address[.0, .1, .2] count - compute CRC32 checksum i2c dev [dev] - show or set current I2C bus i2c loop chip address[.0, .1, .2] [# of objects] - looping read of device i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing) i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill) i2c nm chip address[.0, .1, .2] - write to I2C device (constant address) i2c probe [address] - test for and show device(s) on the I2C bus i2c read chip address[.0, .1, .2] length memaddress - read to memory i2c write memaddress chip address[.0, .1, .2] length [-s] - write memory to I2C; the -s option selects bulk write in a single transaction i2c reset - re-init the I2C Controller i2c speed [speed] - show or set I2C bus speed
在i2c子系统中,i2c bus可以查看系统中有几路i2c总线。
=> i2c bus Bus 0: fsl_0 Bus 1: fsl_1 Bus 2: fsl_2 Bus 3: fsl_3
i2c dev可以查看现在操作的是哪个bus,i2c dev [dev]可切换所操作的i2c总线。
=> i2c dev Current bus is 0 => i2c dev 1 Setting bus to 1 => i2c dev Current bus is 1
i2c probe可以检测出当前bus上有多少个设备,且slaveID是多少。
=> i2c probe Valid chip addresses: 32 4C 54 5C 6A
i2c md mm mw nm命令分别为向i2c读写命令,命令格式类似内存操作,详见本问uboot常用命令中内存操作小结,例如:向slaveID为0x32的设备写入三个值分别为0,1,2
=> i2c mw 0x32 0 0 => i2c mw 0x32 1 1 => i2c mw 0x32 2 2
以上命令每次只能写一个值,使用下面的命令可连续填充
=> i2c mw 0x32 0 2 8
执行后可以看到从00-07的8个值都被写为02。
另外,我们还可以将值写入内存中,使用i2c write命令将内存中的值写入i2c设备中。首先在内存0x10000000处写入三个值0,1,2
mw.b 10000000 00 mw.b 10000000 01 mw.b 10000000 02 => md.b 10000000 10000000: 00 01 02 ef de ad be ef de ad be ef de ad be ef ................
接下来使用i2c write命令将内存中10000000处的值写入i2c设备0x32中。
=> i2c write 10000000 0x32 0 3
i2c read可将内容读到内存中,然后使用md命令查看
=> i2c read 0x4C 0 3 10000000 => i2c md 0x4C 0 0000: 19 13 19 19 19 19 19 19 19 19 19 19 19 19 19 19 ................ => md.b 10000000 10000000: 19 13 19 ef de ad be ef de ad be ef de ad be ef ................
eeprom操作
在u-boot环境输入eeprom即可获得eeprom命令帮助
=> eeprom eeprom - EEPROM sub-system Usage: eeprom read <bus> <devaddr> addr off cnt eeprom write <bus> <devaddr> addr off cnt - read/write `cnt' bytes from `devaddr` EEPROM at offset `off'
eeprom只有读写命令,devaddr表示eeprom的地址,也就是0x4C,而后一个参数addr则是表示将read的数据存在这个地址中,off表示偏移量,cnt表示读取多少个字节的数据。
=> eeprom read 0x4C 10000000 0 8 EEPROM @0x4C read: addr 10000000 off 0000 count 8 ... done => md.b 10000000 10000000: 19 13 19 19 19 19 19 19 de ad be ef de ad be ef ................
SPI Flash操作
检测系统中存在哪些spi 设备
=> sf probe
从Flash中读取数据
=> sf probe SF: Detected w25q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiB => sf read 0x10000000 0 5 device 0 offset 0x0, size 0x5 SF: 5 bytes @ 0x0 Read: OK => md.b 10000000 10000000: aa 55 aa 55 01 ad be ef de ad be ef de ad be ef .U.U............
擦除Flash中的数据
=> sf erase 0 10
向Flash写入数据(将内存0x10000000处的10字节数据写入Flash0x00处)
=> sf write 0x10000000 0 10
注:每次向Flash写入数据时,都要先进行擦除动作。操作flash之前需要先执行sf probe命令。
通过CRT串口向uboot发送文件
在uboot环境下向uboot传输文件可通过网口,内存卡,usb等,也可通过串口传输,下面将介绍使用Xmodem协议向uboot传输文件。
=> loadx $loadaddr
输入以上命令uboot会等待用户传输文件。
然后点击CRT串口上方传输按钮选择发送Xmodem
然后选择将要传输的文件即可开始传输
BOOT启动相关操作命令
我们都知道uboot最主要的工作就是引导启动Linux系统,因此uboot中肯定是有相关的boot启动命令的,和boot启动常用相关的命令有boot、bootm和bootz,接下来,我们了解一下这些命令的使用boot命令是用来启动Linux系统的,可以看到到,该命令将会运行bootcmd,也就是boot命令将会读取bootcmd这个环境变量, 并运行这个环境变量中的命令,来看一下当前我目标板中的bootcmd环境变量内容,使用下面命令查看:
=>print bootcmd
环境变量就是定义了一些启动引导的命令集合,先使用nand read命令从Nand Flash中读取kernel和dtb在DRAM内存地址中,然后使用bootz命令启动Linux系统。
bootm命令用于启动uImage镜像:
=>bootm [addr [args]]
其中addr就是uImage镜像文件在DRAM的起始地址,另外它还有一些参数,如果要使用dtb或initrd的话,则就是在后面添加对应的DRAM地址。
bootz命令也是用来启动Linux系统,只不过启动的是Linux zImage镜像文件:
=>bootz [addr [initrd[:size]][fat]]
命令中的addr是DRAM内存Linux镜像文件的起始地址,initrd是initrd文件在DRAM中的地址,fdt是设备树在DRAM中的地址,如果没有使用到initrd文件的话,则使用'-'进行替代,对于Linux镜像和设备树文件,我们可以通过读取eMMC或Nand Flash到DRAM中,当然,如果在网络接口可以使用的情况下,也可以使用NFS或TFTP服务将镜像下载到DRAM中, 启动的原理是一样的。
例如,当Nand Flash中存储着我们需要启动的Linux系统镜像和设备树文件的话,可以使用下面命令进行启动:
先读取Linux zImage镜像到DRAM的0x80800000处:
=>nand read 0x80800000 0x400000 0x1000000
然后读取设备树文件到DRAM的0x83000000处:
=>nand read 0x83000000 0x1400000 0x80000
使用bootz启动引导Linux系统:
=>bootz 0x80800000-0x83000000
其它常用uboot命令
除了上面提及到的一些常用命令以外,uboot中还有一些另外常用的命令,例如reset、go、run和mtest等,接下来看看这些命令的使用。
reset命令能用来复位CPU:
=>reset
go命令能用于跳转到指定的内存地址处执行应用程序
=>go addr [args]
命令用法中的addr就是内存的地址,将应用程序下载到该内存地址后,用go跳转到该地址处,将会执行该应用程序。
例如,编写一个简单的GPIO电平控制汇编程序gpioctrl.S编译产生gpioctrl.bin文件后,将.bin文件拷贝到SDCard中,在uboot中使用fatload命令加载到内存0x87800000地址处,并使用go命令执行程序:
=>fatload mmc 0:1 0x87800000 gpioctrl.bin => go 0x87800000
程序运行后,对应的GPIO电平将得到控制。
run命令能用来运行环境变量中定义的命令
例如通过run bootcmd来运行bootcmd中定义的启动命令,能将Linux系统进行启动,
该命令能运行我们自己定义的环境变量,用法如下
=>run var [... ]
用法中的var就是定义好的环境变量。
接下来,举例说明该命令如何使用,例如,当前目标板是Nand Flash启动的,我们想要通过SDCard去更新Nand Flash中存储的kernel和dtb,该怎么操作呢?可以将需要更新的固件保存到SDCard里面,然后通过fatload命令将需要更新的固件读入到DRAM里面,再通过nand write命令更新到NandFlash里面,命令非常多,我们可以将这些使用到的命令定义为一个环境变量,然后在uboot中run var即可,在调试Linux系统的时候将会非常方便,接下来,看看怎么操作。
在uboot中使用下面命令,创建updatecmd环境变量并将环境变量进行保存:
=>setenv updatecmd 'fatload mmc 0:1 0x80800000 zImage;nand erase 0x400000 0x1000000;nand write 0x80800000 0x400000 0x1000000;fatload mmc 0:1 0x83000000 imx6ul-14x14-evk.dtb;nand erase 0x1400000 0x80000;nand write 0x83000000 0x1400000 0x80000' =>saveenv
使用print命令查看updatecmd环境变量是否创建成功:
=>print updatecmd
接下来,将保存了需要更新固件的SDCard接入到目标板中,并使用run命令进行固件更新:
=>run updatecmd
命令运行后,固件更新成功(使用该命令能很方便地在uboot中完成了kernel和dtb固件的更新)。
mtest命令能用于进行内存读写测试,例如可以用来测试目标板DDR的稳定性,该命令的用法如下:
=>mtest [start [end [pattern [iterations]]]]
命令用法中的start是DRAM内存的起始地址,end是内存的结束地址,
例如我们向测试0x80000000到0x87800000这段内存,可以使用下面命令:
=>mtest 80000000 87800000
测试的时候,如果想退出测试的话,可以使用键盘上的"Ctrl+C"组合键。