2022年8月21日 星期日

Openwrt 19.07 ASUS Lyra Trio MAP-AC1750

 一直沒有official的Openwrt 所以就自己搞了。


Step 1: GPIO Table.

三色LED分別是GPIO14(RED), GPIO15(GREEN), GPIO16(BLUE)

兩個按鈕是GPIO2 WPS, GPIO5 RESET

還有兩個OUTPUT 應該是AR3012的Power與Reset. GPIO7, GPIO8


Step 2: Flash Layout

使用的是MX25L25645G,是32MByte的Flash,在19.07下需要修改m25p80.c才能正常reboot。若是選擇使用21.04的應該就不用,因為Flash本身支援4B OPCODE,21.04有一定的判斷機制應該會判斷到支援就不用使用EN4B/EX4B。但19.07沒有實作…

Serial Flash MX25L25645G

MTD0: 0x00000000 ~ 0x00040000 uboot

MTD1: 0x00040000 ~ 0x00050000 uboot-env

MTD2: 0x00050000 ~ 0x00060000 factory

MTD3: 0x00060000 ~ 0x01d00000 firmwarey

MTD4: 0x01d00000 ~ 0x02000000 jffs2

Step 3: MAC Address
2.4GHz MAC存在factory 0x1002
5GHz MAC存在factory 0x5006
Ethernet MAC沒有找到, 然後5G MAC是2.4G MAC +2, 而Ethernet MAC則是2.4G MAC +1
原廠的MAC就是2.4G: aa:bb:cc:dd:ee:00,5G: aa:bb:cc:dd:ee:02,GMAC: aa:bb:cc:dd:ee:01
所以直接把同樣的位置寫入到factory 第0的位置去 以後好處理.

Step 4: USB
有一個AR3012的BLE接在USB0上,不過我喜歡兩個都enable。然後有兩個IO都要輸出High才會認到,就先假設一個是Power一個是Reset了。

Step 5: Create DTS
經過以上1~4之後就可以寫出DTS了
以下是我用的dts file內容 存在target/linux/ath79/dts/qca9563_asus_map-ac1750.dts
// SPDX-License-Identifier: GPL-2.0-or-later OR MIT

/dts-v1/;
#include "qca956x.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/leds/common.h>
/ {
        model = "ASUS Lyra Trio MAP-AC1750";
        compatible = "asus,map-ac1750", "qca,qca9563";
        aliases {
                led-boot = &led_blue;
                led-failsafe = &led_red;
                led-running = &led_blue;
                led-upgrade = &led_green;
        };
        leds {
                compatible = "gpio-leds";
                led_red: led_red {
                        label = "red";
                        gpios = <&gpio 16 GPIO_ACTIVE_HIGH>;
                };
                led_blue: led_blue {
                        label = "blue";
                        gpios = <&gpio 14 GPIO_ACTIVE_HIGH>;
                };
                led_green: led_green {
                        label = "green";
                        gpios = <&gpio 15 GPIO_ACTIVE_HIGH>;
                };
        };
        keys {
                compatible = "gpio-keys";
                wps {
                        linux,code = <KEY_WPS_BUTTON>;
                        gpios = <&gpio 5 GPIO_ACTIVE_LOW>;
                        debounce-interval = <60>;
                };
                reset {
                        linux,code = <KEY_RESTART>;
                        gpios = <&gpio 2 GPIO_ACTIVE_LOW>;
                        debounce-interval = <60>;
                };
        };
        gpio-export {
                compatible = "gpio-export";
                gpio_ar3012_power {
                        gpio-export,name = "asus:power:ar3012";
                        gpio-export,output = <1>;
                        gpios = <&gpio 7 GPIO_ACTIVE_HIGH>;
                };
                gpio_ar3012_reset {
                        gpio-export,name = "asus:reset:ar3012";
                        gpio-export,output = <1>;
                        gpios = <&gpio 8 GPIO_ACTIVE_HIGH>;
                };
        };
};
&uart {
        status = "okay";
};
&gpio {
        status = "okay";
};
&pcie {
        status = "okay";
};
&spi {
        status = "okay";
        flash@0 {
                compatible = "jedec,spi-nor";
                reg = <0>;
                spi-max-frequency = <50000000>;
                partitions {
                        compatible = "fixed-partitions";
                        #address-cells = <1>;
                        #size-cells = <1>;
                        partition@0 {
                                label = "u-boot";
                                reg = <0x000000 0x40000>;
                                read-only;
                        };
                        partition@40000 {
                                label = "u-boot-env";
                                reg = <0x040000 0x10000>;
                                read-only;
                        };
                        art: partition@50000 {
                                label = "art";
                                reg = <0x050000 0x10000>;
                                read-only;
                        };
                        partition@60000 {
                                compatible = "denx,uimage";
                                label = "firmware";
                                reg = <0x060000 0x1ca0000>;
                        };
                        partition@1d00000 {
                                compatible = "denx,uimage";
                                label = "jffs2";
                                reg = <0x1d00000 0x300000>;
                        };
                };
        };
};
&usb_phy0 {
        status = "okay";
};
&usb0 {
        status = "okay";
};
&usb_phy1 {
        status = "okay";
};
&usb1 {
        status = "okay";
};
&mdio0 {
        status = "okay";
        phy0: ethernet-phy@0 {
                reg = <0>;
                phy-mode = "sgmii";
                qca,ar8327-initvals = <
                        0x04 0x00080080 /* PORT0 PAD MODE CTRL */
                        0x7c 0x0000007e /* PORT0_STATUS */
                >;
        };
};
&eth0 {
        status = "okay";
        mtd-mac-address = <&art 0x0>;
        phy-handle = <&phy0>;
};
&wmac {
        status = "okay";
        mtd-cal-data = <&art 0x1000>;
        mtd-mac-address = <&art 0x1002>;
};

==

Step 6: 修改generic.mk
Openwrt的generic指的是Firmware存在SPI Flash內,而generic.mk則是說如何產生這個Firmware,同時又會出現在make menuconfig內
修改target/linux/ath79/image/generic.mk
在你喜歡的地方加入以下資訊
define Device/asus_map-ac1750
  DEVICE_VENDOR := ASUS
  ATH_SOC := qca9563
  DEVICE_TITLE := ASUS Lyra Trio MAP-AC1750
  ASUS_PRODUCTID := MAP-AC1750
  IMAGE_SIZE := 16000k
  DEVICE_PACKAGES := kmod-ath10k-ct ath10k-firmware-qca988x-ct-htt kmod-usb-core kmod-usb2
  SUPPORTED_DEVICES += map-ac1750
endef
TARGET_DEVICES += asus_map-ac1750
IMAGE_SIZE其實可以不用設,要設也不能設太大。
ASUS_PRODUCTID是可以不用設,這邊後面再講。

Step 7: 修改board.d
因為新增了新的Device,所以要在board.d裡面的02_network作相對應的設定。
修改target/linux/ath79/base-files/etc/board.d/02_network
在ath79_setup_interfaces()的case "$(board)" in 新增以下
        asus,map-ac1750)
                ucidef_add_switch "switch0" \
                        "0@eth0" "2:wan" "3:lan"
                ;;

Step 8: 修改ath10k的判斷
target/linux/ath79/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
改成以下這樣
case "$FIRMWARE" in
"ath10k/cal-pci-0000:00:00.0.bin")
        case $board in
        asus,map-ac1750)
                ath10kcal_extract "art" 20480 2116
                ath10kcal_patch_mac $(macaddr_add  $(mtd_get_mac_binary art 20486) )
                ;;
        devolo,dvl1200e|\
Step 9: 選擇target device為asus_map-ac1750
一般我都是先使用openwrt release的config來修改
https://downloads.openwrt.org/releases/19.07.10/targets/ath79/generic/config.buildinfo
下載完後改為.config
再make menuconfig在target platform下找到前面新增的. 然後再make world.
記得要git checkout v19.07.10

Step 10: 燒進去
因為ASUS有自己的header定義,所以沒辦法使用Webgui作燒錄。先在WebGUI內打開ssh之後再用scp到/tmp。然後再dd if=new.bin of=/dev/mtdblock3作燒錄。
完成後就重開機看結果了…

第一次燒錄完開機,會去對rootfs作格式化,大約跑3分鐘…這時候藍燈會閃爍,等到它跑完或藍燈恆亮的時候就可以操作了。
1. 修改/etc/config/network
只留前兩個設定後面的全刪了改以下
config interface 'lan'
        option type 'bridge'
        option ifname 'eth0'
        option proto 'dhcp'

config switch
        option name 'switch0'
        option reset '1'

config switch_vlan
        option device 'switch0'
        option vlan '1'
        option vid '1'
        option ports '0 3 2'
重新啟動network
service network restart

2. opkg安裝usb與qca988x的驅動
opkg update
opkg install kmod-usb2 ath10k-firmware-qca988x-ct-htt kmod-ath10k-ct
這時候跳出一堆訊息,我會再重開機一次。
reboot

3. Enjoy your Openwrt on Lyra Trio.


後記.
1. 為什麼不追最新版本?
    因為我在21.04上遇到一些挫折,pppoe在isp換ip的時候偶爾會出現無法連線網路,但這個記得在19.07上是沒發生過的。
2. ASUS WebGUI無法燒錄?
    因為ASUS使用的.trx帶著一個uImage Header,Header定義的Filename裡ASUS包了一些檢查,像是ASUS_PRODUCTID,Version,Build Number等等的資訊,因為沒有全部解析完所以騙不過去…Openwrt裡也有放一個asustrx(在staging_dir/host/bin/asustrx),但實際上試不出來…還好這個檢查只有WebGUI才有,在UBOOT階段或Console下都可以直接燒。
3. 為什麼要玩這台?
    因為它很小,刷完後可以跑Mesh AP也可以用VLAN處理IPTV呀…
4. 哪那麼多廢話?
    年紀到了廢話就變多了…


沒有留言:

張貼留言