將 OpenWRT 移植到一個商業(yè)無線路由器過程中的一些要點

最近在將 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 = <&ethphy4>;
-
-       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ā)工作量。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容