uboot命令行界面中刷入固件
uboot命令行界面中刷入固件
1. 设置串口通讯的波特率为117200 (注意: 不是115200) 2. 在uboot的启动过程中按 Ctrl + c 进入引导命令行界面 3. 输入 printenv 查看环境变量设置 4. 设置环境变量,通过从TFTP服务器上获取指定固件并刷入该固件。 setenv serverip 192.168.0.13 && setenv ipaddr 192.168.0.2 && setenv bootfile ditel-v1.0.6.8.2-ar71xx-generic-acu100-squashfs-sysupgrade.bin && tftp 0x81000000 $bootfile && erase 0x9f050000 +$filesize && cp.b 0x81000000 0x9f050000 $filesize && reset; 在本地PC端上使用 tftpd32.exe 启动一个TFTP服务器,默认目录为可执行文件所在目录。注意在防火墙中放开通讯端口。
# uboot update
setenv serverip 192.168.10.123 setenv ipaddr 192.168.10.254 setenv bootfile uboot-dt-acu100-20221013.bin tftpboot 0x81000000 $bootfile erase 0x09f000000 +$filesize cp.b 0x81000000 0x09f000000 $filesize rese
# firmware update
setenv serverip 192.168.10.123 setenv ipaddr 192.168.10.254 setenv bootfile Rel_DT_9531_B(COMMON)_V3.6.1B_20240921.bin tftpboot erase 0x09f050000 +$filesize cp.b 0x80800000 0x09f050000 $filesize reset
========
U-Boot默认采用HTTP协议通信,也可切换到网络控制台管理模式
网络控制台用于将 U-Boot 的串口输入输出重定向到网络连接,以方便在无串口线时访问 U-Boot 命令行。
网路控制台使用 UDP 协议通信,默认端口为 6666。在 Windows 下一般使用 Hercules SETUP Utility 进行连接。
Hercules SETUP Utility 下载地址: http://new.hwg.cz/files/download/sw/version/hercules_3-2-8.exe
[使用方法]
- 打开 Hercules SETUP Utility,选项卡选择 UDP;
- 右侧 Module IP 填上路由器的 IP 地址,即 192.168.1.1,Port 和 Local port 填写相同的端口;
- 单击 Listen 按钮,以开始通信;
- U-Boot 控制台中填上刚才设置端口,启动网络控制台(此时 U-Boot Web 控制台已经停止运行了,不能再被访问);
- 如果操作无误,Hercules SETUP Utility 里会有输出,此时即可进行操作。
=======
U-Boot 刷机方法大全
1楼: OpenWrt + SSH 刷机方法
2楼: U-Boot + TTL 刷机方法
3楼: 使用 HFS 上传文件 (配合1楼方法)
OpenWrt + SSH 刷机方法
如果要刷 U-Boot,则必须事先刷入解锁 u-boot 分区的 OpenWrt 固件。
准备工具:
PuTTY: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
WinSCP: http://winscp.net/eng/download.php
u-boot下载地址 ftp://ftp.denx.de/pub/u-boot/ http://www.denx.de/en/Software/WebHome
PuTTY 可以作为 SSH 客户端,登录路由器的 Shell 环境,以执行各种命令。
WinSCP 是一个图形化的 SCP 协议 (基于 SSH 的文件传输协议) 客户端,用于本地和路由的文件传输。
设置 OpenWrt 管理密码 (root 密码):
只有设置了 root 密码,才能使用 SSH 协议工具。
如果已经设置了密码,请跳过这一步。
以下步骤任选一个就行
1. 在 LuCI 里设置管理员密码(针对有 LuCI 的固件):
[系统] → [管理权]
2. 使用 telnet 登录路由设置密码(针对没有 LuCI 的固件):
telnet 协议是一种类似于 SSH 的协议,只是它不经过加密,因此在外网环境中不太安全。
OpenWrt 只有在未设置 root 密码时,才能使用 telnet 协议。
PC [开始]→[所有程序]→[附件]→[命令提示符]
或
Win + R 组合键→输入 cmd→回车
输入 telnet <路由IP地址>
输入 passwd,回车
输入两次密码,分别以回车结束。
注意:输入密码时,密码不会显示,直接输入即可。
使用 WinSCP 传输要刷入的文件 (以 U-Boot 为例):
打开 WinSCP
File Protocol 选择 SCP
Host name 填入路由器 IP 地址
User name 填入 root
Password 填入 root 的密码
单击 [Login]
如果是第一次使用 WinSCP 登录路由,那么 WinSCP 会弹出如下对话框:
其大意是第一次连接此主机,其 RSA 指纹 Key 未被登记,是否要信任此主机
这里单击 Yes,以确认信任此路由。
WinSCP 主界面
左侧切换到要上传的文件的目录
右侧切换到 /tmp 目录
选择 /tmp 目录的原因是:/tmp 目录挂载于内存中,而且容量较大,这样刷写固件时不会跟 Flash 产生冲突。
选择要上传的文件,右键菜单选择 [Upload]
直接单击 [OK] 继续
文件即可上传到路由中。
使用 PuTTY 登录路由:
打开 PuTTY
Host Name 填入路由器 IP 地址
Connection type 选择 SSH (默认)
单击 [Open]
跟 WinSCP 一样,如果是第一次使用 PuTTY 登录路由,那么会有如下提示:
单击 [Yes] 即可。
然后 PuTTY 会要求输入用户名和密码:
用户名填入 root
密码填入 root 密码。这里一样在输入密码时不会显示。
如果用户名密码无误,就会进入 Shell 环境。
输入 cd /tmp 命令进入 /tmp 目录。
输入 mtd write <文件名> <mtd分区名> 命令以进行刷机操作
下图是以刷入 U-Boot 为例的:
有些教程会在 mtd 命令后加入 -r 参数,此参数的意思为刷写完成后立即重启路由
但这里不建议这么做,因为一旦刷机文件选错,这里还有补救的机会。
关于获取 MTD 分区名:
运行 cat /proc/mtd 命令即可查看
U-Boot + TTL 刷机方法
此方法适用于任何 U-Boot。
准备工具:
PuTTY: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
TFTPd32: http://tftpd32.jounin.net/tftpd32_download.html
TFTPd32 是一个 TFTP 协议 (简单文件传输协议) 的服务端,用于向 U-Boot 传输文件。
使用 PuTTY 通过串口进入 U-Boot 命令行模式:
这里请自行查找相关资料
设置 PC 网络参数:
需要设置本机网卡的IP地址为静态IP,才能通过 U-Boot 传输数据
1. 查看 U-Boot 中的 IP 地址信息:
在 U-Boot 命令行中运行 printenv 命令
ipaddr 表示 U-Boot 即路由使用的 IP 地址
serverip 表示服务器即 PC 机使用的 IP 地址
这里需要将本机IP改为 serverip 的 IP 地址
设置 TFTP 服务器参数:
打开 TFTPd32
Current Directory 选择要上传文件的目录
Server interfaces 选择本机跟路由相连的网卡 (参考刚才设置的 IP 地址)
在 U-Boot 中使用 tftpboot 命令获取文件:
tftpboot 命令用于向 TFTP 服务器请求文件,并存入内存
tftpboot 命令在无歧义的情况下可简写为 tftp
tftp <内存地址> <文件名>
在 MIPS 架构下内存地址从 0x80000000 开始,一般也选择 0x80000000,因为这样可以尽可能使用更多的内存
文件传输成功的标志为 Loading: 后出现一连串 #
其中可能出现 checksum bad 的提示,这不影响数据传输。
如果每隔10s出现一个T,则表明通信超时,此时需要检查网络连接情况及IP地址是否正确。
Bytes transferred = 后面的第一个数字为传输的数据字节数,10进制;括号里的为对应的16进制大小,后面会用到16进制的大小。
在 U-Boot 中擦除 Flash:
任何一种 Flash 都有一个擦除块大小,擦除大小必须为此大小的整数倍,如果不是,则要进行对齐。
例如:
SPI Flash 的常见擦除块大小为 64KB,其字节数的16进制为 0x10000
如果擦除大小为 0x30000 (192KB),则此大小为 0x10000 的整数倍,是对齐的;
如果擦出大小为 0x12345 (72KB),则此大小未对齐,需要使用比它大但又最接近的是 0x10000 倍数的大小,即 0x20000 (128KB)。
erase <flash地址> +<擦除大小>
其中 Flash 地址在不同的芯片下有所不同,会在后文列出
以在 TP-LINK 路由中刷入 U-Boot 为例:
erase 0x9f000000 +0x20000
在 U-Boot 向 Flash 写入数据:
向 Flash 写入数据的大小可以是任意正整数
cp.b <源地址> <目的地址> <长度>
其中
cp.b 表示以字节为单位进行写入
源地址为通过 tftpboot 命令获取的文件数据的存放地址
目的地址为 Flash 地址
长度为通过 tftpboot 命令获取的文件的大小,16进制表示,带0x前缀
以在 TP-LINK 路由中刷入 U-Boot 为例:
cp.b 0x80000000 0x9f000000 0x20000
常见路由固件各成分的起始地址及大小:
TP-LINK 固件:
U-Boot固件ART4MFlash 地址:0xbf000000 (AR71xx, AR913x) / 0x9f000000 (AR724x 及之后)大小: 0x20000Flash 地址:0xbf020000 / 0x9f020000大小: 0x3c0000Flash 地址:0xbf3f0000 / 0x9f3f0000大小: 0x100008MFlash 地址:0xbf000000 (AR71xx, AR913x) / 0x9f000000 (AR724x 及之后)大小: 0x20000Flash 地址:0xbf020000 / 0x9f020000大小: 0x7c0000Flash 地址:0xbf7f0000 / 0x9f7f0000大小: 0x1000016MFlash 地址:0xbf000000 (AR71xx, AR913x) / 0x9f000000 (AR724x 及之后)大小: 0x20000Flash 地址:0xbf020000 / 0x9f020000大小: 0xfc0000Flash 地址:0xbfff0000 / 0x9fff0000大小: 0x1000032M(仅楼主不死 U-Boot)Flash 地址:0xbf000000 (AR71xx, AR913x) / 0x9f000000 (AR724x 及之后)大小: 0x20000Flash 地址:0xbf020000 / 0x9f020000大小: 0x1fc0000Flash 地址:0xc0ff0000 / 0xa0ff0000大小: 0x10000
网件 WNDR3700v2/WNDR3800/WNDRMAC:
仅 U-Boot 及 ART,因为原厂升级固件不能直刷
U-BootART16MFlash 地址:0xbf000000大小: 0x50000Flash 地址:0xbfff000大小: 0x10000
AR2317 UBNT:
仅 U-Boot 及 board_config,因为原厂升级固件不能直刷
仅适用于楼主的不死 U-Boot
U-BootART4MFlash 地址:0xa8000000大小: 0x30000Flash 地址:0xa83f000大小: 0x100008MFlash 地址:0xa8000000大小: 0x30000Flash 地址:0xa87f000大小: 0x1000016MFlash 地址:0xa8000000大小: 0x30000Flash 地址:0xa8ff000大小: 0x10000
AR7161 AR724x AR934x UBNT:
仅 U-Boot 及 EEPROM/ART,因为原厂升级固件不能直刷
U-BootART4MFlash 地址:0xbf000000 (AR7161) / 0x9f000000 (AR724x 及之后)大小: 0x40000Flash 地址:0xbf3f0000 / 0x9f3f0000大小: 0x100008MFlash 地址:0xbf000000 (AR7161) / 0x9f000000 (AR724x 及之后)大小: 0x40000Flash 地址:0xbf7f0000 / 0x9f7f0000大小: 0x10000
MT7620 公版类型的固件 (U-Boot 大小为 192KB):
U-Boot固件EEPROM4MFlash 地址:0xbc000000 (其它 U-Boot) / 0x9c000000 (楼主不死 U-Boot)大小: 0x30000Flash 地址:0xbc050000 / 0x9c050000大小: 0x3b0000Flash 地址:0xbc040000 / 0x9c040000大小: 0x100008MFlash 地址:0xbc000000 (其它 U-Boot) / 0x9c000000 (楼主不死 U-Boot)大小: 0x30000Flash 地址:0xbc050000 / 0x9c050000大小: 0x7b0000Flash 地址:0xbc040000 / 0x9c040000大小: 0x1000016MFlash 地址:0xbc000000 (其它 U-Boot) / 0x9c000000 (楼主不死 U-Boot)大小: 0x30000Flash 地址:0xbc050000 / 0x9c050000大小: 0xfb0000Flash 地址:0xbc040000 / 0x9c040000大小: 0x1000032M(仅楼主不死 U-Boot)Flash 地址:0x9c000000大小: 0x30000Flash 地址:0x9c050000大小: 0x1fb0000Flash 地址:0x9c040000大小: 0x10000
使用 HFS 上传文件
如果觉得使用 WinSCP 上传文件比较麻烦,那么可以考虑 HTTP 方式上传文件,即将PC设置为 HTTP 服务器,在路由上下载文件。
如果PC上已经搭建有 HTTP 服务器,那么可以直接将要上传的文件存放于 HTTP 根目录,再在路由上通过 wget 命令来下载。
准备工具:
HFS: http://www.rejetto.com/hfs/?f=dl
HFS 是一个轻量级的 HTTP 文件服务器 (HTTP File Server)
配置 HFS:
配置 HFS 很简单,只需指定监听 IP 地址和要下载的文件。
[Menu]→[IP address] 选择本机网卡的 IP 地址
左侧 Virtual File System 里右键菜单,Add files...,选择要上传的文件。
路由里下载文件:
参考1楼的方法,使用 SSH 或 telnet 进入路由
执行 cd /tmp 进入 /tmp 目录
执行 wget http://<HFS的监听IP地址>/<文件名> 以下载文件
如:
wget http://192.168.1.2/u-boot-tp9343.bin
之后的操作同1楼的方法。
==============
Openwrt 烧uboot 需要慎重,一般买一个带不死uboot的路由器再折腾会比较安全,因为
openwrt firmware对uboot分区进行了保护,而且带有不死uboot的路由器可以通过web界面刷firmware。
传说中的不死uboot 原版可以见下面的网址:
https://github.com/pepe2k/u-boot_mod
那么uboot是如何烧写的呢?我总结了下图:
这里总结了4个方法,前两个方法是openwrt还能开起来的时候,后两个办法是openwrt挂掉的时候用的。
第1个方法是通过SSH连接来将firmware放入到可写的文件系统,并且用命令将其刷人。
因为SSH支持文件的传输,用winscp+putty可以搞定。
第2个方法通过在电脑上搭建了一个http server,用ssh命令让openwrt从电脑上下载到firmware到板子上可写的文件系统,
并且用命令将其刷人。
第3个方法需要拆路由器,通过TTL线用命令让路由器从电脑上拿uboot,并且用命令刷入uboot
第4个方法是不死uboot的方法,这里的“不死”的意思实际上是不用拆机来恢复openwrt,
这样大大方便了倒腾的过程。这个uboot一般带有一个友好的web界面,通过HTTP将uboot文件上传到路由器。
当然了,如果连uboot都挂掉了,那么只能通过其他方法刷openwrt了(比如拆下flash直接刷),下面是一个例子:
http://blog.chinaunix.net/uid-27194309-id-3405021.html
在这里(https://github.com/pepe2k/u-boot_mod)提到了如何恢复:
My device does not boot after upgrade!
I told you... bootloader, in this case U-Boot, is the most important piece of code inside your device. It is responsible for hardware initialization and booting an OS (kernel in this case), i.e. it's the bridge head for delegating to / flashing kernel and rootfs images. So, if during the upgrade something went wrong, your device will not boot any more. The only way to recover from such a situation in a mild way is via a JTAG adapter connection. In case of a lack of JTAG connection, you would even need to remove the FLASH chip, load proper image using an external programmer and solder it back.
可以看到,如果uboot都坏了,那么只能将flash拆下,用编程器刷flash,或者使用JTAG连接到路由器。这些设备都需要额外购买,
而且有些路由器也不支持JTAG,所以刷uboot要慎重。
如果你对路由器上面的文件系统有疑惑,那么请看openwrt的官方文档:
http://wiki.openwrt.org/zh-cn/doc/techref/flash.layout
我这里只是介绍了一些大体的概念,具体刷uboot的操作可以看这里:
http://www.right.com.cn/forum/thread-154561-1-1.html
========== End
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2017-10-09 C++ new 解析重载
2017-10-09 各寄存器的作用
2017-10-09 QT信号和槽
2017-10-09 Visual Studio 调试技巧[Command Window & Immediate Window ](Tips)