|
本帖最后由 shanpo 于 2020-1-6 09:36 编辑
2020/1/6再增加TFTP更新固件方法。
刷机有风险,一般并不建议这么玩,除非你愿意自己承担风险。当然因为我错误的指导弄出砖来,大家请随意喷。
玩固件,至少需要了解如何建立tftp/http服务器,掌握ssh/scp/telnet命令使用方法,进一步还需要了解ttl串行控制台的使用方法;本贴对相关知识不会详细说明,请大家自行在网上搜索。
从NAND闪存启动固件,原厂u-boot/breed都可以实现;不过之前dw33d固件都是安装在nor闪存上的,这两种引导加载程序默认都无法启动NAND上的固件,只能修改启动参数。
先来说说原厂u-boot下的启动和安装,请先架设好tftp服务器并测试可用。
让我们比较下两种固件uboot启动参数的差异:
bootcmd=bootm 0x9fe80000 //NOR固件启动参数
bootcmd=nboot 0x8050000 0;bootm //NAND固件启动参数
可以看到nand启动是靠nboot命令实现的。u-boot启动参数存放在nor闪存的u-boot-env分区,可以通过uboot-envtools软件修改,也可以通过ttl串行连接u-boot控制台直接修改。原厂固件和本人提供的固件都可以用fw_printenv/fw_setenv命令显示和修改。
另一个重要的u-boot命令是tftp,这是一个网络启动命令,使路由器启动不再依赖内部闪存,由于固件加载到内存中运行,可以自由地切换不同的分区布局。
tftp启动的例子:
bootcmd=tftp 0x84000000 dw33d.bin;bootm 0x84000000
命令在远程tftp服务器上查找名为dw33d.bin的内存固件,如果找到,加载到0x84000000地址,然后bootm启动。因为要使用网络,还需注意两个参数ipaddr/serverip,这两个参数指示本机/tftp服务器IP地址,例如:
ipaddr=192.168.0.250
serverip=192.168.0.254
利用tftp命令,还可以修复固件错误导致的软砖,避免上ttl串行控制台救砖:
bootcmd=tftp 0x84000000 dw33d.bin;bootm 0x84000000 ||nboot 0x8050000 0;bootm
这条命令使路由器启动时总是先尝试网络启动,如果失败再执行后面的NAND启动;假如我们刷入了错误的固件,导致无法从闪存启动,只需重新架好tftp服务器,在内存固件中重新刷入正确的固件即可。注意务必设置以下参数:
netretry=no
否则,u-boot只会反复尝试tftp启动。用于tftp启动的内存固件,如果用源代码自己编译,默认会生成一个文件名带initramfs-kernel的固件,就是它。
上述命令的缺点是会增加一点启动时间。
再来说NAND固件的安装,在此我强烈建议切换固件尽可能在tftp启动的内存固件中进行,比较不容易出问题。如果从原厂固件安装,可以在web高级管理页面单击‘系统’->‘启动项’,在‘本地启动脚本’输入框中exit 0指令前输入修改uboot环境变量的命令:
- fw_setenv ipaddr 192.168.0.250
- fw_setenv serverip 192.168.0.254
- fw_setenv bootcmd "tftp 0x84000000 dw33d.bin;bootm 0x84000000 ||nboot 0x8050000 0;bootm"
- fw_setenv netretry no
复制代码
核对无误后重启路由器,路由器会再次启动原厂固件,不过这次会修改好u-boot启动参数,下次重启就会尝试tftp加载内存固件了。如果tftp启动成功,就可以用浏览器访问openwrt默认地址192.168.1.1,在WEB管理页面如日常更新固件一样选择NAND固件(文件名包含sysupgrade的固件文件)完成更新。
如果是在其他任何固件下安装,而u-boot-env分区又被锁住,那就只能通过ttl串行控制台来修改u-boot启动参数了,或者设法刷breed bootloader来解决。
breed下安装,请先将breed更新到最新版本并架设好http服务器,其实每一个运行openwrt并且安装了luci的路由器都自带http服务器。breed又称不死uboot,只要breed本身没有被破坏,任何时候都可以进入breed控制台,如何进入breed控制台请参考相关教程。有两种方法连接到控制台,telne和web;因为breed默认启动nor固件,因此必须自定义启动参数来启动NAND固件。可以在web控制台启用和设置breed环境变量,但不能刷写固件,因此还是要用到telnet访问控制台。
通过telnet控制台安装:
首先启用breed环境变量
envconf 0x6000000 0x20000
启用后需要reset重启路由器才能生效,breed环境变量存储在NAND闪存上,这是breed默认的,无法修改,我设置的存储位置位于oem-backup保留分区。
设置breed环境变量
- env set network.ipaddr 192.168.0.250
- env set network.netmask 255.255.255.0
- env set autoboot.disabled 0
- env set autoboot.delay 5
- env set autoboot.command "boot flash bank 0 0x0"
- env save
复制代码
加载内存固件
wget 0x84000000 http://192.168.0.250/firmware/dw33d.bin
boot mem 0x84000000
加载成功后telnet会中断连接,可以像前面讲过的方法在内存固件下更新NAND固件。或者如下直接刷固件:
breed> wget http://192.168.0.254/firmware/dw33d-factory.bin
wget http://192.168.0.254/firmware/dw33d-factory.bin
Connecting to 192.168.0.254:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13631488/0xd00000 (13MB) [application/octet-stream]
Saving to address 0x80000000
[========================================================================] 100%
Transmission completed in 2.0s.
breed> flash bank 0 erase 0x0 0xd00000
breed> flash bank 0 write 0x0 0x80000000 0xd00000
flash bank 0 write 0x0 0x80000000 0xd00000
Writing flash bank 0 into 0h from memory 80000000h, size d00000h
[========================================================================] 100%
Succeeded
注意直接刷机文件必须是文件名包含factory的固件文件。reset重启就ok了。在breed下刷机就无所谓之前采用的是什么固件,但必须强调不能用breed web控制台更新NAND固件。
顺便说说如何返回原厂固件
ssh连接到路由器,修改uboot启动参数:
fw_setenv bootcmd "tftp 0x84000000 dw33d.bin;bootm 0x84000000 ||bootm 0x9fe80000”
重启后uboot将启动NOR闪存上的固件,如果NOR闪存上是原厂固件,启动不会成功,因为原厂固件将nand闪存作为rootfs_data分区,而NAND闪存上已有的数据对原厂固件来说是脏数据;但不要紧,当启动卡住时只需按reset键5秒,重启就行了。刷入原厂固件的方法还是先tftp加载内存固件,用scp命令上传固件到路由器,然后刷入:
scp firmware.bin root@192.168.1.1:/tmp
ssh root@192.168.1.1
mtd erase /dev/mtd2
mtd write /tmp/firmware /dev/mtd2
在我编译的ath79固件中,mtd2分区名是oem-firmware。
最后,简单说说ttl串行控制台,对于不带键盘和显示器的嵌入式设备,ttl串行连接器是唯一能访问引导加载程序的方法,除非是breed这类专为玩家打造的引导加载程序。这需要一个USB转TTL模块,马云家很多也很便宜,模块上的一排针脚只用3个(TX、RX、GND),拆开路由器,找到主板上串行接口,一般是4针,不要接VCC,可能会烧坏TTL模块,模块TX连接主板RX,模块RX连接主板TX,GND直连。pc端ttl控制软件我也不甚了解,我在linux系统下只用过picocom:
sudo picocom -b 115200 /dev/ttyUSB0
在ttl串行控制台当你按任意键中断uboot后,输入help命令,控制台显示所有可用命令,这里只说明一下修改启动参数的命令printenv/setenv,修改参数后记到用saveenv命令保存。
最后对本帖提供的文件做个说明,u-boot是原厂bootloader文件,firmware是原厂固件文件;uboot-unlock.bin是解锁bootloader分区的内存固件,可以tftp加载,此固件可以刷bootloader;另外三个长名文件是我编译的NAND固件,基于openwrt官方代码打上我的ath79补丁。
MD5 2a3773fba9608ea59a26e52bc101f723 u-boot
MD5 c9113ebe98b91666153b01df19cee23c firmware
MD5 fbd18b2dc6ae52db06363f99f3df24b9 uboot-unlock.bin
MD5 736315d3d091c6a8f6d5d91e0b349b16 openwrt-snapshot-r11734+63-b085e0586f-ath79-nand-domywifi_dw33d-initramfs-kernel.bin
MD5 8f131515afbc6e769ef4598ed5660601 openwrt-snapshot-r11734+63-b085e0586f-ath79-nand-domywifi_dw33d-squashfs-factory.bin
MD5 4af6b351da425776c2ee02af22c95d4c openwrt-snapshot-r11734+63-b085e0586f-ath79-nand-domywifi_dw33d-squashfs-sysupgrade.bin
附件下载地址:https://www.lanzous.com/i8b00cb
再增加一种更新固件的方法:TFTP更新固件
设置u-boot启动参数:
- fw_setenv bootnand 'setenv boot "nboot 0x84000000 0"&&saveenv'
- fw_setenv bootnor 'setenv boot "bootm 0x9fe80000"&&saveenv'
- fw_setenv ufoem 'tftp 0x80000000 dw33d-oem-factory.bin&&nand erase 0 8000000&&run bootnor&&run boot'
- fw_setenv ufop 'tftp 0x80000000 dw33d-op-factory.bin&&nand erase 0 8000000&&nand write 0x80000000 0 ${filesize}&&run bootnand&&run boot'
- fw_setenv bootcmd 'run ufop||run ufoem||run boot'
复制代码 启动tftp服务器并上传待更新的固件,固件文件名必须是“dw33d-xxx-factory.bin”,xxx只能是op/oem;重启路由器,路由器从tftp服务器下载固件,如果“dw33d-op-factory.bin”下载成功则将固件刷入nand并从新固件启动;如果“dw33d-oem-factory.bin”下载成功则擦除nand数据并修改启动参数从nor闪存启动固件(原厂固件),启动成功后务必关闭tftp服务器,避免重复刷机。tftp更新固件操作非常简单,也可以很方便地切换不同分区布局的固件和返回原厂固件。“dw33d-oem-factory.bin”固件实际上并不需要是真正的固件,u-boot下载此文件不会写入任何闪存,仅修改启动参数从nor闪存启动,所以它可以是任何文件,只是文件不要太大就行。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|