4.3.28.1. bootloader 使用说明
bootloader 简介
在
硬件
初始化 :配置 CPU 时钟频率、内存 控制器 等 基础 硬件 设置,确保 系统 在 启动 时 进入 稳定 的 工作 状态。 操作系统
加载 :从存储介质(如 NAND Flash、eMMC、SD 卡 等)加载 Linux 内核 映像(通常 为 压缩 格式),并 将 控制权 交给 内核 入口 点。 安全
验证 :通过 CRC 校验、数字签名或 哈希 算法(如 SHA-256)验证 固件 的 完整性 和 合法性,防止 恶意代码 的 注入。 传递
启动 :Bootloader 会参数 将 必要 的 启动 参数(如 内存大小、CPU 架构 信息 和 内核 命令行 参数)传递 给 Linux 内核,确保 内核 能够 顺利 启动 并 运行。
U-Boot (Universal Bootloader) 是
注意:在
BL1: Bootloader Level 1,它
是 存储 在 芯片 IROM 中 的 一段 程序,也 可 称之为 Bootrom,主要 负责 初始化 基本 硬件 功能。 BL2: Bootloader Level 2,bootloader 的
阶段 二,主要 负责 硬件 初始化 以及 安全 校验。 BL31: Bootloader Level 3_1,主要
执行 与 安全 有关 的 操作。 BL33/U-Boot: Bootloader Level 3_3,在
本 系统 中 BL33 即 为 的 广义 U-Boot。
这样
特别bootloader 指U-Boot 指 bootloader 流程
bootloader 配置与编译
本
完成
# 单独编译 uboot
./bd.sh uboot
# 单独 clean uboot
./bd.sh uboot clean
# 单独 distclean uboot
./bd.sh uboot distclean
关于
bootloader 关键文件
下面
配置文件
# 配置文件目录
uboot/configs
# X5 相关配置文件
hobot_x5_auto_defconfig
hobot_x5_evb_nand_defconfig
hobot_x5_fpga_defconfig
hobot_x5_soc_defconfig
hobot_x5_svb_defconfig
hobot_x5_svb_nand_defconfig
在device/horizon/x5/board_xxx_config.mk 会
设备树文件
# 设备树文件目录
uboot/arch/arm/dts/x5.dtsi/
# X5 相关设备树文件
hobot-x5.dts
x5-fpga.dtsi
x5-soc.dtsi
x5-svb.dtsi
x5.dtsi
x5-rdk.dtsi
pinmux-func.dtsi
U-Boot 下
平台专属文件
# 平台芯片硬件抽象层目录
uboot/arch/arm/mach-horizon
# 包括下面文件
├── Kconfig
├── Makefile
├── lowlevel_init.S
└── x5
├── Kconfig
├── Makefile
├── boot_info.c
├── cpu.c
├── fdt_setup.c
├── x5_board.c
├── x5_efuse.c
├── x5_ion_setup.c
└── x5_rpmb.c
其中 uboot/arch/arm/mach-horizon/x5 目录
# 平台硬件配置文件目录
uboot/board/horizon/
# 包括下面文件
├── common
│ ├── Makefile
│ ├── hb_sdhc_boot.c
│ └── horizon_dfu.c
└── x5
├── MAINTAINERS
├── Makefile
├── spi.c
├── x5-aarch32.its
├── x5.c
└── x5.its
其中 uboot/board/horizon/x5 目录
bootloader 启动流程
bootloader 启动流程分析
X5 平台

bootloader 启动
BL1 阶段 (Bootloader Level 1):
该阶段 负责 初始化 基本 硬件 功能,检查 eMMC 配置,并 加载 BL2 的 配置文件。在 此 过程 中, BL1 对 BL2 的 签名 和 哈希 值 进行 验证,确保 固件 的 完整性 和 来源。成功 验证 后, BL1 解密 并 启动 BL2 。 BL2 阶段 (Bootloader Level 2):
BL2 继续完成 硬件 初始化,尤其 是 DDR 的 配置,并 加载 DDR 配置文件,同时 进行 哈希 值 验证。在 DDR 初始化 完成 后, BL2 加载 并 验证 BL31 配置文件 的 签名 和 哈希 值,确保 其 安全性。验证 通过 后, BL2 启动 BL31 。
进入安全 : BL2 启动 BL31 后,系统世界 进入 安全 世界 (Secure World),准备执行 安全 相关 的 初始化 任务。 BL31 阶段 (Bootloader Level 31):
BL31 负责初始化 安全 功能,并 启动 OP-TEE( Open Portable Trusted Execution Environment,开放 可信 执行 环境)。在 OP-TEE 完成 安全 环境 初始化 后,控制权 返回 BL31 ,并 通过 PTA (Pseudo Trusted Application) 和 ETA (Early Trusted Application, Early TA) 执行 安全 相关 任务。
安全世界 : BL31 和 OP-TEE 的操作 运行 都 在 安全 世界 中 完成,确保 整个 启动 过程 的 安全性。 OP-TEE 阶段:
此阶段 加载 OP-TEE 的 PTA 和 Early TA,提供 加密、密钥 管理 等 安全 服务。这些 操作 均 在 安全 世界 中 执行,确保安全 任务 的 隔离 性 和 安全性。 切换
到 :普通 世界
在 BL31 完成安全 任务 后,系统 准备 切换 到 普通 世界 (Normal World)。 BL31 将控制权 交给 U-Boot,完成 从 安全 世界 到 普通 世界 的 切换。这一 过程 通过 TrustZone 提供 的 机制 实现,确保安全 世界 和 普通 世界 之间 的 隔离。 U-Boot 阶段:
在 BL31 完成工作 后,控制权 交给 U-Boot。 U-Boot 的 主要职责 是 加载 和 验证 Linux 操作系统,并 初始化 用户 空间 环境,包括 硬件 初始化 和 用户 交互 界面 的 准备。完成 Linux 系统 分区 挂载 后, U-Boot 开始 执行 用户 空间 代码。
普通世界 : U-Boot 和操作 后续 的 Linux 内核 运行 在 普通 世界 中,负责 系统 的 常规 功能 和 用户 交互。 Linux 内核
启动 :
最终, U-Boot 引导 Linux 内核启动,完成 系统 的 启动 过程。 Linux 内核 运行 在 普通 世界 中,负责 管理系统 的 资源 和 执行 用户 应用程序。
bootloader 启动流程关键函数分析
入口函数 _start
_start 位于 uboot/arch/arm/cpu/armv8/start.S,是
代码段
与 BSS 段 :初始化配置 .text(代码段)、.data(数据段),清零 .bss段(未初始化 的 全局变量 区)。 异常
向量 :定义 ARMv8 架构表 设置 的 中断向量 表,确保 异常 发生 时能 跳转 到 正确 处理程序。 CPU 模式
切换 :从 BootROM 默认的 异常 模式(如 EL3/EL2)切换 到 操作系统 运行 的 权限 模式(如 EL1)。
_start 函数
_start
├─> reset
│ ├─> save_boot_params(板级)
│ ├─> PIC Fixup(位置无关处理)
│ ├─> 设置 VBAR(异常向量)
│ ├─> EL 级别配置(启用 FP/SIMD/ 中断)
│ ├─> SMPEN/ 勘误处理
│ ├─> lowlevel_init
│ │ ├─> GIC 初始化(主核)
│ │ └─> 多核唤醒 / 等待逻辑
│ └─> 跳转到 _main( C 入口)
└─> 从核逻辑 (slave_cpu)
└─> wfe 循环直到主核释放
_main
_main 函数uboot/arch/arm/lib/crt0_64.S ,crt0_64.S 是 U-Boot 用于 AArch64 架构board_init_f 和 board_init_r 中
_main 函数
设置
初始 运行 时 环境,准备 栈 以及 初始化 全局 数据 (GD)。 调用
board_init_f()初始化硬件。 支持
调试 串口(可 选)。 设置
中间 环境 并 进行 代码 重 定位(仅限 U-Boot,非 SPL)。 准备
最终 环境 并 调用 board_init_r()。
_main 函数

具体
入口 (
_main Entry):_main函数的 入口 点,开始 整个 启动 流程。
初始
环境 :设置 ( Initial Environment Setup)设置
初始 栈 和 全局 数据结构 (GD),为 调用 board_init_f()准备环境。
调用
board_init_f():调用
board_init_f()函数,准备硬件 环境,为 后续 在 系统 RAM 中 运行 做 准备。
中间
环境 :设置 ( Intermediate Environment Setup)根据
board_init_f()的结果,更新 栈 和 全局 数据结构 (GD)。
代码
重 :定位 ( Code Relocation)如果
是 U-Boot(而 非 SPL),调用 relocate_code()将 U-Boot 代码迁移 到 目标 地址。
最终
环境 :设置 ( Final Environment Setup)设置
最终 运行 环境,包括 初始化 BSS 和 非常 量 数据。
调用
board_init_r():跳转
到 board_init_r(),进入下一阶段。
分支
U-Boot 和 SPL 的
区别 :如果
是 U-Boot,会 执行 代码 重 定位。 如果
是 SPL (Secondary Program Loader),跳 过重 定位,直接 进入 最终 环境 设置。
board_init_f
board_init_f 函数uboot/common/board_f.c,依次init_sequence_f 数组
static const init_fnc_t init_sequence_f[] = {
initf_malloc, /* 早期堆的初始化 */
arch_cpu_init, /* 各架构的 soc 初始化 */
board_early_init_f /* 板级 early 初始化函数 */
serial_init, /* 串口初始化 */
dram_init, /* 配置 ddr 的 size */
reserve_round_4k, /* reserve 各个区域,为 relocate 做准备 */
arch_reserve_mmu,
reserve_video,
reserve_trace,
reserve_uboot,
reserve_malloc,
reserve_board,
reserve_global_data,
reserve_fdt,
reserve_bootstage,
reserve_bloblist,
reserve_arch,
reserve_stacks,
dram_init_banksize, /* 初始化 global data 中各个 bank 的 size */
show_dram_config,
INIT_FUNC_WATCHDOG_RESET
setup_bdinfo,
display_new_sp,
INIT_FUNC_WATCHDOG_RESET
reloc_fdt,
reloc_bootstage,
reloc_bloblist,
setup_reloc, /* 确定 relocate 的地址 */
clear_bss,
NULL,
};
完成
board_init_r
board_init_r 函数init_sequence_r 的
static init_fnc_t init_sequence_r[] = {
initr_caches, /* 初始化 cache 和 MMU */
initr_malloc, /* 初始化堆区域 */
initr_of_live,
initr_dm, /* 初始化 dm 框架 */
board_init, /* 板级初始化函数 */
initr_watchdog, /* 初始化 watchdog */
last_stage_init, /* 进入 main_loop 之前最后一个阶段的初始化,这里判断了各类启动模式,设置了相应的唤醒变量 */
run_main_loop, /* 进入最后的 loop 阶段,进入命令行模式,或执行 boot 命令 */
};
关键
initr_caches:启用 CPU 缓存和 MMU(内存 管理 单元),提升 执行 效率 与 内存保护。 initr_dm:初始化设备 模型 (Driver Model),扫描 设备树 (DTB),加载 匹配 的 驱动程序。 board_init:板级外设 初始化(如 GPIO、以太网 PHY、存储介质 接口)。 last_stage_init:根据环境变量 或硬件 引脚 状态 判断 启动 模式(如 正常 启动、恢复模式、网络 启动),设 bootcmd执行目标。 run_main_loop:进入 U-Boot 命令行或 自动 执行 bootcmd(如加载 内核、启动 操作系统)。
完成
Secure Boot 流程简介
安全
本

BootROM 阶段
验证
签名
验证 : RSA-4096 (基于公钥 证书) BootROM 使用 RSA-4096 位公钥
算法 对 固件(如 BL2)的 签名 进行 验证。 RSA-4096 是 目前 较为 常见 的 强 加密算法,足以 保证 验证 过程 的 安全性。通过 签名 验证,可以 确保 固件 内容 未 被 篡改,且 其 来源 可信。
解密
算法 : AES-128 (用于 BL2 镜像解密) AES-128 (高级
加密 标准)被 用来 解密 BL2 镜像。 AES-128 是 一种 对称 加密算法,具有 较 高 的 安全性 和 性能。在 启动 过程 中, AES-128 解密 算法 可以 用来 保护 固件 的 机密性,防止 固件 在 传输 过程 中 被 篡改 或 泄露。
证书/密钥:
根公钥:根公钥
存储 在 eFuse(电子 熔丝) 中,通常 是 一个 不可 修改 的 硬件 存储 区域。通过 根公钥, BootROM 可以 验证 BL2 的 数字签名。使用 预置 根公钥,可以 确保 只有 受 信任 的 固件 才 会 通过 验证。 AES 解密
密钥 : AES 解密密钥 也 可能 通过 eFuse 存储 或硬件 固化,以 增强 密钥 的 保护。这样 可以 确保 密钥 的 安全性,防止 恶意程序 获取 密钥 从而 破解 固件。
默认
状态 :签名
验证 和 解密 默认 开启 ,无需客户 干预。
BL2 阶段
BL2 阶段
| 镜像 | 验证 |
证书 |
默认 |
|---|---|---|---|
| BL31 | D-Robotics | D-Robotics 预置 |
默认 |
| OP-TEE | D-Robotics | D-Robotics 预置 |
默认 |
| DDR Firmware | D-Robotics | D-Robotics 预置 |
默认 |
| U-Boot | 客户 | 客户 |
默认 |
| BL2 Config | 客户 | 客户 |
默认 |
BL2 阶段
验证
机制 :所有镜像 均 采用 RSA 签名 验证 证书/密钥:
使用
上表 中 的 证书 / 密钥 进行 验证。
默认
状态 :默认
关闭 , U-Boot 和 BL2 Config 的验证 需要 客户 通过 烧写 eFuse 来 启用 自定义 公钥。
关键
操作 : 在加载 BL31 和 OP-TEE 前,进行 哈希 验证 (verify_hash),确保 镜像 的 完整性。 关于 U-Boot 和 BL2 Config 的
验证 的 详细 内容 可以 参考 U-Boot & BL2 CFG 验证 章节。
证书
在 BL2 阶段, D-Robotics 提供
了 预置 公钥 证书 用于 验证 BL31、OP-TEE 和 DDR Firmware 镜像 的 完整性。 默认
情况 下,这些 镜像 的 验证 功能 是 开启 的,确保 了 这些 关键 组件 的 可信性。 系统
在 启动 时会 自动 对 这些 镜像 进行 验证,确保 它们 没有 被 篡改。
对于 U-Boot 和 BL2 Config 镜像,默认
情况 下 验证 是 关闭 的。客户 可以 根据 自己 的 需求 通过 烧写 eFuse 来 启用 自定义 公钥 证书 验证。 关于
证书 / 秘钥 相关 的 详细 内容 可以 参考 U-Boot 下 密钥 章节。管理
RSA 签名
所有
固件 镜像(包括 BL31 、 OP-TEE、 DDR Firmware、 U-Boot 和 BL2 Config)都 采用 RSA 签名 验证 机制。 这一
机制 通过 数字签名 验证 固件 镜像 的 完整性 和 可信性,确保 只有 未 被 篡改 的 镜像 才能 被 加载 执行。 通过 RSA 签名,任何
对 固件 的 非法 修改 都 能 在 启动 过程 中 被 及时 检测 到,防止 恶意代码 的 注入。
镜像
在
加载 BL31 和 OP-TEE 镜像 之前,系统 会 执行 哈希 验证( verify hash),确保加载 的 镜像文件 没有 被 篡改。 这个
验证 环节 是 BL2 阶段 的 重要 组成部分,确保 了 镜像 的 完整性,并 进一步 增强 了 系统 的 安全性。
U-Boot 阶段
验证
工具/算法:
使用 AVB 2.0 协议
验证 内核 镜像 的 哈希 和 签名。 支持 RSA-2048/4096 或 SHA-256 哈希
树。
证书/密钥:
验证
链 基于 客户 烧录 在 eFuse 中 的 AVB 公钥。
默认
状态 :默认
关闭 ,需客户 烧写 eFuse 启用 AVB 验证。
关于 U-Boot 加密
相关 的 详细 内容 可以 参考 boot 加密 介绍 文档。
Linux 内核阶段
验证
功能:对
system分区进行 完整性 验证(防 篡改)。 配置
依赖 :默认
关闭 ,需客户 烧写 eFuse 启用 DM-Verity。
实现
方式 :内核
启动 后 加载 DM-Verity 元 数据(哈希 树 和 签名)。 使用
预置 在 内核 密钥 环( system_trusted_keyring)中的 公钥 验证 签名。
关于
AVB和DM-Verity的详细 内容 可以 参考 Kernel & rootfs 验证 章节。
安全配置总结
| 阶段 | 验证 |
证书 / 密钥 |
默认 |
启用 |
|---|---|---|---|---|
| BootROM | RSA-4096 + AES-128 | eFuse 根公钥 | 开启 | 固化 |
| BL2 | RSA 签名 | D-Robotics/ 客户 |
部分 |
客户 |
| U-Boot | AVB 2.0 | 客户 AVB 公钥 | 关闭 | 客户 |
| Kernel | DM-Verity | 内核 |
关闭 | 客户 |
补充
BL2阶段
的 : D-Robotics 的分级 验证 公钥 用于 保障 基础 固件 (BL31 、 OP-TEE、 DDR FW) 的 可信性,客户 公钥 用于 业务 相关 模块 (U-Boot、 BL2 Config),实现 责任 分离。 AVB 与 FIT Image 的
关系 : U-Boot 同时支持 FIT (Flat Image Tree) Image 验证(传统 方式)和 AVB 验证,需在 编译 时 配置 优先 使用 AVB 流程。
U-Boot 动态配置内核 ION 预留内存大小功能使用说明
ION 是 Linux 内核
X5 平台
| U-Boot 环境变量 |
修改 |
修改 |
|---|---|---|
| ion_reserved_size | ion_reserved | ion-pool |
| ion_carveout_size | ion_carveout | ion-carveout |
| ion_cma_size | ion_cma | ion-cma |
上述kernel/arch/arm64/boot/dts/hobot/x5-memory.dtsi 中。
使用
# 修改 ION 环境变量
setenv ion_reserved_size 0x40000000
# 若需要重启保持环境变量
saveenv
# 启动 Linux 内核
boot
# 内核中查看 ION 内存
cd /app/platform_samples/sysinfopro/
./sysinfopro -m
上述ion_reserved_size 环境变量
ion_reserved_size是需要 修改 的 目标 ION 区域 对应 的 U-Boot 环境变量 名; 0x40000000是需要 修改 的 目标 ION 区域 的 目标 大小。
示例:
# U-Boot 下执行
Hobot>setenv ion_reserved_size 0x40000000
Hobot>boot
# 等待内核启动后查看 ION 内存信息
root@buildroot:~# cd /app/platform_samples/sysinfopro/
root@buildroot:/app/platform_samples/sysinfopro# ./sysinfopro -m
[Memory Info]:
[Total Memory]: 1.28 GB
[Used Memory]: 0.21 GB
[Free Memory]: 1.02 GB
[NOTE] What is displayed is the memory available to the system,
which is the actual physical memory capacity minus ION and system reserved memory.
(The content is consistent with "free -h")
[ION Memory Info]:
[ION CMA Memory Size]: 0.50 GB
[ION Carveout Memory Size]: 1.00 GB
[ION Reserved Memory Size]: 1.00 GB
可以ION Reserved Memory Size 是 1GB。
注意事项:
内存大小
限制 :当配置 的 ION 区域 的 总 大小( ion_reserved_size + ion_carveout_size + ion_cma_size)加上 ION 起始地址 和 默认 内核 HEAP 大小( DEFAULT_KERNEL_MIN_HEAP)超过可用 DDR 总大 小时, U-Boot 会 发出 告警 并 自动 缩小 这 三个 区域 的 大小。缩小 的 单位 为 16MiB(一次 总共 缩小 48MiB),直到 ION 区域 能够 适配 可用 DDR 大小 为止。 如果
所有 区域 的 大小 都 缩小 到 ION_MIN_SIZE(默认 64MiB)后仍然 无法 容纳, U-Boot 会 提示 错误,但 启动 过程 不会 停止。 ION_MIN_SIZE和DEFAULT_KERNEL_MIN_HEAP(默认 64MiB)的值 定义 在 arch/arm/mach-horizon/x5/x5_ion_setup.c文件内。
十六进制
数值 : U-Boot 环境变量要求 只能 使用 十六进制 数字,如果 配置 的 值 不是 有效 的 十六进制 数字,可能 导致 启动 异常。
U-Boot 使用 dtb overlay 使用说明
DTS Overlay 是
X5 平台
注意: 链接
通用规则
启用
条件 :只有在 配置 了 dtbo_file_path环境变量时, DTS overlay 功能 才 会 被 启用。 文件
限制 :当前只 支持 单个 dtbo 文件 进行 overlay 操作。 默认
行为 :默认情况 下, overlay 只 在 当前 启动 中 生效 一次。如果 需要 在 后续 启动 中 保持 有效,可以 通过 以下 三种 方式 实现: 使用
saveenv命令保存 当前 环境变量。 在
编译 U-Boot 时,直接 在 ./include/configs/x5.h文件中 设置 dtbo_file_path环境变量。
路径
说明 :文中提到 的 路径 为分 区内 路径。例如,如果 分区 挂载 到 /userdata,则/userdata/test.dtbo的分 区内 路径 为 /test.dtbo。
从固定位置获取 overlay 文件
默认
位置 : X5 平台默认 从 mmc0 的 第 12 个 分区(格式 必须 为 ext4)获取 overlay 文件。 配置
命令 :用户需要 使用 setenv dtbo_file_path <path to dtbo file>命令来 配置 环境变量,以便 启动 流程 自动 获取 并 使用 overlay 文件。例如,若 overlay 文件 在 /test.dtbo,则执行: setenv dtbo_file_path /test.dtbo
完整配置 overlay 文件位置
需要
| U-Boot 环境变量 |
含义 | 示例 |
|---|---|---|
| dtbo_fs | overlay 文件 |
ext4 (目前 |
| dtbo_dev | overlay 文件 |
mmc |
| dtbo_part | overlay 文件 |
0:c |
| dtbo_file_path | overlay 文件 |
/test.dtbo |
| dtbo_load_addr | overlay 文件 |
0x9000000 (默认值) |
用户
setenv dtbo_fs ext4
setenv dtbo_dev mmc
setenv dtbo_part 0:c
setenv dtbo_file_path /test.dtbo
boot
DTS Overlay 在
U-Boot 配置 watchdog
默认
CONFIG_DROBOT_DISABLE_WDT=n
watchdog 的
watchdog: watchdog@34250000 {
...
timeout-sec = <10>;
...
};
U-Boot 配置 PHY
U-Boot 下
U-Boot 配置 UART
在 U-Boot 环境
查看
波特率: printenv baudrateprintenv baudrate命令用于 打印 U-Boot 环境变量 中 关于 波特率 的 设置。 baudrate是一个 预定 义 的 环境变量,存储 了 当前 的 串口 通信 波特率。 设置
波特率 : setenv bootargs "console=tty1 console=ttyS0,115200" saveenv
setenv bootargs用于修改 bootargs环境变量。bootargs是启动 参数, console=ttyS0,115200指定了 使用 ttyS0串口设备,并 将 波特率 设置 为 115200 (这个 波特率 值 可以 根据 需要 调整)。 saveenv命令将 修改 后 的 环境变量 保存 到 U-Boot 的 存储 中,使得 修改 能够 在 下次 启动 时 生效。
U-Boot 配置 IO-Domain
U-Boot 内
U-Boot 配置 IO-Domain 的
U-Boot 中常用命令说明
当前 U-Boot 中
Hobot>help
? - alias for 'help'
ab_corrupt- Set the slot to be corrupted.
ab_select - Select the slot used to boot from and register the boot attempt.
adc - ADC sub-system
avb - Provides commands for testing Android Verified Boot 2.0 functionality
base - print or set address offset
bdinfo - print Board Info structure
blkcache - block cache diagnostics and control
boot - boot default, i.e., run 'bootcmd'
bootd - boot default, i.e., run 'bootcmd'
bootelf - Boot from an ELF image in memory
bootflow - Boot flows
booti - boot Linux kernel 'Image' format from memory
bootm - boot application image from memory
bootp - boot image via network using BOOTP/TFTP protocol
bootstage - Boot stage command
bootvx - Boot vxWorks from an ELF image
btype - board type utility commands
chpart - change active partition of a MTD device
cmp - memory compare
coninfo - print console devices and information
cp - memory copy
crc32 - checksum calculation
dcache - enable or disable data cache
dfu - Device Firmware Upgrade
dhcp - boot image via network using DHCP/TFTP protocol
dm - Driver model low level access
echo - echo args to console
editenv - edit environment variable
efuse - Read/Dump efuse access via optee
env - environment handling commands
erase - erase FLASH memory
exit - exit script
ext2load - load binary file from a Ext2 filesystem
ext2ls - list files in a directory (default /)
ext4load - load binary file from a Ext4 filesystem
ext4ls - list files in a directory (default /)
ext4size - determine a file's size
ext4write - create a file in the root directory
false - do nothing, unsuccessfully
fastboot - run as a fastboot usb or udp device
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
fatmkdir - create a directory
fatrm - delete a file
fatsize - determine a file's size
fatwrite - write file into a dos filesystem
fdt - flattened device tree utility commands
flinfo - print FLASH memory information
go - start application at address 'addr'
gpio - query and control gpio pins
gpt - GUID Partition Table
gzwrite - unzip and write memory to block device
hb_avb_helper- Do verify according partition type
help - print command description/usage
i2c - I2C sub-system
icache - enable or disable instruction cache
iminfo - print header information for application image
imxtract - extract a part of a multi-image
itest - return true/false on integer compare
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodem mode)
log - log system
loop - infinite loop on address range
lzmadec - lzma uncompress a memory region
md - memory display
mdio - MDIO utility commands
memdump - memdump system memory to flash
mii - MII utility commands
mm - memory modify (auto-incrementing address)
mmc - MMC sub system
mmcinfo - display MMC info
mtd - MTD utils
mtdparts - define flash/nand partitions
mtest - simple RAM read/write test
mw - memory write (fill)
net - NET sub-system
nfs - boot image via network using NFS protocol
nm - memory modify (constant address)
panic - Panic with optional message
part - disk partition related commands
ping - send ICMP ECHO_REQUEST to network host
pinmux - show pin-controller muxing
poweroff - Perform POWEROFF of the device
printenv - print environment variables
protect - enable or disable FLASH write protection
random - fill memory with random pattern
reset - Perform RESET of the CPU
run - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv - set environment variables
setexpr - set environment variable as the result of eval expression
sf - SPI flash sub-system
showvar - print local hushshell variables
sleep - delay execution for some time
sound - sound sub-system
source - run script from memory
sspi - SPI utility command
test - minimal test like /bin/sh
tftpboot - load file via network using TFTP protocol
true - do nothing, successfully
ubi - ubi commands
ubifsload - load file from an UBIFS filesystem
ubifsls - list files in a directory
ubifsmount- mount UBIFS volume
ubifsumount- unmount UBIFS volume
ums - Use the UMS [USB Mass Storage]
unlz4 - lz4 uncompress a memory region
unzip - unzip a memory region
usb - USB sub-system
usbboot - boot from USB device
version - print monitor, compiler and linker version
下面
环境管理命令
setenv、printenv 和 saveenv 是 U-Boot 中
setenv
setenv 命令
用法:
setenv <variable_name> <value>
<variable_name>:环境变量的 名称。 <value>:环境变量的 值。
示例 1 :
setenv bootargs "console=tty1 console=ttyS0,115200"
这个bootargs 环境变量console=tty1 console=ttyS0,115200。
注意:
如果
环境变量 已经 存在, setenv会覆盖 原有 值。 设置
的 环境变量 只会 在 当前 会话 中 有效,除非 保存。
示例 2 :
设置 IP 地址、子网掩码
setenv ipaddr 192.168.1.10
setenv netmask 255.255.255.0
setenv gatewayip 192.168.1.1
注意:只有ping 测试:
Hobot>ping 192.168.1.101
Using gmac-tsn@35010000 device
host 192.168.1.101 is alive
printenv
printenv 命令
用法:
printenv
显示
printenv <variable_name>
显示
示例:
printenv baudrate
这baudrate 环境变量
Hobot>printenv baudrate
baudrate=115200
注意:
printenv不会修改 任何 环境变量,它 仅 用于 查看 当前 的 环境变量 设置。
saveenv
saveenv 命令saveenv 保存
用法:
saveenv
示例:
setenv bootargs "console=tty1 console=ttyS0,115200"
saveenv
这bootargs 环境变量
注意:
saveenv会将 当前 的 环境变量 保存 到 存储 中,通常 会 覆盖 存储 区域 中 的 原有 环境变量。 保存
环境变量 后,重启 系统 时,这些 变量 会 自动 加载。
md 命令
md (memory display) 是 U-Boot 中
md 命令格式
md [.b, .w, .l, .q] address [# of objects]
md 参数解析
.b、.w、.l、.q:.b:按字节( Byte, 1 字节)显示 内存 数据。 .w:按字( Word, 2 字节)显示内存 数据。 .l:按双字( Long word, 4 字节)显示 内存 数据。 .q:按四字( Quad word, 8 字节)显示内存 数据。
这些
标志符 决定 了 每个 单位 数据 的 显示 宽度。默认 情况 下,如果 不 指定 宽度,它会 选择 默认 的 word宽度( 2 字节)。address:显示
的 起始 地址。可以 是 十六进制 表示 的 地址,指定 内存 的 起始 位置。 # of objects:可
选 参数,表示 要 显示 的 内存 数据 的 数量,默认 为 1 。如果 指定 此参数, md命令会 显示 从 指定 地址 起 的 多个 内存 单元。
md 示例
md.b 0x34120000 4:以
字节 为 单位,从 地址 0x34120000开始显示 4 个 字节 的 数据。 Hobot>md.b 0x34120000 4 34120000: 00 00 00 00 ....
md.w 0x34120000 8:以字
为 单位,从 地址 0x34120000开始显示 8 个 字 的 数据。 Hobot>md.w 0x34120000 8 34120000: 00000000 00000000 00000000 00000000 ................ 34120010: 00000000 00000000 00000000 00000000 ................
md.l 0x34120000 6:以
双字 为 单位,从 地址 0x34120000开始显示 6 个 双字 的 数据。 Hobot>md.l 0x34120000 6 34120000: 00000000 00000000 00000000 00000000 ................ 34120010: 00000000 00000000 ........
md 命令使用场景
md 命令
调试
硬件 :查看问题 特定 内存地址 的 内容,确认 硬件 是否 正确 初始化。 验证
数据 :确认加载 数据 是否 正确 加载 到 内存 中(例如,设备树、内核 镜像 等)。 分析
内存 :查看布局 内存 中 存储 的 结构化 数据(例如,设备树 头 信息、内核 启动 参数 等)。 开发
和 :开发测试 在 过程 中,快速 查看 内存 中 的 数据 变化。
md 命令的注意事项
地址
对齐 :某些内存 操作 可能 需要 地址 对齐(例如, .w需要 2 字节对齐, .l需要 4 字节对齐)。如果 地址 未 正确 对齐,可能 会 导致 错误。 内存
访问 :某些权限 内存 区域 可能 受 保护,访问 这些 区域 可能 会 导致 错误 或 异常。 显示
范围 :如果指定 的 显示 范围 超出 有效 内存 区域,可能 会 导致 未定义 行为。
mw 命令
mw (memory write) 是 U-Boot 中
mw 命令格式
mw [.b, .w, .l, .q] address value [count]
mw 参数解析
.b、.w、.l、.q:.b:以字节( 1 字节)为 单位 写入 内存 数据。 .w:以字( 2 字节)为单位 写入 内存 数据。 .l:以双字( 4 字节)为 单位 写入 内存 数据。 .q:以四字( 8 字节)为单位 写入 内存 数据。
这些
选项 指定 了 写入 数据 的 大小 和 单位。如果 不 指定 宽度,默认 使用 word( 2 字节)作为数据 单位。 address:指定
要 写入 的 内存地址。可以 是 十六进制 表示 的 地址。 value:指定
要 写入 到 内存 的 值。可以 是 十六进制 或 十进制 的 数字,取决于 U-Boot 的 设置。 count(可
选):指定 要 写入 的 内存 单元 数量。默认 为 1 。如果 指定 了 该 参数, mw会将 相同 的 值 写入 连续 的 内存 单元。
mw 示例
mw.b 0x88000000 0xAA 4:将值
0xAA(十六进制)按字节( 1 字节)写入 内存地址 0x88000000开始的 连续 4 个 内存 单元。 Hobot>mw.b 0x88000000 0xAA 4
然后
再 使用 md命令回读 确认 写入 情况: Hobot>md.b 0x88000000 8 88000000: aa aa aa aa 1f 20 03 d5 ..... ..
mw.w 0x88000000 0x1234 3:将值
0x1234(十六进制)按字( 2 字节)写入内存地址 0x88000000开始的 连续 3 个 内存 单元。 Hobot>mw.w 0x88000000 0x1234 3
然后
再 使用 md命令回读 确认 写入 情况: Hobot>md.w 0x88000000 8 88000000: 1234 1234 1234 d503 7000 8fec 0000 0000 4.4.4....p......
mw.l 0x88000000 0xDEADBEEF 2:将值
0xDEADBEEF(十六进制)按双字( 4 字节)写入 内存地址 0x88000000开始的 连续 2 个 内存 单元。 Hobot>mw.l 0x88000000 0xDEADBEEF 2
然后
再 使用 md命令回读 确认 写入 情况: Hobot>md.l 0x88000000 8 88000000: deadbeef deadbeef 8fec7000 00000000 .........p...... 88000010: 00130f20 00000000 00130f20 00000000 ....... .......
mw 命令使用场景
mw 命令
硬件
调试 :向硬件 寄存器 写入 特定 值以 测试 硬件 功能。 内存
测试 :填充内存 区域 以 验证 内存 是否 正常 工作。 修改
内存 :在内容 启动 过程 中 动态 修改 内存 中 的 数据(例如,设备树、内核 启动 参数 等)。 开发
和 :在测试 开发 过程 中 快速 修改 内存 内容 以 验证 功能。
mw 命令的注意事项
地址
对齐 :某些写入 操作 可能 需要 地址 对齐(例如, .w需要 2 字节对齐, .l需要 4 字节对齐)。如果 地址 未 正确 对齐,可能 会 导致 错误。 内存
访问 :某些权限 内存 区域 可能 受 保护,写入 这些 区域 可能 会 导致 错误 或 异常。 数据
范围 :确保写入 的 值 在 指定 的 大小 范围 内(例如,字节 值 范围 为 0x00到0xFF,字值范围 为 0x0000到0xFFFF)。
nm 命令
nm 是 U-Boot 中mw 命令,nm 主要
nm 命令格式
nm [.b, .w, .l, .q] address
nm 参数解析
.b、.w、.l、.q:.b:以字节( 1 字节)为 单位 修改 内存。 .w:以字( 2 字节)为单位 修改 内存。 .l:以双字( 4 字节)为 单位 修改 内存。 .q:以四字( 8 字节)为单位 修改 内存。
这些
选项 确定 了 修改 的 内存 单元 的 大小。如果 不 指定 宽度,默认 按 word( 2 字节)单位修改。 address:指定
要 修改 的 内存地址。这个 地址 通常 是 一个 固定 地址,修改 此 地址 的 数据 值。
nm 命令示例
验证 nm 命令
输入
命令 后,U-Boot 会 显示 当前 地址 的 值,并 等待 用户 输入 新值。 输入
新值 后 按 回车,该 地址 的 值会 被 更新。 可以
直接 按 回车 跳 到 下 一个 地址(地址 自动 递增)。 输入
.(点号)即可 退出 命令。
示例:
Hobot>nm.l 0x34120000
34120000: 80000000 ? 1
34120000: 00000001 ? 2
34120000: 00000002 ? 3
34120000: 00000003 ? abcd
34120000: 0000abcd ? .
Hobot>md.l 0x34120000 1
34120000: 0000abcd ....
与 mw 命令nm 主要
mm 命令
mm 是 U-Boot 中nm 命令mm 具有 自动mm 可以
mm 命令格式
mm [.b, .w, .l, .q] address
mm 命令参数解析
.b、.w、.l、.q:.b:以字节( 1 字节)为 单位 修改 内存。 .w:以字( 2 字节)为单位 修改 内存。 .l:以双字( 4 字节)为 单位 修改 内存。 .q:以四字( 8 字节)为单位 修改 内存。
这些
选项 指定 了 每次 修改 时 的 内存 单元 宽度。如果 没有 指定,默认 按 word( 2 字节)修改。address:指定
起始 的 内存地址。这个 地址 是 修改 的 起点, mm会从 该 地址 开始 修改,并会 在 每次 修改 后 自动 递增 地址,适用 于 连续 内存 单元 的 修改。
mm 命令示例
验证 mm 命令md 命令
Hobot>
88000000: 0a ? 1
88000001: 00 ? 2
88000002: 00 ? 3
88000003: 14 ? 4
88000004: 1f ? Hobot><INTERRUPT>
Hobot>md.w 0x88000000 8
88000000: 0201 0403 201f d503 7000 8fec 0000 0000 ..... ...p......
内存修改命令的区别
mw:用于
向 内存 区域 填充 相同 的 数据。 地址
会 自动 递增。 适合
批量 修改 内存。
nm:用于
修改 内存 中 的 单一 单元。 地址
保持 不变。 适合
逐个 修改 内存 单元 或 多次 修改 同一 地址。
mm:用于
逐个 修改 内存 单元。 地址
自动 递增。 适合
连续 修改 内存 区域。
另外,需要 注意 上述
I2C 命令
在 U-Boot 中,i2c 命令
关于 U-Boot 中 i2c 命令
gpio 命令
U-Boot 下gpio 命令,用户
Hobot>gpio
gpio - query and control gpio pins
Usage:
gpio <input|set|clear|toggle> <pin>
- input/set/clear/toggle the specified pin
gpio status [-a] [<bank> | <pin>] - show [all/claimed] GPIOs
以下
gpio <input|set|clear|toggle> <pin>这个
命令 用于 操作 指定 的 GPIO 引脚(通过 <pin>指定)。input: 将指定 的 GPIO 引脚 配置 为 输入 模式。此 模式 下, GPIO 引脚 可以 读取 外部 信号(例如,按钮 的 状态)。 set: 将指定 的 GPIO 引脚 设置 为 高电平(逻辑 1)。通常,这会 使 引脚 输出 3.3V 或 1.8V,具体 电压 取决于 硬件 配置。 clear: 将指定 的 GPIO 引脚 设置 为 低电平(逻辑 0)。这 通常 会 使 引脚 输出 0V。 toggle: 切换指定 GPIO 引脚 的 状态。如果 引脚 当前 是 高电平,将 其 设置 为 低电平,反之亦然。
例如:
gpio set gpio@ls_0_0将 GPIO 引脚 gpio@ls_0_0 设置为 高电平。 gpio clear gpio@ls_0_0将 GPIO 引脚 gpio@ls_0_0 设置为 低电平。 gpio toggle gpio@ls_0_0将 GPIO 引脚 gpio@ls_0_0 的状态 在 高低 之间 切换。
gpio status [-a] [<bank> | <pin>]这个
命令 用于 显示 GPIO 引脚 的 状态。 status: 显示当前 GPIO 引脚 的 状态,可以 是 输入 或 输出,也 可能 显示 是否 已 被 占用(claimed)。 -a: 如果指定 了 -a选项,将显示 所有 的 GPIO 引脚 的 状态,而 不仅仅 是 已 被 占用 的 引脚。 <bank>: 你可以 通过 指定 一个 bank来查看 该组 中 的 GPIO 引脚 状态(如果 系统 的 GPIO 被 分成 多个 银行)。通常, GPIO 会 被 划分 成 不同 的 银行,每个 银行 包含 多个 引脚。 <pin>: 你也 可以 通过 指定 某个 特定 的 引脚 来 查看 该 引脚 的 状态。
例如:
gpio status gpio@ls_0_0显示 GPIO 引脚 gpio@ls_0_0 的状态。 gpio status -a会显示 所有 GPIO 引脚 的 详细 状态,包括 未 被 占用 和 已 占用 的 引脚。
gpio 工具
dm 命令
dm 是 U-Boot 中dm 命令
dm 命令格式
Hobot>dm
dm - Driver model low level access
Usage:
dm compat Dump list of drivers with compatibility strings
dm devres Dump list of device resources for each device
dm drivers Dump list of drivers with uclass and instances
dm static Dump list of drivers with static platform data
dm tree Dump tree of driver model devices ('*' = activated)
dm uclass Dump list of instances for each uclass
dm 参数解析
dm compat:功能:显示
与 每个 驱动 兼容 的 字符串。 用途:帮助
用户 查看 哪些 驱动 与 特定 硬件 设备 兼容,以及 驱动 的 兼容性 信息。
dm devres:功能:显示
每个 设备 的 资源 列表。 用途:列出
设备 在 启动 时 使用 的 所有 资源,比如 内存、 I/O 地址 等。这 有助于 诊断 设备 资源分配 和 管理 的 问题。 注意:该
选项 需要 将 CONFIG_DEVRES打开才能 使用,当前 板端 默认 不 开启。
dm drivers:功能:输出
当前 U-Boot 系统 中 所有 驱动 的 详细 列表。 用途:显示
当前 系统 中 所有 加载 的 驱动程序 的 类 和 实例,包括 它们 所属 的 设备 类 (uclass) 和 具体 的 驱动 实例。 uclass代表设备 驱动 的 类别,比如 块 设备、网络设备 等。每个 类别 下 可以 有 多个 设备 实例。
dm static:功能:输出
带有 静态 平台 数据 的 驱动 列表。 用途:显示
那些 带有 静态 平台 数据 的 驱动程序,方便 查看 哪些 驱动 使用 了 编译 时 绑定 的 数据。静态 平台 数据 通常 是 在 编译 时 确定 并 与 驱动 绑定 的 数据,显示 这些 数据 有助于 调试 静态 配置 的 设备 驱动。
dm tree:功能:输出 U-Boot 驱动
模型 的 设备树,展示 设备 层次结构 及 激活状态,类似 于 硬件 树形 结构 视图,已 激活 的 设备 以 *标记。用途:以
树状 图 的 方式 显示 所有 驱动 模型 设备 的 层次结构,可以 帮助 理解 设备 间 的 父子关系,查看 设备 的 激活状态。
dm uclass:功能:列出
每个 uclass(设备 类)下 的 实例。 用途:列出
每个 设备 类别 下 的 设备 实例,帮助 用户 了解 每个 设备 类中 存在 的 设备。
dm 命令示例
重点dm compat 和 dm tree 这
dm compat
Hobot>dm compat Driver Compatible -------------------------------- asix_eth ax88179_eth blk_partition bootmeth_distro u-boot,distro-syslinux bootstd_drv u-boot,boot-std board_type_btype_bus btype-bus fixed_factor_clock fixed-factor-clock fixed_rate_raw_clock designware_wdt snps,dw-wdt …… es8156 hobot,es8156 eth_bootdev u-boot,bootdev-eth eth_eqos st,stm32mp1-dwmac horizon,sunrise5-dwmac eth_phy_generic_drv fixed_clock fixed-clock syscon syscon gpio-dwapb snps,dw-apb-gpio guc_adc guc,igav04a hobot_board_btype hobot,btype hobot_i2s hobot, hobot-i2s hobot_sound hobot,audio-codec horizon_dsp_pinctrl d-robotics,horizon-dsp-iomuxc horizon_hsio_pinctrl d-robotics,horizon-hsio-iomuxc horizon_lsio_pinctrl d-robotics,horizon-lsio-iomuxc i2c_designware snps,designware-i2c i2c_generic_chip_drv i2c-chip mmc_blk mmc_bootdev u-boot,bootdev-mmc ns16550_serial ns16550 ns16550a ingenic,jz4780-uart nvidia,tegra20-uart snps,dw-apb-uart optee linaro,optee-tz pinconfig …… x5_sdhci horizon,x5-sdhci xhci-dwc3 snps,dwc3
dm compat命令输出 的 详细分析 如下: Driver:驱动程序 名称 每个
驱动程序 都 有 一个 唯一 的 名称,用于 标识 其 功能 和 用途。
Compatible:兼容性
字符串 兼容性
字符串 是 设备树 中 用于 匹配 硬件 设备 的 属性 值。驱动程序 通过 这些 字符串 来 识别 和 绑定 到 特定 的 硬件 设备。 每个
驱动程序 可以 支持 多个 兼容性 字符串,以 兼容 不同 厂商 或 型号 的 硬件。
举例说明:
gpio-dwapb:兼容性
字符串 :snps,dw-apb-gpio
功能: DesignWare GPIO 控制器驱动
程序。
hobot_i2s:兼容性
字符串 :hobot,hobot-i2s
功能: Hobot I2S 音频接口
驱动程序。
dm tree
Hobot>dm tree Class Index Probed Driver Name ----------------------------------------------------------- root 0 [ + ] root_driver root_driver firmware 0 [ + ] hobot_board_btype |-- board_type gpio 0 [ ] gpio-dwapb |-- gpio@34120000 gpio 1 [ ] gpio-dwapb | `-- gpio@ls_0_ gpio 2 [ ] gpio-dwapb |-- gpio@34130000 gpio 3 [ ] gpio-dwapb | `-- gpio@ls_1_ pinctrl 0 [ + ] horizon_lsio_pinctrl |-- lsio_iomuxc@34180000 pinconfig 0 [ ] pinconfig | |-- pconf-bias-disabled pinconfig 1 [ ] pinconfig | |-- pconf-spi …… pinconfig 70 [ ] pinconfig | `-- lsiogpio1grp6 gpio 4 [ ] gpio-dwapb |-- gpio@35060000 gpio 5 [ ] gpio-dwapb | `-- gpio@hs_0_ gpio 6 [ ] gpio-dwapb |-- gpio@35070000 gpio 7 [ ] gpio-dwapb | `-- gpio@hs_1_ pinctrl 1 [ + ] horizon_hsio_pinctrl |-- hsio_iomuxc@35050000 pinconfig 71 [ + ] pinconfig | |-- enetgrp …… clk 9 [ ] fixed_clock |-- adcclk clk 10 [ ] fixed_clock |-- i2cclk clk 11 [ ] fixed_clock |-- wdtclk bootstd 0 [ ] bootstd_drv `-- bootstd bootmeth 0 [ ] bootmeth_distro |-- distro bootmeth 1 [ ] vbe_simple `-- vbe_simple
dm tree的输出 包含 以下 几列 信息: Class
描述:设备
的 类别,例如 root、firmware、gpio、pinctrl、clk等。作用:帮助
区分 不同 类型 的 设备。
Index
描述:设备
在 同类 设备 中 的 索引 编号。 作用:标识
同 一类 设备 中 的 不同 实例。
Probed
描述:设备
的 初始化 状态,通常 用 符号 表示: [ + ]:设备已 成功 初始化。 [ ]:设备尚未 初始化。
作用:显示
设备 是否 已 被 探测 并 初始化。
Driver
描述:绑定
到 该 设备 的 驱动程序 名称。 作用:显示
设备 的 驱动程序,帮助 调试 驱动程序 相关 问题。
Name
描述:设备
的 名称,通常 包含 设备 的 地址 或 标识符。 作用:提供
设备 的 唯一 标识。
dm tree的输出 通常 以 树状 结构 显示,使用 缩进 和 符号 来 表示 设备 之间 的 层次 关系: |--:表示子 设备。 |--:表示子 设备 的 进一步 缩进。 `--:表示最后 一个 子 设备。
例如:
root 0 [ + ] root_driver root_driver firmware 0 [ + ] hobot_board_btype |-- board_type gpio 0 [ ] gpio-dwapb |-- gpio@34120000 gpio 1 [ ] gpio-dwapb | `-- gpio@ls_0_
举例说明
dm tree输出:根
节点 root 0 [ + ] root_driver root_driver
Class:
root,表示这 是 根 节点。 Index:
0,表示这是 第一个 根 节点。 Probed:
[ + ],表示该 设备 已 成功 初始化。 Driver:
root_driver,表示绑定 到 该 设备 的 驱动程序。 Name:
root_driver,表示设备 的 名称。
GPIO 控制器
gpio 0 [ ] gpio-dwapb |-- gpio@34120000
Class:
gpio,表示这是 GPIO 控制器。 Index:
0,表示这是 第一个 GPIO 控制器。 Probed:
[ ],表示该 设备 尚未 初始化。 Driver:
gpio-dwapb,表示绑定 到 该 设备 的 驱动程序。 Name:
gpio@34120000,表示设备 的 名称,其中 34120000是设备 的 内存地址。
引脚
控制器 (Pinmux) pinctrl 0 [ + ] horizon_lsio_pinctrl |-- lsio_iomuxc@34180000
Class:
pinctrl,表示这是 引脚 控制器。 Index:
0,表示这是 第一个 引脚 控制器。 Probed:
[ + ],表示该 设备 已 成功 初始化。 Driver:
horizon_lsio_pinctrl,表示绑定 到 该 设备 的 驱动程序。 Name:
lsio_iomuxc@34180000,表示设备 的 名称,其中 34180000是设备 的 内存地址。
mii 命令
MII(媒体
在 U-Boot 中,mii 命令
mii 命令格式
mii - MII utility commands
Usage:
mii device - list available devices
mii device <devname> - set current device
mii info <addr> - display MII PHY info
mii read <addr> <reg> - read MII PHY <addr> register <reg>
mii write <addr> <reg> <data> - write MII PHY <addr> register <reg>
mii modify <addr> <reg> <data> <mask> - modify MII PHY <addr> register <reg>
updating bits identified in <mask>
mii dump <addr> <reg> - pretty-print <addr> <reg> (0-5 only)
Addr and/or reg may be ranges, e.g. 2-7.
mii 参数解析
mii device:列出所有 可用 的 MII 设备。 mii device <devname>:设置当前 操作 的 MII 设备。 mii info:显示当前 MII 连接 的 状态 信息(如 链路、速率、双工 模式 等)。 mii read:读取指定 PHY 寄存器 的 值,帮助 获取 网络 状态 信息。 mii write:写入指定 PHY 寄存器 的 值,修改 设备 配置(如 速率、双工 模式 等)。 mii scan:扫描所有 的 PHY 地址,检查 它们 的 状态。 mii reset:重置 PHY 设备,恢复到 默认设置。 mii dump:显示指定 PHY 设备 的 所有 寄存器 的 内容,便于 调试 和 分析。
mii 命令示例
mii device:
mii device命令用于 显示 当前 系统 中 已 配置 的 MII 设备 的 列表。它 通常 用于 查看 系统 中 可用 的 网络设备 及其 状态。 用法:
mii device此
命令 会 显示 系统 中 所有 可用 的 MII 设备 和 其 相关 信息。通常 它会 列出 多个 网络接口 的 状态。 示例:
mii device输出
示例: Hobot>mii device MII devices: 'gmac-tsn@35010000' Current device: 'gmac-tsn@35010000'
分析
输出: MII devices: 这行 显示 了 系统 中 当前 可用 的 MII 设备。这里 显示 的 设备 是 gmac-tsn@35010000 ,表示 系统 检测 到 一个 名为 gmac-tsn@35010000 的 MII 设备。这个 设备 是 一个 集成 的 以太网 控制器, 35010000 是 设备 的 地址。 Current device: 这行 显示 了 当前 操作 的 MII 设备。这里 也 显示 为 gmac-tsn@35010000 ,表示 当前 命令 正在 作用 于 这个 设备。
mii info:
mii info命令用于 显示 当前 网络接口 的 MII 状态 信息,通常 用于 查看 网络连接 的 状态,包括 速率、双工 模式、链路 状态 等。 用法:
mii info <addr>
输出
示例: Hobot>mii info PHY 0x00: OUI = 0x0732, Model = 0x11, Rev = 0x06, 100baseT, FDX PHY 0x01: OUI = 0x0732, Model = 0x11, Rev = 0x06, 100baseT, FDX Hobot>mii info 0x00 PHY 0x00: OUI = 0x0732, Model = 0x11, Rev = 0x06, 100baseT, FDX
可以
看出 系统 检测 到 了 两个 PHY 设备,分别 位于 地址 0x00和0x01,详细解释 如下: PHY 0x00 和 PHY 0x01:这
表示 系统 检测 到 了 两个 物理层 设备 (PHY)。 0x00和0x01是 PHY 设备的 地址 标识符,通常 是 硬件 地址。 OUI (组织
唯一 :标识符) OUI = 0x0732是制造商 的 唯一 标识符 (Organizationally Unique Identifier),用于 标识 设备 制造商。 Model 和 Rev:
Model = 0x11和Rev = 0x06分别是 PHY 设备 的 型号 和 版本号。 100baseT:这
表示 设备 当前 支持 100 Mbps 的 速率, 100baseT是以太网 速率 标准。 FDX (Full Duplex):这
表示 设备 正在 以 全双工 模式 运行,意味着 数据 可以 同时 发送 和 接收。
mii read:
mii read命令用于 读取 指定 PHY 地址 的 特定 寄存器 内容。每个 PHY 设备 有 多个 寄存器,用于 存储 各种 控制 和 状态 信息。 mii read可以读取 这些 寄存器 的 值,帮助 诊断 网络设备 的 问题。 当前
板端 使用 的 PHY 芯片 为 RTL8221F 其 寄存器 列表 如下: 
用法:
mii read <phy_address> <register>
<phy_address>:指定要 读取 的 PHY 地址。 <register>:指定要 读取 的 寄存器 编号。
示例:
mii read 0 0x02 mii read 0 0x03
这
将 读取 地址 为 0的 PHY 设备的 0x020x03寄存器。输出
示例: Hobot>mii read 0 0x2 001C Hobot>mii read 0 0x3 C916
这个
命令 会 显示 寄存器 PHYID1和PHYID1的值。 从 RTL8221F 的
数据 手册 中 可以 查 到 这 两个 寄存器 的 描述: 

从
这 两个 寄存器 的 值 可以 获取 到 如下 信息: OUI_MSB: OUI_MSB 的值 为 0x1C (00011100b), OUI值的 高 16 位。 OUI_LSB: OUI_LSB 的值 为 110010b, OUI值的 低 6 位。 Model Number: Model Number 的值 为 10001b (0x11)。 Revision Number: Revision Number 的值 为 110b (0x6)。
OUI值由 OUI_MSB和OUI_LSB组成:00011100b << 6 + 110010b = 011100110010b也就是 0x732 。这 与 前面 的 mii info的输出 是 一致 的: PHY 0x00: OUI = 0x0732, Model = 0x11, Rev = 0x06, 100baseT, FDX
另外, mii read 命令
支持 一次性 读取 多个 寄存器 的 值: Hobot>mii read 0 0-2 addr=00 reg=00 data=1040 addr=00 reg=01 data=79AD addr=00 reg=02 data=001C
上述
示例 一次性 读取 了 PHY0 寄存器 设备 中 0x0 ~ 0x2 的 寄存器 值。 mii write:
mii write命令用于 写入 指定 PHY 地址 的 特定 寄存器。通过 修改 PHY 寄存器 的 值,用户 可以 更改 网络设备 的 配置(如 速率、双工 模式、自动 协商 等)。 用法:
mii write <phy_address> <register> <value>
<phy_address>:指定要 写入 的 PHY 地址。 <register>:指定要 写入 的 寄存器 编号。 <value>:要写入 寄存器 的 值。
示例:
Hobot>mii read 0 0x4 01E1 Hobot>mii write 0 0x4 0x181
这个
命令 将 向 地址 为 0的 PHY 设备的 0x4寄存器写入 0x181的值。写入 完成 后 可以 使用 mii read命令回读 一下,确认 写入 是否 成功: Hobot>mii read 0 0x4 0181
mii dump:
mii dump命令用于 以 易读 的 格式 打印 MII PHY 设备 的 寄存器 内容,它 可以 详细 显示 每个 寄存器 的 位字段 及其 含义,能够 有效 帮助 用户 分析 和 调试 网络设备 的 状态。 用法:
mii dump <phy_address> <reg_address>
示例:
Hobot>mii dump 0 4 1. (0181) -- Autonegotiation advertisement register -- (8000:0000) 4.15 = 0 next page able (4000:0000) 4.14 = 0 (reserved) (2000:0000) 4.13 = 0 remote fault (1000:0000) 4.12 = 0 (reserved) (0800:0000) 4.11 = 0 asymmetric pause (0400:0000) 4.10 = 0 pause enable (0200:0000) 4. 9 = 0 100BASE-T4 able (0100:0100) 4. 8 = 1 100BASE-TX full duplex able (0080:0080) 4. 7 = 1 100BASE-TX able (0040:0000) 4. 6 = 0 10BASE-T full duplex able (0020:0000) 4. 5 = 0 10BASE-T able (001f:0001) 4. 4- 0 = 1 selector = IEEE 802.3 CSMA/CD
寄存器
0x4是 MII 管理接口 中 的 Autonegotiation Advertisement Register (自 协商 ,该广播 寄存器) 寄存器 用于 描述 PHY 设备 支持 的 速率 和 模式,并 在 自 协商 过程 中向 对 端 设备 广播 这些 能力。该 寄存器 的 值 是 0x0181 。 字
段 :解析 0x8000(bit 15): Next Page Able值:
0含义:不
支持 扩展 自 协商 (Next Page)功能。
0x4000(bit 14):保留位 值:
0
0x2000(bit 13): Remote Fault值:
0含义:没有
检测 到 远程 故障。
0x1000(bit 12):保留位 值:
0
0x0800(bit 11): Asymmetric Pause值:
0含义:不
支持 非对称 暂停 模式。
0x0400(bit 10): Pause Enable值:
0含义:不
支持 暂停 模式。
0x0200(bit 9): 100BASE-T4 Able值:
0含义:不
支持 100BASE-T4 模式。
0x0100(bit 8): 100BASE-TX Full Duplex Able值:
1含义:支持 100Mbps 全双工
模式。
0x0080(bit 7): 100BASE-TX Able值:
1含义:支持 100Mbps 半双工
模式。
0x0040(bit 6): 10BASE-T Full Duplex Able值:
0含义:不
支持 10Mbps 全双工 模式。
0x0020(bit 5): 10BASE-T Able值:
0含义:不
支持 10Mbps 半双工 模式。
0x001F(bits 4-0): Selector值:
0x0001含义:选择 IEEE 802.3 CSMA/CD 模式。
从
mii dump的输出 来看,该 PHY 设备 支持 以下 功能: 100BASE-TX Full Duplex:支持 100Mbps 全双工
模式。 100BASE-TX:支持 100Mbps 半双工
模式。 不
支持 :10BASE-T( 10Mbps 半双工
模式) 10BASE-T Full Duplex( 10Mbps 全双工
模式) 100BASE-T4
暂停
模式 (Pause) 非对称
暂停 模式 (Asymmetric Pause) 扩展
自 协商 (Next Page)
注意:当前 PHY 设备
默认 支持 10Mbps 全 / 半双工 模式,因为 在 mii write示例中 对 寄存器 0x4写入了 0x181 ,禁用 了 该 功能,所以 这里 mii dump出来的 状态 变化 了。
mdio 命令
MDIO (Management Data Input/Output) 是 IEEE 802.3 规范mdio 系列
mdio 命令格式
mdio - MDIO utility commands
Usage:
mdio list - List MDIO buses
mdio read <phydev> [<devad>.]<reg> - read PHY's register at <devad>.<reg>
mdio write <phydev> [<devad>.]<reg> <data> - write PHY's register at <devad>.<reg>
mdio rx <phydev> [<devad>.]<reg> - read PHY's extended register at <devad>.<reg>
mdio wx <phydev> [<devad>.]<reg> <data> - write PHY's extended register at <devad>.<reg>
mdio 参数解析
<phydev>: PHY 设备标识符,可以 是 以下 几种 形式: <busname> <addr>:例如gmac-tsn@35010000 0。<addr>:例如0。<eth name>:例如eth0。
<addr>: PHY 设备地址。 <devad>:设备地址。 <reg>:寄存器地址。 <data>:要写入 的 数据。
mdio 命令示例
mdio list
功能:列出
所有 可用 的 MDIO 总线 及其 名称。 用法:
mdio list输出
示例 :
Hobot>mdio list gmac-tsn@35010000:输出
解析 : gmac-tsn@35010000 :
含义:这是
一个 以太网 MAC 设备,支持 时间 敏感 网络 (TSN)功能。 gmac-tsn:表示
这是 一个 以太网 MAC 设备,支持 TSN 功能。 @35010000 :表示
该 设备 的 基 地址 为 0x35010000 。
系统
中 只有 一个 MDIO 总线,名为 gmac-tsn@35010000。这意味着 所有 与 以太网 PHY 设备 的 通信 都 将 通过 这个 总线 进行。
mdio read <phydev> [<devad>.]<reg>
功能:读取
指定 PHY 设备 的 寄存器 值。 参数:
<phydev>: PHY 设备标识符,可以 是 <busname> <addr>、<addr>或<eth name>。<devad>:设备地址(可 选,默认 为 0)。<reg>:寄存器地址。
用法:
mdio read gmac-tsn@35010000 0 1
输出
示例 :Hobot>mdio read gmac-tsn@35010000 0 1 Reading from bus gmac-tsn@35010000 PHY at address 0: 1 - 0x79ad
字
段 解释 如下: Reading from bus gmac-tsn@35010000:表示
该 命令 是 在 MDIO 总线 gmac-tsn@35010000上执行 的。 PHY at address 0:指示
这是 总线 上 的 第一个 PHY 设备(地址 为 0)。1 - 0x79ad:表示
从 寄存器 1中读取 到 了 值 0x79ad。
mdio write <phydev> [<devad>.]<reg> <data>
功能:向
指定 PHY 设备 的 寄存器 写入 数据。 参数:
<phydev>: PHY 设备标识符。 <devad>:设备地址(可 选,默认 为 0)。<reg>:寄存器地址。 <data>:要写入 的 数据。
用法:
Hobot>mdio write gmac-tsn@35010000 0 4 0x181
字
段 解释 如下: mdio write:用于向 指定 的 MDIO 总线 上 的 PHY 设备 寄存器 写入 数据。 gmac-tsn@35010000: MDIO 总线的 名称,表示 目标 设备 是 gmac-tsn,基地址 为 0x35010000。0: PHY 设备的 地址,表示 目标 PHY 设备 在 MDIO 总线 上 的 地址 为 0。4:寄存器地址,表示 要 写入 的 寄存器 编号 为 4。0x181:要写入 的 数据 值。
为了
验证 写入 操作 是否 成功,可以 使用 mdio read命令读取 寄存器 4的值: Hobot>mdio read gmac-tsn@35010000 0 4 Reading from bus gmac-tsn@35010000 PHY at address 0: 4 - 0x181
可以
看到,值 已经 成功 写入 了。 mdio rx、mdio wx 在 U-Boot 中,mdio rx、mdio wx 命令
用于 读、写 以太网 PHY 设备 的 扩展 寄存器 (Extended Registers)。扩展 寄存器 通常 用于 更 高级 的 配置 和 状态 信息,这些 信息 可能 不 在 标准 的 MII 寄存器 中 提供。并非 所有 PHY 设备 都 支持 扩展 寄存器。在 使用 mdio rx/wx 命令 之前,需要 参考 设备 手册 以 确定 正确 的 寄存器 地址 以及 确认 当前 PHY 设备 是否 支持 扩展 寄存器 访问。
Bootloader 相关术语表
| 术语 | 解释 |
|---|---|
| BootROM | 硬件 |
| U-Boot | Universal Boot Loader,开源 |
| SPL | Secondary Program Loader,二级 |
| Secure Boot | 通过 |
| OP-TEE | Open Portable Trusted Execution Environment,开放 |
| TA | Trusted Application,可信 |
| PTA | Pseudo Trusted Applications,伪 用于 |
| ETA | Early TA,早期 |
| AVB | Android Verified Boot,安卓 |
| DTS | Device Tree Source,设备树 |
| DTB | Device Tree Binary,由 DTS 编译 |
| DTC | Device Tree Compiler,设备树 |
| FDT | Flattened Device Tree,扁平化 |
| FIT | Flat Image Tree, FIT 是 U-Boot 支持 主要 |