U-Boot介绍
U-Boot,全称为 Das U-Boot,是一个开源的引导加载程序,主要用于嵌入式系统中。U-Boot可以引导多种操作系统,如Linux、FreeBSD等,并支持多种架构,如ARM、x86、PowerPC、MIPS等。它的主要功能是初始化硬件、加载操作系统内核以及启动操作系统。
主要功能和特性:
-
硬件初始化:在系统启动时,U-Boot负责初始化处理器、内存、存储设备、网络接口等硬件资源。
-
引导加载:U-Boot可以从多种设备(如SD卡、NAND闪存、USB设备、网络等)加载操作系统内核,并将其传递给处理器执行。
-
环境变量:U-Boot使用环境变量来存储启动参数和配置信息,这些变量可以在运行时进行修改,从而改变启动行为。
-
网络启动支持:U-Boot支持TFTP、NFS等网络协议,可以通过网络引导操作系统,这在嵌入式开发中非常有用。
-
命令行界面:U-Boot提供一个命令行界面,允许用户手动执行各种操作,如内存读写、设备检测、文件传输等。
-
可移植性:由于其模块化设计,U-Boot可以很容易地移植到不同的硬件平台上,开发者可以根据具体的硬件需求进行裁剪和定制。
-
设备树支持:U-Boot可以解析设备树文件(Device Tree Blob, DTB),这使得系统在引导时能够根据硬件配置自动调整。
U-Boot 在嵌入式系统中的作用:
在嵌入式系统中,U-Boot通常是启动过程中的第一个软件组件,它从硬件复位状态开始,将系统带到一个可以启动操作系统的状态。因此,U-Boot的稳定性和可靠性对整个系统的正常运行至关重要。
使用场景:
- 嵌入式Linux设备:如路由器、智能电视、工业控制器等,这些设备在启动时通常依赖U-Boot加载Linux内核。
- 开发和调试:在嵌入式开发中,U-Boot的调试功能允许开发者对系统启动过程进行详细分析,从而帮助排查和解决启动相关的问题。
选择U-Boot的理由:
① 开放源码;
② 支持多种嵌入式操作系统内核,如Linux VxWorks,
③ 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 较高的可靠性和稳定性;
⑤ 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
⑥ 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
总之,U-Boot 是嵌入式系统中一个非常重要的引导加载程序,提供了丰富的功能和高度的灵活性,广泛应用于各种嵌入式设备的开发与生产中。
U-Boot常用命令
1、帮助命令
help 或者 ?当你不确定某个命令的用法时,可以使用 help
或 ?
快速查找相关信息。对于初学者或需要熟悉 U-Boot 命令的人来说,这两个命令非常有用,可以帮助你快速掌握 U-Boot 的命令集。
2、信息查询
2.1、bdinfo 命令 :显示板级信息,例如内存大小、处理器类型等。
2.2、printenv 命令:显示当前的环境变量的相关数据。
2.3、version
: 显示U-Boot的版本信息。
3、 环境变量管理
3.1、setenv命令 :设置一个环境变量的值,例如:将bootdelay 的值改为5,
3.2、saveenv命令:保存当前环境变量到非易失性存储器(如Flash),重启后生效。
首先检查bootdelay的值 然后输入setenv bootdelay 5 ,然后检查数据就是5,最后记得保存环境变量。
3.3、新建命令还是使用setenv ,使用方法就是setenv 加上 环境变量的值
3.4、删除命令同样也是setenv , 使用方法就是 setenv 加上 环境变量名 变量值赋值为空值。
4、内存操作命令
4.1、md命令(Memory Display) - 显示内存内容
md 命令用于显示内存值,格式: md[.b, .w, .l] address [# of objects]
命令中的[.b .w .l]对应 byte、word 和 long,也就是分别以1个字节、2 个字节、4 个字节
来显示内存值。address 就是要查看的内存起始地址,[#ofobiects]表示要查看的数据长度,这
个数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度问
为 20(十六进制为 0x14),如果显示格式为.b的话那就表示 20 个字节;如果显示格式为.w 的话
就表示 20 个 word,也就是 20*2-40 个字节;如果显示格式为.1的话就表示 20个long,也就
是 20*4-80个字节。另外要注意:
uboot 命令中的数字都是十六进制的!不是十进制的!
uboot 命令中的数字都是十六进制的!不是十进制的!
uboot 命令中的数字都是十六进制的!不是十进制的!
比如你想査看以 0X80000000 开始的 20 个字节的内存值,显示格式为b的话,应该使用
如下所示命令:
md.b 80000000 14
而不是:
md.b 80000000 20
如下图所示:三种格式显示的额数据
4.2、nm (Memory Modify with Address Auto-increment) - 修改内存内容
-
手动确认: 在使用
nm
命令时,内存地址不会自动递增。每次输入一个新的内存值后,系统会等待你按下回车键确认并手动递增到下一个地址。 -
操作流程:
- 你输入
nm
命令和一个内存地址后,系统会显示该地址当前的值并等待你输入新的值。 - 每次输入新值后,你必须按下回车键来确认更改,然后系统会跳到下一个地址。
- 你输入
-
适用场景:
nm
适合需要精确控制每个内存修改操作的场景,因为它允许你在确认前检查每次的输入。
4.3、md命令 (Memory Modify) - 修改内存内容
-
自动递增: 在使用
mm
命令时,每次输入一个新的内存值后,内存地址会自动递增到下一个地址,无需手动确认或递增。 -
操作流程:
- 你输入
mm
命令和一个内存地址后,系统会显示该地址当前的值并等待你输入新的值。 - 当你输入一个新值并按下回车键后,系统会自动移动到下一个地址,并继续等待你输入下一个新值。
- 你输入
-
适用场景:
mm
适合快速连续地修改多个内存地址的数据,因为你只需输入新值即可,操作更加流畅。
4.4. mw (Memory Write) - 写入内存
-
功能:
mw
命令用于将指定的值写入内存地址。它可以一次性写入一个或多个连续地址。 -
自动化程度:
mw
是批量操作命令,你可以指定起始地址、要写入的值以及写入的次数(字数),然后命令会自动将这个值写入指定范围的内存地址中。 -
用途: 主要用于初始化内存、批量修改内存内容、快速填充内存区域。
4.5.cp (Memory Copy) - 复制内存
-
作用: 将内存中的数据从一个地址复制到另一个地址。
-
语法:
cp [source] [destination] [count]
source
: 源内存地址。destination
: 目标内存地址。count
: 要复制的字数(以32位字为单位)。
4. cmp
(Memory Compare) - 比较内存
-
作用: 比较两个内存地址之间的数据,以检查它们是否相同。
-
语法:
cmp [address1] [address2] [count]
address1
: 第一个内存地址。address2
: 第二个内存地址。count
: 要比较的字数(以32位字为单位)。
5、EMMC/SD卡操作命令
命令 | 作用与解释 |
---|---|
mmc info | 显示当前MMC设备信息(卡的类型、大小、分区信息...) |
mmc list | 列出系统中可用的所有 MMC 设备。 |
mmc dev [num] | 选择当前要操作的 MMC 设备,[num] 是设备编号。切换操作目标设备。 |
mmc rescan | 重新扫描 MMC 设备,检测插入或移除的 MMC 卡。 |
mmc part | 显示当前选择的 MMC 设备上的分区表信息。 |
mmc read [addr] [blk#] [cnt] | 从当前选择的 MMC 设备读取数据到内存。[addr] 是内存地址,[blk#] 是起始块号,[cnt] 是块数。 |
mmc write [addr] [blk#] [cnt] | 将内存中的数据写入到 MMC 设备。[addr] 是内存地址,[blk#] 是起始块号,[cnt] 是块数。 |
mmc erase [blk#] [cnt] | 擦除 MMC 设备上的指定块范围数据。[blk#] 是起始块号,[cnt] 是块数。 |
mmc extcsd | 显示 eMMC 的扩展 CSD(Card Specific Data)寄存器内容,通常用于查看 eMMC 的特性。 |
mmc setdsr | 设置 DSR(Driver Strength Register),调整 eMMC 驱动强度 |
部分举例
6、FAT 和 EXT 格式文件系统操作命令
6.1、FAT 格式文件系统操作命令
命令 | 作用与解释 |
---|---|
fatls [device] [path] | 列出指定设备和路径下的文件和目录。 [device] 是设备号,[path] 是文件路径。 |
fatload [device] [addr] [filename] [bytes] | 从 FAT 文件系统加载文件到内存。[addr] 是内存地址,[filename] 是文件名,[bytes] 是读取的字节数(可选) |
fatwrite [device] [filename] [addr] [bytes] | 从内存写入数据到 FAT 文件系统。[addr] 是内存地址,[filename] 是目标文件名,[bytes] 是写入的字节数。 |
fatsize [device] [filename] | 显示 FAT 文件系统中指定文件的大小。 |
faterase [device] [filename] | 删除 FAT 文件系统中的文件。 |
6.2、EAT 格式文件系统操作命令
命令 | 作用与解释 |
---|---|
ext2ls [device] [path] | 列出 EXT2 文件系统中指定路径下的文件和目录。 [device] 是设备号,[path] 是文件路径。 |
ext2load [device] [addr] [filename] [bytes] | 从 EXT2 文件系统加载文件到内存。[addr] 是内存地址,[filename] 是文件名,[bytes] 是读取的字节数(可选) |
ext2write [device] [filename] [addr] [bytes] | 从内存写入数据到 EXT2 文件系统。[addr] 是内存地址,[filename] 是目标文件名,[bytes] 是写入的字节数。 |
ext2size [device] [filename] | 显示 EXT2 文件系统中指定文件的大小。 |
ext2info [device] | 显示 EXT2 文件系统的基本信息,如块大小、总空间、可用空间等。 |
ext2erase [device] [filename] | 删除 EXT2 文件系统中的文件。 |
解释与应用
-
文件操作: 这两个表格中的命令都提供了基本的文件操作功能,包括列出目录内容 (
fatls
和ext2ls
)、加载文件到内存 (fatload
和ext2load
) 以及从内存写入文件 (fatwrite
和ext2write
)。这些操作对于嵌入式系统中从文件系统加载内核或其他配置文件非常重要。 -
文件信息:
fatsize
和ext2size
命令用于获取文件大小,fatinfo
和ext2info
提供文件系统的基本信息,这有助于了解文件系统的使用情况和空间管理。 -
文件删除:
faterase
和ext2erase
命令允许删除文件,便于管理存储空间。
7、NAND操作命令
命令 | 作用与解释 |
---|---|
nand info | 显示 NAND 闪存设备的详细信息,如设备大小、块大小、页大小等。 |
nand read [addr] [offset] [size] | 从 NAND 闪存读取数据到内存。[addr] 是目标内存地址,[offset] 是 NAND 中的起始偏移地址,[size] 是读取的字节数。 |
nand write [addr] [offset] [size] | 将内存中的数据写入到 NAND 闪存。[addr] 是源内存地址,[offset] 是 NAND 中的目标偏移地址,[size] 是写入的字节数。 |
nand erase [offset] [size] | 擦除 NAND 闪存中的指定区域。[offset] 是起始偏移地址,[size] 是擦除的字节数 |
nand erase.chip | 擦除整个 NAND 闪存芯片。 |
nand bad | 显示 NAND 闪存中的坏块信息。 |
nand markbad [offset] | 手动将指定的块标记为坏块。[offset] 是块的起始偏移地址。 |
nand scrub [offset] [size] | 强制擦除 NAND 闪存中的指定区域,忽略坏块。[offset] 是起始偏移地址,[size] 是擦除的字节数。 |
nand dump [offset] [size] | 显示 NAND 闪存中指定偏移处的数据内容,便于调试。[offset] 是起始偏移地址,[size] 是显示的字节数 |
nand test | 测试 NAND 闪存的读写功能,检查 NAND 闪存是否正常工作。 |
解释与应用
-
设备信息:
nand info
命令用于显示 NAND 闪存的详细信息,有助于了解设备的基本配置和性能参数。 -
数据读写:
nand read
和nand write
是最常用的命令,用于从 NAND 读取数据到内存或将数据写入到 NAND 闪存中,适合在系统启动和固件更新时使用。 -
擦除操作:
nand erase
命令用于擦除 NAND 闪存中的指定区域,nand erase.chip
可以擦除整个 NAND 芯片,通常在重新分区或重写整个 NAND 闪存时使用。 -
坏块管理:
nand bad
用于显示 NAND 闪存中的坏块信息,而nand markbad
允许手动将某个块标记为坏块。这些命令对于 NAND 闪存的可靠性管理非常重要。 -
调试和测试:
nand dump
命令可以用于查看 NAND 闪存中的原始数据内容,帮助调试和数据校验。nand test
则用于验证 NAND 闪存的读写功能。 -
高级操作:
nand scrub
用于强制擦除 NAND 闪存,忽略坏块,通常在进行低级别操作或修复 NAND 闪存时使用。
8、 重启和电源管理
reset
: 重启系统,相当于软复位。poweroff
: 关闭系统电源(如果硬件支持)