From 993afb41fea09e98cc90e3b0f9189130b34b5e24 Mon Sep 17 00:00:00 2001 From: Zoltan HERPAI Date: Sat, 27 Aug 2022 17:08:32 +0200 Subject: [PATCH] ath79: add support for Atheros PB42 reference board Specifications: SoC: AR7130 DRAM: 32Mb DDR1 Flash: 8Mb SPI-NOR LAN: 4x 10/100Mbps via ADM6996 switch on MII WAN: 1x 10/100Mbps via RMII PCI: 2x mini-PCI UART: standard QCA UART header JTAG: yes Button: 1x WPS, 1x reset LEDs: 8x LEDs Installation instructions: The original FIS partitioning does not provide enough space for the kernel, so the installation must start with re-partitioning the flash from RedBoot. The suggested partition table is the following: RedBoot 0xBF000000 0xBF000000 0x00040000 0x00000000 kernel 0xBF040000 0x80060000 0x001F0000 0x80060000 rootfs 0xBF230000 0x00000000 0x005B0000 0x00000000 FIS directory 0xBF7E0000 0xBF7E0000 0x0000F000 0x00000000 RedBoot config 0xBF7EF000 0xBF7EF000 0x00001000 0x00000000 Which can be created with: fis init fis create -r 0x80060000 -e 0x80060000 -b 0xbf040000 -l 0x220000 kernel fis create -b 0xbf260000 -l 0x580000 rootfs The kernel and the rootfs must then be loaded from TFTP: load -r -v -b 0x80060000 openwrt-ath79-generic-atheros_pb42-squashfs-kernel.bin fis create kernel load -r -v -b 0x80100000 openwrt-ath79-generic-atheros_pb42-squashfs-rootfs.bin fis create rootfs Once OpenWrt is installed, the normal sysupgrade method will work for upgrades. The MAC address is stored in the "boardconfig" partition, which is automatically created. Signed-off-by: Zoltan HERPAI --- .../linux/ath79/dts/ar7130_atheros_pb42.dts | 106 ++++++++++++++++++ .../generic/base-files/etc/board.d/01_leds | 4 + .../generic/base-files/etc/board.d/02_network | 6 + .../base-files/lib/upgrade/platform.sh | 1 + target/linux/ath79/image/generic.mk | 15 +++ .../940-redboot_boardconfig.patch | 60 ++++++++++ 6 files changed, 192 insertions(+) create mode 100644 target/linux/ath79/dts/ar7130_atheros_pb42.dts create mode 100644 target/linux/ath79/patches-5.10/940-redboot_boardconfig.patch diff --git a/target/linux/ath79/dts/ar7130_atheros_pb42.dts b/target/linux/ath79/dts/ar7130_atheros_pb42.dts new file mode 100644 index 0000000000..8f01fcfcdb --- /dev/null +++ b/target/linux/ath79/dts/ar7130_atheros_pb42.dts @@ -0,0 +1,106 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "ar7100.dtsi" + +#include +#include + +/ { + compatible = "atheros,pb42", "qca,ar7130"; + model = "Atheros PB42 reference board"; + + aliases { + led-boot = &led_system; + led-failsafe = &led_system; + led-running = &led_system; + led-upgrade = &led_system; + }; + + extosc: ref { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-output-names = "ref"; + clock-frequency = <40000000>; + }; + + leds { + compatible = "gpio-leds"; + + led_system: system { + label = "green:system"; + gpios = <&gpio 2 GPIO_ACTIVE_HIGH>; + }; + + led_ds1a: ds1a { + label = "green:ds1a"; + gpios = <&gpio 5 GPIO_ACTIVE_HIGH>; + }; + + led_ds1b: ds1b { + label = "green:ds1b"; + gpios = <&gpio 4 GPIO_ACTIVE_HIGH>; + }; + }; + + keys { + compatible = "gpio-keys"; + + wps { + label = "sw4"; + linux,code = ; + gpios = <&gpio 8 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + + reset { + label = "reset"; + gpios = <&gpio 3 GPIO_ACTIVE_LOW>; + linux,code = ; + debounce-interval = <60>; + }; + }; +}; + +&pcie0 { + status = "okay"; +}; + +&spi { + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "ecoscentric,redboot-fis-partitions"; + }; + }; +}; + +&uart { + status = "okay"; +}; + +ð0 { + status = "okay"; + + phy-mode = "mii"; + + fixed-link { + speed = <100>; + full-duplex; + }; +}; + +ð1 { + status = "okay"; + + phy-mode = "rmii"; + + fixed-link { + speed = <100>; + full-duplex; + }; +}; diff --git a/target/linux/ath79/generic/base-files/etc/board.d/01_leds b/target/linux/ath79/generic/base-files/etc/board.d/01_leds index c1d411b9a9..257321eaff 100644 --- a/target/linux/ath79/generic/base-files/etc/board.d/01_leds +++ b/target/linux/ath79/generic/base-files/etc/board.d/01_leds @@ -93,6 +93,10 @@ asus,rp-ac66) ucidef_set_led_rssi "rssimedium-wlan1" "RSSIMEDIUM" "red:rssimedium-wlan1" "wlan1" "1" "79" ucidef_set_led_rssi "rssihigh-wlan1" "RSSIHIGH" "green:rssihigh-wlan1" "wlan1" "70" "100" ;; +atheros,pb42) + ucidef_set_led_wlan "ds1a" "DS1A" "green:ds1a" "phy0tpt" + ucidef_set_led_wlan "ds1a" "DS1B" "green:ds1b" "phy1tpt" + ;; avm,fritz1750e) ucidef_set_led_netdev "lan" "LAN" "green:lan" "eth0" ucidef_set_rssimon "wlan1" "200000" "1" diff --git a/target/linux/ath79/generic/base-files/etc/board.d/02_network b/target/linux/ath79/generic/base-files/etc/board.d/02_network index a9b78e4350..c5c957bdaf 100644 --- a/target/linux/ath79/generic/base-files/etc/board.d/02_network +++ b/target/linux/ath79/generic/base-files/etc/board.d/02_network @@ -168,6 +168,8 @@ ath79_setup_interfaces() "0@eth0" "2:lan" "3:lan" "4:lan" "5:lan" "1:wan" ucidef_add_switch "switch1" \ "0@eth1" "1:lan" "2:lan" "3:lan" "4:lan" "5:lan" + atheros,pb42) + ucidef_set_interfaces_lan_wan "eth1" "eth0" ;; avm,fritz4020|\ pcs,cr3000|\ @@ -613,6 +615,10 @@ ath79_setup_macs() lan_mac=$(macaddr_setbit $base_mac 29) [ $lan_mac = $base_mac ] && lan_mac=$(macaddr_unsetbit $base_mac 29) ;; + atheros,pb42) + lan_mac=$(mtd_get_mac_binary "boardconfig" 0x1000) + wan_mac=$(mtd_get_mac_binary "boardconfig" 0x1006) + ;; avm,fritz1750e|\ avm,fritz450e|\ avm,fritzdvbc) diff --git a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh index a2b717ef34..9001c148d0 100644 --- a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh +++ b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh @@ -98,6 +98,7 @@ platform_do_upgrade() { PART_NAME="inactive" platform_do_upgrade_dualboot_datachk "$1" ;; + atheros,pb42|\ ubnt,routerstation|\ ubnt,routerstation-pro) platform_do_upgrade_redboot_fis "$1" kernel diff --git a/target/linux/ath79/image/generic.mk b/target/linux/ath79/image/generic.mk index e6e78b9287..f2062a3705 100644 --- a/target/linux/ath79/image/generic.mk +++ b/target/linux/ath79/image/generic.mk @@ -575,6 +575,21 @@ define Device/atheros_db120 endef TARGET_DEVICES += atheros_db120 +define Device/atheros_pb42 + SOC := ar7130 + DEVICE_VENDOR := Atheros + DEVICE_MODEL := PB42 + IMAGE_SIZE := 7808k + IMAGES += kernel.bin rootfs.bin + IMAGE/kernel.bin := append-kernel + IMAGE/rootfs.bin := append-rootfs | pad-rootfs + IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | combined-image | \ + append-metadata | check-size + KERNEL := kernel-bin | append-dtb | lzma | pad-to $$(BLOCKSIZE) + SUPPORTED_DEVICES += pb42 +endef +TARGET_DEVICES += atheros_pb42 + define Device/avm DEVICE_VENDOR := AVM KERNEL := kernel-bin | append-dtb | lzma | eva-image diff --git a/target/linux/ath79/patches-5.10/940-redboot_boardconfig.patch b/target/linux/ath79/patches-5.10/940-redboot_boardconfig.patch new file mode 100644 index 0000000000..4dd740d2de --- /dev/null +++ b/target/linux/ath79/patches-5.10/940-redboot_boardconfig.patch @@ -0,0 +1,60 @@ +--- a/drivers/mtd/parsers/redboot.c ++++ b/drivers/mtd/parsers/redboot.c +@@ -30,6 +30,8 @@ + #include + #include + ++#define BOARD_CONFIG_PART "boardconfig" ++ + struct fis_image_desc { + unsigned char name[16]; // Null terminated name + uint32_t flash_base; // Address within FLASH of image +@@ -60,6 +62,7 @@ static int parse_redboot_partitions(stru + const struct mtd_partition **pparts, + struct mtd_part_parser_data *data) + { ++ unsigned long max_offset = 0; + int nrparts = 0; + struct fis_image_desc *buf; + struct mtd_partition *parts; +@@ -225,14 +228,15 @@ static int parse_redboot_partitions(stru + } + } + #endif +- parts = kzalloc(sizeof(*parts)*nrparts + nulllen + namelen, GFP_KERNEL); ++ parts = kzalloc(sizeof(*parts) * (nrparts + 1) + nulllen + namelen + ++ sizeof(BOARD_CONFIG_PART), GFP_KERNEL); + + if (!parts) { + ret = -ENOMEM; + goto out; + } + +- nullname = (char *)&parts[nrparts]; ++ nullname = (char *)&parts[nrparts + 1]; + #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED + if (nulllen > 0) { + strcpy(nullname, nullstring); +@@ -251,6 +255,8 @@ static int parse_redboot_partitions(stru + } + #endif + for ( ; iimg->size; + parts[i].offset = fl->img->flash_base; + parts[i].name = names; +@@ -284,6 +290,13 @@ static int parse_redboot_partitions(stru + fl = fl->next; + kfree(tmp_fl); + } ++ if (master->size - max_offset >= master->erasesize) { ++ parts[nrparts].size = master->size - max_offset; ++ parts[nrparts].offset = max_offset; ++ parts[nrparts].name = names; ++ strcpy(names, BOARD_CONFIG_PART); ++ nrparts++; ++ } + ret = nrparts; + *pparts = parts; + out: -- 2.30.2