From c5ab84161287597002a75926124a6bf7faa36aa8 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 2974855870..f0a5e7f7df 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 @@ -94,6 +94,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 6823c333b6..58d45ec4cf 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 @@ -174,6 +174,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|\ @@ -620,6 +622,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 cb93c1b5ab..9580d13951 100644 --- a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh +++ b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh @@ -106,6 +106,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 502fdc2ed4..2b27b08149 100644 --- a/target/linux/ath79/image/generic.mk +++ b/target/linux/ath79/image/generic.mk @@ -558,6 +558,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