123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- From: Jan Niehusmann <jan@gondor.com>
- Date: Fri, 19 May 2017 09:42:24 +0200
- Subject: firmware-utils: tplink-safeloader: support strings as soft_version
- Some TP-Link routers (C25, C59, C60) contain a version string instead
- of a binary structure in the soft_version partition.
- Flashing LEDE from the original firmware's GUI, this version string
- taken from the soft_ver partition of the firmware image is written to
- the router's config partition.
- When using tftp recovery to go back to the original Archer C25 firmware,
- a version check compares that version to the version of the firmware to
- be flashed.
- Without proper contents in the config partition, reverting to the
- original firmware fails.
- Therefore, write the string "soft_ver:1.0.0\n" to that soft_ver
- partition.
- Signed-off-by: Jan Niehusmann <jan@gondor.com>
- diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c
- index 7617566829e159ae9fec00d5de95919a0fb234c6..24684268b1a3fe491c4eb876a5ebefc700f2e56e 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},
- @@ -345,6 +351,7 @@ static struct device_info boards[] = {
- "product_ver:2.0.0,"
- "special_id:00000000}\r\n",
- .support_trail = '\x00',
- + .soft_ver = NULL,
-
- .partitions = {
- {"fs-uboot", 0x00000, 0x40000},
- @@ -379,6 +386,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},
- @@ -411,6 +419,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},
- @@ -440,6 +449,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
- @@ -483,6 +493,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;
- @@ -611,6 +622,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);
- @@ -851,7 +879,11 @@ static void build_image(const char *output,
- 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);
|