最近在將 OpenWRT 移植到一個商業(yè)無線路由器,中間遇到的一些問題,在此記錄下。
首先是商業(yè)路由器和對應的小米路由器的硬件列表:
| 硬件 | 商業(yè)路由器 | Xiaomi Router 3 Pro | Xiaomi MiWiFi 3G v2 |
|---|---|---|---|
| CPU | mt7621 | mt7621 | mt7621 |
| 無線模塊 | mt7615e | mt7615e | MT7603E MT7612E |
| switch | mt7621內置 (mt7530) | mt7621內置 (mt7530) | mt7621內置 (mt7530) |
| Flash | w25q128 (16M bytes) | Nand 256M Bytes | Nor 16M Bytes |
| 內存 | 256M bytes | 512M bytes | 128M bytes |
| 串口波特率 | 57600 | 115200 | 115200 |
| USB | 無 | 有 | 無 |
最重要的是 cpu + 無線模塊,需要找到一款硬件類似并支持 OpenWRT 的路由器,在此基礎上進行移植,這樣工作量最低。我選了小米路由器3 Pro(該路由器已停產(chǎn),可以買二手的),CPU 和無線模塊是相同的。另外選了小米 3G V2,F(xiàn)lash 比較相似。
查看 OpenWRT 所有設備的 WLAN信息可查閱這個鏈接 https://openwrt.org/toh/views/toh_admin_wlandriver,通過該信息可以找到與自己設備相類似的 OpenWRT 路由器。
移植主要是兩個步驟:
首先通過 uboot 下載 initramfs-kernel.bin 文件,可以調試大多數(shù)的硬件移植。(網(wǎng)口、無線部分)
網(wǎng)口移植好后,通過 initramfs-kernel.bin 的網(wǎng)頁,升級 squashfs-sysupgrade.bin 文件,調試升級。
移植一:波特率
商業(yè)路由器的波特率是57600,通過 tftp 下載運行 openwrt-ramips-mt7621-xiaomi_mi-router-3-pro-initramfs-kernel.bin,串口由于波特率問題,變成亂碼,修改下面的文件:target/linux/ramips/dts/mt7621_xiaomi_mi-router-3-pro.dts
- bootargs = "console=ttyS0,115200n8";
+ bootargs = "console=ttyS0,57600n8";
波特率即完成移植。(詳細步驟見我的另一篇博客文章OpenWRT 設備修改串口波特率)
移植二:Flash
Flash 不同于 Xiaomi route 3 pro 而類似于 Xiaomi MiWiFi 3G v2,需要將 Nand的 flash 的硬件去掉。即刪除 target/linux/ramips/dts/mt7621_xiaomi_mi-router-3-pro.dts 中的 nand 部分。
&nand {
status = "okay";
partitions {
......
};
};
添加 Nor Flash 部分:
+&spi0 {
+ status = "okay";
+ flash@0 {
+ compatible = "w25q128", "jedec,spi-nor";
+ reg = <0>;
+ spi-max-frequency = <10000000>;
+
+ partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition@0 {
+ label = "Bootloader";
+ reg = <0x0 0x30000>;
+ read-only;
+ };
+
+ partition@30000 {
+ label = "Config";
+ reg = <0x30000 0x10000>;
+ read-only;
+ };
+
+ factory: partition@40000 {
+ label = "Factory";
+ reg = <0x40000 0x10000>;
+ read-only;
+ };
+
+ partition@50000 {
+ compatible = "denx,uimage";
+ label = "firmware";
+ reg = <0x50000 0xfb0000>;
+ };
+ };
+ };
+ };
非常重要的一點是:在移植前,先查看下商業(yè)路由器串口打印的 MTD 信息。Flash 的內容要和商業(yè)路由器的 MTD 信息一致。Booter、配置、無線校準數(shù)據(jù)有三個獨立的分區(qū),位置和大小不要隨意修改。
另外,"Factory" 分區(qū)是無線校準部分的數(shù)據(jù)(包含 mac 地址),所以在 “partition” 前有添加 "factory: "。這部分出錯的話,無線部分即使正常工作,性能也會有影響。
移植三:Switch 部分
MT7621 有兩個千兆口,一個一般用來做 WAN 口,另一個接 switch 做 LAN 口。而商業(yè)路由器只用了一個千兆口接 switch,將 switch 的兩個口,一個做 WAN,一個做 LAN(犧牲帶寬降成本的做法)。
需要將一個千兆口刪除掉:
-&gmac1 {
- status = "okay";
- label = "wan";
- phy-handle = <ðphy4>;
-
- nvmem-cells = <&macaddr_factory_e000>;
- nvmem-cell-names = "mac-address";
-};
另一個配置成 lan wan 兩個口:
&switch0 {
ports {
port@1 {
status = "okay";
label = "lan1";
};
port@0 {
status = "okay";
label = "wan";
nvmem-cells = <&macaddr_factory_e000>;
nvmem-cell-names = "mac-address";
};
};
};
移植四:無線部分
這部分小米 3 Pro 和商業(yè)路由器是一致的,無需修改。(商業(yè)路由器使用的是 MTK 某個版本的SDK(非OpenWRT),但產(chǎn)測的數(shù)據(jù)結構是相同的)
移植五:升級配置
小米的使用 NAND,商業(yè)路由器使用 NOR,NAND Flash 的 kernel 分區(qū)是單獨的,NOR Flash 的kenel 和 rootfs 是拼接在一起的,因此升級文件的制作和升級過程是不一樣的。(如果把小米 3 Pro 的 sysupgrade.bin 文件后綴修改為 tar,可以解壓成三個文件,但小米 Route 3G V2 是不行的)
如果這部分沒有修改,升級后,啟動串口會打印
## Booting image at bc050000 ...
Bad Magic Number,73797375
需要修改的兩個文件即可:
target/linux/ramips/image/mt7621.mk
define Device/xiaomi_mi-router-3-pro
- $(Device/nand)
+ $(Device/dsa-migration)
$(Device/uimage-lzma-loader)
- IMAGE_SIZE := 255488k
+ IMAGE_SIZE := 14848k
DEVICE_VENDOR := Xiaomi
DEVICE_MODEL := Mi Router 3 Pro
- IMAGES += factory.bin
- IMAGE/factory.bin := append-kernel | pad-to $$(KERNEL_SIZE) | append-ubi | \
- check-size
DEVICE_PACKAGES := kmod-mt7615-firmware kmod-usb3 kmod-usb-ledtrig-usbport
SUPPORTED_DEVICES += xiaomi,mir3p
endef
target/linux/ramips/mt7621/base-files/lib/upgrade/platform.sh
@@ -111,7 +111,6 @@ platform_do_upgrade() {
tplink,ec330-g5u-v1|\
wifire,s1500-nbn|\
xiaomi,mi-router-3g|\
- xiaomi,mi-router-3-pro|\
xiaomi,mi-router-4|\
xiaomi,mi-router-ac2100|\
xiaomi,mi-router-cr6606|\
這兩個文件的修改思路,就是比較小米 3 Pro 和小米 3G V2 的這部分的差別,修改成小米 3G V2 即可。
總結:移植時,可以借助 OpenWRT 的大量已支持的設備,在此基礎上開發(fā),可以大幅減小開發(fā)工作量。