firmware-utils: tplink-safeloader: support strings as soft_version
[openwrt/staging/dedeckeh.git] / tools / firmware-utils / src / tplink-safeloader.c
index 19d67c3f42654213c510e4c129eed879eac04bed..9c9efc369c23e068687d37122aa8b4879a49d096 100644 (file)
@@ -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},
@@ -303,6 +309,7 @@ static struct device_info boards[] = {
                        "{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:55530000}\r\n",
                .support_trail = '\x00',
+               .soft_ver = "soft_ver:1.0.0\n",
 
                .partitions = {
                        {"fs-uboot", 0x00000, 0x10000},
@@ -340,6 +347,7 @@ static struct device_info boards[] = {
                        "{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},
@@ -374,6 +382,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},
@@ -408,6 +417,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},
@@ -440,6 +450,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},
@@ -478,6 +489,7 @@ static struct device_info boards[] = {
                        "{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
@@ -512,6 +524,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
@@ -555,6 +568,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;
@@ -683,6 +697,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);
@@ -913,7 +944,11 @@ static void build_image(const char *output,
        struct image_partition_entry parts[6] = {};
 
        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);