信息查询有关的命令有 3 个:bdinfo、printenv 和 version。
bdinfo 命令,此命令用于查看板子信息,直接输入“bdinfo”即可,可以查看 DRAM 的起始地址和大小、启动参数保存起始地址、波特率、sp(堆栈指针)起始地址等信息。printenv用于输出环境变量信息,uboot 也支持 TAB 键自动补全功能,输入“print”然后按下 TAB 键就会自动补全命令,直接输入“print”也可。比较关键的baudrate、board_name、board_rec、boot_fdt、bootcmd等等。uboot 中的环境变量都是字符串
#设置修改环境变量 setenv bootdelay 5 saveenv #有时候我们修改的环境变量值可能会有空格 setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw' saveenv #删除环境变量 setenv author saveenv
- 内存操作命令
内存操作命令就是用于直接对 DRAM 进行读写操作的,常用的内存操作命令有 md、nm、mm、mw、cp 和 cmp。我们依次来看一下这些命令都是做什么的。
1.md 命令用于显示内存值
md[.b, .w, .l] address [# of objects]
命令中的[.b .w .l]对应 byte、word 和 long,也就是分别以 1 个字节、2 个字节、4 个字节来显示内存值。address 就是要查看的内存起始地址,[# of objects]表示要查看的数据长度
2.nm 命令用于修改指定地址的内存值
nm [.b, .w, .l] address
nm 命令同样可以以.b、.w 和.l 来指定操作格式,比如现在以.l 格式修改 0x80000000 地址的数据为 0x12345678。输入命令:nm.l 80000000 回显 80000000 6743241B ?然后输入设置值后 按“Enter”,q退出
3.mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增。比如以.l 格式修改从地址 0x80000000 开始的连续 3 个内存块(3*4=12个字节)的数据为 0X05050505
4.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 是数据拷贝命令,用于将 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 [.b, .w, .l] addr1 addr2 count
addr1 为第一段内存首地址,addr2 为第二段内存首地址,count 为要比较的长度。我们使用.l 格式来比较 0x80000000 和 0X80000100 这两个地址数据是否相等,比较长度为 0x10 个内存块(16 * 4=64 个字节),命令如下所示:cmp.l 80000000 80000100 10
- 网络操作命令
网络信息配置命令
#设置静态ip信息: setenv ipaddr 192.168.1.50 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 //服务器 IP 地址,也就是 Ubuntu 主机 IP 地址,用于调试代码。 saveenv #ping ping #dhcp dhcp
文件传输命令
1.nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中,这就是网络调试
#nfs 加载Ubuntu的内核到DRAM #nfs 80800000 192.168.1.253:/home/zuozhongkai/linux/nfs/zImage nfs [loadAddress] [[hostIPaddr:]bootfilename] #tftp 略...
2.mmc子命令,注意这个命令操作对象是扇区不是文件 uboot 支持 EMMC 和 SD 卡,因此也要提供 EMMC 和 SD 卡的操作命令。一般认为 EMMC和 SD 卡是同一个东西,统一使用 MMC 来代指 EMMC 和 SD 卡。uboot 中常用于操作 MMC 设备的命令为“mmc”。mmc的 read和write 是以扇区为基本单位,比如如下的“mmc read” 其实一共读取了0x600*0x10*512byte的数据;mmc write 重新编译了uboot后放在Ubuntu上通过tftp下载到DRAM 然后写入SD卡,写入大小0x32E(742)*512byte=379,904B uboot.imx实际大小为379904B。
mmc info //输出 MMC 设备信息 mmc read addr blk# cnt // 读取 MMC 中的数据。mmc dev 1 0 ->mmc read 80800000 600 10:从dev1,part0 第0x600个扇区开始读取16个扇区到DRAM的0x80800000 mmc write addr blk# cnt // 向 MMC 设备写入数据。tftp 80800000 u-boot.imx -> mmc dev 0 0->mmc write 80800000 2 32E: 从tftp获取新的boot.imx 到DRAM 然后写入SD卡,从第2个扇区开始,因为0,1存放着分区表 mmc rescan // 扫描 MMC 设备。 mmc dev [part] // 切换 MMC 设备。如果当前有多个SD设备,可以设置当前设备,这样会改变mmc info等命令的对象;mmc dev 1 //切换到 EMMC mmc dev 1 2// 将DEV1 的分区2设置为当前 mmc part // 列出 MMC 设备的分区。 mmc list //列出当前有效的所有 MMC 设备。 mmc hwpartition //设置 MMC 设备的分区。 mmc bootbus…… //设置指定 MMC 设备的 BOOT_BUS_WIDTH 域的值。 mmc bootpart…… //设置指定 MMC 设备的 boot 和 RPMB 分区的大小。 mmc partconf…… //设置指定 MMC 设备的 PARTITION_CONFG 域的值。 mmc rst //复位 MMC 设备 mmc setdsr //设置 DSR 寄存器的值。 mmc erase blk# cnt
3.fat32FAT 格式文件系统操作命令,注意这个命令操作对象不是是扇区是文件
uboot 默认没有使能 fatwrite 命令,需要修改板子配置头文件,比如 mx6ullevk.h、mx6ull_alientek_emmc.h 等等,板子不同,其配置头文件也不同。找到自己开发板对应的配置头文件然后添加如下一行宏定义来使能 fatwrite 命令:#define CONFIG_FAT_WRITE /* 使能 fatwrite 命令 */
//interface 表示接口,比如 mmc,dev 是查询的设备号,part 是要查询的分区 fatinfo <interface>[<dev[:part]>] //要查询 EMMC 分区 1 的文件系统信息:fatinfo mmc 1:1 fatls <interface> [<dev[:part]>] [directory] //查询 EMMC 分区 1 中的所有的目录和文件,输入命令:fatls mmc 1:1 fstype <interface> <dev>:<part> //fstype mmc 1:0 查看EMMC设备1,分区0 的文件系统信息 fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]] //bytes总量 pos偏移量将指定的文件读取到 DRAM :fatload mmc 1:1 80800000 zImage fatwrite <interface> <dev[:part]> <addr> <filename> <bytes> //tftp 80800000 zImage ->fatwrite mmc 1:1 80800000 zImage 6788f8
4.EXT 格式文件系统操作命令
uboot 有 ext2 和 ext4 这两种格式的文件系统的操作命令,常用的就四个命令,分别为:ext2load、ext2ls、ext4load、ext4ls 和 ext4write。这些命令的含义和使用与 fatload、fatls 和 fatwrite一样,只是 ext2 和 ext4 都是针对 ext 文件系统的。比如 ext4ls 命令,EMMC 的分区 2 就是 ext4格式的
5.NAND操作命令
addr 是要写入的数据DRAM首地址,off 是 NAND 中的目的地址,size 是要写入的数据大小;由于 I.MX6ULL 要求 NAND 对应的 uboot 可执行文件还需要另外包含 BCB 和 DBBT,因此直接编译出来的 uboot.imx 不能直接烧写到 NAND 里面,需要kogs-ng工具,但SD卡却可以这样操作
//interface 表示接口,比如 mmc,dev 是查询的设备号,part 是要查询的分区 nand info //NAND Flash 信息 nand device [dev] //切换当前的NAND Flash,如果你的板子支持多片 NAND //NAND 的擦除命令一般是配合写命令的 nand erase[.spread] [clean] off size //从指定地址开始(off)开始,擦除指定大小(size)的区域。 nand erase.part [clean] partition //擦除指定的分区 nand erase.chip [clean] //全片擦除 nand write addr off size // nand read addr off size //nand read 0x83000000 0x520000 0x19000 从NAND的0x520000地址开始读取0x19000B到DRAM的地址0x83000000
一个典型的NAND分区信息,一共有六个分区,第一个分区存放 uboot,地址范围为 0x0~0x3FFFFF(共 4MB);第二个分区存放 env(环境变量),地址范围为 0x400000~0x420000(共 128KB);第三个分区存放 logo(启
动图标),地址范围为 0x420000~0x51FFFF(共 1MB);第四个分区存放 dtb(设备树),地址范围为0x520000~0x61FFFF(共 1MB);第五个分区存放 kernel(也就是 linux kernel),地址范围为0x620000~0xE1FFFF(共 8MB);剩下的所有存储空间全部作为最后一个分区,存放 rootfs(根文件系统)。nand write 命令可以烧写 kernel 和 dtb,但不能直接烧写uboot
0x000000000000-0x0000003FFFFF (4MB): "boot" 0x000000400000-0x00000041FFFF : "env" 0x000000420000-0x00000051FFFF : "logo" 0x000000520000-0x00000061FFFF : "dtb" 0x000000620000-0x000000E1FFFF : "kernel" 0x000000E20000-0x000020000000 : "rootfs"
烧写kernel 命令:
tftp 0x87800000 zImage //下载 zImage 到 DRAM 中 nand erase 0x620000 0x800000 //从地址 0x620000 开始擦除 8MB 的空间 nand write 0x87800000 0x620000 0x800000 //将接收到的 zImage 写到 NAND 中
6.BOOT操作命令
uboot 的本质工作是引导 Linux,所以 uboot 肯定有相关的 boot(引导)命令来启动 Linux。常用的跟 boot 有关的命令有:bootz、bootm 和 boot。addr 是 Linux 镜像文件在 DRAM 中的位置,initrd 是 initrd 文件在
DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可,fdt 就是设备树文件在 DRAM 中的地址。
bootz [addr [initrd[:size]] [fdt]] //tftp 80800000 zImage->tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb ->bootz 80800000 - 83000000 bootm [addr [initrd[:size]] [fdt]] //如果使用设备树bootm=bootz bootm addr //不使用设备树直接启动 boot //使用bootcmd 脚本启动 //boot tftp启动 setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000' saveenv boot //boot EMMC启动 setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000' savenev boot
前面说过 uboot 倒计时结束以后就会启动 Linux 系统,其实就是执行的 bootcmd 中的启动命令。只要不修改 bootcmd 中的内容,以后每次开机 uboot 倒计时结束以后都会使用 tftp 命令从网络下载 zImage 和 imx6ull-14×14-emmc-7-1024×600-c.dtb,然后启动 Linux。在启动 Linux 内核的时候可能会遇到如下错误:
“Kernel panic – not Syncing: VFS: Unable to mount root fs on unknown-block(0,0)”
这个错误的原因是 linux 内核没有找到根文件系统,这个很正常,因为没有设置 uboot 的bootargs 环境变量,关于 bootargs 环境变量后面会讲解!此处我们重点是验证 boot 命令,linux内核已经成功启动了,说明 boot 命令工作正常。
7.其它常用命令
reset //重启复位 go addr [arg ...] //跳到指定的地址处执行应用 tftp 87800000 printf.bin ->go 87800000 //run 命令:用自己定义的环境变量脚本启动 他与boot的区别是 boot 只用运行bootcmd setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000' setenv mybootnand 'nand read 80800000 4000000 800000;nand read 83000000 6000000100000;bootz 80800000 - 83000000' setenv mybootnet 'tftp 80800000 zImage; tftp 83000000imx6ull-14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000' saveenv run mybootemmc //EMMC 启动 run mytoobnand //NAND 启动 run mybootnet //网络启动