目录
前言
1、信息查询命令(bdinfo、printenv、versionn)
2、环境变量操作命令(setenv、saveenv)
3、内存操作指令(md、nm、mm、mw、cp、cmp)
4、网络操作命令(ping、dhcp、nfs、tftp)
5、EMMC和SD卡操作命令
6、FAT格式文件系统操作命令(fatinfo、fatls、fstype、fatload、fatwrite)
7、EXT格式文件系统操作命令
8、NAND操作命令
9、BOOT操作命令
10、其他一些常用命令(reset、go、run)
前言
以下内容为学习正点原子阿尔法开发板(I.MAX6ULL Linux开发板)U-BOOT使用章节的备忘总结。
1、信息查询命令(bdinfo、printenv、versionn)
bdinfo
printenv
version
2、环境变量操作命令(setenv、saveenv)
setenv 用于设置和修改环境变量的值;当设置的内容为空时setenv用于删除环境;saveenv用于保存修改后的环境变量;一般环境变量是存放在外部 flash中的,uboot启动的时候会将环境变量从 flash读取到 DRAM中。所以使用命令 setenv修改的是 DRAM中的环境变量值,修改以后要使用 saveenv命令将修改后的环境变量 保存到 flash中,否则的话uboot下一次重启会继续使用以前的环境变量值。
3、内存操作指令(md、nm、mm、mw、cp、cmp)
1、.b .w .l分别表示以byte、word、long显示
2、address就是要查看的内存起始地址
3、数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度 为20(十六进制为 0x14),如果显示格式为 .b的话那就表示 20个字节;如果显示格式为 .w的话就表示 20个 word,也就是 20*2=40个字节;如果显示格式为 .l的话就表示 20个 long,也就是20*4=80个字节。
4、uboot命令中的数字都是十六进制的!不是十进制的!
(1)显示内存值:md[.b, .w, .l] address [# of objects]
(2)修改指定地址的内存值,修改后地址不自增:nm [.b, .w, .l] address
(3)修改指定地址的内存值,修改后地址会自增:mm [.b, .w, .l] address
(4)用指定的数据填充内存:mw [.b, .w, .l] address value [count]
(5)数据拷贝:cp [.b, .w, .l] source target count
将 DRAM中的数据从一段内存拷贝到另一段内存中,或者把 Nor Flash中的数据拷贝到 DRAM
(6)数据比较:cmp [.b, .w, .l] addr1 addr2 count
4、网络操作命令(ping、dhcp、nfs、tftp)
使用网络操作命令前,先设置好环境变量
环境变量 | 描述 |
ipaddr | 开发板ip地址,可以不设置,使用 dhcp命令来从路由器获取 IP地址。 |
ethaddr | 开发板的MAC地址,一定要设置。 |
gatewayip | 网关地址。 |
netmask | 子网掩码。 |
serverip | 服务器IP地址,也就是 Ubuntu主机 IP地址,用于调试代码。 |
(1)查看网络连接状态:ping
(2)自动获取IP地址:dhcp
(3)从ubuntu主机中下载文件:nfs [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress是要保存的DRAM地址,[[hostIPaddr:]bootfilename]是要下载的文件地址
nfs(Network File System)网络文件系统,通过 nfs可以在计算机之间通过网络来分享资源,比如我们将linux 镜像和设备树文件放到 Ubuntu中,然后在 uboot中使用nfs命令将Ubuntu中的linux镜像和设备树下载到开发板的DRAM中。这样做的目的是为了方便调试linux镜像和设备树,也就是网络调试,通过网络调试是 Linux开发中最常用的调试方法。原因是嵌入式 linux开发不像单片机开发,可以直接通过 JLINK或 STLink等仿真器将代码直接烧写到单片机内部的 flash中,嵌入式 Linux通常是烧写到 EMMC、 NAND Flash、 SPI Flash等外置 flash中,但是嵌入式 Linux开发也没有 MDK IAR这样的 IDE,更没有烧写算法,因此不可能通过点击一个download”按钮就将固件烧写到外部 flash中。虽然半导体厂商一般都会提供一个烧写固件的软件,但是这个软 件使用起来比较复杂,这个烧写软件一般用于量产的。
(4)从ubuntu主机中下载文件:tftp [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress是要保存的DRAM地址,[[hostIPaddr:]bootfilename]是要下载的文件地址(使用TFTP时可以不用指定全名称,前提是在ubuntu主机上开启了tftpd服务并将该文件放置在了tftp服务器文件夹下)
5、EMMC和SD卡操作命令
(1)切换当前的mmc设备:mmc dev [dev] [part]
[dev]:用来设置要切换的MMC设备设备号(0是SD卡、1是eMMC),
[part]:是分区号。如果不写分区号的话默认为分区 0。
使用如下命令切换到 SD卡:
mmc dev 0 //切换到 SD卡, 0为 SD卡, 1为 eMMC
(2)查看分区:mmc part
比如查看 EMMC的分区情况,输入如下命令:
mmc dev 1 //切换到 EMMC
mmc part //查看 EMMC分区
图中可以看出,此时 EMMC有两个分区,扇区 20480~1024000为第一个分区,扇区 1228800~6504448为第二个分区。如果 EMMC里面烧写了 Linux系统的话, EMMC是有3个分区的,第 0个分区存放 uboot,第 1个分区存放 Linux镜像文件和设备树,第 2个分区存放根文件系统。但是在图中只有两个分区,那是因为第 0个分区没有格式化,所以识别不出来,实际上第 0个 分区是存在的。
(3)读取指令: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 //读取数据
(4)写指令: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设备中。
比如更新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需要这一步!
6、FAT格式文件系统操作命令(fatinfo、fatls、fstype、fatload、fatwrite)
(1)查询指定分区的文件系统信息:fatinfo <interface> [<dev[:part]>]
interface:表示接口,比如 mmc
dev:是查询的设备号,0为SD卡、1为EMMC
part:是要查询的分区
(2)查询FAT格式设备的目录和文件信息:fatls <interface> [<dev[:part]>] [directory]
interface:表示接口,比如 mmc
dev:是查询的设备号,0为SD卡、1为EMMC
part:是要查询的分区
directory:是要查询的目录
(3)查询MMC设备某个分区的文件系统格式:fstype <interface> <dev>:<part>
interface:表示接口,比如 mmc
dev:是查询的设备号,0为SD卡、1为EMMC
part:是要查询的分区
fstype mmc 1:0 //查看EMMC分区0的文件系统格式
fstype mmc 1:1 //查看EMMC分区1的文件系统格式
fstype mmc 1:2 //查看EMMC分区2的文件系统格式
(4)将指定的文件读取到DRAM中:fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
interface:表示接口,比如 mmc
dev:是查询的设备号,0为SD卡、1为EMMC
part:是要查询的分区
addr:保存在DRAM中的起始地址
filename:要读取的文件名字
bytes:表示要读取多少字节的数据,为0或省略表示读取整个文件
pos:要读取的数据相对于文件首地址的偏移,为0或省略表示从文件首地址开始读取
fatload mmc 1:1 80800000 zImage //将EMMC分区1中的zImage文件读取到DRAM中的80800000地址处
(5)将DRAM中的数据写入到MMC设备中:
fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>
interface:表示接口,比如 mmc
dev:是查询的设备号,0为SD卡、1为EMMC
part:是要查询的分区
addr:要写入的数据在DRAM中的起始地址
filename:要写入的文件名字
bytes:表示要写入多少字节的数据,为0或省略表示写入整个文件
7、EXT格式文件系统操作命令
这两种格式的文件系统的操作命令,常用的就四个命令,分别为:ext2load、 ext2ls、 ext4load、 ext4ls、ext4write。这些命令的含义和使用与 fatload、 fatls和 fatwrit一样,只是 ext2和 ext4都是针对 ext文件系统的。
8、NAND操作命令
9、BOOT操作命令
(1)启动Linux:bootz [addr [initrd[:size]] [fdt]]
addr:是 Linux镜像文件在 DRAM中的位置,
initrd:是 initrd文件在DRAM中的地址,如果不使用 initrd的话使用‘ ‘-’代替即可
fdt:就是设备树文件在 DRAM中的地址。
示例:通过tftp网络将zImage和设备树从ubuntu主机下载到DDR中:
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb
bootz 80800000 - 83000000
示例:通过fatload将zImage和设备树从EMMC的分区1中拷贝到DDR中:
fatload mmc 1:1 80800000 zImage
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb
bootz 80800000 - 83000000
(2)启动Linux:boot
boot 命令也是用于启动Linux;boot命令是会读取bootcmd环境变量来启动Linux,bootcmd环境变量保存着引导命令也就是启动命令的集合,具体的引导命令内容是可以修改的。
示例:通过tftp网络将zImage和设备树从ubuntu主机下载到DDR中:
setenv bootcmd '
tftp 80800000 zImage;
tftp 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb;
bootz 80800000 - 83000000;' //设置bootcmd环境变量
saveenv //保存环境变量
boot //启动Linux
示例:通过fatload将zImage和设备树从EMMC的分区1中拷贝到DDR中:
setenv bootcmd '
fatload mmc 1:1 80800000 zImage;
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb;
bootz 80800000 - 83000000;' //设置bootcmd环境变量
saveenv //保存环境变量
boot //启动Linux
10、其他一些常用命令(reset、go、run)
(1)重启:reset
(2)跳转到指定地址处执行应用:go addr [arg ...];多用于调试裸机程序
addr:应用在DRAM中的首地址
(3)运行环境变量中定义的命令:run 环境变量;多用于运行自定义环境变量