小米路由器3G R3G 刷入Breed和OpenWrt 20.02.2 的記錄

小米 R3G 參數

  • Architecture: MIPS
  • Vendor: Mediatek
  • Bootloader: U-Boot
  • System-On-Chip: MT7621 family
  • CPU/Speed: mipsel_24kc @ 880MHz 2 core
  • Flash: 128MB ESMT NAND
  • RAM: 256MB – NT 5C C 128M16 FP-DI,DDR3-1600-11-11-11
  • Wireless: MT7603/MT7612 2.4GHz/5GHz 802.11an+ac
  • Ethernet: 1000 Mbit/s / vlan support
  • USB: 1x 3.0

路由器刷入開發板ROM

為了寫入Bootloader, 要開啟SSH, 要開啟SSH, 就需要將小米路由器的 ROM 更新為開發版.

在小米的 miwifi 下載頁面找到路由器對應的開發版 ROM(R3G ROM 開發版).

ROM 的升級有兩種方式

  1. 登陸路由器後台在線升級
  2. 如果前一個方式不行, 可以將其拷貝到U盤根目錄, 並命名為 miwifi.bin, 隨後斷開電源, 插上U盤, 並按住 reset 按鈕後插入電源, 等到指示燈變為黃色閃爍(10-15秒)後鬆開 reset 鍵, 之後路由器將更新 ROM 並重啟進入正常狀態(指示燈變為藍色常亮).

獲取ssh許可權

  1. 先註冊小米帳號.
  2. 安裝MiWiFi手機APP, 連上路由器WIFI後綁定路由器, 綁定教程請參見 //zhidao.baidu.com/question/2011024461729333668.html
  3. 綁定後, 登陸 //d.miwifi.com/rom/ssh, 點擊”下載工具包”
  4. 下載工具包的鏈接旁邊有root密碼, 需要記一下

下載工具包時顯示的資訊

工具包使用方法:小米路由器需升級到開發版0.5.28及以上, 小米路由器mini需升級到開發版0.3.84及以上, 小米路由器3即將支援. 注意:穩定版不支援
請將下載的工具包bin文件複製到U盤(FAT/FAT32格式)的根目錄下, 保證文件名為miwifi_ssh.bin;
斷開小米路由器的電源, 將U盤插入USB介面;
按住reset按鈕之後重新接入電源, 指示燈變為黃色閃爍狀態即可鬆開reset鍵;
等待3-5秒後安裝完成之後, 小米路由器會自動重啟, 之後您就可以盡情折騰啦 :)

開啟 SSH

  1. 將下載的工具包bin文件複製到U盤(FAT/FAT32格式)的根目錄下, 保證文件名為miwifi_ssh.bin;
  2. 斷開小米路由器的電源, 將U盤插入USB介面;
  3. 按住reset按鈕之後重新接入電源, 指示燈變為黃色閃爍狀態(10-15秒)即可鬆開reset鍵
  4. 等待3-5秒後安裝完成之後, 小米路由器會自動重啟, 藍燈常亮
  5. 登錄ssh的密碼, 在剛才下載工具包的介面上

備份

R3G的快閃記憶體是128M的NAND, 查看布局

cat /proc/mtd
dev:    size   erasesize  name
mtd0: 07f80000 00020000 "ALL"
mtd1: 00080000 00020000 "Bootloader"
mtd2: 00040000 00020000 "Config"
mtd3: 00040000 00020000 "Bdata"
mtd4: 00040000 00020000 "Factory"
mtd5: 00040000 00020000 "crash"
mtd6: 00040000 00020000 "crash_syslog"
mtd7: 00040000 00020000 "reserved0"
mtd8: 00400000 00020000 "kernel0"
mtd9: 00400000 00020000 "kernel1"
mtd10: 02000000 00020000 "rootfs0"
mtd11: 02000000 00020000 "rootfs1"
mtd12: 03580000 00020000 "overlay"
mtd13: 012a6000 0001f000 "ubi_rootfs"
mtd14: 030ec000 0001f000 "data"

備份命令(具體路徑根據自己的U盤路徑調整)

dd if=/dev/mtd0 of=/extdisks/sda4/ALL.bin
dd if=/dev/mtd1 of=/extdisks/sda4/Bootloader.bin
dd if=/dev/mtd2 of=/extdisks/sda4/Config.bin
dd if=/dev/mtd3 of=/extdisks/sda4/Bdata.bin
dd if=/dev/mtd4 of=/extdisks/sda4/Factory.bin
dd if=/dev/mtd5 of=/extdisks/sda4/crash.bin
dd if=/dev/mtd6 of=/extdisks/sda4/crash_syslog.bin
dd if=/dev/mtd7 of=/extdisks/sda4/reserved0.bin
dd if=/dev/mtd8 of=/extdisks/sda4/kernel0.bin
dd if=/dev/mtd9 of=/extdisks/sda4/kernel1.bin
dd if=/dev/mtd10 of=/extdisks/sda4/rootfs0.bin
dd if=/dev/mtd11 of=/extdisks/sda4/rootfs1.bin
dd if=/dev/mtd12 of=/extdisks/sda4/overlay.bin
dd if=/dev/mtd13 of=/extdisks/sda4/ubi_rootfs.bin
dd if=/dev/mtd14 of=/extdisks/sda4/data.bin

備份到mtd14可以會提示設備不存在, 可以忽略, mtd0-mtd4備份下來就行了

恢復命令

mtd write /extdisks/sda4/Bootloader.bin Bootloader
mtd write /extdisks/sda4/Config.bin Config
mtd write /extdisks/sda4/Bdata.bin Bdata
mtd write /extdisks/sda4/Factory.bin Factory
mtd write /extdisks/sda4/crash.bin crash
mtd write /extdisks/sda4/crash_syslog.bin crash_syslog
mtd write /extdisks/sda4/reserved0.bin reserved0
mtd write /extdisks/sda4/kernel0.bin kernel0
mtd write /extdisks/sda4/kernel1.bin kernel1
mtd write /extdisks/sda4/rootfs0.bin rootfs0
mtd write /extdisks/sda4/rootfs1.bin rootfs1
mtd write /extdisks/sda4/overlay.bin overlay
mtd write /extdisks/sda4/ubi_rootfs.bin ubi_rootfs
mtd write /extdisks/sda4/data.bin data

寫入 breed

下載breed //breed.hackpascal.net/ 在下面找到 breed-mt7621-xiaomi-r3g.bin, 當前版本的日期是 2021-12-16. 這個版本有專為R3G準備的”小米R3G設置”, “環境變數編輯”, “小米 R3G Bdata”配置介面

  1. 使用 winscp 登入路由器
  2. 將剛才下載的breed-mt7621-xiaomi-r3g.bin上傳到路由器的/tmp文件夾下, 並改個簡單點的文件名 breed.bin

執行命令

mtd -r write /tmp/breed.bin Bootloader

等重啟後, 拔掉電源, 按住路由的reset鍵開機, 等到路由的燈閃爍的時候, 鬆開reset鍵, 在cmd中通過ipconfig查看IP, 當電腦獲取到192.168.1.x的IP後, 在瀏覽器中訪問192.168.1.1 就可以進入breed控制台

配置 breed

  • 在小米 R3G 設置中, 刪除normal_firmware_md5這個鍵值, 因為刷新刷的韌體 md5 值與原來的不一致會導致無法開機(刪了, 不刪是否不能開機未驗證)
  • 在環境變數編輯中, 添加一個環境變數, 變數名為 xiaomi.r3g.bootfw, 值為2

關於第三個操作, 如果已經寫入了breed到bootloader, 這個是必須的. breed的啟動流程如下

  1. 如果 kernel0 存在, 那麼啟動 kernel0
  2. 如果 kernel0 不存在, kernel1 存在, 那麼啟動 kernel1
  3. 如果 kernel0 和 kernel1 都存在, 則檢查環境變數 xiaomi.r3g.bootfw 的值, 如果存在且值為2, 那麼啟動 kernel1, 否則啟動 kernel0
  4. 在下面通過mtd寫入OpenWrt後, 如果不寫這個環境變數, 會從kernel0啟動, 然後無法進入系統, 重啟, 再次從kernel0啟動, 這樣一直循環.

寫入第三方韌體

對於單文件的第三方韌體, 可以在breed中上傳刷入

寫入 OpenWrt

對於R3G的OpenWrt韌體, 寫入方式比較特殊, 需要說明一下. 具體的方式在官方網站上已經詳細說明了//openwrt.org/toh/xiaomi/mir3g

首先下載韌體, 訪問 //firmware-selector.openwrt.org/ , 輸入 xiaomi, 選擇 Xiaomi Router 3G, 如果沒有這個型號, 在右側的版本中選擇舊一個版本試試, 在下載頁面下載以下兩個文件

openwrt-ramips-mt7621-mir3g-squashfs-kernel1.bin 
openwrt-ramips-mt7621-mir3g-squashfs-rootfs0.bin 

這兩文件需要在ssh下, 通過mtd寫入, 所以如果沒有ssh, 需要用breed刷回官方的開發版韌體並按前面的步驟開啟ssh.

將上面準備的2個OpenWrt文件上傳到 /tmp 目錄下,執行下面的命令寫入韌體

cd /tmp
# 這個命令用於寫入kerenl分區1, 可以不執行, 如果執行這條命令, 那麼兩個分區都會是同樣的內核了
# mtd write openwrt-ramips-mt7621-mir3g-squashfs-kernel1.bin kernel0
# 寫入第二個kernel分區
mtd write openwrt-ramips-mt7621-mir3g-squashfs-kernel1.bin kernel1
# 寫入rootfs分區
mtd write openwrt-ramips-mt7621-mir3g-squashfs-rootfs0.bin rootfs0
# 如果刷了breed, 不需要運行下面兩行, 直接reboot
nvram set flag_try_sys1_failed=1
nvram commit
reboot

使用kernel1.bin和rootfs0.bin寫入, 啟動OpenWrt後通過df -h看到的是正常的文件系統, 可以直接使用, 不需要再刷sysupgrade.bin

切換OpenWrt和原生韌體

原Bootlaoder

如果使用原Bootloader, 切換啟動分區是用的flag_try_sys1_failedflag_try_sys2_failed變數,

使用OpenWrt啟動

nvram set flag_try_sys1_failed=1 
nvram set flag_try_sys2_failed=0
nvram set flag_boot_success=0 
nvram commit
reboot

恢復官方系統

需要切換回原kernel分區啟動

  1. 將官方韌體放在U盤根目錄下, fat32格式, 文件改名為 miwifi.bin 接上路由器
  2. ssh連接路由器執行
fw_setenv flag_try_sys1_failed 0
fw_setenv flag_try_sys2_failed 1
fw_setenv flag_boot_success 0
  1. 路由器斷電, 按住 reset 鍵, 加電, 等待黃色燈閃爍, 鬆開即可
  2. 啟動後進入官方系統

使用Breed作為Bootloader

通過xiaomi.r3g.bootfw變數進行控制

參考