Uboot命令是可以配置的,需要什么命令使能什么命令就可以。我们输入help或者?即可查看命令的详细用法。help <查找的命令>
信息查询命令
常用的包括:bdinfo、printenv、version
bdinfo
bdinfo可以查到板子信息:DRAM(动态随机存储器)的起始地址和大小、启动参数保存起始地址、波特率、sp(堆指针)起始地址等信息
printenv
pritenv用于输出环境变量信息,输出有很多变量,在uboot中变量都是字符串;既然为变量,那么其中的数值肯定可以修改
version
version显得的是uboot的信息,版本号。编译日期,编译器名称等
环境变量操作命令
修改环境变量
修改环境变量涉及两个命令 : setenv、 saveenv;
- setenv用于设置修改环境变量 setenv 要修改的环境变量名称 修改的内容
- saveenv用于保存修改后的环境变量 saveenv 要保存的环境变量名称
这两者同时出现,set之后如果不保存是没有意义的
save之后会显示环境变量保存的地方
当我们修改的环境变量值出现空格的时候,这个时候修改环境变量的内容值要用单引号括起来
新建/删除环境变量
setenv也可以用于创建命令,用法和修改环境变量是一样的
删除环境变量也是使用setenv,setenv 删除的环境变量名称 <空白>
每次setenv之后都要save一下
内存操作命令
内存操作可以直接对SDRAM进行读写操作,常用命令包括md、nm、mm、mw、cp、cmp
md命令
md命令用于显示内存值:md [.b,.w,.l] address [# of objects]
命令中 .b,.w,.l 对应的是byte、word、long对应1、2、4字节来显示内存;address显示的是内存值,其为查看的起始地址;[# of objects]表示查看的数据长度,数据长度应为16进制(Ubbot命令中的数字都是16进制)
nm命令
nm命令用于修改指定地址的内存值: nm[.b,.w,.l] address
输入命令,在?后面输入要修改的数据,回车;输入’q’即可退出
mm命令
mm修改指定地址内存值 ,这个与nm区别在于,mm当你修改完一个地址后,会跳到下一个相邻的地址
mw命令
mw用于使用一个指定的数据填充一段内寸:mw[.b,.w,.l] 地址 数据 [count]
count为数据长度,填充的范围为count*使用的类型(.l,.w,.b)
cp命令
cp是数据拷贝命令,用于将DRAM中的数据从一段内存中拷贝到另一段内存:
cp[.b,.w,.l] source target count
source代表源地址、target代表目的地址、count代表拷贝的长度
cmp命令
cmp是比较命令,用于比较两段内存的数据是否相同:
cmp[.b,.w,.l] add1 add2 count
add1、add2代表要比较的两端地址,count代表比较长度
网络操作命令
ubbot支持网络,我们在移植uboot的时候一般都要调通网络功能,因为移植linux kernel的时候需使用uboot的网络功能做调试。ubbot支持大量的网络相关命令。
我们将开发板与PC连接在同一局域网内之后,我们需要设置几个环境变量:
- ipaddr:开发板ip地址,可以不设置,使用dhcp命令从路由器获取IP
- ethaddr:开发板的MAC地址
- gatewayip:网关地址
- netmask:子网掩码
- serverip:服务器ip,也就是Ubuntu的IP,用于调试代码
setenv ethaddr b8:ae:1d:01:00:00
setenv gatewayip 192.168.100.1
setenv netmask 255.255.255.0
setenv serverip 192.168.100.203
saveenv
我这里没有手动设置ip,因为我现在这个网内有太多的设备来,怕ip冲突了。当然你不设置它会使用路由器默认分配的ip;
现在我输入dhcp,就可看到我现在的ip
ping
ping是与一个ip地址建立通信,现在可用于检测开发板的网络是否可用,是否可以与Ubuntu服务器进行通信
dhcp
dhcp用于获取路由器的ip地址
在输出有有一段“warning……”、“TFTP……”的内容,这是因为dhcp不单单是获取ip地址,其还会通过tftp来启动linux内核
nfs命令######重要
nfs(netword file system)网络文件系统,通过nfs可以在计算机之间通过网络来分享资源,我们可以通过nfs将Ubuntu中linux的镜像和设备树下载到开发板的DRAM中,这样方便调试,也就是网络测试。
这一段可能会面试题,为什么使用网络调试?
通过网络调试是Linux开发中最常用的调试方法;原因是嵌入式Linux开发不像单片机开发,可以直接通过JLink等仿真器烧写代码到单片机的flash中;嵌入式Linux通常是烧写到EMMC、NAND Flash、SPI Flash等外置flash中,并且也没有如Keil的IDE,没有直接download那么快捷的操作。所以在Linux内核调试阶段,如果用这个烧写软件(半导体厂商配套提供),那么这个时候就展示了网络调试的魅力了,可以直接通过网络将编译好的镜像文件和设备树下载到DRAM中,然后直接运行。
在使用uboot中的nfs命令将Ubuntu中的文件下载到开发板的DRAM中,在使用之前我们需要开启Ubuntu中的nfs服务,并创建一个nfs目录,以后就将需要通过nfs访问的文件都放到这个目录下。(我把Ubuntu如何创建NFS的操作放到文章最后一个部分了)
在Uboot中,nfs命令的使用格式:
nfs [loadAddress] [hostIPaddr:]bootfilename
loadAddress为要保存的DRAM地址,[hostIPaddr:]bootfilename是要下载的文件地址:
例如我们将编译的文件下载到DRAM的0x80800000地址处
nfs 80800000 192.168.100.203:/home/liustu/linux/nfs/zImage
如果你下载失败请看【nfs 下载镜像报错 File lookup fail】
tftp命令
tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令。使用的 TFTP 协议,Ubuntu 主机作为 TFTP 服务器
EMMC和SD卡操作命令
uboot支持EMMC和SD卡上,因此也要提供EMMC和SD卡的操作命令。一般认为EMMC和SD卡是一个东西,所以没有特殊说明。
mmc是一系列的命令,其后可以跟不同的参数,输入“?mmc”即可查看mmc有关的命令
mmc info
输出mmc info设备信息,查看EMMC的版本、容量、速度,8位宽的总线
mmc rescan
扫描当前开发板上的所有MMC设备,包括EMMC和SD卡
mmc list
查看当前开发板一共有多少个MMC设备
mmc dev
切换当前MMC设备,命令格式
mmc dev [dev][part]
[dev]表示要切换的MMC设备号、[part]是分区号,分区号不写默认为0
mmc part
part查看当前mmc的分区
可以看见我这个EMMC一共两个分区,以及其他的起始扇区,和长度。
mmc read
用于读取mmc设备的数据,命令格式
mmc read addr blk# cnt
addr 是数据读取到 DRAM 中的地址,blk 是要读取的块起始地址(十六进制),cnt 是要读取的块数量(十六进制)
mmc write
把数据写到MMC设备中,和read相反,但格式一样
mmc write addr blk# cnt
FAT格式文件系统操作命令
文件操作命令
fatinfo
fatinfo 命令用于查询指定 MMC 设备分区的文件系统信息,格式如下:
fatinfo <interface> [<dev[:part]>]
interface:表示接口如mmc,dev表示查找的设备号,part是查询的分区
BOOT 操作命令
uboot 的本质工作是引导 Linux,所以 uboot 肯定有相关的 boot(引导)命令来启动 Linux
bootz 命令
要启动 Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要
将设备树拷贝到 DRAM 中
将 Linux 镜像和设备树文件存到 DRAM 中,然后使用 bootz 命令来启动,bootz 命令用于启动 zImage 镜像文件,bootz 命令格式如下:
bootz [addr [initrd[:size]] [fdt]]
addr 是Linux镜像在DRAM中的位置;initrd是initrd(初始化根文件目录)文件在DRAM中的位置;fdt是设备树文件在 DRAM 中的地址
boot命令 #### 重要
boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统,bootcmd 是一个很重要的环境变量。比如我们要使用网络来启动Linux
setenv bootcmd 'nfs 192.168.100.203:/home/liustu/linux/nfs/zImage; nfs 83000000 192.168.100.203:/home/liustu/linux/nfs/imx6ull-14x14-emmc-7-800x480-c.dtb; bootz 80800000 - 83000000'
saveenv
boot
启动时会报错:
“Kernel panic – not Syncing: VFS: Unable to mount root fs on unknown-block(0,0)”
其他命令
reset命令:
复位
go命令:
go 命令用于跳到指定的地址处执行应用
go addr [arg ...]
addr 是应用在 DRAM 中的首地址
run命令
run 命令用于运行环境变量中定义的命令,例如“run bootcmd ”允许bootcmd中的命令,但是 run 命令最大的作用在于运行我们自定义的环境变量
mtest
mtest 命令是一个简单的内存读写测试命令,可以用来测试自己开发板上的 DDR
mtest [start [end [pattern [iterations]]]]
start 是要测试的 DRAM 开始地址,end 是结束地址
比如我们测试 0X80000000~0X80001000
uboot还有很多命令,这里不一一列举,不需要全部知道,可以认为这就是一个工具,当需要用的时候再查找用法也可以
Ubuntu创建nfs
包括4个步:安装nfs、创建共享目录、配置nfs服务、应用配置并开启nfs服务
这个错误的原因是 linux 内核没有找到根文件系统,这个很正常,因为没有设置 uboot 的bootargs 环境变量。我们这次本来就是单纯的验证boot命令,linux内核已经成功启动了,说明 boot 命令工作正常
安装nfs
sudo apt-get update
sudo apt-get install nfs-kernel-server
创建共享目录
sudo mkdir -p /home/liustu/linux/nfs/
并修改目录权限
sudo chmod 777 /home/liustu/linux/nfs/
配置nfs服务
编辑NFS服务的配置文件/etc/export
s,添加vim共享目录及其访问权限、应用配置并启动NFS服务
sudo vim /etc/exports
在文件中添加下面内容
/home/liustu/linux/nfs *(rw,sync,no_root_squash)
- /home/liustu/linux/nfs:文件目录
- * :允许访问的客户端范围,我直接写*,都可以访问
- rw:读写权限
- sync:同步写入数据,保证文件安全性
- no_root_squash:表示客户端的root用户可以拥有该共享目录的所有权限
应用配置并启动NFS服务
保存并关闭/etc/exports后(ctrl+o保存,enter确认,ctrl+x
退出),执行命令使配置生效,并启动nfs服务
sudo /etc/init.d/nfs-kernel-server restart
评论