Linux系统移植:U-Boot常用指令(上)

举报
JeckXu666 发表于 2022/01/15 01:11:53 2022/01/15
【摘要】 文章目录 Linux系统移植:U-Boot常用指令(上)一、U-Boot 命令行二、U-Boot 常用命令(上)2.1 help帮助命令2.2 信息查询命令2.3 环境变量修改命令2.4 内存操作...

Linux系统移植:U-Boot常用指令(上)

一、U-Boot 命令行

烧写启动 U-Boot 后,弹出如下界面:

20211126095829

其中 第 1 行 是 uboot 版本信息和编译时间

2 - 3 行 表面了芯片的厂商和最高主频以及当前主频;4 行 是复位源;5 行 是板子名字,当前的板子名字;6 行 提示 I2C 准备就绪;7、8 行是 RAM 和 ROM ;

10 、11 行 是 LCD 型号(800 * 480);12-14 行 是标准输入、标准输出和标准错误所使用的终端;

第 15 和 16 行 是切换到 emmc 的第 0 个分区上,因为当前的 uboot 是 emmc 版本的,也就 是从 emmc 启动的。我们只是为了方便将其烧写到了 SD 卡上,但是它的“内心”还是 EMMC 的。所以 uboot 启动以后会将 emmc 作为默认存储器

18 行 提示 FEC1 网卡地址没有设置,这里还没有配置

最后一行就是 uboot 命令行,在其中我们可以输入 uboot 指令

二、U-Boot 常用命令(上)

2.1 help帮助命令

列出所有命令

help 或者 ?

  
 
  • 1

20211126103518

查询某一条命令功能,比如查询 ls 指令的功能

help ls

  
 
  • 1

20211126103727

2.2 信息查询命令

bdinfo:查看板子信息

20211126105628

打印出 DRAM 的起始地址和大小、启动参数保存起始地址、波特率、 sp(堆栈指针)起始地址等信息

printenv:打印环境信息,显示一些环境参数的配置信息,当然这些参数也是可以修改的

20211126110114

version:查看 uboot 版本,uboot 编译时间和编译器

20211126110324

2.3 环境变量修改命令

2.2 中有打印环境变量,此处我们可以直接通过指令进行变量修改

2.3.1 修改环境变量

修改环境变量的操作涉及到两个命令:setenv 和 saveenv

setenv:设置或者修改环境变量的值

saveenv:保存修改后的环境变量;一般环境变量是存放在外部 flash 中的, uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中,所以使用命令 setenv 将修改的环境变量值保存到 flash 中

eg:设置 uboot 启动延时时间从 3 s到 10 s

setenv bootdelay 10
saveenv

  
 
  • 1
  • 2

20211126111246

修改的环境变量值可能会有空格,比如 bootcmd 等,这个时候环境变量值就得用单引号括起来

2.3.2 新建\删除环境变量

命令 setenv 可用于新建命令,比如新建 test 值为 jeckxu666

setenv test jeckxu666
saveenv

  
 
  • 1
  • 2

20211126111906

重新启动 uboot ,打印变量

20211126112025

删除变量的话,我们直接使用 setenv 设置变量的值为空就行

2.4 内存操作命令

内存操作命令就是用于直接对 DRAM 进行读写操作,常用的内存操作命令有 md、nm、 mm、mw、cp 和 cmp

2.4.1 md 指令

md 命令用于显示内存值

md[.b, .w, .l] address [# of objects]

  
 
  • 1

[.b .w .l] :对应 byte、word 和 long,也就是分别以 1 个字节、2 个字节、4 个字节来显示内存值

address :就是要查看的内存起始地址

[# of objects] :表示要查看的数据长度(总长度安装选择的内存大小来计算)

eg:

20211126121715

2.4.2 nm 指令

nm 命令用于修改指定地址的内存值

nm[.b, .w, .l] address

  
 
  • 1

输入指令后,就可以跟在后面输入我们需要修改的值,如下,修改 0x80000000 内存值为 0x66666666,修改完成输入 q 退出修改:

20211126122119

2.4.3 mm 指令

mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命 令 nm 的话地址不会自增,使用 mm 修改完一个值后会修改下一个值

mm[.b, .w, .l] address

  
 
  • 1

20211126122654

2.4.4 mw 指令

mw 用于使用一个指定的数据填充一段内存

mw[.b, .w, .l] address value [count]

  
 
  • 1

eg:

20211126123152

2.4.5 cp 指令

cp 是数据拷贝命令,用于将 DRAM 中的数据从一段内存拷贝到另一段内存中,或者把 Nor Flash 中的数据拷贝到 DRAM 中

cp[.b, .w, .l] source target count

  
 
  • 1

20211126123727

2.4.6 cmp 指令

cmp 是比较命令,用于比较两段内存的数据是否相等

cmp[.b, .w, .l] addr1 addr2 count

  
 
  • 1

eg例程:

20211126123835

2.5 网络操作命令

ARM 板的调试经常用到网络功能,uboot 提供了许多用于网络调试的指令,将开发板和电脑连接在同一个交换机或者路由器下,方便进行网络调试

首先看一下 env 环境中关于网络的配置变量

环境变量 描述
ipaddr 开发板 ip 地址,可以不设置,使用 dhcp 命令来从路由器获取 IP 地址
ethaddr 开发板的 MAC 地址,一定要设置
gatewayip 网关地址
netmask 子网掩码
serverip 服务器 IP 地址,也就是 Ubuntu 主机 IP 地址,用于调试代码

这些网络参数用于配置网关网段,使网络处于局域网下,使用如下代码进行设置 (以下的ip地址要根据自己的情况进行设置)

setenv ipaddr 210.45.244.17
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 210.45.244.1
setenv netmask 255.255.255.0
setenv serverip 210.45.244.1
saveenv

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.5.1 ping 命令

通过 ping 命令可以验证网络能否使用

ping 210.45.244.116

  
 
  • 1

比如,我用开发板 ping 我的电脑主机和一台不存在的机器,分别有如下结果:

20211126131900

只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping 命令做处理,如果用其他的机器 ping uboot 的话会失败!

2.5.2 dhcp 命令

dhcp 可以用于从路由器获取 IP 地址,前提得开发连接到路由器(交换机自动分配IP)上

20211126132121

2.5.3 nfs 命令

nfs (Network File System) 网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源

可以通过网络将编译好的 linux 镜像和设备树文件下载 到 DRAM 中,然后直接运行

主机通过 nfs 和开发板建立连接,首先需要新建一个文件夹作为 nfs 的根目录,把正点原子出厂内核镜像放进去,这文件我已经上传,可以 0 积分下载: 正点原子阿尔法开发板出厂内核镜像

20211126134343
然后我们在 uboot 中通过 nfs 指令,下载镜像到 DRAM 中 0x80800000 地址处,nfs 指令格式

nfs [loadAddress] [[hostIPaddr:]bootfilename]

  
 
  • 1

下载指令

nfs 0x80800000 210.45.244.116:/home/jeck/linux/nfs/zImage

  
 
  • 1

下载完成如下:

待加入

2.5.4 tftp 命令

tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令 使用的 TFTP 协议

使用前需要在主机上安装 tftp 服务

sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd

  
 
  • 1
  • 2

然后在主机上创建一个文件夹,方便传输文件

使用 tftp 需要新建文件 /etc/xinetd.d/tftp 文件,在配置文件里面输入如下内容

server tftp
{
	socket_type = dgram
	protocol = udp
	wait = yes
	user = root
	server = /usr/sbin/in.tftpd
	server_args = -s /home/jeck/linux/tftp
	disable = no
	per_source = 11
	cps = 100 2
	flags = IPv4
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

然后修改 /etc/default/tftpd-hpa 文件传输信息,改变传输目录

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/jeck/linux/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s" 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

配置完成,启动服务

sudo service tftpd-hpa start

  
 
  • 1

我们使用 tftp 就是把文件传到对应目录下,权限设置为 777 ,然后在 uboot 内就可以调用 tftp 指令来传文件了

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

  
 
  • 1

指令和 nfs 差不多,区别在于 tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可,因为文件目录已经配置完成,使用如下指令传文件

tftp 80800000 zImage

  
 
  • 1

传输完成图片:

待加入

文章来源: blog.csdn.net,作者:JeckXu666,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_45396672/article/details/121567584

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。