From e985fa09f03d32753c74aaf8932515e2983e5d11 Mon Sep 17 00:00:00 2001 From: RISCi_ATOM Date: Sun, 30 Sep 2018 15:52:14 -0400 Subject: [PATCH] TP-Link TL-WR1043N v5 appears to be identical to the TL-WR1043ND v4, except that the USB port has been removed and there is no longer a removable antenna option. The software is more in line with the Archer series in that it uses a nested bootloader scheme. Specifications: - QCA9563 at 775 MHz - 64 MB RAM - 16 MB flash - 3 (non-detachable) Antennas / 450 Mbit - 1x/4x WAN/LAN Gbps Ethernet (QCA8337) - reset and Wi-Fi buttons Based upon upstream commit : 673793d753717dc49e5a6f9b1bba52658cae63fc Note: This commit has not been tested on actual hardware!!! --- .../ar71xx/base-files/etc/board.d/01_leds | 7 +- .../ar71xx/base-files/etc/board.d/02_network | 2 + target/linux/ar71xx/base-files/etc/diag.sh | 1 + target/linux/ar71xx/base-files/lib/ar71xx.sh | 3 + .../ar71xx/base-files/lib/upgrade/platform.sh | 1 + target/linux/ar71xx/config-4.4 | 1 + .../files/arch/mips/ath79/Kconfig.openwrt | 9 + .../arch/mips/ath79/mach-tl-wr1043nd-v4.c | 82 +++ .../ar71xx/files/arch/mips/ath79/machtypes.h | 1 + target/linux/ar71xx/image/tp-link.mk | 13 +- target/linux/ar71xx/nand/config-default | 1 + tools/firmware-utils/src/tplink-safeloader.c | 520 +++++++++++++++++- 12 files changed, 631 insertions(+), 10 deletions(-) diff --git a/target/linux/ar71xx/base-files/etc/board.d/01_leds b/target/linux/ar71xx/base-files/etc/board.d/01_leds index 40e0ecff45..e28fcf83df 100755 --- a/target/linux/ar71xx/base-files/etc/board.d/01_leds +++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds @@ -661,14 +661,19 @@ tl-wr1043nd-v2) ucidef_set_led_usbdev "usb" "USB" "tp-link:green:usb" "1-1" ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" ;; +tl-wr1043n-v5|\ tl-wr1043nd-v4) - ucidef_set_led_usbdev "usb" "USB" "tp-link:green:usb" "1-1" ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" ucidef_set_led_switch "wan" "WAN" "tp-link:green:wan" "switch0" "0x20" ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x10" ucidef_set_led_switch "lan2" "LAN2" "tp-link:green:lan2" "switch0" "0x08" ucidef_set_led_switch "lan3" "LAN3" "tp-link:green:lan3" "switch0" "0x04" ucidef_set_led_switch "lan4" "LAN4" "tp-link:green:lan4" "switch0" "0x02" + case "$board" in + tl-wr1043nd-v4) + ucidef_set_led_usbdev "usb" "USB" "tp-link:green:usb" "1-1" + ;; + esac ;; tl-wr2543n) ucidef_set_led_usbdev "usb" "USB" "tp-link:green:usb" "1-1" diff --git a/target/linux/ar71xx/base-files/etc/board.d/02_network b/target/linux/ar71xx/base-files/etc/board.d/02_network index 90c0a07b89..36a5a33024 100755 --- a/target/linux/ar71xx/base-files/etc/board.d/02_network +++ b/target/linux/ar71xx/base-files/etc/board.d/02_network @@ -236,6 +236,7 @@ ar71xx_setup_interfaces() esr900|\ mynet-n750|\ sr3200|\ + tl-wr1043n-v5|\ wndr3700v4|\ wndr4300) ucidef_add_switch "switch0" \ @@ -482,6 +483,7 @@ ar71xx_setup_macs() lan_mac=$(mtd_get_mac_binary caldata 0) wan_mac=$(mtd_get_mac_binary caldata 6) ;; + tl-wr1043n-v5|\ tl-wr1043nd-v4) lan_mac=$(mtd_get_mac_binary product-info 8) wan_mac=$(macaddr_add "$lan_mac" 1) diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh index 61a224d08d..32a6e129f1 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -359,6 +359,7 @@ get_status_led() { tl-wdr3320-v2|\ tl-wdr3500|\ tl-wr1041n-v2|\ + tl-wr1043n-v5|\ tl-wr1043nd|\ tl-wr1043nd-v2|\ tl-wr1043nd-v4|\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh index 2e9dcfb06e..cd5797e5e7 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -938,6 +938,9 @@ ar71xx_board_detect() { *"TL-WR1041N v2") name="tl-wr1041n-v2" ;; + *"TL-WR1043N v5") + name="tl-wr1043n-v5" + ;; *TL-WR1043ND) name="tl-wr1043nd" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh index ec7cbce9d3..642b27ea39 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -296,6 +296,7 @@ platform_check_image() { tew-712br|\ tew-732br|\ tew-823dru|\ + tl-wr1043n-v5|\ unifi-outdoor|\ unifiac-lite|\ unifiac-pro|\ diff --git a/target/linux/ar71xx/config-4.4 b/target/linux/ar71xx/config-4.4 index 26e9ec2878..26f0986769 100644 --- a/target/linux/ar71xx/config-4.4 +++ b/target/linux/ar71xx/config-4.4 @@ -179,6 +179,7 @@ CONFIG_ATH79_MACH_TL_WDR4300=y CONFIG_ATH79_MACH_TL_WDR6500_V2=y CONFIG_ATH79_MACH_TL_WPA8630=y CONFIG_ATH79_MACH_TL_WR1041N_V2=y +CONFIG_ATH79_MACH_TL_WR1043N_V5=y CONFIG_ATH79_MACH_TL_WR1043ND=y CONFIG_ATH79_MACH_TL_WR1043ND_V2=y CONFIG_ATH79_MACH_TL_WR1043ND_V4=y diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt index 8fa61df28e..ac7d4a70fa 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt +++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt @@ -1574,6 +1574,15 @@ config ATH79_MACH_TL_WR1041N_V2 select ATH79_DEV_USB select ATH79_DEV_WMAC +config ATH79_MACH_TL_WR1043N_V5 + bool "TP-LINK TL-WR1043N v5 support" + select SOC_QCA956X + select ATH79_DEV_ETH + select ATH79_DEV_GPIO_BUTTONS + select ATH79_DEV_LEDS_GPIO + select ATH79_DEV_M25P80 + select ATH79_DEV_WMAC + config ATH79_MACH_TL_WR1043ND bool "TP-LINK TL-WR1043ND support" select SOC_AR913X diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr1043nd-v4.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr1043nd-v4.c index b1539c5d71..391b1ff6dc 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr1043nd-v4.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr1043nd-v4.c @@ -5,6 +5,7 @@ * Copyright (C) 2016 Matthias Schiffer * Copyright (C) 2016 Andreas Ziegler * Copyright (C) 2016 Ludwig Thomeczek + * Copyright (C) 2017 Tim Thorpe * * Derived from: mach-dir-869-a1.c * @@ -62,6 +63,8 @@ #define TL_WR1043_V4_EEPROM_ADDR 0x1fff0000 #define TL_WR1043_V4_WMAC_CALDATA_OFFSET 0x1000 +#define TL_WR1043N_V5_MAC_LOCATION 0x1ff00008 + static struct gpio_led tl_wr1043nd_v4_leds_gpio[] __initdata = { { .name = "tp-link:green:wps", @@ -188,3 +191,82 @@ static void __init tl_wr1043nd_v4_setup(void) MIPS_MACHINE(ATH79_MACH_TL_WR1043ND_V4, "TL-WR1043ND-v4", "TP-LINK TL-WR1043ND v4", tl_wr1043nd_v4_setup); + +static struct gpio_led tl_wr1043n_v5_leds_gpio[] __initdata = { + { + .name = "tp-link:green:wps", + .gpio = TL_WR1043_V4_GPIO_LED_WPS, + .active_low = 1, + }, + { + .name = "tp-link:green:system", + .gpio = TL_WR1043_V4_GPIO_LED_SYSTEM, + .active_low = 1, + }, + { + .name = "tp-link:green:wlan", + .gpio = TL_WR1043_V4_GPIO_LED_WLAN, + .active_low = 1, + }, + { + .name = "tp-link:green:wan", + .gpio = TL_WR1043_V4_GPIO_LED_WAN, + .active_low = 1, + }, + { + .name = "tp-link:green:lan1", + .gpio = TL_WR1043_V4_GPIO_LED_LAN1, + .active_low = 1, + }, + { + .name = "tp-link:green:lan2", + .gpio = TL_WR1043_V4_GPIO_LED_LAN2, + .active_low = 1, + }, + { + .name = "tp-link:green:lan3", + .gpio = TL_WR1043_V4_GPIO_LED_LAN3, + .active_low = 1, + }, + { + .name = "tp-link:green:lan4", + .gpio = TL_WR1043_V4_GPIO_LED_LAN4, + .active_low = 1, + }, +}; + +/* The 1043Nv5 is identical to the 1043NDv4, + * only missing the usb and small firmware layout changes */ +static void __init tl_wr1043nv5_setup(void) +{ + u8 *art = (u8 *) KSEG1ADDR(TL_WR1043_V4_EEPROM_ADDR); + u8 *mac = (u8 *) KSEG1ADDR(TL_WR1043N_V5_MAC_LOCATION); + + ath79_register_m25p80(NULL); + + ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr1043n_v5_leds_gpio), + tl_wr1043n_v5_leds_gpio); + ath79_register_gpio_keys_polled(-1, TL_WR1043_V4_KEYS_POLL_INTERVAL, + ARRAY_SIZE(tl_wr1043nd_v4_gpio_keys), + tl_wr1043nd_v4_gpio_keys); + + platform_device_register(&ath79_mdio0_device); + + mdiobus_register_board_info(tl_wr1043nd_v4_mdio0_info, + ARRAY_SIZE(tl_wr1043nd_v4_mdio0_info)); + + ath79_register_wmac(art + TL_WR1043_V4_WMAC_CALDATA_OFFSET, mac); + + ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0); + + /* GMAC0 is connected to an AR8337 switch */ + ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_SGMII; + ath79_eth0_data.speed = SPEED_1000; + ath79_eth0_data.duplex = DUPLEX_FULL; + ath79_eth0_data.phy_mask = BIT(0); + ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev; + ath79_register_eth(0); +} + +MIPS_MACHINE(ATH79_MACH_TL_WR1043N_V5, "TL-WR1043N-v5", "TP-LINK TL-WR1043N v5", + tl_wr1043nv5_setup); diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h index 7ae30b1a83..93692144c7 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h +++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h @@ -215,6 +215,7 @@ enum ath79_mach_type { ATH79_MACH_TL_WDR6500_V2, /* TP-LINK TL-WDR6500 v2 */ ATH79_MACH_TL_WPA8630, /* TP-Link TL-WPA8630 */ ATH79_MACH_TL_WR1041N_V2, /* TP-LINK TL-WR1041N v2 */ + ATH79_MACH_TL_WR1043N_V5, /* TP-LINK TL-WR1043N v5 */ ATH79_MACH_TL_WR1043ND, /* TP-LINK TL-WR1043ND */ ATH79_MACH_TL_WR1043ND_V2, /* TP-LINK TL-WR1043ND v2 */ ATH79_MACH_TL_WR1043ND_V4, /* TP-LINK TL-WR1043ND v4 */ diff --git a/target/linux/ar71xx/image/tp-link.mk b/target/linux/ar71xx/image/tp-link.mk index d952e952f4..4b4615ac2c 100644 --- a/target/linux/ar71xx/image/tp-link.mk +++ b/target/linux/ar71xx/image/tp-link.mk @@ -735,6 +735,17 @@ define Device/tl-wr1041n-v2 endef TARGET_DEVICES += tl-wr1041n-v2 +define Device/tl-wr1043n-v5 + $(Device/archer-cxx) + DEVICE_TITLE := TP-LINK TL-WR1043N v5 + BOARDNAME := TL-WR1043N-v5 + SUPPORTED_DEVICES := tl-wr1043n-v5 + DEVICE_PROFILE := TLWR1043 + MTDPARTS := spi0.0:128k(factory-uboot)ro,128k(u-boot)ro,15104k(firmware),128k(product-info)ro,640k(config)ro,64k(partition-table)ro,128k(logs)ro,64k(art)ro + IMAGE_SIZE := 15104k + TPLINK_BOARD_ID := TLWR1043NV5 +endef + define Device/tl-wr1043nd-v1 $(Device/tplink-8m) DEVICE_TITLE := TP-LINK TL-WR1043N/ND v1 @@ -778,7 +789,7 @@ define Device/tl-wr1043nd-v4 IMAGE/sysupgrade.bin := append-rootfs | tplink-safeloader sysupgrade IMAGE/factory.bin := append-rootfs | tplink-safeloader factory endef -TARGET_DEVICES += tl-wr1043nd-v1 tl-wr1043nd-v2 tl-wr1043nd-v3 tl-wr1043nd-v4 +TARGET_DEVICES += tl-wr1043nd-v1 tl-wr1043nd-v2 tl-wr1043nd-v3 tl-wr1043nd-v4 tl-wr1043n-v5 define Device/tl-wr2543-v1 $(Device/tplink-8mlzma) diff --git a/target/linux/ar71xx/nand/config-default b/target/linux/ar71xx/nand/config-default index 042d4d300d..0b2b1fe8d0 100644 --- a/target/linux/ar71xx/nand/config-default +++ b/target/linux/ar71xx/nand/config-default @@ -51,6 +51,7 @@ # CONFIG_ATH79_MACH_TL_WDR3500 is not set # CONFIG_ATH79_MACH_TL_WDR4300 is not set # CONFIG_ATH79_MACH_TL_WR1041N_V2 is not set +# CONFIG_ATH79_MACH_TL_WR1043N_V5 is not set # CONFIG_ATH79_MACH_TL_WR1043ND is not set # CONFIG_ATH79_MACH_TL_WR1043ND_V4 is not set # CONFIG_ATH79_MACH_TL_WR2543N is not set diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c index 4e3d2058b2..88e2e88bdf 100644 --- a/tools/firmware-utils/src/tplink-safeloader.c +++ b/tools/firmware-utils/src/tplink-safeloader.c @@ -75,6 +75,7 @@ struct device_info { const char *vendor; const char *support_list; char support_trail; + const char *soft_ver; const struct flash_partition_entry partitions[MAX_PARTITIONS+1]; const char *first_sysupgrade_partition; const char *last_sysupgrade_partition; @@ -130,6 +131,7 @@ static struct device_info boards[] = { "CPE220(TP-LINK|US|N300-2):1.1\r\n" "CPE220(TP-LINK|EU|N300-2):1.1\r\n", .support_trail = '\xff', + .soft_ver = NULL, .partitions = { {"fs-uboot", 0x00000, 0x20000}, @@ -167,6 +169,7 @@ static struct device_info boards[] = { "CPE520(TP-LINK|US|N300-5):1.1\r\n" "CPE520(TP-LINK|EU|N300-5):1.1\r\n", .support_trail = '\xff', + .soft_ver = NULL, .partitions = { {"fs-uboot", 0x00000, 0x20000}, @@ -198,6 +201,7 @@ static struct device_info boards[] = { "WBS210(TP-LINK|US|N300-2):1.20\r\n" "WBS210(TP-LINK|EU|N300-2):1.20\r\n", .support_trail = '\xff', + .soft_ver = NULL, .partitions = { {"fs-uboot", 0x00000, 0x20000}, @@ -229,6 +233,7 @@ static struct device_info boards[] = { "WBS510(TP-LINK|US|N300-5):1.20\r\n" "WBS510(TP-LINK|EU|N300-5):1.20\r\n", .support_trail = '\xff', + .soft_ver = NULL, .partitions = { {"fs-uboot", 0x00000, 0x20000}, @@ -259,6 +264,7 @@ static struct device_info boards[] = { "SupportList:\r\n" "{product_name:Archer C2600,product_ver:1.0.0,special_id:00000000}\r\n", .support_trail = '\x00', + .soft_ver = NULL, .partitions = { {"SBL1", 0x00000, 0x20000}, @@ -293,16 +299,168 @@ static struct device_info boards[] = { .last_sysupgrade_partition = "file-system" }, + /** Firmware layout for the C25v1 */ + { + .id = "ARCHER-C25-V1", + .support_list = + "SupportList:\n" + "{product_name:ArcherC25,product_ver:1.0.0,special_id:00000000}\n" + "{product_name:ArcherC25,product_ver:1.0.0,special_id:55530000}\n" + "{product_name:ArcherC25,product_ver:1.0.0,special_id:45550000}\n", + .support_trail = '\x00', + .soft_ver = "soft_ver:1.0.0\n", + + /** + We use a bigger os-image partition than the stock images (and thus + smaller file-system), as our kernel doesn't fit in the stock firmware's + 1MB os-image. + */ + .partitions = { + {"factory-boot", 0x00000, 0x20000}, + {"fs-uboot", 0x20000, 0x10000}, + {"os-image", 0x30000, 0x180000}, /* Stock: base 0x30000 size 0x100000 */ + {"file-system", 0x1b0000, 0x620000}, /* Stock: base 0x130000 size 0x6a0000 */ + {"user-config", 0x7d0000, 0x04000}, + {"default-mac", 0x7e0000, 0x00100}, + {"device-id", 0x7e0100, 0x00100}, + {"extra-para", 0x7e0200, 0x00100}, + {"pin", 0x7e0300, 0x00100}, + {"support-list", 0x7e0400, 0x00400}, + {"soft-version", 0x7e0800, 0x00400}, + {"product-info", 0x7e0c00, 0x01400}, + {"partition-table", 0x7e2000, 0x01000}, + {"profile", 0x7e3000, 0x01000}, + {"default-config", 0x7e4000, 0x04000}, + {"merge-config", 0x7ec000, 0x02000}, + {"qos-db", 0x7ee000, 0x02000}, + {"radio", 0x7f0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system", + }, + + /** Firmware layout for the C58v1 */ + { + .id = "ARCHER-C58-V1", + .vendor = "", + .support_list = + "SupportList:\r\n" + "{product_name:Archer C58,product_ver:1.0.0,special_id:00000000}\r\n" + "{product_name:Archer C58,product_ver:1.0.0,special_id:45550000}\r\n" + "{product_name:Archer C58,product_ver:1.0.0,special_id:55530000}\r\n", + .support_trail = '\x00', + .soft_ver = "soft_ver:1.0.0\n", + + .partitions = { + {"fs-uboot", 0x00000, 0x10000}, + {"default-mac", 0x10000, 0x00200}, + {"pin", 0x10200, 0x00200}, + {"product-info", 0x10400, 0x00100}, + {"partition-table", 0x10500, 0x00800}, + {"soft-version", 0x11300, 0x00200}, + {"support-list", 0x11500, 0x00100}, + {"device-id", 0x11600, 0x00100}, + {"profile", 0x11700, 0x03900}, + {"default-config", 0x15000, 0x04000}, + {"user-config", 0x19000, 0x04000}, + {"os-image", 0x20000, 0x180000}, + {"file-system", 0x1a0000, 0x648000}, + {"certyficate", 0x7e8000, 0x08000}, + {"radio", 0x7f0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system", + }, + + /** Firmware layout for the C59v1 */ + { + .id = "ARCHER-C59-V1", + .vendor = "", + .support_list = + "SupportList:\r\n" + "{product_name:Archer C59,product_ver:1.0.0,special_id:00000000}\r\n" + "{product_name:Archer C59,product_ver:1.0.0,special_id:45550000}\r\n" + "{product_name:Archer C59,product_ver:1.0.0,special_id:52550000}\r\n" + "{product_name:Archer C59,product_ver:1.0.0,special_id:55530000}\r\n", + .support_trail = '\x00', + .soft_ver = "soft_ver:1.0.0\n", + + .partitions = { + {"fs-uboot", 0x00000, 0x10000}, + {"default-mac", 0x10000, 0x00200}, + {"pin", 0x10200, 0x00200}, + {"device-id", 0x10400, 0x00100}, + {"product-info", 0x10500, 0x0fb00}, + {"os-image", 0x20000, 0x180000}, + {"file-system", 0x1a0000, 0xcb0000}, + {"partition-table", 0xe50000, 0x10000}, + {"soft-version", 0xe60000, 0x10000}, + {"support-list", 0xe70000, 0x10000}, + {"profile", 0xe80000, 0x10000}, + {"default-config", 0xe90000, 0x10000}, + {"user-config", 0xea0000, 0x40000}, + {"usb-config", 0xee0000, 0x10000}, + {"certificate", 0xef0000, 0x10000}, + {"qos-db", 0xf00000, 0x40000}, + {"log", 0xfe0000, 0x10000}, + {"radio", 0xff0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system", + }, + + /** Firmware layout for the C60v1 */ + { + .id = "ARCHER-C60-V1", + .vendor = "", + .support_list = + "SupportList:\r\n" + "{product_name:Archer C60,product_ver:1.0.0,special_id:00000000}\r\n" + "{product_name:Archer C60,product_ver:1.0.0,special_id:45550000}\r\n" + "{product_name:Archer C60,product_ver:1.0.0,special_id:55530000}\r\n", + .support_trail = '\x00', + .soft_ver = "soft_ver:1.0.0\n", + + .partitions = { + {"fs-uboot", 0x00000, 0x10000}, + {"default-mac", 0x10000, 0x00200}, + {"pin", 0x10200, 0x00200}, + {"product-info", 0x10400, 0x00100}, + {"partition-table", 0x10500, 0x00800}, + {"soft-version", 0x11300, 0x00200}, + {"support-list", 0x11500, 0x00100}, + {"device-id", 0x11600, 0x00100}, + {"profile", 0x11700, 0x03900}, + {"default-config", 0x15000, 0x04000}, + {"user-config", 0x19000, 0x04000}, + {"os-image", 0x20000, 0x180000}, + {"file-system", 0x1a0000, 0x648000}, + {"certyficate", 0x7e8000, 0x08000}, + {"radio", 0x7f0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system", + }, + /** Firmware layout for the C5 */ { .id = "ARCHER-C5-V2", .vendor = "", .support_list = "SupportList:\r\n" - "{product_name:ArcherC5," - "product_ver:2.0.0," - "special_id:00000000}\r\n", + "{product_name:ArcherC5,product_ver:2.0.0,special_id:00000000}\r\n" + "{product_name:ArcherC5,product_ver:2.0.0,special_id:55530000}\r\n" + "{product_name:ArcherC5,product_ver:2.0.0,special_id:4A500000}\r\n", /* JP version */ .support_trail = '\x00', + .soft_ver = NULL, .partitions = { {"fs-uboot", 0x00000, 0x40000}, @@ -327,6 +485,56 @@ static struct device_info boards[] = { .last_sysupgrade_partition = "file-system" }, + /** Firmware layout for the C7 */ + { + .id = "ARCHER-C7-V4", + .support_list = + "SupportList:\n" + "{product_name:Archer C7,product_ver:4.0.0,special_id:00000000}\n" + "{product_name:Archer C7,product_ver:4.0.0,special_id:41550000}\n" + "{product_name:Archer C7,product_ver:4.0.0,special_id:45550000}\n" + "{product_name:Archer C7,product_ver:4.0.0,special_id:4B520000}\n" + "{product_name:Archer C7,product_ver:4.0.0,special_id:42520000}\n" + "{product_name:Archer C7,product_ver:4.0.0,special_id:4A500000}\n" + "{product_name:Archer C7,product_ver:4.0.0,special_id:52550000}\n" + "{product_name:Archer C7,product_ver:4.0.0,special_id:54570000}\n" + "{product_name:Archer C7,product_ver:4.0.0,special_id:55530000}\n" + "{product_name:Archer C7,product_ver:4.0.0,special_id:43410000}\n", + .support_trail = '\x00', + .soft_ver = "soft_ver:1.0.0\n", + + /** + We use a bigger os-image partition than the stock images (and thus + smaller file-system), as our kernel doesn't fit in the stock firmware's + 1MB os-image. + */ + .partitions = { + {"factory-boot", 0x00000, 0x20000}, + {"fs-uboot", 0x20000, 0x20000}, + {"os-image", 0x40000, 0x180000}, /* Stock: base 0x40000 size 0x120000 */ + {"file-system", 0x1c0000, 0xd40000}, /* Stock: base 0x160000 size 0xda0000 */ + {"default-mac", 0xf00000, 0x00200}, + {"pin", 0xf00200, 0x00200}, + {"device-id", 0xf00400, 0x00100}, + {"product-info", 0xf00500, 0x0fb00}, + {"soft-version", 0xf10000, 0x00100}, + {"extra-para", 0xf11000, 0x01000}, + {"support-list", 0xf12000, 0x0a000}, + {"profile", 0xf1c000, 0x04000}, + {"default-config", 0xf20000, 0x10000}, + {"user-config", 0xf30000, 0x40000}, + {"qos-db", 0xf70000, 0x40000}, + {"certificate", 0xfb0000, 0x10000}, + {"partition-table", 0xfc0000, 0x10000}, + {"log", 0xfd0000, 0x20000}, + {"radio", 0xff0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system", + }, + /** Firmware layout for the C9 */ { .id = "ARCHERC9", @@ -337,6 +545,7 @@ static struct device_info boards[] = { "product_ver:1.0.0," "special_id:00000000}\n", .support_trail = '\x00', + .soft_ver = NULL, .partitions = { {"fs-uboot", 0x00000, 0x40000}, @@ -369,6 +578,7 @@ static struct device_info boards[] = { "SupportList:\r\n" "EAP120(TP-LINK|UN|N300-2):1.0\r\n", .support_trail = '\xff', + .soft_ver = NULL, .partitions = { {"fs-uboot", 0x00000, 0x20000}, @@ -390,6 +600,125 @@ static struct device_info boards[] = { .last_sysupgrade_partition = "file-system" }, + /** Firmware layout for the TL-WA850RE v2 */ + { + .id = "TLWA850REV2", + .vendor = "", + .support_list = + "SupportList:\n" + "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:55530000}\n" + "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:00000000}\n" + "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:55534100}\n" + "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:45550000}\n" + "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:4B520000}\n" + "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:42520000}\n" + "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:4A500000}\n" + "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:43410000}\n" + "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:41550000}\n" + "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:52550000}\n", + .support_trail = '\x00', + .soft_ver = NULL, + + /** + 576KB were moved from file-system to os-image + in comparison to the stock image + */ + .partitions = { + {"fs-uboot", 0x00000, 0x20000}, + {"os-image", 0x20000, 0x150000}, + {"file-system", 0x170000, 0x240000}, + {"partition-table", 0x3b0000, 0x02000}, + {"default-mac", 0x3c0000, 0x00020}, + {"pin", 0x3c0100, 0x00020}, + {"product-info", 0x3c1000, 0x01000}, + {"soft-version", 0x3c2000, 0x00100}, + {"support-list", 0x3c3000, 0x01000}, + {"profile", 0x3c4000, 0x08000}, + {"user-config", 0x3d0000, 0x10000}, + {"default-config", 0x3e0000, 0x10000}, + {"radio", 0x3f0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system" + }, + + /** Firmware layout for the TL-WA855RE v1 */ + { + .id = "TLWA855REV1", + .vendor = "", + .support_list = + "SupportList:\n" + "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:00000000}\n" + "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:55530000}\n" + "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:45550000}\n" + "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:4B520000}\n" + "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:42520000}\n" + "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:4A500000}\n" + "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:43410000}\n" + "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:41550000}\n" + "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:52550000}\n", + .support_trail = '\x00', + .soft_ver = NULL, + + .partitions = { + {"fs-uboot", 0x00000, 0x20000}, + {"os-image", 0x20000, 0x150000}, + {"file-system", 0x170000, 0x240000}, + {"partition-table", 0x3b0000, 0x02000}, + {"default-mac", 0x3c0000, 0x00020}, + {"pin", 0x3c0100, 0x00020}, + {"product-info", 0x3c1000, 0x01000}, + {"soft-version", 0x3c2000, 0x00100}, + {"support-list", 0x3c3000, 0x01000}, + {"profile", 0x3c4000, 0x08000}, + {"user-config", 0x3d0000, 0x10000}, + {"default-config", 0x3e0000, 0x10000}, + {"radio", 0x3f0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system" + }, + + /** Firmware layout for the TL-WR1043 v5 */ + { + .id = "TLWR1043NV5", + .vendor = "", + .support_list = + "SupportList:\n" + "{product_name:TL-WR1043N,product_ver:5.0.0,special_id:45550000}\n" + "{product_name:TL-WR1043N,product_ver:5.0.0,special_id:55530000}\n", + .support_trail = '\x00', + .soft_ver = "soft_ver:1.0.0\n", + .partitions = { + {"factory-boot", 0x00000, 0x20000}, + {"fs-uboot", 0x20000, 0x20000}, + {"os-image", 0x40000, 0x180000}, + {"file-system", 0x1c0000, 0xd40000}, + {"default-mac", 0xf00000, 0x00200}, + {"pin", 0xf00200, 0x00200}, + {"device-id", 0xf00400, 0x00100}, + {"product-info", 0xf00500, 0x0fb00}, + {"soft-version", 0xf10000, 0x01000}, + {"extra-para", 0xf11000, 0x01000}, + {"support-list", 0xf12000, 0x0a000}, + {"profile", 0xf1c000, 0x04000}, + {"default-config", 0xf20000, 0x10000}, + {"user-config", 0xf30000, 0x40000}, + {"qos-db", 0xf70000, 0x40000}, + {"certificate", 0xfb0000, 0x10000}, + {"partition-table", 0xfc0000, 0x10000}, + {"log", 0xfd0000, 0x20000}, + {"radio", 0xff0000, 0x10000}, + {NULL, 0, 0} + }, + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system" + }, + /** Firmware layout for the TL-WR1043 v4 */ { .id = "TLWR1043NDV4", @@ -398,6 +727,7 @@ static struct device_info boards[] = { "SupportList:\n" "{product_name:TL-WR1043ND,product_ver:4.0.0,special_id:45550000}\n", .support_trail = '\x00', + .soft_ver = NULL, /** We use a bigger os-image partition than the stock images (and thus @@ -426,6 +756,121 @@ static struct device_info boards[] = { .last_sysupgrade_partition = "file-system" }, + /** Firmware layout for the TL-WR902AC v1 */ + { + .id = "TL-WR902AC-V1", + .vendor = "", + .support_list = + "SupportList:\n" + "{product_name:TL-WR902AC,product_ver:1.0.0,special_id:45550000}\n" + "{product_name:TL-WR902AC,product_ver:1.0.0,special_id:55530000}\n", + .support_trail = '\x00', + .soft_ver = NULL, + + /** + 384KB were moved from file-system to os-image + in comparison to the stock image + */ + .partitions = { + {"fs-uboot", 0x00000, 0x20000}, + {"os-image", 0x20000, 0x180000}, + {"file-system", 0x1a0000, 0x5b0000}, + {"default-mac", 0x750000, 0x00200}, + {"pin", 0x750200, 0x00200}, + {"product-info", 0x750400, 0x0fc00}, + {"soft-version", 0x760000, 0x0b000}, + {"support-list", 0x76b000, 0x04000}, + {"profile", 0x770000, 0x04000}, + {"default-config", 0x774000, 0x0b000}, + {"user-config", 0x780000, 0x40000}, + {"partition-table", 0x7c0000, 0x10000}, + {"log", 0x7d0000, 0x20000}, + {"radio", 0x7f0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system", + }, + + /** Firmware layout for the TL-WR942N V1 */ + { + .id = "TLWR942NV1", + .vendor = "", + .support_list = + "SupportList:\r\n" + "{product_name:TL-WR942N,product_ver:1.0.0,special_id:00000000}\r\n" + "{product_name:TL-WR942N,product_ver:1.0.0,special_id:52550000}\r\n", + .support_trail = '\x00', + .soft_ver = NULL, + + .partitions = { + {"fs-uboot", 0x00000, 0x20000}, + {"os-image", 0x20000, 0x180000}, + {"file-system", 0x1a0000, 0xca0000}, + {"default-mac", 0xe40000, 0x00200}, + {"pin", 0xe40200, 0x00200}, + {"product-info", 0xe40400, 0x0fc00}, + {"partition-table", 0xe50000, 0x10000}, + {"soft-version", 0xe60000, 0x10000}, + {"support-list", 0xe70000, 0x10000}, + {"profile", 0xe80000, 0x10000}, + {"default-config", 0xe90000, 0x10000}, + {"user-config", 0xea0000, 0x40000}, + {"qos-db", 0xee0000, 0x40000}, + {"certificate", 0xf20000, 0x10000}, + {"usb-config", 0xfb0000, 0x10000}, + {"log", 0xfc0000, 0x20000}, + {"radio-bk", 0xfe0000, 0x10000}, + {"radio", 0xff0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system", + }, + + /** Firmware layout for the RE350 v1 */ + { + .id = "RE350-V1", + .vendor = "", + .support_list = + "SupportList:\n" + "{product_name:RE350,product_ver:1.0.0,special_id:45550000}\n" + "{product_name:RE350,product_ver:1.0.0,special_id:00000000}\n" + "{product_name:RE350,product_ver:1.0.0,special_id:41550000}\n" + "{product_name:RE350,product_ver:1.0.0,special_id:55530000}\n" + "{product_name:RE350,product_ver:1.0.0,special_id:43410000}\n" + "{product_name:RE350,product_ver:1.0.0,special_id:4b520000}\n" + "{product_name:RE350,product_ver:1.0.0,special_id:4a500000}\n", + .support_trail = '\x00', + .soft_ver = NULL, + + /** + The original os-image partition is too small, + so we enlarge it to 1.6M + */ + .partitions = { + {"fs-uboot", 0x00000, 0x20000}, + {"os-image", 0x20000, 0x1a0000}, + {"file-system", 0x1c0000, 0x440000}, + {"partition-table", 0x600000, 0x02000}, + {"default-mac", 0x610000, 0x00020}, + {"pin", 0x610100, 0x00020}, + {"product-info", 0x611100, 0x01000}, + {"soft-version", 0x620000, 0x01000}, + {"support-list", 0x621000, 0x01000}, + {"profile", 0x622000, 0x08000}, + {"user-config", 0x630000, 0x10000}, + {"default-config", 0x640000, 0x10000}, + {"radio", 0x7f0000, 0x10000}, + {NULL, 0, 0} + }, + + .first_sysupgrade_partition = "os-image", + .last_sysupgrade_partition = "file-system" + }, + /** Firmware layout for the RE450 */ { .id = "RE450", @@ -441,6 +886,7 @@ static struct device_info boards[] = { "{product_name:RE450,product_ver:1.0.0,special_id:4B520000}\r\n" "{product_name:RE450,product_ver:1.0.0,special_id:55534100}\r\n", .support_trail = '\x00', + .soft_ver = NULL, /** The flash partition table for RE450; @@ -449,8 +895,8 @@ static struct device_info boards[] = { */ .partitions = { {"fs-uboot", 0x00000, 0x20000}, - {"os-image", 0x20000, 0x150000}, - {"file-system", 0x170000, 0x4a0000}, + {"os-image", 0x20000, 0x180000}, + {"file-system", 0x1a0000, 0x460000}, {"partition-table", 0x600000, 0x02000}, {"default-mac", 0x610000, 0x00020}, {"pin", 0x610100, 0x00020}, @@ -502,6 +948,20 @@ static void free_image_partition(struct image_partition_entry entry) { free(entry.data); } +static time_t source_date_epoch = -1; +static void set_source_date_epoch() { + char *env = getenv("SOURCE_DATE_EPOCH"); + char *endptr = env; + errno = 0; + if (env && *env) { + source_date_epoch = strtoull(env, &endptr, 10); + if (errno || (endptr && *endptr != '\0')) { + fprintf(stderr, "Invalid SOURCE_DATE_EPOCH"); + exit(1); + } + } +} + /** Generates the partition-table partition */ static struct image_partition_entry make_partition_table(const struct flash_partition_entry *p) { struct image_partition_entry entry = alloc_image_partition("partition-table", 0x800); @@ -545,7 +1005,9 @@ static struct image_partition_entry make_soft_version(uint32_t rev) { time_t t; - if (time(&t) == (time_t)(-1)) + if (source_date_epoch != -1) + t = source_date_epoch; + else if (time(&t) == (time_t)(-1)) error(1, errno, "time"); struct tm *tm = localtime(&t); @@ -569,6 +1031,23 @@ static struct image_partition_entry make_soft_version(uint32_t rev) { return entry; } +static struct image_partition_entry make_soft_version_from_string(const char *soft_ver) { + /** String length _including_ the terminating zero byte */ + uint32_t ver_len = strlen(soft_ver) + 1; + /** Partition contains 64 bit header, the version string, and one additional null byte */ + size_t partition_len = 2*sizeof(uint32_t) + ver_len + 1; + struct image_partition_entry entry = alloc_image_partition("soft-version", partition_len); + + uint32_t *len = (uint32_t *)entry.data; + len[0] = htonl(ver_len); + len[1] = 0; + memcpy(&len[2], soft_ver, ver_len); + + entry.data[partition_len - 1] = 0; + + return entry; +} + /** Generates the support-list partition */ static struct image_partition_entry make_support_list(const struct device_info *info) { size_t len = strlen(info->support_list); @@ -615,6 +1094,15 @@ static struct image_partition_entry read_file(const char *part_name, const char return entry; } +/** Creates a new image partition from arbitrary data */ +static struct image_partition_entry put_data(const char *part_name, const char *datain, size_t len) { + + struct image_partition_entry entry = alloc_image_partition(part_name, len); + + memcpy(entry.data, datain, len); + + return entry; +} /** Copies a list of image partitions into an image buffer and generates the image partition table while doing so @@ -796,14 +1284,29 @@ static void build_image(const char *output, bool add_jffs2_eof, bool sysupgrade, const struct device_info *info) { - struct image_partition_entry parts[6] = {}; + + struct image_partition_entry parts[7] = {}; parts[0] = make_partition_table(info->partitions); - parts[1] = make_soft_version(rev); + if (info->soft_ver) + parts[1] = make_soft_version_from_string(info->soft_ver); + else + parts[1] = make_soft_version(rev); + parts[2] = make_support_list(info); parts[3] = read_file("os-image", kernel_image, false); parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof); + /* Some devices need the extra-para partition to accept the firmware */ + if (strcasecmp(info->id, "ARCHER-C25-V1") == 0 || + strcasecmp(info->id, "TLWR1043NV5") == 0) { + const char mdat[11] = {0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}; + parts[5] = put_data("extra-para", mdat, 11); + } else if (strcasecmp(info->id, "ARCHER-C7-V4") == 0) { + const char mdat[11] = {0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0xca, 0x00, 0x01, 0x00, 0x00}; + parts[5] = put_data("extra-para", mdat, 11); + } + size_t len; void *image; if (sysupgrade) @@ -862,6 +1365,7 @@ int main(int argc, char *argv[]) { bool add_jffs2_eof = false, sysupgrade = false; unsigned rev = 0; const struct device_info *info; + set_source_date_epoch(); while (true) { int c; -- 2.25.1