diff --git a/target/linux/ath79/dts/qca9561_tplink_eap225-wall-v2.dts b/target/linux/ath79/dts/qca9561_tplink_eap225-wall-v2.dts new file mode 100644 index 0000000000..281f7f18fa --- /dev/null +++ b/target/linux/ath79/dts/qca9561_tplink_eap225-wall-v2.dts @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/dts-v1/; + +#include +#include + +#include "qca956x.dtsi" + +/ { + compatible = "tplink,eap225-wall-v2", "qca,qca9561"; + model = "TP-Link EAP225-Wall v2"; + + aliases { + label-mac-device = ð1; + led-boot = &led_status; + led-failsafe = &led_status; + led-running = &led_status; + led-upgrade = &led_status; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "Reset button"; + linux,code = ; + gpios = <&gpio 18 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + + led { + label = "LED button"; + linux,code = ; + gpios = <&gpio 21 GPIO_ACTIVE_LOW>; + debounce-interval = <60>; + }; + }; + + leds { + compatible = "gpio-leds"; + + led_status: status { + label = "tp-link:white:status"; + gpios = <&gpio 16 GPIO_ACTIVE_LOW>; + default-state = "on"; + }; + }; + + gpio-export { + compatible = "gpio-export"; + + poe_passthrough { + gpio-export,name = "tp-link:poe-passthrough:enable"; + gpio-export,output = <0>; + gpios = <&gpio 20 GPIO_ACTIVE_HIGH>; + }; + }; +}; + +&uart { + status = "okay"; +}; + +&pcie { + status = "okay"; +}; + +&spi { + status = "okay"; + num-cs = <1>; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <25000000>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "u-boot"; + reg = <0x000000 0x020000>; + read-only; + }; + + partition@20000 { + label = "partition-table"; + reg = <0x020000 0x010000>; + read-only; + }; + + info: partition@30000 { + label = "info"; + reg = <0x030000 0x010000>; + read-only; + }; + + partition@40000 { + compatible = "openwrt,elf"; + label = "firmware"; + reg = <0x040000 0xd80000>; + }; + + partition@dc0000 { + label = "config"; + reg = <0xdc0000 0x030000>; + read-only; + }; + + /* df0000-f30000 undefined in vendor firmware */ + + partition@f30000 { + label = "mutil-log"; + reg = <0xf30000 0x080000>; + read-only; + }; + + partition@fb0000 { + label = "oops"; + reg = <0xfb0000 0x040000>; + read-only; + }; + + art: partition@ff0000 { + label = "art"; + reg = <0xff0000 0x010000>; + read-only; + }; + }; + }; +}; + +ð1 { + status = "okay"; + + mtd-mac-address = <&info 0x8>; +}; + +&wmac { + status = "okay"; + + mtd-cal-data = <&art 0x1000>; + mtd-mac-address = <&info 0x8>; +}; 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 a4567019be..f437f7432f 100755 --- a/target/linux/ath79/generic/base-files/etc/board.d/02_network +++ b/target/linux/ath79/generic/base-files/etc/board.d/02_network @@ -302,6 +302,14 @@ ath79_setup_interfaces() ucidef_add_switch "switch0" \ "0@eth1" "3:lan:3" "4:lan:2" "5:lan:1" "6@eth0" "2:wan:4" "1:wan:5" ;; + tplink,eap225-wall-v2) + ucidef_add_switch "switch0" \ + "0@eth0" "1:lan" "2:lan" "3:lan" "4:lan" + ;; + tplink,eap245-v3) + ucidef_add_switch "switch0" \ + "0@eth0" "2:lan:1" "5:lan:2" + ;; tplink,tl-mr6400-v1) ucidef_set_interfaces_lan_wan "eth0.1 eth1" "usb0" ucidef_add_switch "switch0" \ diff --git a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata index 76c4b0a371..10136664a4 100644 --- a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -261,6 +261,16 @@ case "$FIRMWARE" in ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \ /lib/firmware/ath10k/QCA9888/hw2.0/board.bin ;; + tplink,eap225-wall-v2) + ath10kcal_extract "art" 0x5000 0x2f20 + ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary info 0x8) +1) + ln -sf /lib/firmware/ath10k/pre-cal-pci-0000\:00\:00.0.bin \ + /lib/firmware/ath10k/QCA9888/hw2.0/board.bin + ;; + tplink,eap245-v3) + ath10kcal_extract "art" 0x5000 0x2f20 + ath10kcal_patch_mac_crc $(macaddr_add $(mtd_get_mac_binary info 0x8) +1) + ;; yuncore,a782|\ yuncore,xd4200) ath10kcal_extract "art" 0x5000 0x2f20 diff --git a/target/linux/ath79/image/generic-tp-link.mk b/target/linux/ath79/image/generic-tp-link.mk index 7128d853f8..22d1ac8a9e 100644 --- a/target/linux/ath79/image/generic-tp-link.mk +++ b/target/linux/ath79/image/generic-tp-link.mk @@ -362,6 +362,37 @@ define Device/tplink_cpe610-v2 endef TARGET_DEVICES += tplink_cpe610-v2 +define Device/tplink-eap2x5 + $(Device/tplink-safeloader) + LOADER_TYPE := elf + KERNEL := kernel-bin | append-dtb | lzma | loader-kernel + KERNEL_INITRAMFS := $$(KERNEL) + IMAGE/factory.bin := append-rootfs | tplink-safeloader factory | \ + pad-extra 128 +endef + +define Device/tplink_eap225-wall-v2 + $(Device/tplink-eap2x5) + SOC := qca9561 + IMAGE_SIZE := 13824k + DEVICE_MODEL := EAP225-Wall + DEVICE_VARIANT := v2 + DEVICE_PACKAGES := kmod-ath10k-ct ath10k-firmware-qca9888-ct + TPLINK_BOARD_ID := EAP225-WALL-V2 +endef +TARGET_DEVICES += tplink_eap225-wall-v2 + +define Device/tplink_eap245-v3 + $(Device/tplink-eap2x5) + SOC := qca9563 + IMAGE_SIZE := 14592k + DEVICE_MODEL := EAP245 + DEVICE_VARIANT := v3 + DEVICE_PACKAGES := kmod-ath10k-ct ath10k-firmware-qca99x0-ct + TPLINK_BOARD_ID := EAP245-V3 +endef +TARGET_DEVICES += tplink_eap245-v3 + define Device/tplink_re350k-v1 $(Device/tplink-safeloader) SOC := qca9558 diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c index 9254e07857..82166a9ebb 100644 --- a/tools/firmware-utils/src/tplink-safeloader.c +++ b/tools/firmware-utils/src/tplink-safeloader.c @@ -1298,6 +1298,67 @@ static struct device_info boards[] = { .last_sysupgrade_partition = "file-system" }, + /** Firmware layout for the EAP225-Wall v2 */ + { + .id = "EAP225-WALL-V2", + .support_list = + "SupportList:\r\n" + "EAP225-Wall(TP-Link|UN|AC1200-D):2.0\r\n", + .support_trail = '\xff', + .soft_ver = NULL, + .soft_ver_compat_level = 1, + + .partitions = { + {"fs-uboot", 0x00000, 0x20000}, + {"partition-table", 0x20000, 0x02000}, + {"default-mac", 0x30000, 0x01000}, + {"support-list", 0x31000, 0x00100}, + {"product-info", 0x31100, 0x00400}, + {"soft-version", 0x32000, 0x00100}, + {"firmware", 0x40000, 0xd80000}, + {"user-config", 0xdc0000, 0x30000}, + {"mutil-log", 0xf30000, 0x80000}, + {"oops", 0xfb0000, 0x40000}, + {"radio", 0xff0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system" + }, + + /** Firmware layout for the EAP245 v3 */ + { + .id = "EAP245-V3", + .support_list = + "SupportList:\r\n" + "EAP245(TP-Link|UN|AC1750-D):3.0\r\n", + .support_trail = '\xff', + .soft_ver = NULL, + .soft_ver_compat_level = 1, + + /** Firmware partition with dynamic kernel/rootfs split */ + .partitions = { + {"factroy-boot", 0x00000, 0x40000}, + {"fs-uboot", 0x40000, 0x40000}, + {"partition-table", 0x80000, 0x10000}, + {"default-mac", 0x90000, 0x01000}, + {"support-list", 0x91000, 0x00100}, + {"product-info", 0x91100, 0x00400}, + {"soft-version", 0x92000, 0x00100}, + {"radio", 0xa0000, 0x10000}, + {"extra-para", 0xb0000, 0x10000}, + {"firmware", 0xc0000, 0xe40000}, + {"config", 0xf00000, 0x30000}, + {"mutil-log", 0xf30000, 0x80000}, + {"oops", 0xfb0000, 0x40000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system" + }, + /** Firmware layout for the TL-WA850RE v2 */ { .id = "TLWA850REV2", @@ -1380,6 +1441,78 @@ static struct device_info boards[] = { .last_sysupgrade_partition = "file-system" }, + /** Firmware layout for the TL-WPA8630P v2 (EU)*/ + { + .id = "TL-WPA8630P-V2-EU", + .vendor = "", + .support_list = + "SupportList:\n" + "{product_name:TL-WPA8630P,product_ver:2.0.0,special_id:45550000}\n", + .support_trail = '\x00', + .soft_ver = NULL, + + .partitions = { + {"factory-uboot", 0x00000, 0x20000}, + {"fs-uboot", 0x20000, 0x20000}, + {"firmware", 0x40000, 0x5e0000}, + {"partition-table", 0x620000, 0x02000}, + {"default-mac", 0x630000, 0x00020}, + {"pin", 0x630100, 0x00020}, + {"device-id", 0x630200, 0x00030}, + {"product-info", 0x631100, 0x01000}, + {"extra-para", 0x632100, 0x01000}, + {"soft-version", 0x640000, 0x01000}, + {"support-list", 0x641000, 0x01000}, + {"profile", 0x642000, 0x08000}, + {"user-config", 0x650000, 0x10000}, + {"default-config", 0x660000, 0x10000}, + {"default-nvm", 0x670000, 0xc0000}, + {"default-pib", 0x730000, 0x40000}, + {"radio", 0x7f0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system" + }, + + /** Firmware layout for the TL-WPA8630P v2 (INT)*/ + { + .id = "TL-WPA8630P-V2-INT", + .vendor = "", + .support_list = + "SupportList:\n" + "{product_name:TL-WPA8630P,product_ver:2.0.0,special_id:41550000}\n" + "{product_name:TL-WPA8630P,product_ver:2.0.0,special_id:44450000}\n" + "{product_name:TL-WPA8630P,product_ver:2.1.0,special_id:41550000}\n", + .support_trail = '\x00', + .soft_ver = NULL, + + .partitions = { + {"factory-uboot", 0x00000, 0x20000}, + {"fs-uboot", 0x20000, 0x20000}, + {"firmware", 0x40000, 0x5e0000}, + {"partition-table", 0x620000, 0x02000}, + {"extra-para", 0x632100, 0x01000}, + {"soft-version", 0x640000, 0x01000}, + {"support-list", 0x641000, 0x01000}, + {"profile", 0x642000, 0x08000}, + {"user-config", 0x650000, 0x10000}, + {"default-config", 0x660000, 0x10000}, + {"default-nvm", 0x670000, 0xc0000}, + {"default-pib", 0x730000, 0x40000}, + {"default-mac", 0x7e0000, 0x00020}, + {"pin", 0x7e0100, 0x00020}, + {"device-id", 0x7e0200, 0x00030}, + {"product-info", 0x7e1100, 0x01000}, + {"radio", 0x7f0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system" + }, + /** Firmware layout for the TL-WR1043 v5 */ { .id = "TLWR1043NV5", @@ -1562,6 +1695,50 @@ static struct device_info boards[] = { .last_sysupgrade_partition = "file-system" }, + /** Firmware layout for the RE200 v3 */ + { + .id = "RE200-V3", + .vendor = "", + .support_list = + "SupportList:\n" + "{product_name:RE200,product_ver:3.0.0,special_id:00000000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:41520000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:41550000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:42520000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:43410000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:45470000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:45530000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:45550000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:49440000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:4A500000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:4B520000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:52550000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:54570000}\n" + "{product_name:RE200,product_ver:3.0.0,special_id:55530000}\n", + .support_trail = '\x00', + .soft_ver = NULL, + + .partitions = { + {"fs-uboot", 0x00000, 0x20000}, + {"firmware", 0x20000, 0x7a0000}, + {"partition-table", 0x7c0000, 0x02000}, + {"default-mac", 0x7c2000, 0x00020}, + {"pin", 0x7c2100, 0x00020}, + {"product-info", 0x7c3100, 0x01000}, + {"soft-version", 0x7c4200, 0x01000}, + {"support-list", 0x7c5200, 0x01000}, + {"profile", 0x7c6200, 0x08000}, + {"config-info", 0x7ce200, 0x00400}, + {"user-config", 0x7d0000, 0x10000}, + {"default-config", 0x7e0000, 0x10000}, + {"radio", 0x7f0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system" + }, + /** Firmware layout for the RE220 v2 */ { .id = "RE220-V2", @@ -2397,6 +2574,9 @@ static void build_image(const char *output, } else if (strcasecmp(info->id, "ARCHER-C6-V2-US") == 0) { const char mdat[11] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00}; parts[5] = put_data("extra-para", mdat, 11); + } else if (strcasecmp(info->id, "EAP245-V3") == 0) { + const char mdat[10] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01}; + parts[5] = put_data("extra-para", mdat, 10); } size_t len;