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

news2024/11/28 10:34:16
将之前自学的知识整理了一下笔记,以便回忆
信息查询命令

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
=>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1668491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多商户Docker Supervisor进程管理器部署

Dockerfile 根目录下没有Dockerfile的可以复制下面的命令 # 使用基础镜像 FROM leekay0218/crmeb-mer## 复制代码 ## 在本地调试注释掉&#xff0c;使用映射把文件映射进去 #ADD ./ /var/www# 设置工作目录 WORKDIR /var/www# 设置时区为上海 ENV TZAsia/Shanghai RUN ln -sn…

对数据进行标准化和归一化

数据的形式&#xff1a;保存在CSV中&#xff0c;第一列为姓名&#xff0c;第二列之后为特征。 标准化 输入文件的路径&#xff0c;设置保存转化后的文件路径 import pandas as pd from sklearn.preprocessing import StandardScaler# 读取CSV文件 data pd.read_csv(rC:\User…

开发时如何快速分析代码和生成测试方法(Baidu Comate插件帮我一键分析)

目录 前言 Baidu Comate智能编码助手简介 安装教程 使用RabbitMQ一个绑定队列方法进行演示 进行测试现有功能 使用感觉 测试结果 前言 因为在开发代码的时候&#xff0c;发现有很多都是废话也不是很想写注释 的&#xff0c;毕竟程序员最讨厌的两件事情&#xff0c;一…

Hikyuu高性能量化研究框架助力探索

Hikyuu Quant Framework 是一款基于C/Python的开源量化交易分析与研究工具&#xff0c;主要用于A股市场的交易策略分析与回测&#xff0c;目前不支持期货等&#xff0c;需要自行改造。 Hikyuu的目标 Hikyuu的最初目的是为了快速对A股全市场股票进行策略回测和验证&#xff0c…

windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中&#xff0c;消息队列和窗口过程函数是实现消息驱动机制的核心组件。 消息队列&#xff08;Message Queue&#xff09;&#xff1a; 消息队列是用于存储窗口消息的缓冲区。当用户与应用程序交互时&#xff0c;系统会将生成的消息插入到消息队列中&…

C++11:常用语法汇总

目录 &#x1f341;统一的列表初始化 { }initializer_list &#x1f341;decltype 推导表达式类型&#x1f341;可变参数模板解析可变参数包方法一方法二 &#x1f341;lambda 表达式捕捉列表的使用运用场景举例lambda表达式 与 函数对象 &#x1f341;统一的列表初始化 { } 在…

电商购物系统首页的商品分类

如上图对商品的一个分类实际上和省市区的分类十分类似 , 都是通过自关联的方法来实现 , 但是这里不同的是 , 涉及到外键来获取数据 首先让我们来看一下最后通过后端返回数据的形式是什么样子的 """{1:{channels:[{id:1 , name:手机 , url:},{}{}],sub_cats:[{…

苍穹外卖面试总结

项目介绍 我完成了一个外卖项目&#xff0c;名叫苍穹外卖&#xff0c;是跟着黑马程序员的课程来自己动手写的。 项目基本实现了外卖客户端、商家端的后端完整业务。 商家端分为员工管理、文件上传、菜品管理、分类管理、套餐管理、店铺营业状态、订单下单派送等的管理、数据…

考研数学|强化阶段怎么刷《660》《880》《1000》?

强化阶段想要刷好题&#xff0c;首先要选一本适合自己的题集&#xff01; 一般在强化阶段&#xff0c;大家用多个最多的题集就是660题&#xff0c;880题还有1000题 660题的特点是只训练客观题&#xff0c;虽然题目的质量很高&#xff0c;但是训练面还是比较窄 880题是综合训…

【SpringBoot】 什么是springboot(二)?springboot操作mybatisPlus、swagger、thymeleaf模板

文章目录 SpringBoot第三章1、整合mybatsPlus1-234-67-10问题2、整合pageHelper分页3、MP代码生成器1、编写yml文件2、导入依赖3、创建mp代码生成器4、生成代码5、编写配置类扫描mapper类6、编写控制器类4、swagger1、什么是swagger2、作用3、发展历程4、一个简单的swagger项目…

ADC模-数转换原理与实现

1. 今日摸鱼计划 今天来学习一下ADC的原理&#xff0c;然后把ADC给实现 ADC芯片:ADC128S102 视频&#xff1a; 18A_基于SPI接口的ADC芯片功能和接口时序介绍_哔哩哔哩_bilibili 18B_使用线性序列机思路分析SPI接口的ADC芯片接口时序_哔哩哔哩_bilibili 18C_基于线性序列机的S…

MFC的句柄概念以及句柄类型

在MFC&#xff08;Microsoft Foundation Class&#xff09;桌面应用程序中&#xff0c;窗口是通过句柄&#xff08;Handle&#xff09;来进行管理和操作的。 句柄是一个标识符&#xff0c;用于唯一标识和引用窗口、控件、设备上下文等对象。在MFC桌面应用程序中&#xff0c;常…

mac -- Navicat premium for mac 12的安装破解过程

下载准备好dmg文件&#xff0c;接下来开始安装破解。 镜像在官网下载&#xff0c;复制打开链接可以直接下载&#xff0c;可以直接下载中文版&#xff0c;不需要汉化&#xff1a;&#xff08;下载包不能用&#xff0c;留言我发给你&#xff09; 英文64位&#xff1a; http://dow…

【0003day】VOSviewer分析

这个软件也可以用知网&#xff0c;也可以用web of science。 首先&#xff0c;需要创建数据。这个数据如何创建&#xff0c;需要参考对应的教程。&#xff08;本文以web of science为平台来做分析。&#xff09; 首先&#xff0c;创建对应的数据库。 一直下一步 让后选择完…

Linux重定向及缓冲区理解

重定向&#xff1a; 在上一期虚拟文件系统中讲到了每个进程在打开后&#xff0c;都会默认打开3个文件&#xff0c;如下&#xff1a; stdin 标准输入&#xff08;键盘&#xff09; 文件描述符&#xff1a;0 stdout 标准输出&#xff08;显示器&#xff09;文件描述符&a…

Boss让你设计架构图,你懵逼了,解救你的参考图来啦。

架构图是指用于描述系统或软件的结构和组成部分之间关系的图形表示。 它是一种高层次的图示&#xff0c;用于展示系统的组件、模块、接口和数据流等&#xff0c;以及它们之间的相互作用和依赖关系。架构图通常被用于可视化系统的整体设计和组织结构&#xff0c;帮助人们理解系…

分享10类正规的网上赚钱平台,让你摆脱单一收入

在这个互联网飞速发展的时代&#xff0c;你是否还在为单一的收入来源而焦虑&#xff1f;别担心&#xff0c;今天带你解锁10种网上赚钱的新姿势&#xff0c;让你的收入不再单一&#xff0c;甚至可能翻倍&#xff01; 1. 文库类&#xff1a;知识的变现 你知道吗&#xff1f;你的…

利用IP地址查询解决被“薅羊毛”的方法

在互联网时代&#xff0c;随着各种网络诈骗手段的不断更新和演变&#xff0c;“薅羊毛”成为了一种常见的网络犯罪行为。其中&#xff0c;利用查询IP地址进行欺诈活动已经成为一种普遍的手段。当个人或组织的IP地址被不法分子查询后&#xff0c;可能会面临虚假注册、盗取个人信…

三. TensorRT基础入门-剖析ONNX架构并理解ProtoBuf

目录 前言0. 简述1. 执行一下我们的python程序2. ONNX是什么&#xff1f;3. onnx中的各类Proto3.1 理解onnx中的ValueInfoProto3.2 理解onnx中的TensorProto3.3 理解onnx中的NodeProto3.4 理解onnx中的AttributeProto3.5 理解onnx中的GraphProto3.6 理解onnx中的ModelProto 4. …

Google与哈佛大学的科学家团队共同创造了一张人脑中一个极小部分的精细地图

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…