ffd1f0b3a5
This patchset enables the RX LNA for the CPE210/510, improving RX by about 20dB. The profiles for CPE210 and CPE510 is split into two images, so the CPE510 can use the correct ART offset, improving the TX power by 10dB. Fixes #796
189 lines
6.9 KiB
Diff
189 lines
6.9 KiB
Diff
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
|
Date: Thu, 9 Jun 2016 05:02:18 +0200
|
|
Subject: fw-utils/tplink-safeloader.c: Add support for Archer C2600
|
|
|
|
Signed-off-by: Ash Benz <ash.benz@bk.ru>
|
|
|
|
Backport of LEDE 955c341d3bec0eb4971a03924e99156367255d7b
|
|
|
|
diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c
|
|
index 77a894b..2e204aa 100644
|
|
--- a/tools/firmware-utils/src/tplink-safeloader.c
|
|
+++ b/tools/firmware-utils/src/tplink-safeloader.c
|
|
@@ -105,6 +105,8 @@ static const uint8_t md5_salt[16] = {
|
|
/** Vendor information for CPE210/220/510/520 */
|
|
static const char cpe510_vendor[] = "CPE510(TP-LINK|UN|N300-5):1.0\r\n";
|
|
|
|
+/** Vendor information for C2600 */
|
|
+static const char c2600_vendor[] = "";
|
|
|
|
/**
|
|
The flash partition table for CPE210/220/510/520;
|
|
@@ -128,6 +130,39 @@ static const struct flash_partition_entry cpe510_partitions[] = {
|
|
};
|
|
|
|
/**
|
|
+ The flash partition table for C2600;
|
|
+ it is the same as the one used by the stock images.
|
|
+*/
|
|
+static const struct flash_partition_entry c2600_partitions[] = {
|
|
+ {"SBL1", 0x00000, 0x20000},
|
|
+ {"MIBIB", 0x20000, 0x20000},
|
|
+ {"SBL2", 0x40000, 0x20000},
|
|
+ {"SBL3", 0x60000, 0x30000},
|
|
+ {"DDRCONFIG", 0x90000, 0x10000},
|
|
+ {"SSD", 0xa0000, 0x10000},
|
|
+ {"TZ", 0xb0000, 0x30000},
|
|
+ {"RPM", 0xe0000, 0x20000},
|
|
+ {"fs-uboot", 0x100000, 0x70000},
|
|
+ {"uboot-env", 0x170000, 0x40000},
|
|
+ {"radio", 0x1b0000, 0x40000},
|
|
+ {"os-image", 0x1f0000, 0x200000},
|
|
+ {"file-system", 0x3f0000, 0x1b00000},
|
|
+ {"default-mac", 0x1ef0000, 0x00200},
|
|
+ {"pin", 0x1ef0200, 0x00200},
|
|
+ {"product-info", 0x1ef0400, 0x0fc00},
|
|
+ {"partition-table", 0x1f00000, 0x10000},
|
|
+ {"soft-version", 0x1f10000, 0x10000},
|
|
+ {"support-list", 0x1f20000, 0x10000},
|
|
+ {"profile", 0x1f30000, 0x10000},
|
|
+ {"default-config", 0x1f40000, 0x10000},
|
|
+ {"user-config", 0x1f50000, 0x40000},
|
|
+ {"qos-db", 0x1f90000, 0x40000},
|
|
+ {"usb-config", 0x1fd0000, 0x10000},
|
|
+ {"log", 0x1fe0000, 0x20000},
|
|
+ {NULL, 0, 0}
|
|
+};
|
|
+
|
|
+/**
|
|
The support list for CPE210/220/510/520
|
|
*/
|
|
static const char cpe510_support_list[] =
|
|
@@ -141,6 +176,13 @@ static const char cpe510_support_list[] =
|
|
"CPE220(TP-LINK|UN|N300-2):1.0\r\n"
|
|
"CPE220(TP-LINK|UN|N300-2):1.1\r\n";
|
|
|
|
+/**
|
|
+ The support list for C2600
|
|
+*/
|
|
+static const char c2600_support_list[] =
|
|
+ "SupportList:\r\n"
|
|
+ "{product_name:Archer C2600,product_ver:1.0.0,special_id:00000000}\r\n";
|
|
+
|
|
#define error(_ret, _errno, _str, ...) \
|
|
do { \
|
|
fprintf(stderr, _str ": %s\n", ## __VA_ARGS__, \
|
|
@@ -240,14 +282,14 @@ static struct image_partition_entry make_soft_version(uint32_t rev) {
|
|
}
|
|
|
|
/** Generates the support-list partition */
|
|
-static struct image_partition_entry make_support_list(const char *support_list) {
|
|
+static struct image_partition_entry make_support_list(const char *support_list, bool trailzero) {
|
|
size_t len = strlen(support_list);
|
|
struct image_partition_entry entry = alloc_image_partition("support-list", len + 9);
|
|
|
|
put32(entry.data, len);
|
|
memset(entry.data+4, 0, 4);
|
|
memcpy(entry.data+8, support_list, len);
|
|
- entry.data[len+8] = '\xff';
|
|
+ entry.data[len+8] = trailzero ? '\x00' : '\xff';
|
|
|
|
return entry;
|
|
}
|
|
@@ -436,6 +478,37 @@ static void * generate_sysupgrade_image(const struct flash_partition_entry *flas
|
|
return image;
|
|
}
|
|
|
|
+static void * generate_sysupgrade_image_c2600(const struct flash_partition_entry *flash_parts, const struct image_partition_entry *image_parts, size_t *len) {
|
|
+ const struct flash_partition_entry *flash_os_image = &flash_parts[11];
|
|
+ const struct flash_partition_entry *flash_file_system = &flash_parts[12];
|
|
+
|
|
+ const struct image_partition_entry *image_os_image = &image_parts[3];
|
|
+ const struct image_partition_entry *image_file_system = &image_parts[4];
|
|
+
|
|
+ assert(strcmp(flash_os_image->name, "os-image") == 0);
|
|
+ assert(strcmp(flash_file_system->name, "file-system") == 0);
|
|
+
|
|
+ assert(strcmp(image_os_image->name, "os-image") == 0);
|
|
+ assert(strcmp(image_file_system->name, "file-system") == 0);
|
|
+
|
|
+ if (image_os_image->size > flash_os_image->size)
|
|
+ error(1, 0, "kernel image too big (more than %u bytes)", (unsigned)flash_os_image->size);
|
|
+ if (image_file_system->size > flash_file_system->size)
|
|
+ error(1, 0, "rootfs image too big (more than %u bytes)", (unsigned)flash_file_system->size);
|
|
+
|
|
+ *len = flash_file_system->base - flash_os_image->base + image_file_system->size;
|
|
+
|
|
+ uint8_t *image = malloc(*len);
|
|
+ if (!image)
|
|
+ error(1, errno, "malloc");
|
|
+
|
|
+ memset(image, 0xff, *len);
|
|
+
|
|
+ memcpy(image, image_os_image->data, image_os_image->size);
|
|
+ memcpy(image + flash_file_system->base - flash_os_image->base, image_file_system->data, image_file_system->size);
|
|
+
|
|
+ return image;
|
|
+}
|
|
|
|
/** Generates an image for CPE210/220/510/520 and writes it to a file */
|
|
static void do_cpe510(const char *output, const char *kernel_image, const char *rootfs_image, uint32_t rev, bool add_jffs2_eof, bool sysupgrade) {
|
|
@@ -443,7 +516,7 @@ static void do_cpe510(const char *output, const char *kernel_image, const char *
|
|
|
|
parts[0] = make_partition_table(cpe510_partitions);
|
|
parts[1] = make_soft_version(rev);
|
|
- parts[2] = make_support_list(cpe510_support_list);
|
|
+ parts[2] = make_support_list(cpe510_support_list,false);
|
|
parts[3] = read_file("os-image", kernel_image, false);
|
|
parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
|
|
|
|
@@ -470,6 +543,39 @@ static void do_cpe510(const char *output, const char *kernel_image, const char *
|
|
free_image_partition(parts[i]);
|
|
}
|
|
|
|
+/** Generates an image for C2600 and writes it to a file */
|
|
+static void do_c2600(const char *output, const char *kernel_image, const char *rootfs_image, uint32_t rev, bool add_jffs2_eof, bool sysupgrade) {
|
|
+ struct image_partition_entry parts[6] = {};
|
|
+
|
|
+ parts[0] = make_partition_table(c2600_partitions);
|
|
+ parts[1] = make_soft_version(rev);
|
|
+ parts[2] = make_support_list(c2600_support_list,true);
|
|
+ parts[3] = read_file("os-image", kernel_image, false);
|
|
+ parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof);
|
|
+
|
|
+ size_t len;
|
|
+ void *image;
|
|
+ if (sysupgrade)
|
|
+ image = generate_sysupgrade_image_c2600(c2600_partitions, parts, &len);
|
|
+ else
|
|
+ image = generate_factory_image(c2600_vendor, parts, &len);
|
|
+
|
|
+ FILE *file = fopen(output, "wb");
|
|
+ if (!file)
|
|
+ error(1, errno, "unable to open output file");
|
|
+
|
|
+ if (fwrite(image, len, 1, file) != 1)
|
|
+ error(1, 0, "unable to write output file");
|
|
+
|
|
+ fclose(file);
|
|
+
|
|
+ free(image);
|
|
+
|
|
+ size_t i;
|
|
+ for (i = 0; parts[i].name; i++)
|
|
+ free_image_partition(parts[i]);
|
|
+}
|
|
+
|
|
|
|
/** Usage output */
|
|
static void usage(const char *argv0) {
|
|
@@ -552,6 +658,8 @@ int main(int argc, char *argv[]) {
|
|
|
|
if (strcmp(board, "CPE510") == 0)
|
|
do_cpe510(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade);
|
|
+ else if (strcmp(board, "C2600") == 0)
|
|
+ do_c2600(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade);
|
|
else
|
|
error(1, 0, "unsupported board %s", board);
|
|
|