Uboot命令

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/exports,添加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

如果您觉得这篇文章不错,且手里较为宽裕,可以支持一下博主,一分也是缘分😊

评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇