====== U-Boot 专题 ======
U-Boot 是最流行的开源引导程序,支持几乎所有路由器架构。
===== 简介 =====
U-Boot (Das U-Boot) 是德信开源的嵌入式引导程序。
**官方网站**:https://www.denx.de/wiki/U-Boot/
**主要特点**:
- 完全开源
- 支持多种 CPU 架构(MIPS/ARM/PowerPC/x86)
- 丰富的启动命令
- 支持网络启动(TFTP/NFS)
- 强大的环境变量系统
- 可从 Flash、网络、串口加载
===== 架构支持 =====
== MIPS ==
- 常见于 MediaTek MT7620/MT7621
- TP-Link、小米、华为部分机型
- 典型地址:0x9f000000(Flash)
== ARM ==
- 博通 BCM47xx/BCM53xx 系列
- 高通 IPQ 系列
- 小米/Netgear/华硕部分机型
== x86 ==
- 软路由
- Intel/AMD 平台
===== 启动流程 =====
== 上电初始化 ==
U-Boot 1.1.4 (Dec 6 2021 - 11:13:09)
CPU: MediaTek MT7621AT
RAM: 256MB DDR3
Flash: W25Q128JV
== 自动引导 ==
- 读取环境变量 bootcmd
- 执行启动命令
- 从 Flash/网络加载内核
- 传递参数给内核
== 中断自动引导 ==
在启动时按任意键可进入命令行:
Hit any key to stop autoboot: 0
===== 常用命令 =====
== 环境变量 ==
# 查看所有环境变量
printenv
# 查看特定变量
printenv ipaddr
printenv bootcmd
# 设置变量
setenv ipaddr 192.168.1.1
setenv serverip 192.168.1.100
# 保存到 Flash
saveenv
# 恢复默认
env default -a
saveenv
== 存储操作 ==
# 读取 Flash 信息
sf probe
# 读取内存
md.l 0x81000000 10 # 读取 10 个 32-bit 字
md.b 0x81000000 100 # 读取 100 字节
# 写入内存
mw.l 0x81000000 0x12345678 1
== TFTP 启动 ==
# 设置环境变量
setenv ipaddr 192.168.1.1 # 路由器 IP
setenv serverip 192.168.1.100 # TFTP 服务器 IP
# 从 TFTP 加载固件到内存
tftpboot 0x81000000 openwrt.bin
# 或简写
tftp 0x81000000 openwrt.bin
# 启动固件
bootm 0x81000000
== Flash 操作 ==
# 擦除 Flash 分区
# 语法:erase +
erase 0x9f020000 +0x300000
# 复制数据
# 语法:cp.b
cp.b 0x81000000 0x9f020000 0x300000
# 从内存写入 Flash
sf write 0x81000000 0x9f020000 0x300000
== 启动命令 ==
# 直接启动指定地址
bootm 0x9f020000
# 从网络启动
bootp 0x81000000 firmware.bin
bootm 0x81000000
# 从 SD 卡启动(部分设备)
load mmc 0:1 0x81000000 uImage
bootm 0x81000000
== 其他命令 ==
# 复位
reset
# 打印版本
version
# 帮助
help
# 列出设备
printenv bootdev
===== 环境变量详解 =====
== bootcmd ==
定义自动引导命令:
bootcmd=bootm 0x9f020000
# 或网络启动
bootcmd=tftp 0x81000000 openwrt.bin; bootm 0x81000000
== bootargs ==
传递给内核的参数:
bootargs=console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=squashfs mtdparts=spi0.0:256k(u-boot),64k(u-boot-env),3000k(kernel),-(rootfs)
== mtdparts ==
Flash 分区定义:
mtdparts=spi0.0:256k(u-boot),64k(config),3000k(kernel),-(rootfs)
===== TFTP 服务器配置 =====
== Windows ==
使用 TFTPD64:
- 设置 TFTP 根目录
- 确认防火墙允许
- 确保使用有线连接
== Linux ==
sudo apt install tftpd-hpa
sudo systemctl start tftpd-hpa
# 将固件放入 /srv/tftp/
== macOS ==
sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist
# 将固件放入 /private/tftpboot/
===== 常见问题 =====
== bootcmd 为空 ==
# 恢复默认
setenv bootcmd bootm 0x9f020000
saveenv
reset
== TFTP 连接失败 ==
- 确认电脑和路由器 IP 在同一网段
- 检查防火墙
- 确认 TFTP 服务器运行中
- 使用 ping 测试连通性
== Flash 写入失败 ==
- 确认地址正确
- 可能 Flash 损坏
- 尝试先擦除再写入
== 环境变量丢失 ==
- 环境变量存储在 Flash 特定分区
- 使用 saveenv 保存
- 恢复方法:setenv default 并 saveenv
===== Breed 与 U-Boot 对比 =====
| 特性 | Breed | U-Boot |
|------|--------|--------|
| 开源 | ❌ | ✅ |
| Web 界面 | ✅ | ❌ |
| 多固件备份 | ✅ | ❌ |
| 命令复杂度 | 简单 | 复杂 |
| 设备支持 | 有限 | 广泛 |
===== 相关链接 =====
- [[bootloader:breed|Breed 专题]]
- [[bootloader:cfe|CFE 专题]]
- [[method:tftp-recovery|TFTP 恢复方法]]
- [[method:ttl-serial|TTL 串口救砖]]