ath79: add support for Atheros PB42 reference board
authorZoltan HERPAI <wigyori@uid0.hu>
Sat, 27 Aug 2022 15:08:32 +0000 (17:08 +0200)
committerZoltan HERPAI <wigyori@uid0.hu>
Sat, 26 Nov 2022 17:33:05 +0000 (18:33 +0100)
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 <wigyori@uid0.hu>
target/linux/ath79/dts/ar7130_atheros_pb42.dts [new file with mode: 0644]
target/linux/ath79/generic/base-files/etc/board.d/01_leds
target/linux/ath79/generic/base-files/etc/board.d/02_network
target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
target/linux/ath79/image/generic.mk
target/linux/ath79/patches-5.10/940-redboot_boardconfig.patch [new file with mode: 0644]

diff --git a/target/linux/ath79/dts/ar7130_atheros_pb42.dts b/target/linux/ath79/dts/ar7130_atheros_pb42.dts
new file mode 100644 (file)
index 0000000..8f01fcf
--- /dev/null
@@ -0,0 +1,106 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+
+#include "ar7100.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+/ {
+       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 = <KEY_WPS_BUTTON>;
+                       gpios = <&gpio 8 GPIO_ACTIVE_LOW>;
+                       debounce-interval = <60>;
+               };
+
+               reset {
+                       label = "reset";
+                       gpios = <&gpio 3 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_RESTART>;
+                       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";
+};
+
+&eth0 {
+       status = "okay";
+
+       phy-mode = "mii";
+
+       fixed-link {
+               speed = <100>;
+               full-duplex;
+       };
+};
+
+&eth1 {
+       status = "okay";
+
+       phy-mode = "rmii";
+
+       fixed-link {
+               speed = <100>;
+               full-duplex;
+       };
+};
index cfcd2dfeda5e35185910edffa72925ecc2a42be2..436dcf69f37dea22facf652cd59f986d18cb1c81 100644 (file)
@@ -79,6 +79,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"
index 50576be9c547f018f344b9e649ed5bc50036c574..341fad28a59a14ed6f65a1c2f09495fa5650fa6f 100644 (file)
@@ -149,6 +149,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|\
@@ -574,6 +576,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)
index 8aa7e90ab8a8c7e30c314e406333b7ca6109b58d..b47da024b591cf8b4a1bdfb986450abf6700fc9e 100644 (file)
@@ -83,6 +83,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
index 3581f616c6dba3a0fdb1acaa72fd319e013c644f..82e9b343a61c73280e2449898c711417e4a4625f 100644 (file)
@@ -451,6 +451,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 (file)
index 0000000..4dd740d
--- /dev/null
@@ -0,0 +1,60 @@
+--- a/drivers/mtd/parsers/redboot.c
++++ b/drivers/mtd/parsers/redboot.c
+@@ -30,6 +30,8 @@
+ #include <linux/mtd/partitions.h>
+ #include <linux/module.h>
++#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 ( ; i<nrparts; i++) {
++              if (max_offset < buf[i].flash_base + buf[i].size)
++                      max_offset = buf[i].flash_base + buf[i].size;
+               parts[i].size = fl->img->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: