Linux-笔记 开发板Uboot命令使用

将之前自学的知识整理了一下笔记,以便回忆
信息查询命令

1、help/?:查看所支持命令

=> ? md
md - memory display

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

 2、bdinfo:查询板子信息

=> bdinfo
arch_number = 0x00000000
boot_params = 0x80000100
DRAM bank   = 0x00000000
-> start    = 0x80000000
-> size     = 0x20000000
eth0name    = FEC1
ethaddr     = b8:ae:1d:01:00:00
current eth = FEC1
ip_addr     = 192.168.31.100
baudrate    = 115200 bps
TLB addr    = 0x9FFF0000
relocaddr   = 0x9FF47000
reloc off   = 0x18747000
irq_sp      = 0x9EF44EA0
sp start    = 0x9EF44E90
FB base     = 0x00000000

3、printenv:输出环境变量信息

=> printenv
baudrate=115200
board_name=EVK
board_rev=14X14
boot_fdt=try
bootargs=comsole=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.31.121:/home/lxz/linux/nfs/rootfs,proto=tcp rw ip=192.168.31.102:192.168.31.121:192.168.31.1:255.255.255.0::eth0:off
bootcmd=tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000
bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};
bootdelay=3
bootscript=echo Running bootscript from mmc ...; source
console=ttymxc0
ethact=FEC1
ethaddr=b8:ae:1d:01:00:00
省略...

4、version:版本号

=> version

U-Boot 2016.03 (Oct 17 2023 - 10:40:58 +0800)
arm-linux-gnueabihf-gcc (Linaro GCC 4.9-2017.01) 4.9.4
GNU ld (Linaro_Binutils-2017.01) 2.24.0.20141017 Linaro 2014_11-3-git
环境变量命令

5、setenv:设置环境变量

=> setenv cc 123
=> printenv cc
cc=123
=>

6、saveenv:保存环境变量

=> saveenv
Saving Environment to MMC...
Writing to MMC(1)... done
内存操作命令

1、显示内存值:md

md[.b, .w, .l] address [# of objects]
md.b 80000000 14 //查看0x80000000开始的20个字节的内存值    uboot中的命令数字都是十六进制

2、修改内存值:nm

nm [.b, .w, .l] address
nm.l 80000000
=> nm.l 80000000
80000000: 0500e031 ? 修改的值
80000000: 修改的值 ? q
=>

3、自增修改指定地址的内存值:mm 

4、指定数据填充内存:mw

mw [.b, .w, .l] address value [count]
=> mw.l 80000000 0A0A0A0A 10
=> md.l 80000000 10
80000000: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a
80000010: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a
80000020: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a
80000030: 0a0a0a0a 0a0a0a0a 0a0a0a0a 0a0a0a0a

5、数据拷贝:cp

cp [.b, .w, .l] source target count
cp.l 80000000 80000100 10

6、比较内存值是否相等:cmp

cmp [.b, .w, .l] addr1 addr2 count
=> cmp.l 80000000 80000100 10
Total of 16 word(s) were the same
=> cmp.l 80002000 80003000 10
Total of 16 word(s) were the same
=> cmp.l 80002000 80008000 10
word at 0x80002000 (0x00) != word at 0x80008000 (0xeb0049d6)
Total of 0 word(s) were the same
=>
网络操作命令

使用命令前需要先设置好uboot网络有关的环境变量,确保网络正常。

=> printenv ipaddr
ipaddr=192.168.31.100
=> printenv serverip
serverip=192.168.31.54
=> printenv ethaddr
ethaddr=b8:ae:1d:01:00:00
=> printenv gatewayip
gatewayip=192.168.31.1
=> printenv netmask
netmask=255.255.255.0
=>

1、检查网络是否正常:ping(只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping 命令做处理,如果用其他的机器 ping uboot 的话会失败!)

=> ping 192.168.31.54
FEC1 Waiting for PHY auto negotiation to complete... done
Using FEC1 device
host 192.168.31.54 is alive
=>

2、自动获取ip:dhcp

从路由器获取IP,如果是连接电脑则会不成功。

3、网络文件系统:nfs(Network File System)

nfs [loadAddress] [[hostIPaddr:]bootfilename]
nfs 80800000 192.168.1.253:/home/tux/nfs/zImage

4、tftp

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
tftp 80800000 zImage
EMMC/SD卡操作命令

设备操作命令头:mmc

1、mmc info :输出当前选择的mmc设备

2、mmc rescan:扫描开发板上的所有mmc设备

3、mmc list:列出所有的mmc设备

4、mmc dev:切换当前mmc设备

mmc dev [dev] [part]

5、mmc part:查看分区

EMMC 里面烧写了 Linux 系统的话,EMMC 是有 3 个分区的,第 0 个分区存放 uboot,第 1 个分区存放 Linux 镜像文件和设备树,第 2 个分区存放根文件系统。

mmc read addr    blk#   cnt
mmc read 80800000 600 10
=> mmc read 80800000 600 10

MMC read: dev # 1, block # 1536, count 16 ... 16 blocks read: OK

=> md.b 80800000 2000
80800000: 28 67 cf c8 62 61 75 64 72 61 74 65 3d 31 31 35    (g..baudrate=115
80800010: 32 30 30 00 62 6f 61 72 64 5f 6e 61 6d 65 3d 45    200.board_name=E
80800020: 56 4b 00 62 6f 61 72 64 5f 72 65 76 3d 31 34 58    VK.board_rev=14X
80800030: 31 34 00 62 6f 6f 74 5f 66 64 74 3d 74 72 79 00    14.boot_fdt=try.
80800040: 62 6f 6f 74 61 72 67 73 3d 63 6f 6d 73 6f 6c 65    bootargs=comsole
80800050: 3d 74 74 79 31 20 63 6f 6e 73 6f 6c 65 3d 74 74    =tty1 console=tt
省略...

6、mmc write:写数据到mmc设备

mmc write addr blk# cnt
// addr 是要写入 MMC 中的数据在 DRAM 中的起始地址,blk 是要写入 MMC 的块起始地址
(十六进制),cnt 是要写入的块大小,一个块为 512 字节。

mmc write 80800000 2 33E

//例子(1)
//先将uboot下载到DRAM
=>tftp 80800000 u-boot.imx     
FEC1 Waiting for PHY auto negotiation to complete... done
Using FEC1 device
TFTP from server 192.168.31.54; our IP address is 192.168.31.100
Filename 'u-boot.imx'.
Load address: 0x80800000
Loading: #############################
         2.1 MiB/s
done
Bytes transferred = 424960 (67c00 hex)


//然后写到mmc 设备对应分区里,这里写到SD卡 分区0 第二块,
mmc dev 0 0
mmc write 80800000 2 33E
424960/512 转16进制 = 33E   
 
千万不能写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!


//例子(2) 更新 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 需要这一步!
千万不能写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!

7、mmc erase:擦除命令

mmc erase blk# cnt
// blk 为要擦除的起始块,cnt 是要擦除的数量
FAT格式文件系统操作命令

需要在 uboot 中对 SD 卡或者 EMMC 中存储的文件进行操作,文件操作相关的命令有:fatinfo、fatls、fstype、fatload 和 fatwrite,只支持FAT格式系统。

1、fatinfo:查询指定 MMC 设备分区的文件系统信息

fatinfo <interface> [<dev[:part]>]
interface 表示接口,dev 是查询的设备号,part 是要查询的分区
fatinfo mmc 1:1

2、fatls:查询 FAT 格式设备的目录和文件信息

fatls <interface> [<dev[:part]>] [directory]
fatls mmc 1:1 //查所有文件
=>fatls mmc 1:1
  6725336   zimage
    36325   imx6ull-alientek-emmc.dtb

2 file(s), 0 dir(s)

3、fstype:查看 MMC 设备某个分区的文件系统格式

fstype <interface> <dev>:<part>
fstype mmc 1:0
fstype mmc 1:1
fstype mmc 1:2
=> fstype mmc 1:0
Failed to mount ext2 filesystem...
** Unrecognized filesystem type **
=> fstype mmc 1:1
fat
=> fstype mmc 1:2
ext4
=>

4、fatload:将指定的文件读取到 DRAM 中

fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
fatload mmc 1:1 80800000 zImage  // EMMC 分区 1 中的 zImage 文件读取到 DRAM 中的
0X80800000 地址处

5、fatwrite:用于将 DRAM 中的数据写入到 MMC 设备中

fatwrite <interface> <dev[:part]> <addr> <filename> <bytes>
// interface 为接口,比如 mmc,dev 是设备号,part 是分区,addr 是要写入的数据在 DRAM
中的起始地址,filename 是写入的数据文件名字,bytes 表示要写入多少字节的数据。

例子:通过 fatwrite 命令在 uboot 中更新 linux 镜像文件和设备树,先将文件读取到DRAM,再从DRAM写到EMMC 

1、tftp 80800000 zImage //tftp下载到DRAM
2、fatwrite mmc 1:1 80800000 zImage 6788f8  //根据uboot大小写到EMMC分区中
3、fatls mmc 1:1  //查询一下文件
EXT格式文件系统命令

uboot 支持 ext2 和 ext4 这两种格式的文件系统的操作命令,一般的命令有 ext2load、ext2ls、ext4load、ext4ls 和 ext4write。这些命令的含义和使用与 fatload、fatls 和 fatwrite 一样,只是 ext2 和 ext4 都是针对 ext 文件系统的,使用 ext4ls 就可以查询 EMMC 的分区 2 中的文件和目录。

ext4ls mmc 1:2
=> ext4ls mmc 1:2
<DIR>       4096 .
<DIR>       4096 ..
<DIR>      16384 lost+found
<DIR>       4096 bin
<DIR>       4096 dev
<DIR>       4096 drivers
<DIR>       4096 etc
<DIR>       4096 lib
<SYM>         11 linuxrc
<DIR>       4096 mnt
<DIR>       4096 proc
<DIR>       4096 root
              46 rootfs
<DIR>       4096 sbin
<DIR>       4096 sys
<DIR>       4096 tmp
<DIR>       4096 usr
        27766784 v
<DIR>       4096 中文测试
              84 .ash_history
BOOT操作命令

        uboot 的本质工作是引导 Linux,一般使用 boot(引导)命令来启动 Linux。常用的跟 boot 有关的命令有:bootz、bootm 和 boot。

1、bootz:启动 DRRM中的 zImage 镜像文件

启动 Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要 将设备树拷贝到 DRAM 中。可以从 EMMC 或者 NAND 等存储设备中将 Linux 镜像和设备树文 件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中。 不管用那种方法,只要能将 Linux 镜像和设备树文件存到 DRAM 中就行,然后使用 bootz 命令 来启动,bootz 命令用于启动 zImage 镜像文件。

bootz [addr [initrd[:size]] [fdt]]
// addr 是 Linux 镜像文件在 DRAM 中的位置,initrd 是 initrd 文件在
DRAM 中的地址,如果不使用 initrd 的话使用‘-’代替即可,fdt 就是设备树文件在 DRAM 中
的地址。

// 方法(1):将zImage下载到DRAM的0X80800000地址处,然后将设备树下载到 DRAM 中的 0X83000000 地址处,最后之后命令 bootz 启动
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000

//方法(2):使用命令 fatload 将 镜像和 设备树 从 EMMC 的分区 1 中拷贝到 DRAM 中,然后使用命令 bootz 启动
fatload mmc 1:1 80800000 zImage
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb
bootz 80800000 - 83000000

2、bootm:启动 zImage 镜像文件中的uImage镜像

//不使用设备树的话启动 Linux 内核
bootm addr   //addr 是 uImage 镜像在 DRAM 中的首地址

//使用设备树启动内核
bootm [addr [initrd[:size]] [fdt]]  //addr 是 uImage 在 DRAM 中的首地址,initrd 是 initrd 的地址,fdt 是设备树(.dtb)文件 ,在 DRAM 中的首地址,如果 initrd 为空的话,同样是用“-”来替代

3、boot:读取环境变量 bootcmd 来启动 Linux 系统

uboot 倒计时结束以后就会启动 Linux 系统,其实就是执行的 bootcmd 中的启动 命令。

//(1)通过tftp下载到DRAM中启动
=> printenv bootcmd
bootcmd=tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000
=>


//(2)通过加载EMMC中的镜像文件到DRAM驱动
setenv bootcmd 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-
emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000'


注:启动 Linux 内核的时候可能会遇到如下错误
“Kernel panic – not Syncing: VFS: Unable to mount root fs on unknown-block(0,0)”
这个错误的原因是 linux 内核没有找到根文件系统,这个很正常,因为没有设置 uboot 的bootargs 环境变量,

4、go:到指定地址运行应用

go addr [arg ...]
// 使用 tftp 命令将 xxx.bin下载到开发板 DRAM 的 0X87800000(这个应用的链接首地址) 地址处
tftp 87800000 xxx.bin
go 87800000

5、run:运行环境变量中定义的命令

run bootcmd
// run 命令最大的作用在于运行我们自定义的环境变量
// 比如定义环境变量 mybootemmc 表示从 emmc 启动,
定义 mybootnet 表示从网络启动,定义 mybootnand 表示从 NAND 启动。如果要切换启动方式
的话只需要运行“run mybootxxx(xxx 为 emmc、net 或 nand)”即可。

例子:根据之前学习给出自己的板子情况

//emmc启动
setenv mybootemmc 'fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull14x14-emmc-7-1024x600-c.dtb;bootz 80800000 - 83000000'

//nand启动
setenv mybootnand 'nand read 80800000 4000000 800000;nand read 83000000 6000000 
100000;bootz 80800000 - 83000000'

//网络启动
setenv mybootnet 'tftp 80800000 zImage; tftp 83000000imx6ull-14x14-emmc-7-1024x600-c.dtb; 
bootz 80800000 - 83000000'
saveenv


//然后 run 对应的环境变量即可

6、mtest:开发板DDR内存读写测试

mtest [start [end [pattern [iterations]]]]

// start是要测试的DRAM 开始地址,end 是结束地址,比如我们测试 0X80000000~0X80001000
这段内存,输入“mtest 80000000 80001000” 

=> mtest 80000000 80001000
Testing 80000000 ... 80001000:
Pattern FFFFFFFF  Writing...  Reading...Iteration:    248
=>

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Rockchip RK3566是一款由Rockchip推出的高性能应用处理器,其集成了四核ARM Cortex-A55 CPU和ARM Mali-G52 GPU。在移植U-Boot 2023.04时,我们需要考虑以下几个方面的工作: 1. 了解RK3566芯片的硬件架构和技术规格,包括处理器核心、内存控制器、外设接口等。这将有助于理解U-Boot如何与硬件交互,并进行相应的配置。 2. 下载并准备U-Boot 2023.04的源代码。在Rockchip官方网站或开源社区中可以找到最新的U-Boot源代码。将其下载并解压到开发机上。 3. 设置交叉编译环境。因为U-Boot是一个跨平台的项目,所以需要配置适合RK3566的交叉编译器,确保能够正确编译U-Boot源代码。 4. 配置U-Boot。根据RK3566的硬件架构和技术规格,需要进行相应的配置,包括处理器、内存、外设等设置。这些设置在U-Boot的配置文件中进行,可以根据需求进行修改。 5. 编译U-Boot。在配置好U-Boot后,使用交叉编译器编译U-Boot源代码。编译完成后,将生成的U-Boot二进制文件烧录到RK3566的启动设备上,如eMMC或SD卡。 6. 测试U-Boot。将准备好的启动设备插入RK3566开发中,根据开发的启动方式,进入U-Boot命令行界面。在命令行界面中可以进行各种操作和调试,如加载内核、启动操作系统等。 7. 调试和优化。在移植和测试U-Boot过程中,可能会出现一些问题和不稳定的情况。需要通过调试和优化来解决这些问题,确保U-Boot的正常运行和稳定性。 总之,移植U-Boot 2023.04到Rockchip RK3566需要了解芯片的硬件架构和技术规格,配置和编译U-Boot源代码,进行测试和调试。这样可以确保U-Boot能够与RK3566正常交互,并为后续的操作系统加载和启动提供基础支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值