注:参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.6
一、help命令
进入 uboot 的命令行模式以后输入“help”或者“?”,然后按下回车即可查看当前 uboot 所支持的命令:
help”或者“?
图中只是 uboot 的一部分命令,具体的命令列表以实际为准。图中的命令并不是 uboot 所支持的所有命令,uboot 是可配置的,需要什么命令就使能什么命令,而且也可以在 uboot 中自定义命令。这些命令后面都跟有命令说明,用于描述此命令的作用,输入:
help(或?) 命令名
可以查看命令的详细用法,以“bootz”这个命令为例,我们输入如下命令即可查看“bootz”这个命令的用法:
? bootz 或 help bootz
二、信息查询命令
常用的和信息查询有关的命令有 3 个:bdinfo、printenv 和 version。
1、bdinfo 命令
用于查看板子信息,直接输入“bdinfo”,结果如图所示:
bdinfo
从图中可以得出 DRAM 的起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指针)起始地址等信息。
2、printenv命令
用于输出环境变量信息,uboot 也支持 TAB 键自动补全功能,输入“print”,然后按下回车键,环境变量如图所示:
printenv

图中有很多的环境变量,比如 baudrate、board_name、board_rec、boot_fdt、bootcmd等等。uboot 中的环境变量都是字符串,既然叫做环境变量,那么它的作用就和“变量”一样。比如 bootdelay 这个环境变量就表示 uboot 启动延时时间,默认 bootdelay=3,也就默认延时 3秒。uboot 中的环境变量是可以修改的,有专门的命令来修改环境变量的值。
3、version命令
查看 uboot 的版本号,输入“version”,uboot 版本号如图所示:
当前 uboot 版本号为 2016.03,2020 年 8 月 7 日编译的,编译器为arm-poky-linux-gnueabi-gcc,这是 NXP 官方提供的编译器,正点原子出厂系统用的此编译器编译的,但是本教程我们统一使用 arm-linux-gnueabihf-gcc。
三、环境变量操作命令
环境变量的操作涉及到两个命令:setenv 和 saveenv
1、修改环境变量setenv
命令 setenv 用于设置或者修改环境变量的值,命令 saveenv 用于保存修改后的环境变量。
命令 saveenv 使用格式为:
saveenv
比如我们要将环境变量 bootdelay 改为 5,就可以使用如下所示命令:
setenv bootdelay 5
saveenv
有时候我们修改的环境变量值可能会有空格,比如 bootcmd、bootargs 等,这个时候环境变量值就得用单引号括起来,比如下面修改环境变量 bootargs 的值:
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv
上面命令设置 bootargs 的值为“console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw”,其中“console=ttymxc0,115200”、“root=/dev/mmcblk1p2”、“rootwait”和“rw”相当于四组“值”,这四组“值”之间用空格隔开,所以需要使用单引号‘’将其括起来,表示这四组“值”都属于环境变量 bootargs。
2、新建环境变量setenv
命令 setenv 也可以用于新建命令,用法和修改环境变量一样,比如我们新建一个环境变量author,author 的值为我的名字拼音:kodo,那么就可以使用如下命令:
setenv author kodo
saveenv
3、删除环境变量setenv
删除环境变量也是使用命令 setenv,要删除一个环境变量只要给这个环境变量赋空值即可,比如我们删除掉上面新建的 author 这个环境变量,命令如下:
setenv author
saveenv
上面命令中通过 setenv 给 author 赋空值,也就是什么都不写来删除环境变量 author。
四、内存操作命令
内存操作命令就是用于直接对 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]表示要查看的数据长度,这个数据长度单位跟选择的显示格式(byte、word、long)有关。
另外要注意:uboot 命令中的数字都是十六进制的!不是十进制的!比如你想查看以 0X80000000 开始的 20 个字节的内存值,显示格式为.b 的话,应该使用如下所示命令:
md.b 80000000 14
而不是:
md.b 80000000 20
uboot 命令里面的数字都是十六进制的,所以可以不用写“0x”前缀,十进制的 20 其十六进制为 0x14,所以命令 md 后面的个数应该是 14。
2、nm 命令
nm 命令用于修改指定地址的内存值,命令格式如下:
nm [.b, .w, .l] address
nm 命令同样可以以.b、.w 和.l 来指定操作格式,比如现在以.l 格式修改 0x80000000 地址的数据为 0x12345678。输入命令:
nm.l 80000000
输入上述命令以后如图 30.4.3.2 所示:

在上图中,80000000 表示现在要修改的内存地址,0500e031 表示地址 0x80000000 现在的数据,?后面就可以输入要修改后的数据 0x12345678,输入完成以后按下回车,然后再输入 q 即可退出,如图所示:
3、mm 命令
mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增。比如以.l 格式修改从地址 0x80000000 开始的连续 3 个内存块(3*4=12个字节)的数据为 0X05050505,操作如图 30.4.3.5 所示:
nm.l 80000000050505050505050505050505q
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
5、cp 命令
cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 NorFlash 中的数据拷贝到 DRAM 中。命令格式如下:
cp [.b, .w, .l] source target count
cp 命令同样可以以.b、.w 和.l 来指定操作格式,source 为源地址,target 为目的地址,count为拷贝的长度。我们使用.l 格式将 0x80000000 处的地址拷贝到 0X80000100 处,长度为 0x10 个内存块(0x10 * 4=64 个字节),命令如下所示:
cp.l 80000000 80000100 10
6、cmp 命令
cmp 是比较命令,用于比较两段内存的数据是否相等,命令格式如下:
cmp [.b, .w, .l] addr1 addr2 count
cmp 命令同样可以以.b、.w 和.l 来指定操作格式,addr1 为第一段内存首地址,addr2 为第二段内存首地址,count 为要比较的长度。使用.l 格式来比较0x80000000 和 0X80000100 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节),命令如下所示:
cmp.l 80000000 80000100 10
五、网络操作命令
uboot 支持大量的网络相关命令,比如 dhcp、ping、nfs 和 tftpboot。在移植 uboot 的时候一般都要调通网络功能,在移植 linux kernel 的时候需要使用到 uboot 的网络功能做调试。
设置以下几个环境变量:
setenv ipaddr 192.168.1.50 //开发板ip 地址,可以使用 dhcp 命令来获取IP 地址setenv ethaddr b8:ae:1d:01:00:00 //开发板的 MAC 地址,一定要设置setenv gatewayip 192.168.1.1 //网关地址setenv netmask 255.255.255.0 //子网掩码setenv serverip 192.168.1.253 //Ubuntu 主机服务器 IP 地址,用于调试代码saveenv //保存环境变量
setenv ipaddr 192.168.1.50 //开发板ip 地址,可以使用 dhcp 命令来获取IP 地址
setenv ethaddr b8:ae:1d:01:00:00 //开发板的 MAC 地址,一定要设置
setenv gatewayip 192.168.1.1 //网关地址
setenv netmask 255.255.255.0 //子网掩码
setenv serverip 192.168.1.253 //Ubuntu 主机服务器 IP 地址,用于调试代码
saveenv //保存环境变量
网络地址环境变量的设置,确保 Ubuntu 主机和开发板的 IP地址在同一个网段内。ethaddr 为网络 MAC 地址,是一个 48bit 的地址,在同一个网段内有多个开发板的话要保证每个开发板的 ethaddr 是不同的,否则通信会有问题!设置好网络相关的环境变量以后就可以使用网络相关命令了。
1、ping 命令
开发板的网络能否使用,是否可以和服务器(Ubuntu 主机)进行通信,通过 ping 命令就可以验证,直接 ping 服务器的 IP 地址即可,如下:
ping 192.168.148.200
注:只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping命令做处理,如果用其他的机器 ping uboot 的话会失败!
2、dhcp 命令
dhcp 用于从路由器获取 IP 地址,前提得开发板连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。输入 dhcp 命令即可通过路由器获取到 IP地址:
dhcp

开发板通过 dhcp 获取到的 IP 地址为 192.168.1.137。同时在图中可以看到“warning:no boot file name;”、“TFTP from server 192.168.1.1”这样的字样。这是因为 DHCP 不单单是获取 IP 地址,其还会通过 TFTP 来启动 linux 内核。
输入“? dhcp”即可查看 dhcp 命令详细的信息:
? dhcp
3、nfs 命令
nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源。uboot 中的 nfs 命令格式如下所示:
nfs [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress 是要保存的 DRAM 地址,[[hostIPaddr:]bootfilename] 是要下载的文件地址。
这里我们将编译出来的 Linux 镜像文件 zImage 下载到开发板 DRAM 的0x80800000这个地址处。将文件 zImage 放到 Ubuntu 的 NFS 目录下,比如放到 /home/qq/NFS 这个目录下,准备好以后就可以使用 nfs 命令来将 zImage 下载到开发板 DRAM 的0X80800000 地址处,命令如下:
nfs 80800000 192.168.148.200:/home/qq/NFS/zImage
4、tftp 命令
①环境准备
tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议,Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器,需要安装 tftp-hpa 和 tftpd-hpa,命令如下:
sudo apt-get install tftp-hpa tftpd-hpasudo apt-get install xinetd
和 NFS 一样,TFTP 也需要一个文件夹来存放文件,在用户目录下新建一个目录,注意要给文件夹权限,命令如下:
mkdir /home/qq/linux/tftpbootchmod 777 /home/qq/linux/tftpboot
最后配置 tftp,安装完成以后新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目录的话自行创建,然后在里面输入如下内容:
server tftp{ socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /home/zuozhongkai/linux/tftpboot/ disable = no per_source = 11 cps = 100 2 flags = IPv4 }
完了以后启动 tftp 服务,命令如下:
sudo service tftpd-hpa start
打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容:
# /etc/default/tftpd-hpaTFTP_USERNAME='tftp'TFTP_DIRECTORY='/home/zuozhongkai/linux/tftpboot'TFTP_ADDRESS=':69'TFTP_OPTIONS='-l -c -s'
最后输入如下命令, 重启 tftp 服务器:
sudo service tftpd-hpa restart
tftp 服务器已经搭建好了,接下来就是使用了。将 zImage 镜像文件拷贝到 tftpboot 文件夹中,并且给予 zImage 相应的权限,命令如下:
cp zImage /home/zuozhongkai/linux/tftpboot/cd /home/zuozhongkai/linux/tftpboot/chmod 777 zImage
②开始下载
万事俱备,只剩验证了,uboot 中的 tftp 命令格式如下:
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。比如我们现在将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处,命令如下:
tftp 80800000 zImage
六、EMMC 和 SD 卡操作命令
一般认为 EMMC和 SD 卡是同一个东西,本教程统一使用 MMC 来代指 EMMC 和 SD 卡。uboot 中常用于操作 MMC 设备的命令为“mmc”。mmc 是一系列的命令,其后可以跟不同的参数,输入“?mmc”即可查看 mmc 有关的命令,如图所示:
mmc 后面跟不同的参数可以实现不同的功能,如下表所示:
①、 mmc info 命令
mmc info 命令用于输出当前选中的 mmc info 设备的信息,输入命令“mmc info”即可:
mmc info
还有一个与 mmc info 命令相同功能的命令:
mmcinfo
②、mmc rescan 命令
mmc rescan 命令用于扫描当前开发板上所有的 MMC 设备,包括 EMMC 和 SD 卡,输入“mmc rescan”即可。
mmc rescan
③、mmc list 命令
mmc list 命令用于来查看当前开发板一共有几个 MMC 设备,输入“mmc list”:
mmc list

可以看出当前开发板有两个 MMC 设备:FSL_SDHC:0 和 FSL_SDHC:1 (eMMC),这是因为用的是 EMMC 版本的核心板,加上 SD 卡一共有两个 MMC 设备,FSL_SDHC:0 是 SD卡,FSL_SDHC:1(eMMC)是 EMMC。默认会将 EMMC 设置为当前 MMC 设备,输入“mmc info”查询到的是 EMMC 设备信息,而不是 SD 卡。要想查看 SD 卡信息,就要使用命令“mmc dev”来将 SD 卡设置为当前的 MMC 设备。
④、mmc dev 命令
mmc dev 命令用于切换当前 MMC 设备,命令格式如下:
mmc dev [dev] [part]
[dev]用来设置要切换的 MMC 设备号,[part]是分区号。如果不写分区号的话默认为分区 0。使用如下命令切换到 SD 卡:
mmc dev 0 //切换到 SD 卡,0 为 SD 卡,1 为 eMMC

切换到 SD后,mmc0 为当前的 MMC 设备,输入命令“mmc info”可查看 SD 卡信息:
⑤、mmc part 命令
有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区,比如查看 EMMC 的分区情况,输入如下命令:
mmc dev 1 //切换到 EMMCmmc part //查看 EMMC 分区

从图 中可以看出,此时 EMMC 有两个分区,第一个分区起始扇区为 20480,长度为 262144 个扇区;第二个分区起始扇区为 282624,长度为 14594048 个扇区。
如果 EMMC 里面烧写了 Linux 系统的话,EMMC 是有 3 个分区的,第 0 个分区存放 uboot,第 1 个分区存放Linux 镜像文件和设备树,第 2 个分区存放根文件系统。但是在图 中只有两个分区,那是因为第 0 个分区没有格式化,所以识别不出来,实际上第 0 个分区是存在的。
一个新的 SD卡默认只有一个分区,那就是分区 0,所以前面讲解的 uboot 烧写到 SD 卡,其实就是将 u-boot.bin烧写到了 SD 卡的分区 0 里面。后面学习 Linux 内核移植的时候再讲解怎么在 SD 卡中创建并格式化第二个分区,并将 Linux 镜像文件和设备树文件存放到第二个分区中。
如果要将 EMMC 的分区 2 设置为当前 MMC 设备,可以使用如下命令:
mmc dev 1 2
⑥、mmc read 命令
mmc read 命令用于读取 mmc 设备的数据,命令格式如下:
mmc read addr blk# cnt
addr 是数据读取到 DRAM 中的地址,blk 是要读取的块起始地址(十六进制),一个块是 512字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区,cnt 是要读取的块数量(十六进制)。比如从 EMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM 的0X80800000 地址处,命令如下:
mmc dev 1 0 //切换到 MMC 分区 0
mmc read 80800000 600 10 //读取数据
⑦、mmc write 命令
要将数据写到 MMC 设备里面,可以使用命令“mmc write”,格式如下:
mmc write addr blk# cnt
addr 是要写入 MMC 中的数据在 DRAM 中的起始地址,blk 是要写入 MMC 的块起始地址(十六进制),cnt 是要写入的块大小,一个块为 512 字节。我们可以使用命令“mmc write”来升级 uboot,也就是在 uboot 中更新 uboot。这里要用到 nfs 或者 tftp 命令,通过 nfs 或者 tftp 命令将新的 u-boot.bin 下载到开发板的 DRAM 中,然后再使用命令“mmc write”将其写入到 MMC设备中。
TFTP下载:使用 tftp 命令将其下载到 0x80800000 地址处,命令如下:
tftp 80800000 u-boot.imx

u-boot.imx 大小为 379904 字节,379904/512=742,所以我们要向 SD 卡中写入742 个块,如果有小数的话就要加 1 个块。
写入SD卡:使用命令“mmc write”从 SD 卡分区 0 第 2 个块(扇区)开始烧写,一共烧写 742(0x2E6)个块,命令如下:
mmc dev 0 0mmc write 80800000 2 32E
写入EMMC:要在 uboot 中更新 EMMC 对应的 uboot,可以使用如下所示命令:
mmc dev 1 0 //切换到 EMMC 分区 0
tftp 80800000 u-boot.imx //下载 u-boot.imx 到 DRAM
mmc write 80800000 2 32E //烧写 u-boot.imx 到 EMMC 中
mmc partconf 1 1 0 0 //分区配置,EMMC 需要这一步!
千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!
⑧、mmc erase 命令
如果要擦除 MMC 设备的指定块就是用命令“mmc erase”,命令格式如下:
上一篇:【IMX6ULL学习笔记】三、U-BOOT Makefile详解
下一篇:【IMX6ULL学习笔记】一、Linux开发环境搭建
- 热门资源推荐
- 热门放大器推荐
- 用于 7VIN 至 16VIN、1.5V 和 1.2V 输出的 LTM4628EV DC/DC 模块稳压器的典型应用电路
- 使用 Analog Devices 的 LTC3728LIGN 的参考设计
- DER-406 - 适用于 A19 灯的 5.76 W 高 PF 非隔离降压-升压型 TRIAC 调光 LED 驱动器
- ADR5045B 5V 输出精密微功率并联模式电压基准的典型应用
- LT3970EDDB-3.42 2.5V 降压转换器的典型应用
- MC78M08BDTG 8V 电流调节器的典型应用
- LT1021DCN8-5 精密电压基准的典型应用
- DER-282 - 100W, 扁平(11 mm), LLC DC-DC转换器
- REF193 低压差开尔文连接电压基准的典型应用电路
- LT3088EM 线性稳压器用于添加软启动的典型应用













非常经典的关于LLC的杨波博士论文
5962-89541022A

XC6406PP60DL






京公网安备 11010802033920号