tplink-safeloader: add RU support-list entry for Archer C6U v1
[project/firmware-utils.git] / src / tplink-safeloader.c
1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3 Copyright (c) 2014, Matthias Schiffer <mschiffer@universe-factory.net>
4 All rights reserved.
5 */
6
7
8 /*
9 tplink-safeloader
10
11 Image generation tool for the TP-LINK SafeLoader as seen on
12 TP-LINK Pharos devices (CPE210/220/510/520)
13 */
14
15
16 #include <assert.h>
17 #include <ctype.h>
18 #include <errno.h>
19 #include <stdbool.h>
20 #include <stddef.h>
21 #include <stdio.h>
22 #include <stdint.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <time.h>
26 #include <unistd.h>
27
28 #include <arpa/inet.h>
29
30 #include <sys/types.h>
31 #include <sys/stat.h>
32 #include <limits.h>
33
34 #include "md5.h"
35
36
37 #define ALIGN(x,a) ({ typeof(a) __a = (a); (((x) + __a - 1) & ~(__a - 1)); })
38
39
40 #define MAX_PARTITIONS 32
41
42 /** An image partition table entry */
43 struct image_partition_entry {
44 const char *name;
45 size_t size;
46 uint8_t *data;
47 };
48
49 /** A flash partition table entry */
50 struct flash_partition_entry {
51 const char *name;
52 uint32_t base;
53 uint32_t size;
54 };
55
56 /** Flash partition names table entry */
57 struct factory_partition_names {
58 const char *partition_table;
59 const char *soft_ver;
60 const char *os_image;
61 const char *support_list;
62 const char *file_system;
63 const char *extra_para;
64 };
65
66 /** Partition trailing padding definitions
67 * Values 0x00 to 0xff are reserved to indicate the padding value
68 * Values from 0x100 are reserved to indicate other behaviour */
69 enum partition_trail_value {
70 PART_TRAIL_00 = 0x00,
71 PART_TRAIL_FF = 0xff,
72 PART_TRAIL_MAX = 0xff,
73 PART_TRAIL_NONE = 0x100
74 };
75
76 /** soft-version value overwrite types
77 * The default (for an uninitialised soft_ver field) is to use the numerical
78 * version number "0.0.0"
79 */
80 enum soft_ver_type {
81 SOFT_VER_TYPE_NUMERIC = 0,
82 SOFT_VER_TYPE_TEXT = 1,
83 };
84
85 /** Firmware layout description */
86 struct device_info {
87 const char *id;
88 const char *vendor;
89 const char *support_list;
90 enum partition_trail_value part_trail;
91 struct {
92 enum soft_ver_type type;
93 union {
94 const char *text;
95 uint8_t num[3];
96 };
97 } soft_ver;
98 uint32_t soft_ver_compat_level;
99 struct flash_partition_entry partitions[MAX_PARTITIONS+1];
100 const char *first_sysupgrade_partition;
101 const char *last_sysupgrade_partition;
102 struct factory_partition_names partition_names;
103 };
104
105 #define SOFT_VER_TEXT(_t) {.type = SOFT_VER_TYPE_TEXT, .text = _t}
106 #define SOFT_VER_NUMERIC(_maj, _min, _patch) { \
107 .type = SOFT_VER_TYPE_NUMERIC, \
108 .num = {_maj, _min, _patch}}
109 #define SOFT_VER_DEFAULT SOFT_VER_NUMERIC(0, 0, 0)
110
111 struct __attribute__((__packed__)) meta_header {
112 uint32_t length;
113 uint32_t zero;
114 };
115
116 /** The content of the soft-version structure */
117 struct __attribute__((__packed__)) soft_version {
118 uint8_t pad1;
119 uint8_t version_major;
120 uint8_t version_minor;
121 uint8_t version_patch;
122 uint8_t year_hi;
123 uint8_t year_lo;
124 uint8_t month;
125 uint8_t day;
126 uint32_t rev;
127 uint32_t compat_level;
128 };
129
130 /*
131 * Safeloader image type
132 * Safeloader images contain a 0x14 byte preamble with image size (big endian
133 * UINT32) and md5 checksum (16 bytes).
134 *
135 * SAFEFLOADER_TYPE_DEFAULT
136 * Standard preamble with size including preamble length, and checksum.
137 * Header of 0x1000 bytes, contents of which are not specified.
138 * Payload starts at offset 0x1014.
139 *
140 * SAFELOADER_TYPE_VENDOR
141 * Standard preamble with size including preamble length, and checksum.
142 * Header contains up to 0x1000 bytes of vendor data, starting with a big endian
143 * UINT32 size, followed by that number of bytes containing (text) data.
144 * Padded with 0xFF. Payload starts at offset 0x1014.
145 *
146 * SAFELOADER_TYPE_CLOUD
147 * Standard preamble with size including preamble length, and checksum.
148 * Followed by the 'fw-type:Cloud' string and some (unknown) data.
149 * Payload starts at offset 0x1014.
150 *
151 * SAFELOADER_TYPE_QNEW
152 * Reversed order preamble, with (apparent) md5 checksum before the image
153 * size. The size does not include the preamble length.
154 * Header starts with 0x3C bytes, starting with the string '?NEW' (format not
155 * understood). Then another 0x1000 bytes follow, with the data payload
156 * starting at 0x1050.
157 */
158 enum safeloader_image_type {
159 SAFELOADER_TYPE_DEFAULT,
160 SAFELOADER_TYPE_VENDOR,
161 SAFELOADER_TYPE_CLOUD,
162 SAFELOADER_TYPE_QNEW,
163 };
164
165 /* Internal representation of safeloader image data */
166 struct safeloader_image_info {
167 enum safeloader_image_type type;
168 size_t payload_offset;
169 struct flash_partition_entry entries[MAX_PARTITIONS];
170 };
171
172 #define SAFELOADER_PREAMBLE_SIZE 0x14
173 #define SAFELOADER_HEADER_SIZE 0x1000
174 #define SAFELOADER_PAYLOAD_OFFSET (SAFELOADER_PREAMBLE_SIZE + SAFELOADER_HEADER_SIZE)
175
176 #define SAFELOADER_QNEW_HEADER_SIZE 0x3C
177 #define SAFELOADER_QNEW_PAYLOAD_OFFSET \
178 (SAFELOADER_PREAMBLE_SIZE + SAFELOADER_QNEW_HEADER_SIZE + SAFELOADER_HEADER_SIZE)
179
180 #define SAFELOADER_PAYLOAD_TABLE_SIZE 0x800
181
182 static const uint8_t jffs2_eof_mark[4] = {0xde, 0xad, 0xc0, 0xde};
183
184
185 /**
186 Salt for the MD5 hash
187
188 Fortunately, TP-LINK seems to use the same salt for most devices which use
189 the new image format.
190 */
191 static const uint8_t md5_salt[16] = {
192 0x7a, 0x2b, 0x15, 0xed,
193 0x9b, 0x98, 0x59, 0x6d,
194 0xe5, 0x04, 0xab, 0x44,
195 0xac, 0x2a, 0x9f, 0x4e,
196 };
197
198
199 /** Firmware layout table */
200 static struct device_info boards[] = {
201 /** Firmware layout for the CPE210/220 V1 */
202 {
203 .id = "CPE210",
204 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
205 .support_list =
206 "SupportList:\r\n"
207 "CPE210(TP-LINK|UN|N300-2):1.0\r\n"
208 "CPE210(TP-LINK|UN|N300-2):1.1\r\n"
209 "CPE210(TP-LINK|US|N300-2):1.1\r\n"
210 "CPE210(TP-LINK|EU|N300-2):1.1\r\n"
211 "CPE220(TP-LINK|UN|N300-2):1.1\r\n"
212 "CPE220(TP-LINK|US|N300-2):1.1\r\n"
213 "CPE220(TP-LINK|EU|N300-2):1.1\r\n",
214 .part_trail = 0xff,
215 .soft_ver = SOFT_VER_DEFAULT,
216
217 .partitions = {
218 {"fs-uboot", 0x00000, 0x20000},
219 {"partition-table", 0x20000, 0x02000},
220 {"default-mac", 0x30000, 0x00020},
221 {"product-info", 0x31100, 0x00100},
222 {"signature", 0x32000, 0x00400},
223 {"firmware", 0x40000, 0x770000},
224 {"soft-version", 0x7b0000, 0x00100},
225 {"support-list", 0x7b1000, 0x00400},
226 {"user-config", 0x7c0000, 0x10000},
227 {"default-config", 0x7d0000, 0x10000},
228 {"log", 0x7e0000, 0x10000},
229 {"radio", 0x7f0000, 0x10000},
230 {NULL, 0, 0}
231 },
232
233 .first_sysupgrade_partition = "os-image",
234 .last_sysupgrade_partition = "support-list",
235 },
236
237 /** Firmware layout for the CPE210 V2 */
238 {
239 .id = "CPE210V2",
240 .vendor = "CPE210(TP-LINK|UN|N300-2|00000000):2.0\r\n",
241 .support_list =
242 "SupportList:\r\n"
243 "CPE210(TP-LINK|EU|N300-2|00000000):2.0\r\n"
244 "CPE210(TP-LINK|EU|N300-2|45550000):2.0\r\n"
245 "CPE210(TP-LINK|EU|N300-2|55530000):2.0\r\n"
246 "CPE210(TP-LINK|UN|N300-2|00000000):2.0\r\n"
247 "CPE210(TP-LINK|UN|N300-2|45550000):2.0\r\n"
248 "CPE210(TP-LINK|UN|N300-2|55530000):2.0\r\n"
249 "CPE210(TP-LINK|US|N300-2|55530000):2.0\r\n"
250 "CPE210(TP-LINK|UN|N300-2):2.0\r\n"
251 "CPE210(TP-LINK|EU|N300-2):2.0\r\n"
252 "CPE210(TP-LINK|US|N300-2):2.0\r\n",
253 .part_trail = 0xff,
254 .soft_ver = SOFT_VER_DEFAULT,
255
256 .partitions = {
257 {"fs-uboot", 0x00000, 0x20000},
258 {"partition-table", 0x20000, 0x02000},
259 {"default-mac", 0x30000, 0x00020},
260 {"product-info", 0x31100, 0x00100},
261 {"device-info", 0x31400, 0x00400},
262 {"signature", 0x32000, 0x00400},
263 {"device-id", 0x33000, 0x00100},
264 {"firmware", 0x40000, 0x770000},
265 {"soft-version", 0x7b0000, 0x00100},
266 {"support-list", 0x7b1000, 0x01000},
267 {"user-config", 0x7c0000, 0x10000},
268 {"default-config", 0x7d0000, 0x10000},
269 {"log", 0x7e0000, 0x10000},
270 {"radio", 0x7f0000, 0x10000},
271 {NULL, 0, 0}
272 },
273
274 .first_sysupgrade_partition = "os-image",
275 .last_sysupgrade_partition = "support-list",
276 },
277
278 /** Firmware layout for the CPE210 V3 */
279 {
280 .id = "CPE210V3",
281 .vendor = "CPE210(TP-LINK|UN|N300-2|00000000):3.0\r\n",
282 .support_list =
283 "SupportList:\r\n"
284 "CPE210(TP-LINK|EU|N300-2|45550000):3.0\r\n"
285 "CPE210(TP-LINK|UN|N300-2|00000000):3.0\r\n"
286 "CPE210(TP-LINK|US|N300-2|55530000):3.0\r\n"
287 "CPE210(TP-LINK|UN|N300-2):3.0\r\n"
288 "CPE210(TP-LINK|EU|N300-2):3.0\r\n"
289 "CPE210(TP-LINK|EU|N300-2|45550000):3.1\r\n"
290 "CPE210(TP-LINK|UN|N300-2|00000000):3.1\r\n"
291 "CPE210(TP-LINK|US|N300-2|55530000):3.1\r\n"
292 "CPE210(TP-LINK|EU|N300-2|45550000):3.20\r\n"
293 "CPE210(TP-LINK|UN|N300-2|00000000):3.20\r\n"
294 "CPE210(TP-LINK|US|N300-2|55530000):3.20\r\n",
295 .part_trail = 0xff,
296 .soft_ver = SOFT_VER_DEFAULT,
297
298 .partitions = {
299 {"fs-uboot", 0x00000, 0x20000},
300 {"partition-table", 0x20000, 0x01000},
301 {"default-mac", 0x30000, 0x00020},
302 {"product-info", 0x31100, 0x00100},
303 {"device-info", 0x31400, 0x00400},
304 {"signature", 0x32000, 0x00400},
305 {"device-id", 0x33000, 0x00100},
306 {"firmware", 0x40000, 0x770000},
307 {"soft-version", 0x7b0000, 0x00100},
308 {"support-list", 0x7b1000, 0x01000},
309 {"user-config", 0x7c0000, 0x10000},
310 {"default-config", 0x7d0000, 0x10000},
311 {"log", 0x7e0000, 0x10000},
312 {"radio", 0x7f0000, 0x10000},
313 {NULL, 0, 0}
314 },
315
316 .first_sysupgrade_partition = "os-image",
317 .last_sysupgrade_partition = "support-list",
318 },
319
320 /** Firmware layout for the CPE220 V2 */
321 {
322 .id = "CPE220V2",
323 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
324 .support_list =
325 "SupportList:\r\n"
326 "CPE220(TP-LINK|EU|N300-2|00000000):2.0\r\n"
327 "CPE220(TP-LINK|EU|N300-2|45550000):2.0\r\n"
328 "CPE220(TP-LINK|EU|N300-2|55530000):2.0\r\n"
329 "CPE220(TP-LINK|UN|N300-2|00000000):2.0\r\n"
330 "CPE220(TP-LINK|UN|N300-2|45550000):2.0\r\n"
331 "CPE220(TP-LINK|UN|N300-2|55530000):2.0\r\n"
332 "CPE220(TP-LINK|US|N300-2|55530000):2.0\r\n"
333 "CPE220(TP-LINK|UN|N300-2):2.0\r\n"
334 "CPE220(TP-LINK|EU|N300-2):2.0\r\n"
335 "CPE220(TP-LINK|US|N300-2):2.0\r\n",
336 .part_trail = 0xff,
337 .soft_ver = SOFT_VER_DEFAULT,
338
339 .partitions = {
340 {"fs-uboot", 0x00000, 0x20000},
341 {"partition-table", 0x20000, 0x02000},
342 {"default-mac", 0x30000, 0x00020},
343 {"product-info", 0x31100, 0x00100},
344 {"signature", 0x32000, 0x00400},
345 {"firmware", 0x40000, 0x770000},
346 {"soft-version", 0x7b0000, 0x00100},
347 {"support-list", 0x7b1000, 0x00400},
348 {"user-config", 0x7c0000, 0x10000},
349 {"default-config", 0x7d0000, 0x10000},
350 {"log", 0x7e0000, 0x10000},
351 {"radio", 0x7f0000, 0x10000},
352 {NULL, 0, 0}
353 },
354
355 .first_sysupgrade_partition = "os-image",
356 .last_sysupgrade_partition = "support-list",
357 },
358
359 /** Firmware layout for the CPE220 V3 */
360 {
361 .id = "CPE220V3",
362 .vendor = "CPE220(TP-LINK|UN|N300-2|00000000):3.0\r\n",
363 .support_list =
364 "SupportList:\r\n"
365 "CPE220(TP-LINK|EU|N300-2|00000000):3.0\r\n"
366 "CPE220(TP-LINK|EU|N300-2|45550000):3.0\r\n"
367 "CPE220(TP-LINK|EU|N300-2|55530000):3.0\r\n"
368 "CPE220(TP-LINK|UN|N300-2|00000000):3.0\r\n"
369 "CPE220(TP-LINK|UN|N300-2|45550000):3.0\r\n"
370 "CPE220(TP-LINK|UN|N300-2|55530000):3.0\r\n"
371 "CPE220(TP-LINK|US|N300-2|55530000):3.0\r\n"
372 "CPE220(TP-LINK|UN|N300-2):3.0\r\n"
373 "CPE220(TP-LINK|EU|N300-2):3.0\r\n"
374 "CPE220(TP-LINK|US|N300-2):3.0\r\n",
375 .part_trail = 0xff,
376 .soft_ver = SOFT_VER_DEFAULT,
377
378 .partitions = {
379 {"fs-uboot", 0x00000, 0x20000},
380 {"partition-table", 0x20000, 0x02000},
381 {"default-mac", 0x30000, 0x00020},
382 {"product-info", 0x31100, 0x00100},
383 {"device-info", 0x31400, 0x00400},
384 {"signature", 0x32000, 0x00400},
385 {"device-id", 0x33000, 0x00100},
386 {"firmware", 0x40000, 0x770000},
387 {"soft-version", 0x7b0000, 0x00100},
388 {"support-list", 0x7b1000, 0x01000},
389 {"user-config", 0x7c0000, 0x10000},
390 {"default-config", 0x7d0000, 0x10000},
391 {"log", 0x7e0000, 0x10000},
392 {"radio", 0x7f0000, 0x10000},
393 {NULL, 0, 0}
394 },
395
396 .first_sysupgrade_partition = "os-image",
397 .last_sysupgrade_partition = "support-list",
398 },
399
400 /** Firmware layout for the CPE510/520 V1 */
401 {
402 .id = "CPE510",
403 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
404 .support_list =
405 "SupportList:\r\n"
406 "CPE510(TP-LINK|UN|N300-5):1.0\r\n"
407 "CPE510(TP-LINK|UN|N300-5):1.1\r\n"
408 "CPE510(TP-LINK|UN|N300-5):1.1\r\n"
409 "CPE510(TP-LINK|US|N300-5):1.1\r\n"
410 "CPE510(TP-LINK|EU|N300-5):1.1\r\n"
411 "CPE520(TP-LINK|UN|N300-5):1.1\r\n"
412 "CPE520(TP-LINK|US|N300-5):1.1\r\n"
413 "CPE520(TP-LINK|EU|N300-5):1.1\r\n",
414 .part_trail = 0xff,
415 .soft_ver = SOFT_VER_DEFAULT,
416
417 .partitions = {
418 {"fs-uboot", 0x00000, 0x20000},
419 {"partition-table", 0x20000, 0x02000},
420 {"default-mac", 0x30000, 0x00020},
421 {"product-info", 0x31100, 0x00100},
422 {"signature", 0x32000, 0x00400},
423 {"firmware", 0x40000, 0x770000},
424 {"soft-version", 0x7b0000, 0x00100},
425 {"support-list", 0x7b1000, 0x00400},
426 {"user-config", 0x7c0000, 0x10000},
427 {"default-config", 0x7d0000, 0x10000},
428 {"log", 0x7e0000, 0x10000},
429 {"radio", 0x7f0000, 0x10000},
430 {NULL, 0, 0}
431 },
432
433 .first_sysupgrade_partition = "os-image",
434 .last_sysupgrade_partition = "support-list",
435 },
436
437 /** Firmware layout for the CPE510 V2 */
438 {
439 .id = "CPE510V2",
440 .vendor = "CPE510(TP-LINK|UN|N300-5):2.0\r\n",
441 .support_list =
442 "SupportList:\r\n"
443 "CPE510(TP-LINK|EU|N300-5|00000000):2.0\r\n"
444 "CPE510(TP-LINK|EU|N300-5|45550000):2.0\r\n"
445 "CPE510(TP-LINK|EU|N300-5|55530000):2.0\r\n"
446 "CPE510(TP-LINK|UN|N300-5|00000000):2.0\r\n"
447 "CPE510(TP-LINK|UN|N300-5|45550000):2.0\r\n"
448 "CPE510(TP-LINK|UN|N300-5|55530000):2.0\r\n"
449 "CPE510(TP-LINK|US|N300-5|00000000):2.0\r\n"
450 "CPE510(TP-LINK|US|N300-5|45550000):2.0\r\n"
451 "CPE510(TP-LINK|US|N300-5|55530000):2.0\r\n"
452 "CPE510(TP-LINK|UN|N300-5):2.0\r\n"
453 "CPE510(TP-LINK|EU|N300-5):2.0\r\n"
454 "CPE510(TP-LINK|US|N300-5):2.0\r\n",
455 .part_trail = 0xff,
456 .soft_ver = SOFT_VER_DEFAULT,
457
458 .partitions = {
459 {"fs-uboot", 0x00000, 0x20000},
460 {"partition-table", 0x20000, 0x02000},
461 {"default-mac", 0x30000, 0x00020},
462 {"product-info", 0x31100, 0x00100},
463 {"signature", 0x32000, 0x00400},
464 {"firmware", 0x40000, 0x770000},
465 {"soft-version", 0x7b0000, 0x00100},
466 {"support-list", 0x7b1000, 0x00400},
467 {"user-config", 0x7c0000, 0x10000},
468 {"default-config", 0x7d0000, 0x10000},
469 {"log", 0x7e0000, 0x10000},
470 {"radio", 0x7f0000, 0x10000},
471 {NULL, 0, 0}
472 },
473
474 .first_sysupgrade_partition = "os-image",
475 .last_sysupgrade_partition = "support-list",
476 },
477
478 /** Firmware layout for the CPE510 V3 */
479 {
480 .id = "CPE510V3",
481 .vendor = "CPE510(TP-LINK|UN|N300-5):3.0\r\n",
482 .support_list =
483 "SupportList:\r\n"
484 "CPE510(TP-LINK|EU|N300-5|00000000):3.0\r\n"
485 "CPE510(TP-LINK|EU|N300-5|45550000):3.0\r\n"
486 "CPE510(TP-LINK|EU|N300-5|55530000):3.0\r\n"
487 "CPE510(TP-LINK|UN|N300-5|00000000):3.0\r\n"
488 "CPE510(TP-LINK|UN|N300-5|45550000):3.0\r\n"
489 "CPE510(TP-LINK|UN|N300-5|55530000):3.0\r\n"
490 "CPE510(TP-LINK|US|N300-5|00000000):3.0\r\n"
491 "CPE510(TP-LINK|US|N300-5|45550000):3.0\r\n"
492 "CPE510(TP-LINK|US|N300-5|55530000):3.0\r\n"
493 "CPE510(TP-LINK|UN|N300-5):3.0\r\n"
494 "CPE510(TP-LINK|EU|N300-5):3.0\r\n"
495 "CPE510(TP-LINK|US|N300-5):3.0\r\n"
496 "CPE510(TP-LINK|UN|N300-5|00000000):3.20\r\n"
497 "CPE510(TP-LINK|US|N300-5|55530000):3.20\r\n"
498 "CPE510(TP-LINK|EU|N300-5|45550000):3.20\r\n",
499 .part_trail = 0xff,
500 .soft_ver = SOFT_VER_DEFAULT,
501
502 .partitions = {
503 {"fs-uboot", 0x00000, 0x20000},
504 {"partition-table", 0x20000, 0x02000},
505 {"default-mac", 0x30000, 0x00020},
506 {"product-info", 0x31100, 0x00100},
507 {"signature", 0x32000, 0x00400},
508 {"firmware", 0x40000, 0x770000},
509 {"soft-version", 0x7b0000, 0x00100},
510 {"support-list", 0x7b1000, 0x00400},
511 {"user-config", 0x7c0000, 0x10000},
512 {"default-config", 0x7d0000, 0x10000},
513 {"log", 0x7e0000, 0x10000},
514 {"radio", 0x7f0000, 0x10000},
515 {NULL, 0, 0}
516 },
517
518 .first_sysupgrade_partition = "os-image",
519 .last_sysupgrade_partition = "support-list",
520 },
521
522 /** Firmware layout for the CPE605V1 */
523 {
524 .id = "CPE605V1",
525 .vendor = "CPE605(TP-LINK|UN|N150-5):1.0\r\n",
526 .support_list =
527 "SupportList:\r\n"
528 "CPE605(TP-LINK|UN|N150-5|00000000):1.0\r\n"
529 "CPE605(TP-LINK|EU|N150-5|45550000):1.0\r\n"
530 "CPE605(TP-LINK|US|N150-5|55530000):1.0\r\n",
531 .part_trail = 0x00,
532 .soft_ver = SOFT_VER_DEFAULT,
533
534 .partitions = {
535 {"fs-uboot", 0x00000, 0x20000},
536 {"partition-table", 0x20000, 0x02000},
537 {"default-mac", 0x30000, 0x00020},
538 {"serial-number", 0x30100, 0x00020},
539 {"product-info", 0x31100, 0x00100},
540 {"device-info", 0x31400, 0x00400},
541 {"signature", 0x32000, 0x00400},
542 {"device-id", 0x33000, 0x00100},
543 {"firmware", 0x40000, 0x770000},
544 {"soft-version", 0x7b0000, 0x00100},
545 {"support-list", 0x7b1000, 0x01000},
546 {"user-config", 0x7c0000, 0x10000},
547 {"default-config", 0x7d0000, 0x10000},
548 {"log", 0x7e0000, 0x10000},
549 {"radio", 0x7f0000, 0x10000},
550 {NULL, 0, 0}
551 },
552
553 .first_sysupgrade_partition = "os-image",
554 .last_sysupgrade_partition = "support-list",
555 },
556
557 /** Firmware layout for the CPE610V1 */
558 {
559 .id = "CPE610V1",
560 .vendor = "CPE610(TP-LINK|UN|N300-5|00000000):1.0\r\n",
561 .support_list =
562 "SupportList:\r\n"
563 "CPE610(TP-LINK|EU|N300-5|00000000):1.0\r\n"
564 "CPE610(TP-LINK|EU|N300-5|45550000):1.0\r\n"
565 "CPE610(TP-LINK|EU|N300-5|55530000):1.0\r\n"
566 "CPE610(TP-LINK|UN|N300-5|00000000):1.0\r\n"
567 "CPE610(TP-LINK|UN|N300-5|45550000):1.0\r\n"
568 "CPE610(TP-LINK|UN|N300-5|55530000):1.0\r\n"
569 "CPE610(TP-LINK|US|N300-5|55530000):1.0\r\n"
570 "CPE610(TP-LINK|UN|N300-5):1.0\r\n"
571 "CPE610(TP-LINK|EU|N300-5):1.0\r\n"
572 "CPE610(TP-LINK|US|N300-5):1.0\r\n",
573 .part_trail = 0xff,
574 .soft_ver = SOFT_VER_DEFAULT,
575
576 .partitions = {
577 {"fs-uboot", 0x00000, 0x20000},
578 {"partition-table", 0x20000, 0x02000},
579 {"default-mac", 0x30000, 0x00020},
580 {"product-info", 0x31100, 0x00100},
581 {"signature", 0x32000, 0x00400},
582 {"firmware", 0x40000, 0x770000},
583 {"soft-version", 0x7b0000, 0x00100},
584 {"support-list", 0x7b1000, 0x00400},
585 {"user-config", 0x7c0000, 0x10000},
586 {"default-config", 0x7d0000, 0x10000},
587 {"log", 0x7e0000, 0x10000},
588 {"radio", 0x7f0000, 0x10000},
589 {NULL, 0, 0}
590 },
591
592 .first_sysupgrade_partition = "os-image",
593 .last_sysupgrade_partition = "support-list",
594 },
595
596 /** Firmware layout for the CPE610V2 */
597 {
598 .id = "CPE610V2",
599 .vendor = "CPE610(TP-LINK|UN|N300-5|00000000):2.0\r\n",
600 .support_list =
601 "SupportList:\r\n"
602 "CPE610(TP-LINK|EU|N300-5|00000000):2.0\r\n"
603 "CPE610(TP-LINK|EU|N300-5|45550000):2.0\r\n"
604 "CPE610(TP-LINK|EU|N300-5|55530000):2.0\r\n"
605 "CPE610(TP-LINK|UN|N300-5|00000000):2.0\r\n"
606 "CPE610(TP-LINK|UN|N300-5|45550000):2.0\r\n"
607 "CPE610(TP-LINK|UN|N300-5|55530000):2.0\r\n"
608 "CPE610(TP-LINK|US|N300-5|55530000):2.0\r\n"
609 "CPE610(TP-LINK|UN|N300-5):2.0\r\n"
610 "CPE610(TP-LINK|EU|N300-5):2.0\r\n"
611 "CPE610(TP-LINK|US|N300-5):2.0\r\n",
612 .part_trail = 0xff,
613 .soft_ver = SOFT_VER_DEFAULT,
614
615 .partitions = {
616 {"fs-uboot", 0x00000, 0x20000},
617 {"partition-table", 0x20000, 0x02000},
618 {"default-mac", 0x30000, 0x00020},
619 {"product-info", 0x31100, 0x00100},
620 {"signature", 0x32000, 0x00400},
621 {"firmware", 0x40000, 0x770000},
622 {"soft-version", 0x7b0000, 0x00100},
623 {"support-list", 0x7b1000, 0x00400},
624 {"user-config", 0x7c0000, 0x10000},
625 {"default-config", 0x7d0000, 0x10000},
626 {"log", 0x7e0000, 0x10000},
627 {"radio", 0x7f0000, 0x10000},
628 {NULL, 0, 0}
629 },
630
631 .first_sysupgrade_partition = "os-image",
632 .last_sysupgrade_partition = "support-list",
633 },
634 /** Firmware layout for the CPE710 V1 */
635 {
636 .id = "CPE710V1",
637 .vendor = "CPE710(TP-LINK|UN|AC866-5|00000000):1.0\r\n",
638 .support_list =
639 "SupportList:\r\n"
640 "CPE710(TP-LINK|UN|AC866-5|00000000):1.0\r\n"
641 "CPE710(TP-LINK|EU|AC866-5|45550000):1.0\r\n"
642 "CPE710(TP-LINK|US|AC866-5|55530000):1.0\r\n"
643 "CPE710(TP-LINK|UN|AC866-5):1.0\r\n"
644 "CPE710(TP-LINK|EU|AC866-5):1.0\r\n"
645 "CPE710(TP-LINK|US|AC866-5):1.0\r\n",
646 .part_trail = 0xff,
647 .soft_ver = SOFT_VER_DEFAULT,
648
649 .partitions = {
650 {"fs-uboot", 0x00000, 0x50000},
651 {"partition-table", 0x50000, 0x02000},
652 {"default-mac", 0x60000, 0x00020},
653 {"serial-number", 0x60100, 0x00020},
654 {"product-info", 0x61100, 0x00100},
655 {"device-info", 0x61400, 0x00400},
656 {"signature", 0x62000, 0x00400},
657 {"device-id", 0x63000, 0x00100},
658 {"firmware", 0x70000, 0xf40000},
659 {"soft-version", 0xfb0000, 0x00100},
660 {"support-list", 0xfb1000, 0x01000},
661 {"user-config", 0xfc0000, 0x10000},
662 {"default-config", 0xfd0000, 0x10000},
663 {"log", 0xfe0000, 0x10000},
664 {"radio", 0xff0000, 0x10000},
665 {NULL, 0, 0}
666 },
667
668 .first_sysupgrade_partition = "os-image",
669 .last_sysupgrade_partition = "support-list",
670 },
671
672 {
673 .id = "WBS210",
674 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
675 .support_list =
676 "SupportList:\r\n"
677 "WBS210(TP-LINK|UN|N300-2):1.20\r\n"
678 "WBS210(TP-LINK|US|N300-2):1.20\r\n"
679 "WBS210(TP-LINK|EU|N300-2):1.20\r\n",
680 .part_trail = 0xff,
681 .soft_ver = SOFT_VER_DEFAULT,
682
683 .partitions = {
684 {"fs-uboot", 0x00000, 0x20000},
685 {"partition-table", 0x20000, 0x02000},
686 {"default-mac", 0x30000, 0x00020},
687 {"product-info", 0x31100, 0x00100},
688 {"signature", 0x32000, 0x00400},
689 {"firmware", 0x40000, 0x770000},
690 {"soft-version", 0x7b0000, 0x00100},
691 {"support-list", 0x7b1000, 0x00400},
692 {"user-config", 0x7c0000, 0x10000},
693 {"default-config", 0x7d0000, 0x10000},
694 {"log", 0x7e0000, 0x10000},
695 {"radio", 0x7f0000, 0x10000},
696 {NULL, 0, 0}
697 },
698
699 .first_sysupgrade_partition = "os-image",
700 .last_sysupgrade_partition = "support-list",
701 },
702
703 {
704 .id = "WBS210V2",
705 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
706 .support_list =
707 "SupportList:\r\n"
708 "WBS210(TP-LINK|UN|N300-2|00000000):2.0\r\n"
709 "WBS210(TP-LINK|US|N300-2|55530000):2.0\r\n"
710 "WBS210(TP-LINK|EU|N300-2|45550000):2.0\r\n",
711 .part_trail = 0xff,
712 .soft_ver = SOFT_VER_DEFAULT,
713
714 .partitions = {
715 {"fs-uboot", 0x00000, 0x20000},
716 {"partition-table", 0x20000, 0x02000},
717 {"default-mac", 0x30000, 0x00020},
718 {"product-info", 0x31100, 0x00100},
719 {"signature", 0x32000, 0x00400},
720 {"firmware", 0x40000, 0x770000},
721 {"soft-version", 0x7b0000, 0x00100},
722 {"support-list", 0x7b1000, 0x00400},
723 {"user-config", 0x7c0000, 0x10000},
724 {"default-config", 0x7d0000, 0x10000},
725 {"log", 0x7e0000, 0x10000},
726 {"radio", 0x7f0000, 0x10000},
727 {NULL, 0, 0}
728 },
729
730 .first_sysupgrade_partition = "os-image",
731 .last_sysupgrade_partition = "support-list",
732 },
733
734 {
735 .id = "WBS510",
736 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
737 .support_list =
738 "SupportList:\r\n"
739 "WBS510(TP-LINK|UN|N300-5):1.20\r\n"
740 "WBS510(TP-LINK|US|N300-5):1.20\r\n"
741 "WBS510(TP-LINK|EU|N300-5):1.20\r\n"
742 "WBS510(TP-LINK|CA|N300-5):1.20\r\n",
743 .part_trail = 0xff,
744 .soft_ver = SOFT_VER_DEFAULT,
745
746 .partitions = {
747 {"fs-uboot", 0x00000, 0x20000},
748 {"partition-table", 0x20000, 0x02000},
749 {"default-mac", 0x30000, 0x00020},
750 {"product-info", 0x31100, 0x00100},
751 {"signature", 0x32000, 0x00400},
752 {"firmware", 0x40000, 0x770000},
753 {"soft-version", 0x7b0000, 0x00100},
754 {"support-list", 0x7b1000, 0x00400},
755 {"user-config", 0x7c0000, 0x10000},
756 {"default-config", 0x7d0000, 0x10000},
757 {"log", 0x7e0000, 0x10000},
758 {"radio", 0x7f0000, 0x10000},
759 {NULL, 0, 0}
760 },
761
762 .first_sysupgrade_partition = "os-image",
763 .last_sysupgrade_partition = "support-list",
764 },
765
766 {
767 .id = "WBS510V2",
768 .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n",
769 .support_list =
770 "SupportList:\r\n"
771 "WBS510(TP-LINK|UN|N300-5|00000000):2.0\r\n"
772 "WBS510(TP-LINK|US|N300-5|55530000):2.0\r\n"
773 "WBS510(TP-LINK|EU|N300-5|45550000):2.0\r\n"
774 "WBS510(TP-LINK|CA|N300-5|43410000):2.0\r\n",
775 .part_trail = 0xff,
776 .soft_ver = SOFT_VER_DEFAULT,
777
778 .partitions = {
779 {"fs-uboot", 0x00000, 0x20000},
780 {"partition-table", 0x20000, 0x02000},
781 {"default-mac", 0x30000, 0x00020},
782 {"product-info", 0x31100, 0x00100},
783 {"signature", 0x32000, 0x00400},
784 {"firmware", 0x40000, 0x770000},
785 {"soft-version", 0x7b0000, 0x00100},
786 {"support-list", 0x7b1000, 0x00400},
787 {"user-config", 0x7c0000, 0x10000},
788 {"default-config", 0x7d0000, 0x10000},
789 {"log", 0x7e0000, 0x10000},
790 {"radio", 0x7f0000, 0x10000},
791 {NULL, 0, 0}
792 },
793
794 .first_sysupgrade_partition = "os-image",
795 .last_sysupgrade_partition = "support-list",
796 },
797
798 /** Firmware layout for the AD7200 */
799 {
800 .id = "AD7200",
801 .vendor = "",
802 .support_list =
803 "SupportList:\r\n"
804 "{product_name:AD7200,product_ver:1.0.0,special_id:00000000}\r\n",
805 .part_trail = 0x00,
806 .soft_ver = SOFT_VER_DEFAULT,
807
808 .partitions = {
809 {"SBL1", 0x00000, 0x20000},
810 {"MIBIB", 0x20000, 0x20000},
811 {"SBL2", 0x40000, 0x20000},
812 {"SBL3", 0x60000, 0x30000},
813 {"DDRCONFIG", 0x90000, 0x10000},
814 {"SSD", 0xa0000, 0x10000},
815 {"TZ", 0xb0000, 0x30000},
816 {"RPM", 0xe0000, 0x20000},
817 {"fs-uboot", 0x100000, 0x70000},
818 {"uboot-env", 0x170000, 0x40000},
819 {"radio", 0x1b0000, 0x40000},
820 {"os-image", 0x1f0000, 0x400000},
821 {"file-system", 0x5f0000, 0x1900000},
822 {"default-mac", 0x1ef0000, 0x00200},
823 {"pin", 0x1ef0200, 0x00200},
824 {"device-id", 0x1ef0400, 0x00200},
825 {"product-info", 0x1ef0600, 0x0fa00},
826 {"partition-table", 0x1f00000, 0x10000},
827 {"soft-version", 0x1f10000, 0x10000},
828 {"support-list", 0x1f20000, 0x10000},
829 {"profile", 0x1f30000, 0x10000},
830 {"default-config", 0x1f40000, 0x10000},
831 {"user-config", 0x1f50000, 0x40000},
832 {"qos-db", 0x1f90000, 0x40000},
833 {"usb-config", 0x1fd0000, 0x10000},
834 {"log", 0x1fe0000, 0x20000},
835 {NULL, 0, 0}
836 },
837
838 .first_sysupgrade_partition = "os-image",
839 .last_sysupgrade_partition = "file-system"
840 },
841
842 /** Firmware layout for the C2600 */
843 {
844 .id = "C2600",
845 .vendor = "",
846 .support_list =
847 "SupportList:\r\n"
848 "{product_name:Archer C2600,product_ver:1.0.0,special_id:00000000}\r\n",
849 .part_trail = 0x00,
850 .soft_ver = SOFT_VER_DEFAULT,
851
852 /**
853 We use a bigger os-image partition than the stock images (and thus
854 smaller file-system), as our kernel doesn't fit in the stock firmware's
855 2 MB os-image since kernel 4.14.
856 */
857 .partitions = {
858 {"SBL1", 0x00000, 0x20000},
859 {"MIBIB", 0x20000, 0x20000},
860 {"SBL2", 0x40000, 0x20000},
861 {"SBL3", 0x60000, 0x30000},
862 {"DDRCONFIG", 0x90000, 0x10000},
863 {"SSD", 0xa0000, 0x10000},
864 {"TZ", 0xb0000, 0x30000},
865 {"RPM", 0xe0000, 0x20000},
866 {"fs-uboot", 0x100000, 0x70000},
867 {"uboot-env", 0x170000, 0x40000},
868 {"radio", 0x1b0000, 0x40000},
869 {"os-image", 0x1f0000, 0x400000}, /* Stock: base 0x1f0000 size 0x200000 */
870 {"file-system", 0x5f0000, 0x1900000}, /* Stock: base 0x3f0000 size 0x1b00000 */
871 {"default-mac", 0x1ef0000, 0x00200},
872 {"pin", 0x1ef0200, 0x00200},
873 {"product-info", 0x1ef0400, 0x0fc00},
874 {"partition-table", 0x1f00000, 0x10000},
875 {"soft-version", 0x1f10000, 0x10000},
876 {"support-list", 0x1f20000, 0x10000},
877 {"profile", 0x1f30000, 0x10000},
878 {"default-config", 0x1f40000, 0x10000},
879 {"user-config", 0x1f50000, 0x40000},
880 {"qos-db", 0x1f90000, 0x40000},
881 {"usb-config", 0x1fd0000, 0x10000},
882 {"log", 0x1fe0000, 0x20000},
883 {NULL, 0, 0}
884 },
885
886 .first_sysupgrade_partition = "os-image",
887 .last_sysupgrade_partition = "file-system"
888 },
889
890 /** Firmware layout for the A7-V5 */
891 {
892 .id = "ARCHER-A7-V5",
893 .support_list =
894 "SupportList:\n"
895 "{product_name:Archer A7,product_ver:5.0.0,special_id:45550000}\n"
896 "{product_name:Archer A7,product_ver:5.0.0,special_id:55530000}\n"
897 "{product_name:Archer A7,product_ver:5.0.0,special_id:43410000}\n"
898 "{product_name:Archer A7,product_ver:5.0.0,special_id:4A500000}\n"
899 "{product_name:Archer A7,product_ver:5.0.0,special_id:54570000}\n"
900 "{product_name:Archer A7,product_ver:5.0.0,special_id:52550000}\n",
901 .part_trail = 0x00,
902 .soft_ver = SOFT_VER_TEXT("soft_ver:7.0.0\n"),
903
904 /* We're using a dynamic kernel/rootfs split here */
905 .partitions = {
906 {"factory-boot", 0x00000, 0x20000},
907 {"fs-uboot", 0x20000, 0x20000},
908 {"firmware", 0x40000, 0xec0000}, /* Stock: name os-image base 0x40000 size 0x120000 */
909 /* Stock: name file-system base 0x160000 size 0xda0000 */
910 {"default-mac", 0xf40000, 0x00200},
911 {"pin", 0xf40200, 0x00200},
912 {"device-id", 0xf40400, 0x00100},
913 {"product-info", 0xf40500, 0x0fb00},
914 {"soft-version", 0xf50000, 0x00100},
915 {"extra-para", 0xf51000, 0x01000},
916 {"support-list", 0xf52000, 0x0a000},
917 {"profile", 0xf5c000, 0x04000},
918 {"default-config", 0xf60000, 0x10000},
919 {"user-config", 0xf70000, 0x40000},
920 {"certificate", 0xfb0000, 0x10000},
921 {"partition-table", 0xfc0000, 0x10000},
922 {"log", 0xfd0000, 0x20000},
923 {"radio", 0xff0000, 0x10000},
924 {NULL, 0, 0}
925 },
926
927 .first_sysupgrade_partition = "os-image",
928 .last_sysupgrade_partition = "file-system",
929 },
930
931 /** Firmware layout for the Archer A9 v6 */
932 {
933 .id = "ARCHER-A9-V6",
934 .support_list =
935 "SupportList:\n"
936 "{product_name:Archer A9,product_ver:6.0,special_id:55530000}\n"
937 "{product_name:Archer A9,product_ver:6.0,special_id:45550000}\n"
938 "{product_name:Archer A9,product_ver:6.0,special_id:52550000}\n"
939 "{product_name:Archer A9,product_ver:6.0,special_id:4A500000}\n"
940 "{product_name:Archer C90,product_ver:6.0,special_id:55530000}\n",
941 .part_trail = 0x00,
942 .soft_ver = SOFT_VER_TEXT("soft_ver:1.1.0\n"),
943
944 /* We're using a dynamic kernel/rootfs split here */
945 .partitions = {
946 {"factory-boot", 0x00000, 0x20000},
947 {"fs-uboot", 0x20000, 0x20000},
948 {"partition-table", 0x40000, 0x10000},
949 {"radio", 0x50000, 0x10000},
950 {"default-mac", 0x60000, 0x00200},
951 {"pin", 0x60200, 0x00200},
952 {"device-id", 0x60400, 0x00100},
953 {"product-info", 0x60500, 0x0fb00},
954 {"soft-version", 0x70000, 0x01000},
955 {"extra-para", 0x71000, 0x01000},
956 {"support-list", 0x72000, 0x0a000},
957 {"profile", 0x7c000, 0x04000},
958 {"user-config", 0x80000, 0x10000},
959 {"ap-config", 0x90000, 0x10000},
960 {"apdef-config", 0xa0000, 0x10000},
961 {"router-config", 0xb0000, 0x10000},
962 {"firmware", 0xc0000, 0xf00000}, /* Stock: name os-image base 0xc0000 size 0x120000 */
963 /* Stock: name file-system base 0x1e0000 size 0xde0000 */
964 {"log", 0xfc0000, 0x20000},
965 {"certificate", 0xfe0000, 0x10000},
966 {"default-config", 0xff0000, 0x10000},
967 {NULL, 0, 0}
968 },
969
970 .first_sysupgrade_partition = "os-image",
971 .last_sysupgrade_partition = "file-system",
972 },
973
974 /** Firmware layout for the Archer AX23 v1 */
975 {
976 .id = "ARCHER-AX23-V1",
977 .vendor = "",
978 .support_list =
979 "SupportList:\n"
980 "{product_name:Archer AX23,product_ver:1.0,special_id:45550000}\n"
981 "{product_name:Archer AX23,product_ver:1.0,special_id:4A500000}\n"
982 "{product_name:Archer AX23,product_ver:1.0,special_id:4B520000}\n"
983 "{product_name:Archer AX23,product_ver:1.0,special_id:52550000}\n"
984 "{product_name:Archer AX23,product_ver:1.0.0,special_id:43410000}\n"
985 "{product_name:Archer AX23,product_ver:1.0.0,special_id:54570000}\n"
986 "{product_name:Archer AX23,product_ver:1.0.0,special_id:55530000}\n"
987 "{product_name:Archer AX23,product_ver:1.20,special_id:45550000}\n"
988 "{product_name:Archer AX23,product_ver:1.20,special_id:4A500000}\n"
989 "{product_name:Archer AX23,product_ver:1.20,special_id:52550000}\n"
990 "{product_name:Archer AX23,product_ver:1.20,special_id:55530000}\n"
991 "{product_name:Archer AX1800,product_ver:1.20,special_id:45550000}\n"
992 "{product_name:Archer AX1800,product_ver:1.20,special_id:52550000}\n",
993 .part_trail = 0x00,
994 .soft_ver = SOFT_VER_TEXT("soft_ver:3.0.3\n"),
995
996 .partitions = {
997 {"fs-uboot", 0x00000, 0x40000},
998 {"firmware", 0x40000, 0xf60000},
999 {"default-mac", 0xfa0000, 0x00200},
1000 {"pin", 0xfa0200, 0x00100},
1001 {"device-id", 0xfa0300, 0x00100},
1002 {"product-info", 0xfa0400, 0x0fc00},
1003 {"default-config", 0xfb0000, 0x08000},
1004 {"ap-def-config", 0xfb8000, 0x08000},
1005 {"user-config", 0xfc0000, 0x0a000},
1006 {"ag-config", 0xfca000, 0x04000},
1007 {"certificate", 0xfce000, 0x02000},
1008 {"ap-config", 0xfd0000, 0x06000},
1009 {"router-config", 0xfd6000, 0x06000},
1010 {"favicon", 0xfdc000, 0x02000},
1011 {"logo", 0xfde000, 0x02000},
1012 {"partition-table", 0xfe0000, 0x00800},
1013 {"soft-version", 0xfe0800, 0x00100},
1014 {"support-list", 0xfe0900, 0x00400},
1015 {"profile", 0xfe0d00, 0x03000},
1016 {"extra-para", 0xfe3d00, 0x00100},
1017 {"radio", 0xff0000, 0x10000},
1018 {NULL, 0, 0}
1019 },
1020 .first_sysupgrade_partition = "os-image",
1021 .last_sysupgrade_partition = "file-system",
1022 },
1023 /** Firmware layout for the C2v3 */
1024 {
1025 .id = "ARCHER-C2-V3",
1026 .support_list =
1027 "SupportList:\n"
1028 "{product_name:ArcherC2,product_ver:3.0.0,special_id:00000000}\n"
1029 "{product_name:ArcherC2,product_ver:3.0.0,special_id:55530000}\n"
1030 "{product_name:ArcherC2,product_ver:3.0.0,special_id:45550000}\n",
1031 .part_trail = 0x00,
1032 .soft_ver = SOFT_VER_TEXT("soft_ver:3.0.1\n"),
1033
1034 /** We're using a dynamic kernel/rootfs split here */
1035
1036 .partitions = {
1037 {"factory-boot", 0x00000, 0x20000},
1038 {"fs-uboot", 0x20000, 0x10000},
1039 {"firmware", 0x30000, 0x7a0000},
1040 {"user-config", 0x7d0000, 0x04000},
1041 {"default-mac", 0x7e0000, 0x00100},
1042 {"device-id", 0x7e0100, 0x00100},
1043 {"extra-para", 0x7e0200, 0x00100},
1044 {"pin", 0x7e0300, 0x00100},
1045 {"support-list", 0x7e0400, 0x00400},
1046 {"soft-version", 0x7e0800, 0x00400},
1047 {"product-info", 0x7e0c00, 0x01400},
1048 {"partition-table", 0x7e2000, 0x01000},
1049 {"profile", 0x7e3000, 0x01000},
1050 {"default-config", 0x7e4000, 0x04000},
1051 {"merge-config", 0x7ec000, 0x02000},
1052 {"qos-db", 0x7ee000, 0x02000},
1053 {"radio", 0x7f0000, 0x10000},
1054 {NULL, 0, 0}
1055 },
1056
1057 .first_sysupgrade_partition = "os-image",
1058 .last_sysupgrade_partition = "file-system",
1059 },
1060
1061 /** Firmware layout for the C25v1 */
1062 {
1063 .id = "ARCHER-C25-V1",
1064 .support_list =
1065 "SupportList:\n"
1066 "{product_name:ArcherC25,product_ver:1.0.0,special_id:00000000}\n"
1067 "{product_name:ArcherC25,product_ver:1.0.0,special_id:55530000}\n"
1068 "{product_name:ArcherC25,product_ver:1.0.0,special_id:45550000}\n",
1069 .part_trail = 0x00,
1070 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1071
1072 /* We're using a dynamic kernel/rootfs split here */
1073 .partitions = {
1074 {"factory-boot", 0x00000, 0x20000},
1075 {"fs-uboot", 0x20000, 0x10000},
1076 {"firmware", 0x30000, 0x7a0000}, /* Stock: name os-image base 0x30000 size 0x100000 */
1077 /* Stock: name file-system base 0x130000 size 0x6a0000 */
1078 {"user-config", 0x7d0000, 0x04000},
1079 {"default-mac", 0x7e0000, 0x00100},
1080 {"device-id", 0x7e0100, 0x00100},
1081 {"extra-para", 0x7e0200, 0x00100},
1082 {"pin", 0x7e0300, 0x00100},
1083 {"support-list", 0x7e0400, 0x00400},
1084 {"soft-version", 0x7e0800, 0x00400},
1085 {"product-info", 0x7e0c00, 0x01400},
1086 {"partition-table", 0x7e2000, 0x01000},
1087 {"profile", 0x7e3000, 0x01000},
1088 {"default-config", 0x7e4000, 0x04000},
1089 {"merge-config", 0x7ec000, 0x02000},
1090 {"qos-db", 0x7ee000, 0x02000},
1091 {"radio", 0x7f0000, 0x10000},
1092 {NULL, 0, 0}
1093 },
1094
1095 .first_sysupgrade_partition = "os-image",
1096 .last_sysupgrade_partition = "file-system",
1097 },
1098
1099 /** Firmware layout for the C58v1 */
1100 {
1101 .id = "ARCHER-C58-V1",
1102 .vendor = "",
1103 .support_list =
1104 "SupportList:\r\n"
1105 "{product_name:Archer C58,product_ver:1.0.0,special_id:00000000}\r\n"
1106 "{product_name:Archer C58,product_ver:1.0.0,special_id:45550000}\r\n"
1107 "{product_name:Archer C58,product_ver:1.0.0,special_id:55530000}\r\n",
1108 .part_trail = 0x00,
1109 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1110
1111 .partitions = {
1112 {"fs-uboot", 0x00000, 0x10000},
1113 {"default-mac", 0x10000, 0x00200},
1114 {"pin", 0x10200, 0x00200},
1115 {"product-info", 0x10400, 0x00100},
1116 {"partition-table", 0x10500, 0x00800},
1117 {"soft-version", 0x11300, 0x00200},
1118 {"support-list", 0x11500, 0x00100},
1119 {"device-id", 0x11600, 0x00100},
1120 {"profile", 0x11700, 0x03900},
1121 {"default-config", 0x15000, 0x04000},
1122 {"user-config", 0x19000, 0x04000},
1123 {"firmware", 0x20000, 0x7c8000},
1124 {"certyficate", 0x7e8000, 0x08000},
1125 {"radio", 0x7f0000, 0x10000},
1126 {NULL, 0, 0}
1127 },
1128
1129 .first_sysupgrade_partition = "os-image",
1130 .last_sysupgrade_partition = "file-system",
1131 },
1132
1133 /** Firmware layout for the C59v1 */
1134 {
1135 .id = "ARCHER-C59-V1",
1136 .vendor = "",
1137 .support_list =
1138 "SupportList:\r\n"
1139 "{product_name:Archer C59,product_ver:1.0.0,special_id:00000000}\r\n"
1140 "{product_name:Archer C59,product_ver:1.0.0,special_id:43410000}\r\n"
1141 "{product_name:Archer C59,product_ver:1.0.0,special_id:45550000}\r\n"
1142 "{product_name:Archer C59,product_ver:1.0.0,special_id:52550000}\r\n"
1143 "{product_name:Archer C59,product_ver:1.0.0,special_id:55530000}\r\n",
1144 .part_trail = 0x00,
1145 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1146
1147 /* We're using a dynamic kernel/rootfs split here */
1148 .partitions = {
1149 {"fs-uboot", 0x00000, 0x10000},
1150 {"default-mac", 0x10000, 0x00200},
1151 {"pin", 0x10200, 0x00200},
1152 {"device-id", 0x10400, 0x00100},
1153 {"product-info", 0x10500, 0x0fb00},
1154 {"firmware", 0x20000, 0xe30000},
1155 {"partition-table", 0xe50000, 0x10000},
1156 {"soft-version", 0xe60000, 0x10000},
1157 {"support-list", 0xe70000, 0x10000},
1158 {"profile", 0xe80000, 0x10000},
1159 {"default-config", 0xe90000, 0x10000},
1160 {"user-config", 0xea0000, 0x40000},
1161 {"usb-config", 0xee0000, 0x10000},
1162 {"certificate", 0xef0000, 0x10000},
1163 {"qos-db", 0xf00000, 0x40000},
1164 {"log", 0xfe0000, 0x10000},
1165 {"radio", 0xff0000, 0x10000},
1166 {NULL, 0, 0}
1167 },
1168
1169 .first_sysupgrade_partition = "os-image",
1170 .last_sysupgrade_partition = "file-system",
1171 },
1172
1173 /** Firmware layout for the C59v2 */
1174 {
1175 .id = "ARCHER-C59-V2",
1176 .vendor = "",
1177 .support_list =
1178 "SupportList:\r\n"
1179 "{product_name:Archer C59,product_ver:2.0.0,special_id:00000000}\r\n"
1180 "{product_name:Archer C59,product_ver:2.0.0,special_id:43410000}\r\n"
1181 "{product_name:Archer C59,product_ver:2.0.0,special_id:45550000}\r\n"
1182 "{product_name:Archer C59,product_ver:2.0.0,special_id:55530000}\r\n",
1183 .part_trail = 0x00,
1184 .soft_ver = SOFT_VER_TEXT("soft_ver:2.0.0 Build 20161206 rel.7303\n"),
1185
1186 /** We're using a dynamic kernel/rootfs split here */
1187 .partitions = {
1188 {"factory-boot", 0x00000, 0x20000},
1189 {"fs-uboot", 0x20000, 0x10000},
1190 {"default-mac", 0x30000, 0x00200},
1191 {"pin", 0x30200, 0x00200},
1192 {"device-id", 0x30400, 0x00100},
1193 {"product-info", 0x30500, 0x0fb00},
1194 {"firmware", 0x40000, 0xe10000},
1195 {"partition-table", 0xe50000, 0x10000},
1196 {"soft-version", 0xe60000, 0x10000},
1197 {"support-list", 0xe70000, 0x10000},
1198 {"profile", 0xe80000, 0x10000},
1199 {"default-config", 0xe90000, 0x10000},
1200 {"user-config", 0xea0000, 0x40000},
1201 {"usb-config", 0xee0000, 0x10000},
1202 {"certificate", 0xef0000, 0x10000},
1203 {"extra-para", 0xf00000, 0x10000},
1204 {"qos-db", 0xf10000, 0x30000},
1205 {"log", 0xfe0000, 0x10000},
1206 {"radio", 0xff0000, 0x10000},
1207 {NULL, 0, 0}
1208 },
1209
1210 .first_sysupgrade_partition = "os-image",
1211 .last_sysupgrade_partition = "file-system",
1212 },
1213
1214 /** Firmware layout for the Archer C6 v2 (EU/RU/JP) */
1215 {
1216 .id = "ARCHER-C6-V2",
1217 .vendor = "",
1218 .support_list =
1219 "SupportList:\r\n"
1220 "{product_name:Archer A6,product_ver:2.0.0,special_id:45550000}\r\n"
1221 "{product_name:Archer C6,product_ver:2.0.0,special_id:45550000}\r\n"
1222 "{product_name:Archer C6,product_ver:2.0.0,special_id:52550000}\r\n"
1223 "{product_name:Archer C6,product_ver:2.0.0,special_id:4A500000}\r\n",
1224 .part_trail = 0x00,
1225 .soft_ver = SOFT_VER_TEXT("soft_ver:1.9.1\n"),
1226
1227 .partitions = {
1228 {"fs-uboot", 0x00000, 0x20000},
1229 {"default-mac", 0x20000, 0x00200},
1230 {"pin", 0x20200, 0x00100},
1231 {"product-info", 0x20300, 0x00200},
1232 {"device-id", 0x20500, 0x0fb00},
1233 {"firmware", 0x30000, 0x7a9400},
1234 {"soft-version", 0x7d9400, 0x00100},
1235 {"extra-para", 0x7d9500, 0x00100},
1236 {"support-list", 0x7d9600, 0x00200},
1237 {"profile", 0x7d9800, 0x03000},
1238 {"default-config", 0x7dc800, 0x03000},
1239 {"partition-table", 0x7df800, 0x00800},
1240 {"user-config", 0x7e0000, 0x0c000},
1241 {"certificate", 0x7ec000, 0x04000},
1242 {"radio", 0x7f0000, 0x10000},
1243 {NULL, 0, 0}
1244 },
1245
1246 .first_sysupgrade_partition = "os-image",
1247 .last_sysupgrade_partition = "file-system",
1248 },
1249
1250 /** Firmware layout for the Archer C6 v2 (US) and A6 v2 (US/TW) */
1251 {
1252 .id = "ARCHER-C6-V2-US",
1253 .vendor = "",
1254 .support_list =
1255 "SupportList:\n"
1256 "{product_name:Archer A6,product_ver:2.0.0,special_id:55530000}\n"
1257 "{product_name:Archer A6,product_ver:2.0.0,special_id:54570000}\n"
1258 "{product_name:Archer C6,product_ver:2.0.0,special_id:55530000}\n",
1259 .part_trail = 0x00,
1260 .soft_ver = SOFT_VER_TEXT("soft_ver:1.9.1\n"),
1261
1262 .partitions = {
1263 {"factory-boot", 0x00000, 0x20000},
1264 {"default-mac", 0x20000, 0x00200},
1265 {"pin", 0x20200, 0x00100},
1266 {"product-info", 0x20300, 0x00200},
1267 {"device-id", 0x20500, 0x0fb00},
1268 {"fs-uboot", 0x30000, 0x20000},
1269 {"firmware", 0x50000, 0xf89400},
1270 {"soft-version", 0xfd9400, 0x00100},
1271 {"extra-para", 0xfd9500, 0x00100},
1272 {"support-list", 0xfd9600, 0x00200},
1273 {"profile", 0xfd9800, 0x03000},
1274 {"default-config", 0xfdc800, 0x03000},
1275 {"partition-table", 0xfdf800, 0x00800},
1276 {"user-config", 0xfe0000, 0x0c000},
1277 {"certificate", 0xfec000, 0x04000},
1278 {"radio", 0xff0000, 0x10000},
1279 {NULL, 0, 0}
1280 },
1281 .first_sysupgrade_partition = "os-image",
1282 .last_sysupgrade_partition = "file-system",
1283 },
1284 /** Firmware layout for the Archer C6 v3 */
1285 {
1286 .id = "ARCHER-C6-V3",
1287 .vendor = "",
1288 .support_list =
1289 "SupportList:\n"
1290 "{product_name:Archer C6,product_ver:3.20,special_id:55530000}"
1291 "{product_name:Archer C6,product_ver:3.20,special_id:45550000}"
1292 "{product_name:Archer C6,product_ver:3.20,special_id:52550000}"
1293 "{product_name:Archer C6,product_ver:3.20,special_id:4A500000}"
1294 "{product_name:Archer C6,product_ver:3.20,special_id:4B520000}"
1295 "{product_name:Archer C6,product_ver:3.0.0,special_id:42520000}",
1296 .part_trail = 0x00,
1297 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.9\n"),
1298
1299 .partitions = {
1300 {"fs-uboot", 0x00000, 0x40000},
1301 {"firmware", 0x40000, 0xf60000},
1302 {"default-mac", 0xfa0000, 0x00200},
1303 {"pin", 0xfa0200, 0x00100},
1304 {"device-id", 0xfa0300, 0x00100},
1305 {"product-info", 0xfa0400, 0x0fc00},
1306 {"default-config", 0xfb0000, 0x08000},
1307 {"ap-def-config", 0xfb8000, 0x08000},
1308 {"user-config", 0xfc0000, 0x0a000},
1309 {"ag-config", 0xfca000, 0x04000},
1310 {"certificate", 0xfce000, 0x02000},
1311 {"ap-config", 0xfd0000, 0x06000},
1312 {"router-config", 0xfd6000, 0x06000},
1313 {"favicon", 0xfdc000, 0x02000},
1314 {"logo", 0xfde000, 0x02000},
1315 {"partition-table", 0xfe0000, 0x00800},
1316 {"soft-version", 0xfe0800, 0x00100},
1317 {"support-list", 0xfe0900, 0x00200},
1318 {"profile", 0xfe0b00, 0x03000},
1319 {"extra-para", 0xfe3b00, 0x00100},
1320 {"radio", 0xff0000, 0x10000},
1321 {NULL, 0, 0}
1322 },
1323 .first_sysupgrade_partition = "os-image",
1324 .last_sysupgrade_partition = "file-system",
1325 },
1326 /** Firmware layout for the Archer A6 v3 */
1327 {
1328 .id = "ARCHER-A6-V3",
1329 .vendor = "",
1330 .support_list =
1331 "SupportList:\n"
1332 "{product_name:Archer A6,product_ver:3.0.0,special_id:43410000}\n"
1333 "{product_name:Archer A6,product_ver:3.0.0,special_id:55530000}\n"
1334 "{product_name:Archer A6,product_ver:3.0.0,special_id:54570000}\n"
1335 "{product_name:Archer A6,product_ver:3.0.0,special_id:4A500000}\n"
1336 "{product_name:Archer A6,product_ver:3.20,special_id:45550000}\n"
1337 "{product_name:Archer A6,product_ver:3.20,special_id:52550000}\n",
1338 .part_trail = 0x00,
1339 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.5\n"),
1340
1341 .partitions = {
1342 {"fs-uboot", 0x00000, 0x40000},
1343 {"firmware", 0x40000, 0xf60000},
1344 {"default-mac", 0xfa0000, 0x00200},
1345 {"pin", 0xfa0200, 0x00100},
1346 {"device-id", 0xfa0300, 0x00100},
1347 {"product-info", 0xfa0400, 0x0fc00},
1348 {"default-config", 0xfb0000, 0x08000},
1349 {"ap-def-config", 0xfb8000, 0x08000},
1350 {"user-config", 0xfc0000, 0x0a000},
1351 {"ag-config", 0xfca000, 0x04000},
1352 {"certificate", 0xfce000, 0x02000},
1353 {"ap-config", 0xfd0000, 0x06000},
1354 {"router-config", 0xfd6000, 0x06000},
1355 {"favicon", 0xfdc000, 0x02000},
1356 {"logo", 0xfde000, 0x02000},
1357 {"partition-table", 0xfe0000, 0x00800},
1358 {"soft-version", 0xfe0800, 0x00100},
1359 {"support-list", 0xfe0900, 0x00200},
1360 {"profile", 0xfe0b00, 0x03000},
1361 {"extra-para", 0xfe3b00, 0x00100},
1362 {"radio", 0xff0000, 0x10000},
1363 {NULL, 0, 0}
1364 },
1365 .first_sysupgrade_partition = "os-image",
1366 .last_sysupgrade_partition = "file-system",
1367 },
1368 /** Firmware layout for the Archer C6U v1 */
1369 {
1370 .id = "ARCHER-C6U-V1",
1371 .vendor = "",
1372 .support_list =
1373 "SupportList:\n"
1374 "{product_name:Archer C6U,product_ver:1.0.0,special_id:45550000}\n"
1375 "{product_name:Archer C6U,product_ver:1.0.0,special_id:52550000}\n",
1376 .part_trail = 0x00,
1377 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.2\n"),
1378
1379 .partitions = {
1380 {"fs-uboot", 0x00000, 0x40000},
1381 {"firmware", 0x40000, 0xf60000},
1382 {"default-mac", 0xfa0000, 0x00200},
1383 {"pin", 0xfa0200, 0x00100},
1384 {"device-id", 0xfa0300, 0x00100},
1385 {"product-info", 0xfa0400, 0x0fc00},
1386 {"default-config", 0xfb0000, 0x08000},
1387 {"ap-def-config", 0xfb8000, 0x08000},
1388 {"user-config", 0xfc0000, 0x0c000},
1389 {"certificate", 0xfcc000, 0x04000},
1390 {"ap-config", 0xfd0000, 0x08000},
1391 {"router-config", 0xfd8000, 0x08000},
1392 {"partition-table", 0xfe0000, 0x00800},
1393 {"soft-version", 0xfe0800, 0x00100},
1394 {"support-list", 0xfe0900, 0x00200},
1395 {"profile", 0xfe0b00, 0x03000},
1396 {"extra-para", 0xfe3b00, 0x00100},
1397 {"radio", 0xff0000, 0x10000},
1398 {NULL, 0, 0}
1399 },
1400 .first_sysupgrade_partition = "os-image",
1401 .last_sysupgrade_partition = "file-system",
1402 },
1403 /** Firmware layout for the C60v1 */
1404 {
1405 .id = "ARCHER-C60-V1",
1406 .vendor = "",
1407 .support_list =
1408 "SupportList:\r\n"
1409 "{product_name:Archer C60,product_ver:1.0.0,special_id:00000000}\r\n"
1410 "{product_name:Archer C60,product_ver:1.0.0,special_id:43410000}\r\n"
1411 "{product_name:Archer C60,product_ver:1.0.0,special_id:45550000}\r\n"
1412 "{product_name:Archer C60,product_ver:1.0.0,special_id:55530000}\r\n",
1413 .part_trail = 0x00,
1414 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1415
1416 .partitions = {
1417 {"fs-uboot", 0x00000, 0x10000},
1418 {"default-mac", 0x10000, 0x00200},
1419 {"pin", 0x10200, 0x00200},
1420 {"product-info", 0x10400, 0x00100},
1421 {"partition-table", 0x10500, 0x00800},
1422 {"soft-version", 0x11300, 0x00200},
1423 {"support-list", 0x11500, 0x00100},
1424 {"device-id", 0x11600, 0x00100},
1425 {"profile", 0x11700, 0x03900},
1426 {"default-config", 0x15000, 0x04000},
1427 {"user-config", 0x19000, 0x04000},
1428 {"firmware", 0x20000, 0x7c8000},
1429 {"certyficate", 0x7e8000, 0x08000},
1430 {"radio", 0x7f0000, 0x10000},
1431 {NULL, 0, 0}
1432 },
1433
1434 .first_sysupgrade_partition = "os-image",
1435 .last_sysupgrade_partition = "file-system",
1436 },
1437
1438 /** Firmware layout for the C60v2 */
1439 {
1440 .id = "ARCHER-C60-V2",
1441 .vendor = "",
1442 .support_list =
1443 "SupportList:\r\n"
1444 "{product_name:Archer C60,product_ver:2.0.0,special_id:42520000}\r\n"
1445 "{product_name:Archer C60,product_ver:2.0.0,special_id:43410000}\r\n"
1446 "{product_name:Archer C60,product_ver:2.0.0,special_id:45550000}\r\n"
1447 "{product_name:Archer C60,product_ver:2.0.0,special_id:55530000}\r\n",
1448 .part_trail = 0x00,
1449 .soft_ver = SOFT_VER_TEXT("soft_ver:2.0.0\n"),
1450
1451 .partitions = {
1452 {"factory-boot", 0x00000, 0x1fb00},
1453 {"default-mac", 0x1fb00, 0x00200},
1454 {"pin", 0x1fd00, 0x00100},
1455 {"product-info", 0x1fe00, 0x00100},
1456 {"device-id", 0x1ff00, 0x00100},
1457 {"fs-uboot", 0x20000, 0x10000},
1458 {"firmware", 0x30000, 0x7a0000},
1459 {"soft-version", 0x7d9500, 0x00100},
1460 {"support-list", 0x7d9600, 0x00100},
1461 {"extra-para", 0x7d9700, 0x00100},
1462 {"profile", 0x7d9800, 0x03000},
1463 {"default-config", 0x7dc800, 0x03000},
1464 {"partition-table", 0x7df800, 0x00800},
1465 {"user-config", 0x7e0000, 0x0c000},
1466 {"certificate", 0x7ec000, 0x04000},
1467 {"radio", 0x7f0000, 0x10000},
1468 {NULL, 0, 0}
1469 },
1470
1471 .first_sysupgrade_partition = "os-image",
1472 .last_sysupgrade_partition = "file-system",
1473 },
1474
1475 /** Firmware layout for the C60v3 */
1476 {
1477 .id = "ARCHER-C60-V3",
1478 .vendor = "",
1479 .support_list =
1480 "SupportList:\r\n"
1481 "{product_name:Archer C60,product_ver:3.0.0,special_id:42520000}\r\n"
1482 "{product_name:Archer C60,product_ver:3.0.0,special_id:43410000}\r\n"
1483 "{product_name:Archer C60,product_ver:3.0.0,special_id:45550000}\r\n"
1484 "{product_name:Archer C60,product_ver:3.0.0,special_id:55530000}\r\n",
1485 .part_trail = 0x00,
1486 .soft_ver = SOFT_VER_TEXT("soft_ver:3.0.0\n"),
1487
1488 .partitions = {
1489 {"factory-boot", 0x00000, 0x1fb00},
1490 {"default-mac", 0x1fb00, 0x00200},
1491 {"pin", 0x1fd00, 0x00100},
1492 {"product-info", 0x1fe00, 0x00100},
1493 {"device-id", 0x1ff00, 0x00100},
1494 {"fs-uboot", 0x20000, 0x10000},
1495 {"firmware", 0x30000, 0x7a0000},
1496 {"soft-version", 0x7d9500, 0x00100},
1497 {"support-list", 0x7d9600, 0x00100},
1498 {"extra-para", 0x7d9700, 0x00100},
1499 {"profile", 0x7d9800, 0x03000},
1500 {"default-config", 0x7dc800, 0x03000},
1501 {"partition-table", 0x7df800, 0x00800},
1502 {"user-config", 0x7e0000, 0x0c000},
1503 {"certificate", 0x7ec000, 0x04000},
1504 {"radio", 0x7f0000, 0x10000},
1505 {NULL, 0, 0}
1506 },
1507
1508 .first_sysupgrade_partition = "os-image",
1509 .last_sysupgrade_partition = "file-system",
1510 },
1511
1512 /** Firmware layout for the C5 */
1513 {
1514 .id = "ARCHER-C5-V2",
1515 .vendor = "",
1516 .support_list =
1517 "SupportList:\r\n"
1518 "{product_name:ArcherC5,product_ver:2.0.0,special_id:00000000}\r\n"
1519 "{product_name:ArcherC5,product_ver:2.0.0,special_id:55530000}\r\n"
1520 "{product_name:ArcherC5,product_ver:2.0.0,special_id:4A500000}\r\n", /* JP version */
1521 .part_trail = 0x00,
1522 .soft_ver = SOFT_VER_DEFAULT,
1523
1524 .partitions = {
1525 {"fs-uboot", 0x00000, 0x40000},
1526 {"os-image", 0x40000, 0x200000},
1527 {"file-system", 0x240000, 0xc00000},
1528 {"default-mac", 0xe40000, 0x00200},
1529 {"pin", 0xe40200, 0x00200},
1530 {"product-info", 0xe40400, 0x00200},
1531 {"partition-table", 0xe50000, 0x10000},
1532 {"soft-version", 0xe60000, 0x00200},
1533 {"support-list", 0xe61000, 0x0f000},
1534 {"profile", 0xe70000, 0x10000},
1535 {"default-config", 0xe80000, 0x10000},
1536 {"user-config", 0xe90000, 0x50000},
1537 {"log", 0xee0000, 0x100000},
1538 {"radio_bk", 0xfe0000, 0x10000},
1539 {"radio", 0xff0000, 0x10000},
1540 {NULL, 0, 0}
1541 },
1542
1543 .first_sysupgrade_partition = "os-image",
1544 .last_sysupgrade_partition = "file-system"
1545 },
1546
1547 /** Firmware layout for the C7 */
1548 {
1549 .id = "ARCHER-C7-V4",
1550 .support_list =
1551 "SupportList:\n"
1552 "{product_name:Archer C7,product_ver:4.0.0,special_id:00000000}\n"
1553 "{product_name:Archer C7,product_ver:4.0.0,special_id:41550000}\n"
1554 "{product_name:Archer C7,product_ver:4.0.0,special_id:45550000}\n"
1555 "{product_name:Archer C7,product_ver:4.0.0,special_id:4B520000}\n"
1556 "{product_name:Archer C7,product_ver:4.0.0,special_id:42520000}\n"
1557 "{product_name:Archer C7,product_ver:4.0.0,special_id:4A500000}\n"
1558 "{product_name:Archer C7,product_ver:4.0.0,special_id:52550000}\n"
1559 "{product_name:Archer C7,product_ver:4.0.0,special_id:54570000}\n"
1560 "{product_name:Archer C7,product_ver:4.0.0,special_id:55530000}\n"
1561 "{product_name:Archer C7,product_ver:4.0.0,special_id:43410000}\n",
1562 .part_trail = 0x00,
1563 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1564
1565 /* We're using a dynamic kernel/rootfs split here */
1566 .partitions = {
1567 {"factory-boot", 0x00000, 0x20000},
1568 {"fs-uboot", 0x20000, 0x20000},
1569 {"firmware", 0x40000, 0xEC0000}, /* Stock: name os-image base 0x40000 size 0x120000 */
1570 /* Stock: name file-system base 0x160000 size 0xda0000 */
1571 {"default-mac", 0xf00000, 0x00200},
1572 {"pin", 0xf00200, 0x00200},
1573 {"device-id", 0xf00400, 0x00100},
1574 {"product-info", 0xf00500, 0x0fb00},
1575 {"soft-version", 0xf10000, 0x00100},
1576 {"extra-para", 0xf11000, 0x01000},
1577 {"support-list", 0xf12000, 0x0a000},
1578 {"profile", 0xf1c000, 0x04000},
1579 {"default-config", 0xf20000, 0x10000},
1580 {"user-config", 0xf30000, 0x40000},
1581 {"qos-db", 0xf70000, 0x40000},
1582 {"certificate", 0xfb0000, 0x10000},
1583 {"partition-table", 0xfc0000, 0x10000},
1584 {"log", 0xfd0000, 0x20000},
1585 {"radio", 0xff0000, 0x10000},
1586 {NULL, 0, 0}
1587 },
1588
1589 .first_sysupgrade_partition = "os-image",
1590 .last_sysupgrade_partition = "file-system",
1591 },
1592
1593 /** Firmware layout for the C7 v5*/
1594 {
1595 .id = "ARCHER-C7-V5",
1596 .support_list =
1597 "SupportList:\n"
1598 "{product_name:Archer C7,product_ver:5.0.0,special_id:00000000}\n"
1599 "{product_name:Archer C7,product_ver:5.0.0,special_id:45550000}\n"
1600 "{product_name:Archer C7,product_ver:5.0.0,special_id:55530000}\n"
1601 "{product_name:Archer C7,product_ver:5.0.0,special_id:43410000}\n"
1602 "{product_name:Archer C7,product_ver:5.0.0,special_id:4A500000}\n"
1603 "{product_name:Archer C7,product_ver:5.0.0,special_id:54570000}\n"
1604 "{product_name:Archer C7,product_ver:5.0.0,special_id:52550000}\n"
1605 "{product_name:Archer C7,product_ver:5.0.0,special_id:4B520000}\n",
1606
1607 .part_trail = 0x00,
1608 .soft_ver = SOFT_VER_TEXT("soft_ver:7.0.0\n"),
1609
1610 /* We're using a dynamic kernel/rootfs split here */
1611 .partitions = {
1612 {"factory-boot", 0x00000, 0x20000},
1613 {"fs-uboot", 0x20000, 0x20000},
1614 {"partition-table", 0x40000, 0x10000},
1615 {"radio", 0x50000, 0x10000},
1616 {"default-mac", 0x60000, 0x00200},
1617 {"pin", 0x60200, 0x00200},
1618 {"device-id", 0x60400, 0x00100},
1619 {"product-info", 0x60500, 0x0fb00},
1620 {"soft-version", 0x70000, 0x01000},
1621 {"extra-para", 0x71000, 0x01000},
1622 {"support-list", 0x72000, 0x0a000},
1623 {"profile", 0x7c000, 0x04000},
1624 {"user-config", 0x80000, 0x40000},
1625
1626
1627 {"firmware", 0xc0000, 0xf00000}, /* Stock: name os-image base 0xc0000 size 0x120000 */
1628 /* Stock: name file-system base 0x1e0000 size 0xde0000 */
1629
1630 {"log", 0xfc0000, 0x20000},
1631 {"certificate", 0xfe0000, 0x10000},
1632 {"default-config", 0xff0000, 0x10000},
1633 {NULL, 0, 0}
1634
1635 },
1636
1637 .first_sysupgrade_partition = "os-image",
1638 .last_sysupgrade_partition = "file-system",
1639 },
1640
1641 /** Firmware layout for the C9 */
1642 {
1643 .id = "ARCHERC9",
1644 .vendor = "",
1645 .support_list =
1646 "SupportList:\n"
1647 "{product_name:ArcherC9,"
1648 "product_ver:1.0.0,"
1649 "special_id:00000000}\n",
1650 .part_trail = 0x00,
1651 .soft_ver = SOFT_VER_DEFAULT,
1652
1653 .partitions = {
1654 {"fs-uboot", 0x00000, 0x40000},
1655 {"os-image", 0x40000, 0x200000},
1656 {"file-system", 0x240000, 0xc00000},
1657 {"default-mac", 0xe40000, 0x00200},
1658 {"pin", 0xe40200, 0x00200},
1659 {"product-info", 0xe40400, 0x00200},
1660 {"partition-table", 0xe50000, 0x10000},
1661 {"soft-version", 0xe60000, 0x00200},
1662 {"support-list", 0xe61000, 0x0f000},
1663 {"profile", 0xe70000, 0x10000},
1664 {"default-config", 0xe80000, 0x10000},
1665 {"user-config", 0xe90000, 0x50000},
1666 {"log", 0xee0000, 0x100000},
1667 {"radio_bk", 0xfe0000, 0x10000},
1668 {"radio", 0xff0000, 0x10000},
1669 {NULL, 0, 0}
1670 },
1671
1672 .first_sysupgrade_partition = "os-image",
1673 .last_sysupgrade_partition = "file-system"
1674 },
1675
1676 /** Firmware layout for the Deco M4R v1 and v2 */
1677 {
1678 .id = "DECO-M4R-V1",
1679 .vendor = "",
1680 .support_list =
1681 "SupportList:\n"
1682 "{product_name:M4R,product_ver:1.0.0,special_id:55530000}\n"
1683 "{product_name:M4R,product_ver:1.0.0,special_id:45550000}\n"
1684 "{product_name:M4R,product_ver:1.0.0,special_id:43410000}\n"
1685 "{product_name:M4R,product_ver:1.0.0,special_id:4A500000}\n"
1686 "{product_name:M4R,product_ver:1.0.0,special_id:41550000}\n"
1687 "{product_name:M4R,product_ver:1.0.0,special_id:4B520000}\n"
1688 "{product_name:M4R,product_ver:1.0.0,special_id:49440000}\n"
1689 "{product_name:M4R,product_ver:2.0.0,special_id:55530000}\n"
1690 "{product_name:M4R,product_ver:2.0.0,special_id:45550000}\n"
1691 "{product_name:M4R,product_ver:2.0.0,special_id:43410000}\n"
1692 "{product_name:M4R,product_ver:2.0.0,special_id:4A500000}\n"
1693 "{product_name:M4R,product_ver:2.0.0,special_id:41550000}\n"
1694 "{product_name:M4R,product_ver:2.0.0,special_id:4B520000}\n"
1695 "{product_name:M4R,product_ver:2.0.0,special_id:54570000}\n"
1696 "{product_name:M4R,product_ver:2.0.0,special_id:42340000}\n"
1697 "{product_name:M4R,product_ver:2.0.0,special_id:49440000}\n",
1698 .part_trail = 0x00,
1699 .soft_ver = SOFT_VER_DEFAULT,
1700
1701 .partitions = {
1702 {"fs-uboot", 0x00000, 0x80000},
1703 {"firmware", 0x80000, 0xe00000},
1704 {"product-info", 0xe80000, 0x05000},
1705 {"default-mac", 0xe85000, 0x01000},
1706 {"device-id", 0xe86000, 0x01000},
1707 {"support-list", 0xe87000, 0x10000},
1708 {"user-config", 0xea7000, 0x10000},
1709 {"device-config", 0xeb7000, 0x10000},
1710 {"group-info", 0xec7000, 0x10000},
1711 {"partition-table", 0xed7000, 0x02000},
1712 {"soft-version", 0xed9000, 0x10000},
1713 {"profile", 0xee9000, 0x10000},
1714 {"default-config", 0xef9000, 0x10000},
1715 {"url-sig", 0xfe0000, 0x10000},
1716 {"radio", 0xff0000, 0x10000},
1717 {NULL, 0, 0}
1718 },
1719 .first_sysupgrade_partition = "os-image",
1720 .last_sysupgrade_partition = "file-system",
1721 },
1722
1723 /** Firmware layout for the Deco M4R v4 */
1724 {
1725 .id = "DECO-M4R-V4",
1726 .vendor = "",
1727 .support_list =
1728 "SupportList:\n"
1729 "{product_name:M4R,product_ver:4.0.0,special_id:55530000}\n"
1730 "{product_name:M4R,product_ver:4.0.0,special_id:45550000}\n"
1731 "{product_name:M4R,product_ver:4.0.0,special_id:4A500000}\n"
1732 "{product_name:M4R,product_ver:4.0.0,special_id:42340000}\n"
1733 "{product_name:M4R,product_ver:4.0.0,special_id:5A470000}\n",
1734 .part_trail = 0x00,
1735 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
1736
1737 .partitions = {
1738 {"fs-uboot", 0x00000, 0x40000},
1739 {"firmware", 0x40000, 0xf60000},
1740 {"default-mac", 0xfa0000, 0x00300},
1741 {"device-id", 0xfa0300, 0x00100},
1742 {"product-info", 0xfa0400, 0x0fc00},
1743 {"group-info", 0xfb0000, 0x04000},
1744 {"user-config", 0xfb4000, 0x0c000},
1745 {"device-config", 0xfc0000, 0x10000},
1746 {"default-config", 0xfd0000, 0x10000},
1747 {"partition-table", 0xfe0000, 0x00800},
1748 {"soft-version", 0xfe0800, 0x00100},
1749 {"support-list", 0xfe0900, 0x00200},
1750 {"profile", 0xfe0b00, 0x03000},
1751 {"extra-para", 0xfe3b00, 0x00100},
1752 {"radio", 0xff0000, 0x10000},
1753 {NULL, 0, 0}
1754 },
1755 .first_sysupgrade_partition = "os-image",
1756 .last_sysupgrade_partition = "file-system",
1757 },
1758
1759 /** Firmware layout for the Deco S4 v2 */
1760 {
1761 .id = "DECO-S4-V2",
1762 .vendor = "",
1763 .support_list =
1764 "SupportList:\n"
1765 "{product_name:S4,product_ver:1.0.0,special_id:55530000}\n"
1766 "{product_name:S4,product_ver:1.0.0,special_id:45550000}\n"
1767 "{product_name:S4,product_ver:1.0.0,special_id:43410000}\n"
1768 "{product_name:S4,product_ver:1.0.0,special_id:4A500000}\n"
1769 "{product_name:S4,product_ver:1.0.0,special_id:41550000}\n"
1770 "{product_name:S4,product_ver:1.0.0,special_id:4B520000}\n"
1771 "{product_name:S4,product_ver:2.0.0,special_id:55530000}\n"
1772 "{product_name:S4,product_ver:2.0.0,special_id:45550000}\n"
1773 "{product_name:S4,product_ver:2.0.0,special_id:43410000}\n"
1774 "{product_name:S4,product_ver:2.0.0,special_id:4A500000}\n"
1775 "{product_name:S4,product_ver:2.0.0,special_id:41550000}\n"
1776 "{product_name:S4,product_ver:2.0.0,special_id:4B520000}\n",
1777 .part_trail = 0x00,
1778 .soft_ver = SOFT_VER_DEFAULT,
1779
1780 .partitions = {
1781 {"fs-uboot", 0x00000, 0x80000},
1782 {"product-info", 0x80000, 0x05000},
1783 {"default-mac", 0x85000, 0x01000},
1784 {"device-id", 0x86000, 0x01000},
1785 {"support-list", 0x87000, 0x10000},
1786 {"user-config", 0xa7000, 0x10000},
1787 {"device-config", 0xb7000, 0x10000},
1788 {"group-info", 0xc7000, 0x10000},
1789 {"partition-table", 0xd7000, 0x02000},
1790 {"soft-version", 0xd9000, 0x10000},
1791 {"profile", 0xe9000, 0x10000},
1792 {"default-config", 0xf9000, 0x10000},
1793 {"url-sig", 0x1e0000, 0x10000},
1794 {"radio", 0x1f0000, 0x10000},
1795 {"firmware", 0x200000, 0xe00000},
1796 {NULL, 0, 0}
1797 },
1798 .first_sysupgrade_partition = "os-image",
1799 .last_sysupgrade_partition = "file-system",
1800 },
1801
1802 /** Firmware layout for the EAP120 */
1803 {
1804 .id = "EAP120",
1805 .vendor = "EAP120(TP-LINK|UN|N300-2):1.0\r\n",
1806 .support_list =
1807 "SupportList:\r\n"
1808 "EAP120(TP-LINK|UN|N300-2):1.0\r\n",
1809 .part_trail = 0xff,
1810 .soft_ver = SOFT_VER_DEFAULT,
1811
1812 .partitions = {
1813 {"fs-uboot", 0x00000, 0x20000},
1814 {"partition-table", 0x20000, 0x02000},
1815 {"default-mac", 0x30000, 0x00020},
1816 {"support-list", 0x31000, 0x00100},
1817 {"product-info", 0x31100, 0x00100},
1818 {"soft-version", 0x32000, 0x00100},
1819 {"os-image", 0x40000, 0x180000},
1820 {"file-system", 0x1c0000, 0x600000},
1821 {"user-config", 0x7c0000, 0x10000},
1822 {"backup-config", 0x7d0000, 0x10000},
1823 {"log", 0x7e0000, 0x10000},
1824 {"radio", 0x7f0000, 0x10000},
1825 {NULL, 0, 0}
1826 },
1827
1828 .first_sysupgrade_partition = "os-image",
1829 .last_sysupgrade_partition = "file-system"
1830 },
1831
1832 /** Firmware layout for the EAP225-Outdoor v1 */
1833 {
1834 .id = "EAP225-OUTDOOR-V1",
1835 .support_list =
1836 "SupportList:\r\n"
1837 "EAP225-Outdoor(TP-Link|UN|AC1200-D):1.0\r\n",
1838 .part_trail = PART_TRAIL_NONE,
1839 .soft_ver = SOFT_VER_DEFAULT,
1840 .soft_ver_compat_level = 1,
1841
1842 .partitions = {
1843 {"fs-uboot", 0x00000, 0x20000},
1844 {"partition-table", 0x20000, 0x02000},
1845 {"default-mac", 0x30000, 0x01000},
1846 {"support-list", 0x31000, 0x00100},
1847 {"product-info", 0x31100, 0x00400},
1848 {"soft-version", 0x32000, 0x00100},
1849 {"firmware", 0x40000, 0xd80000},
1850 {"user-config", 0xdc0000, 0x30000},
1851 {"mutil-log", 0xf30000, 0x80000},
1852 {"oops", 0xfb0000, 0x40000},
1853 {"radio", 0xff0000, 0x10000},
1854 {NULL, 0, 0}
1855 },
1856
1857 .first_sysupgrade_partition = "os-image",
1858 .last_sysupgrade_partition = "file-system"
1859 },
1860
1861 /** Firmware layout for the EAP225 v1 */
1862 {
1863 .id = "EAP225-V1",
1864 .support_list =
1865 "SupportList:\r\n"
1866 "EAP225(TP-LINK|UN|AC1200-D):1.0\r\n",
1867 .part_trail = PART_TRAIL_NONE,
1868 .soft_ver = SOFT_VER_DEFAULT,
1869
1870 .partitions = {
1871 {"fs-uboot", 0x00000, 0x20000},
1872 {"partition-table", 0x20000, 0x02000},
1873 {"default-mac", 0x30000, 0x01000},
1874 {"support-list", 0x31000, 0x00100},
1875 {"product-info", 0x31100, 0x00400},
1876 {"soft-version", 0x32000, 0x00100},
1877 {"firmware", 0x40000, 0xd80000},
1878 {"user-config", 0xdc0000, 0x30000},
1879 {"radio", 0xff0000, 0x10000},
1880 {NULL, 0, 0}
1881 },
1882
1883 .first_sysupgrade_partition = "os-image",
1884 .last_sysupgrade_partition = "file-system"
1885 },
1886
1887 /** Firmware layout for the EAP225 v3
1888 * Also compatible with:
1889 * - EAP225 v3.20
1890 * - EAP225 v4
1891 * - EAP225-Outdoor v1
1892 * - EAP225-Outdoor v3
1893 * */
1894 {
1895 .id = "EAP225-V3",
1896 .support_list =
1897 "SupportList:\r\n"
1898 "EAP225(TP-Link|UN|AC1350-D):3.0\r\n"
1899 "EAP225(TP-Link|UN|AC1350-D):3.20\r\n"
1900 "EAP225(TP-Link|UN|AC1350-D):4.0 CA\r\n"
1901 "EAP225-Outdoor(TP-Link|UN|AC1200-D):1.0\r\n"
1902 "EAP225-Outdoor(TP-Link|UN|AC1200-D):3.0 CA,JP\r\n",
1903 .part_trail = PART_TRAIL_NONE,
1904 .soft_ver = SOFT_VER_DEFAULT,
1905 .soft_ver_compat_level = 1,
1906
1907 .partitions = {
1908 {"fs-uboot", 0x00000, 0x20000},
1909 {"partition-table", 0x20000, 0x02000},
1910 {"default-mac", 0x30000, 0x01000},
1911 {"support-list", 0x31000, 0x00100},
1912 {"product-info", 0x31100, 0x00400},
1913 {"soft-version", 0x32000, 0x00100},
1914 {"firmware", 0x40000, 0xd80000},
1915 {"user-config", 0xdc0000, 0x30000},
1916 {"mutil-log", 0xf30000, 0x80000},
1917 {"oops", 0xfb0000, 0x40000},
1918 {"radio", 0xff0000, 0x10000},
1919 {NULL, 0, 0}
1920 },
1921
1922 .first_sysupgrade_partition = "os-image",
1923 .last_sysupgrade_partition = "file-system"
1924 },
1925
1926 /** Firmware layout for the EAP225-Wall v2 */
1927 {
1928 .id = "EAP225-WALL-V2",
1929 .support_list =
1930 "SupportList:\r\n"
1931 "EAP225-Wall(TP-Link|UN|AC1200-D):2.0\r\n",
1932 .part_trail = PART_TRAIL_NONE,
1933 .soft_ver = SOFT_VER_DEFAULT,
1934 .soft_ver_compat_level = 1,
1935
1936 .partitions = {
1937 {"fs-uboot", 0x00000, 0x20000},
1938 {"partition-table", 0x20000, 0x02000},
1939 {"default-mac", 0x30000, 0x01000},
1940 {"support-list", 0x31000, 0x00100},
1941 {"product-info", 0x31100, 0x00400},
1942 {"soft-version", 0x32000, 0x00100},
1943 {"firmware", 0x40000, 0xd80000},
1944 {"user-config", 0xdc0000, 0x30000},
1945 {"mutil-log", 0xf30000, 0x80000},
1946 {"oops", 0xfb0000, 0x40000},
1947 {"radio", 0xff0000, 0x10000},
1948 {NULL, 0, 0}
1949 },
1950
1951 .first_sysupgrade_partition = "os-image",
1952 .last_sysupgrade_partition = "file-system"
1953 },
1954
1955 /** Firmware layout for the EAP235-Wall v1 */
1956 {
1957 .id = "EAP235-WALL-V1",
1958 .support_list =
1959 "SupportList:\r\n"
1960 "EAP235-Wall(TP-Link|UN|AC1200-D):1.0\r\n",
1961 .part_trail = PART_TRAIL_NONE,
1962 .soft_ver = SOFT_VER_NUMERIC(3, 0, 0),
1963 .soft_ver_compat_level = 1,
1964
1965 .partitions = {
1966 {"fs-uboot", 0x00000, 0x80000},
1967 {"partition-table", 0x80000, 0x02000},
1968 {"default-mac", 0x90000, 0x01000},
1969 {"support-list", 0x91000, 0x00100},
1970 {"product-info", 0x91100, 0x00400},
1971 {"soft-version", 0x92000, 0x00100},
1972 {"firmware", 0xa0000, 0xd20000},
1973 {"user-config", 0xdc0000, 0x30000},
1974 {"mutil-log", 0xf30000, 0x80000},
1975 {"oops", 0xfb0000, 0x40000},
1976 {"radio", 0xff0000, 0x10000},
1977 {NULL, 0, 0}
1978 },
1979
1980 .first_sysupgrade_partition = "os-image",
1981 .last_sysupgrade_partition = "file-system"
1982 },
1983
1984 /** Firmware layout for the EAP245 v1 */
1985 {
1986 .id = "EAP245-V1",
1987 .support_list =
1988 "SupportList:\r\n"
1989 "EAP245(TP-LINK|UN|AC1750-D):1.0\r\n",
1990 .part_trail = PART_TRAIL_NONE,
1991 .soft_ver = SOFT_VER_DEFAULT,
1992
1993 .partitions = {
1994 {"fs-uboot", 0x00000, 0x20000},
1995 {"partition-table", 0x20000, 0x02000},
1996 {"default-mac", 0x30000, 0x01000},
1997 {"support-list", 0x31000, 0x00100},
1998 {"product-info", 0x31100, 0x00400},
1999 {"soft-version", 0x32000, 0x00100},
2000 {"firmware", 0x40000, 0xd80000},
2001 {"user-config", 0xdc0000, 0x30000},
2002 {"radio", 0xff0000, 0x10000},
2003 {NULL, 0, 0}
2004 },
2005
2006 .first_sysupgrade_partition = "os-image",
2007 .last_sysupgrade_partition = "file-system"
2008 },
2009
2010 /** Firmware layout for the EAP245 v3 */
2011 {
2012 .id = "EAP245-V3",
2013 .support_list =
2014 "SupportList:\r\n"
2015 "EAP245(TP-Link|UN|AC1750-D):3.0\r\n"
2016 "EAP265 HD(TP-Link|UN|AC1750-D):1.0",
2017 .part_trail = PART_TRAIL_NONE,
2018 .soft_ver = SOFT_VER_DEFAULT,
2019 .soft_ver_compat_level = 1,
2020
2021 /** Firmware partition with dynamic kernel/rootfs split */
2022 .partitions = {
2023 {"factroy-boot", 0x00000, 0x40000},
2024 {"fs-uboot", 0x40000, 0x40000},
2025 {"partition-table", 0x80000, 0x10000},
2026 {"default-mac", 0x90000, 0x01000},
2027 {"support-list", 0x91000, 0x00100},
2028 {"product-info", 0x91100, 0x00400},
2029 {"soft-version", 0x92000, 0x00100},
2030 {"radio", 0xa0000, 0x10000},
2031 {"extra-para", 0xb0000, 0x10000},
2032 {"firmware", 0xc0000, 0xe40000},
2033 {"config", 0xf00000, 0x30000},
2034 {"mutil-log", 0xf30000, 0x80000},
2035 {"oops", 0xfb0000, 0x40000},
2036 {NULL, 0, 0}
2037 },
2038
2039 .first_sysupgrade_partition = "os-image",
2040 .last_sysupgrade_partition = "file-system"
2041 },
2042
2043 /** Firmware layout for the EAP615-Wall v1 */
2044 {
2045 .id = "EAP615-WALL-V1",
2046 .soft_ver = SOFT_VER_DEFAULT,
2047 .soft_ver_compat_level = 1,
2048 .support_list =
2049 "SupportList:\r\n"
2050 "EAP615-Wall(TP-Link|UN|AX1800-D):1.0\r\n"
2051 "EAP615-Wall(TP-Link|CA|AX1800-D):1.0\r\n"
2052 "EAP615-Wall(TP-Link|JP|AX1800-D):1.0\r\n",
2053 .part_trail = PART_TRAIL_NONE,
2054
2055 .partitions = {
2056 {"fs-uboot", 0x00000, 0x80000},
2057 {"partition-table", 0x80000, 0x02000},
2058 {"default-mac", 0x90000, 0x01000},
2059 {"support-list", 0x91000, 0x00100},
2060 {"product-info", 0x91100, 0x00400},
2061 {"soft-version", 0x92000, 0x00100},
2062 {"firmware", 0xa0000, 0xcf0000},
2063 {"user-config", 0xd90000, 0x60000},
2064 {"mutil-log", 0xf30000, 0x80000},
2065 {"oops", 0xfb0000, 0x40000},
2066 {"radio", 0xff0000, 0x10000},
2067 {NULL, 0, 0}
2068 },
2069
2070 .first_sysupgrade_partition = "os-image",
2071 .last_sysupgrade_partition = "file-system"
2072 },
2073
2074 /** Firmware layout for the TL-WA1201 v2 */
2075 {
2076 .id = "TL-WA1201-V2",
2077 .vendor = "",
2078 .support_list =
2079 "SupportList:\n"
2080 "{product_name:TL-WA1201,product_ver:2.0.0,special_id:45550000}\n"
2081 "{product_name:TL-WA1201,product_ver:2.0.0,special_id:55530000}\n",
2082 .part_trail = 0x00,
2083 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.1 Build 20200709 rel.66244\n"),
2084
2085 .partitions = {
2086 {"fs-uboot", 0x00000, 0x20000},
2087 {"default-mac", 0x20000, 0x00200},
2088 {"pin", 0x20200, 0x00100},
2089 {"product-info", 0x20300, 0x00200},
2090 {"device-id", 0x20500, 0x0fb00},
2091 {"firmware", 0x30000, 0xce0000},
2092 {"portal-logo", 0xd10000, 0x20000},
2093 {"portal-back", 0xd30000, 0x200000},
2094 {"soft-version", 0xf30000, 0x00200},
2095 {"extra-para", 0xf30200, 0x00200},
2096 {"support-list", 0xf30400, 0x00200},
2097 {"profile", 0xf30600, 0x0fa00},
2098 {"apdef-config", 0xf40000, 0x10000},
2099 {"ap-config", 0xf50000, 0x10000},
2100 {"redef-config", 0xf60000, 0x10000},
2101 {"re-config", 0xf70000, 0x10000},
2102 {"multidef-config", 0xf80000, 0x10000},
2103 {"multi-config", 0xf90000, 0x10000},
2104 {"clientdef-config", 0xfa0000, 0x10000},
2105 {"client-config", 0xfb0000, 0x10000},
2106 {"partition-table", 0xfc0000, 0x10000},
2107 {"user-config", 0xfd0000, 0x10000},
2108 {"certificate", 0xfe0000, 0x10000},
2109 {"radio", 0xff0000, 0x10000},
2110 {NULL, 0, 0}
2111 },
2112 .first_sysupgrade_partition = "os-image",
2113 .last_sysupgrade_partition = "file-system",
2114 },
2115
2116 /** Firmware layout for the TL-WA850RE v2 */
2117 {
2118 .id = "TLWA850REV2",
2119 .vendor = "",
2120 .support_list =
2121 "SupportList:\n"
2122 "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:55530000}\n"
2123 "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:00000000}\n"
2124 "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:55534100}\n"
2125 "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:45550000}\n"
2126 "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:4B520000}\n"
2127 "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:42520000}\n"
2128 "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:4A500000}\n"
2129 "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:43410000}\n"
2130 "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:41550000}\n"
2131 "{product_name:TL-WA850RE,product_ver:2.0.0,special_id:52550000}\n",
2132 .part_trail = 0x00,
2133 .soft_ver = SOFT_VER_DEFAULT,
2134
2135 /**
2136 576KB were moved from file-system to os-image
2137 in comparison to the stock image
2138 */
2139 .partitions = {
2140 {"fs-uboot", 0x00000, 0x20000},
2141 {"firmware", 0x20000, 0x390000},
2142 {"partition-table", 0x3b0000, 0x02000},
2143 {"default-mac", 0x3c0000, 0x00020},
2144 {"pin", 0x3c0100, 0x00020},
2145 {"product-info", 0x3c1000, 0x01000},
2146 {"soft-version", 0x3c2000, 0x00100},
2147 {"support-list", 0x3c3000, 0x01000},
2148 {"profile", 0x3c4000, 0x08000},
2149 {"user-config", 0x3d0000, 0x10000},
2150 {"default-config", 0x3e0000, 0x10000},
2151 {"radio", 0x3f0000, 0x10000},
2152 {NULL, 0, 0}
2153 },
2154
2155 .first_sysupgrade_partition = "os-image",
2156 .last_sysupgrade_partition = "file-system"
2157 },
2158
2159 /** Firmware layout for the TL-WA855RE v1 */
2160 {
2161 .id = "TLWA855REV1",
2162 .vendor = "",
2163 .support_list =
2164 "SupportList:\n"
2165 "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:00000000}\n"
2166 "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:55530000}\n"
2167 "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:45550000}\n"
2168 "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:4B520000}\n"
2169 "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:42520000}\n"
2170 "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:4A500000}\n"
2171 "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:43410000}\n"
2172 "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:41550000}\n"
2173 "{product_name:TL-WA855RE,product_ver:1.0.0,special_id:52550000}\n",
2174 .part_trail = 0x00,
2175 .soft_ver = SOFT_VER_DEFAULT,
2176
2177 .partitions = {
2178 {"fs-uboot", 0x00000, 0x20000},
2179 {"os-image", 0x20000, 0x150000},
2180 {"file-system", 0x170000, 0x240000},
2181 {"partition-table", 0x3b0000, 0x02000},
2182 {"default-mac", 0x3c0000, 0x00020},
2183 {"pin", 0x3c0100, 0x00020},
2184 {"product-info", 0x3c1000, 0x01000},
2185 {"soft-version", 0x3c2000, 0x00100},
2186 {"support-list", 0x3c3000, 0x01000},
2187 {"profile", 0x3c4000, 0x08000},
2188 {"user-config", 0x3d0000, 0x10000},
2189 {"default-config", 0x3e0000, 0x10000},
2190 {"radio", 0x3f0000, 0x10000},
2191 {NULL, 0, 0}
2192 },
2193
2194 .first_sysupgrade_partition = "os-image",
2195 .last_sysupgrade_partition = "file-system"
2196 },
2197
2198 /** Firmware layout for the TL-WPA8630P v2 (EU)*/
2199 {
2200 .id = "TL-WPA8630P-V2.0-EU",
2201 .vendor = "",
2202 .support_list =
2203 "SupportList:\n"
2204 "{product_name:TL-WPA8630P,product_ver:2.0.0,special_id:45550000}\n",
2205 .part_trail = 0x00,
2206 .soft_ver = SOFT_VER_DEFAULT,
2207
2208 .partitions = {
2209 {"factory-uboot", 0x00000, 0x20000},
2210 {"fs-uboot", 0x20000, 0x20000},
2211 {"firmware", 0x40000, 0x5e0000},
2212 {"partition-table", 0x620000, 0x02000},
2213 {"default-mac", 0x630000, 0x00020},
2214 {"pin", 0x630100, 0x00020},
2215 {"device-id", 0x630200, 0x00030},
2216 {"product-info", 0x631100, 0x01000},
2217 {"extra-para", 0x632100, 0x01000},
2218 {"soft-version", 0x640000, 0x01000},
2219 {"support-list", 0x641000, 0x01000},
2220 {"profile", 0x642000, 0x08000},
2221 {"user-config", 0x650000, 0x10000},
2222 {"default-config", 0x660000, 0x10000},
2223 {"default-nvm", 0x670000, 0xc0000},
2224 {"default-pib", 0x730000, 0x40000},
2225 {"radio", 0x7f0000, 0x10000},
2226 {NULL, 0, 0}
2227 },
2228
2229 .first_sysupgrade_partition = "os-image",
2230 .last_sysupgrade_partition = "file-system"
2231 },
2232
2233 /** Firmware layout for the TL-WPA8630P v2 (INT)*/
2234 {
2235 .id = "TL-WPA8630P-V2-INT",
2236 .vendor = "",
2237 .support_list =
2238 "SupportList:\n"
2239 "{product_name:TL-WPA8630P,product_ver:2.0.0,special_id:41550000}\n"
2240 "{product_name:TL-WPA8630P,product_ver:2.0.0,special_id:44450000}\n"
2241 "{product_name:TL-WPA8630P,product_ver:2.1.0,special_id:41550000}\n",
2242 .part_trail = 0x00,
2243 .soft_ver = SOFT_VER_DEFAULT,
2244
2245 .partitions = {
2246 {"factory-uboot", 0x00000, 0x20000},
2247 {"fs-uboot", 0x20000, 0x20000},
2248 {"firmware", 0x40000, 0x5e0000},
2249 {"partition-table", 0x620000, 0x02000},
2250 {"extra-para", 0x632100, 0x01000},
2251 {"soft-version", 0x640000, 0x01000},
2252 {"support-list", 0x641000, 0x01000},
2253 {"profile", 0x642000, 0x08000},
2254 {"user-config", 0x650000, 0x10000},
2255 {"default-config", 0x660000, 0x10000},
2256 {"default-nvm", 0x670000, 0xc0000},
2257 {"default-pib", 0x730000, 0x40000},
2258 {"default-mac", 0x7e0000, 0x00020},
2259 {"pin", 0x7e0100, 0x00020},
2260 {"device-id", 0x7e0200, 0x00030},
2261 {"product-info", 0x7e1100, 0x01000},
2262 {"radio", 0x7f0000, 0x10000},
2263 {NULL, 0, 0}
2264 },
2265
2266 .first_sysupgrade_partition = "os-image",
2267 .last_sysupgrade_partition = "file-system"
2268 },
2269
2270 /** Firmware layout for the TL-WPA8630P v2.1 (EU)*/
2271 {
2272 .id = "TL-WPA8630P-V2.1-EU",
2273 .vendor = "",
2274 .support_list =
2275 "SupportList:\n"
2276 "{product_name:TL-WPA8630P,product_ver:2.1.0,special_id:45550000}\n",
2277 .part_trail = 0x00,
2278 .soft_ver = SOFT_VER_DEFAULT,
2279
2280 .partitions = {
2281 {"factory-uboot", 0x00000, 0x20000},
2282 {"fs-uboot", 0x20000, 0x20000},
2283 {"firmware", 0x40000, 0x5e0000},
2284 {"extra-para", 0x680000, 0x01000},
2285 {"product-info", 0x690000, 0x01000},
2286 {"partition-table", 0x6a0000, 0x02000},
2287 {"soft-version", 0x6b0000, 0x01000},
2288 {"support-list", 0x6b1000, 0x01000},
2289 {"profile", 0x6b2000, 0x08000},
2290 {"user-config", 0x6c0000, 0x10000},
2291 {"default-config", 0x6d0000, 0x10000},
2292 {"default-nvm", 0x6e0000, 0xc0000},
2293 {"default-pib", 0x7a0000, 0x40000},
2294 {"default-mac", 0x7e0000, 0x00020},
2295 {"pin", 0x7e0100, 0x00020},
2296 {"device-id", 0x7e0200, 0x00030},
2297 {"radio", 0x7f0000, 0x10000},
2298 {NULL, 0, 0}
2299 },
2300
2301 .first_sysupgrade_partition = "os-image",
2302 .last_sysupgrade_partition = "file-system"
2303 },
2304
2305 /** Firmware layout for the TL-WPA8631P v3 */
2306 {
2307 .id = "TL-WPA8631P-V3",
2308 .vendor = "",
2309 .support_list =
2310 "SupportList:\n"
2311 "{product_name:TL-WPA8631P,product_ver:3.0.0,special_id:41550000}\n"
2312 "{product_name:TL-WPA8631P,product_ver:3.0.0,special_id:45550000}\n"
2313 "{product_name:TL-WPA8631P,product_ver:3.0.0,special_id:55530000}\n"
2314 "{product_name:TL-WPA8631P,product_ver:4.0.0,special_id:45550000}\n"
2315 "{product_name:TL-WPA8635P,product_ver:3.0.0,special_id:46520000}\n",
2316 .part_trail = 0x00,
2317 .soft_ver = SOFT_VER_DEFAULT,
2318
2319 .partitions = {
2320 {"fs-uboot", 0x00000, 0x20000},
2321 {"firmware", 0x20000, 0x710000},
2322 {"partition-table", 0x730000, 0x02000},
2323 {"default-mac", 0x732000, 0x00020},
2324 {"pin", 0x732100, 0x00020},
2325 {"device-id", 0x732200, 0x00030},
2326 {"default-region", 0x732300, 0x00010},
2327 {"product-info", 0x732400, 0x00200},
2328 {"extra-para", 0x732600, 0x00200},
2329 {"soft-version", 0x732800, 0x00100},
2330 {"support-list", 0x732900, 0x00200},
2331 {"profile", 0x732b00, 0x00100},
2332 {"default-config", 0x732c00, 0x00800},
2333 {"plc-type", 0x733400, 0x00020},
2334 {"default-pib", 0x733500, 0x06000},
2335 {"user-config", 0x740000, 0x10000},
2336 {"plc-pib", 0x750000, 0x10000},
2337 {"plc-nvm", 0x760000, 0x90000},
2338 {"radio", 0x7f0000, 0x10000},
2339 {NULL, 0, 0}
2340 },
2341
2342 .first_sysupgrade_partition = "os-image",
2343 .last_sysupgrade_partition = "file-system"
2344 },
2345
2346 /** Firmware layout for the TL-WR1043 v5 */
2347 {
2348 .id = "TLWR1043NV5",
2349 .vendor = "",
2350 .support_list =
2351 "SupportList:\n"
2352 "{product_name:TL-WR1043N,product_ver:5.0.0,special_id:45550000}\n"
2353 "{product_name:TL-WR1043N,product_ver:5.0.0,special_id:55530000}\n",
2354 .part_trail = 0x00,
2355 .soft_ver = SOFT_VER_TEXT("soft_ver:1.0.0\n"),
2356 .partitions = {
2357 {"factory-boot", 0x00000, 0x20000},
2358 {"fs-uboot", 0x20000, 0x20000},
2359 {"firmware", 0x40000, 0xec0000},
2360 {"default-mac", 0xf00000, 0x00200},
2361 {"pin", 0xf00200, 0x00200},
2362 {"device-id", 0xf00400, 0x00100},
2363 {"product-info", 0xf00500, 0x0fb00},
2364 {"soft-version", 0xf10000, 0x01000},
2365 {"extra-para", 0xf11000, 0x01000},
2366 {"support-list", 0xf12000, 0x0a000},
2367 {"profile", 0xf1c000, 0x04000},
2368 {"default-config", 0xf20000, 0x10000},
2369 {"user-config", 0xf30000, 0x40000},
2370 {"qos-db", 0xf70000, 0x40000},
2371 {"certificate", 0xfb0000, 0x10000},
2372 {"partition-table", 0xfc0000, 0x10000},
2373 {"log", 0xfd0000, 0x20000},
2374 {"radio", 0xff0000, 0x10000},
2375 {NULL, 0, 0}
2376 },
2377 .first_sysupgrade_partition = "os-image",
2378 .last_sysupgrade_partition = "file-system"
2379 },
2380
2381 /** Firmware layout for the TL-WR1043 v4 */
2382 {
2383 .id = "TLWR1043NDV4",
2384 .vendor = "",
2385 .support_list =
2386 "SupportList:\n"
2387 "{product_name:TL-WR1043ND,product_ver:4.0.0,special_id:45550000}\n",
2388 .part_trail = 0x00,
2389 .soft_ver = SOFT_VER_DEFAULT,
2390
2391 /* We're using a dynamic kernel/rootfs split here */
2392 .partitions = {
2393 {"fs-uboot", 0x00000, 0x20000},
2394 {"firmware", 0x20000, 0xf30000},
2395 {"default-mac", 0xf50000, 0x00200},
2396 {"pin", 0xf50200, 0x00200},
2397 {"product-info", 0xf50400, 0x0fc00},
2398 {"soft-version", 0xf60000, 0x0b000},
2399 {"support-list", 0xf6b000, 0x04000},
2400 {"profile", 0xf70000, 0x04000},
2401 {"default-config", 0xf74000, 0x0b000},
2402 {"user-config", 0xf80000, 0x40000},
2403 {"partition-table", 0xfc0000, 0x10000},
2404 {"log", 0xfd0000, 0x20000},
2405 {"radio", 0xff0000, 0x10000},
2406 {NULL, 0, 0}
2407 },
2408
2409 .first_sysupgrade_partition = "os-image",
2410 .last_sysupgrade_partition = "file-system"
2411 },
2412
2413 /** Firmware layout for the TL-WR902AC v1 */
2414 {
2415 .id = "TL-WR902AC-V1",
2416 .vendor = "",
2417 .support_list =
2418 "SupportList:\n"
2419 "{product_name:TL-WR902AC,product_ver:1.0.0,special_id:45550000}\n"
2420 "{product_name:TL-WR902AC,product_ver:1.0.0,special_id:55530000}\n",
2421 .part_trail = 0x00,
2422 .soft_ver = SOFT_VER_DEFAULT,
2423
2424 /**
2425 384KB were moved from file-system to os-image
2426 in comparison to the stock image
2427 */
2428 .partitions = {
2429 {"fs-uboot", 0x00000, 0x20000},
2430 {"firmware", 0x20000, 0x730000},
2431 {"default-mac", 0x750000, 0x00200},
2432 {"pin", 0x750200, 0x00200},
2433 {"product-info", 0x750400, 0x0fc00},
2434 {"soft-version", 0x760000, 0x0b000},
2435 {"support-list", 0x76b000, 0x04000},
2436 {"profile", 0x770000, 0x04000},
2437 {"default-config", 0x774000, 0x0b000},
2438 {"user-config", 0x780000, 0x40000},
2439 {"partition-table", 0x7c0000, 0x10000},
2440 {"log", 0x7d0000, 0x20000},
2441 {"radio", 0x7f0000, 0x10000},
2442 {NULL, 0, 0}
2443 },
2444
2445 .first_sysupgrade_partition = "os-image",
2446 .last_sysupgrade_partition = "file-system",
2447 },
2448
2449 /** Firmware layout for the TL-WR941HP v1 */
2450 {
2451 .id = "TL-WR941HP-V1",
2452 .vendor = "",
2453 .support_list =
2454 "SupportList:\n"
2455 "{product_name:TL-WR941HP,product_ver:1.0.0,special_id:00000000}\n",
2456 .part_trail = 0x00,
2457 .soft_ver = SOFT_VER_DEFAULT,
2458
2459 .partitions = {
2460 {"fs-uboot", 0x00000, 0x20000},
2461 {"firmware", 0x20000, 0x730000},
2462 {"default-mac", 0x750000, 0x00200},
2463 {"pin", 0x750200, 0x00200},
2464 {"product-info", 0x750400, 0x0fc00},
2465 {"soft-version", 0x760000, 0x0b000},
2466 {"support-list", 0x76b000, 0x04000},
2467 {"profile", 0x770000, 0x04000},
2468 {"default-config", 0x774000, 0x0b000},
2469 {"user-config", 0x780000, 0x40000},
2470 {"partition-table", 0x7c0000, 0x10000},
2471 {"log", 0x7d0000, 0x20000},
2472 {"radio", 0x7f0000, 0x10000},
2473 {NULL, 0, 0}
2474 },
2475
2476 .first_sysupgrade_partition = "os-image",
2477 .last_sysupgrade_partition = "file-system",
2478 },
2479
2480 /** Firmware layout for the TL-WR942N V1 */
2481 {
2482 .id = "TLWR942NV1",
2483 .vendor = "",
2484 .support_list =
2485 "SupportList:\r\n"
2486 "{product_name:TL-WR942N,product_ver:1.0.0,special_id:00000000}\r\n"
2487 "{product_name:TL-WR942N,product_ver:1.0.0,special_id:52550000}\r\n",
2488 .part_trail = 0x00,
2489 .soft_ver = SOFT_VER_DEFAULT,
2490
2491 .partitions = {
2492 {"fs-uboot", 0x00000, 0x20000},
2493 {"firmware", 0x20000, 0xe20000},
2494 {"default-mac", 0xe40000, 0x00200},
2495 {"pin", 0xe40200, 0x00200},
2496 {"product-info", 0xe40400, 0x0fc00},
2497 {"partition-table", 0xe50000, 0x10000},
2498 {"soft-version", 0xe60000, 0x10000},
2499 {"support-list", 0xe70000, 0x10000},
2500 {"profile", 0xe80000, 0x10000},
2501 {"default-config", 0xe90000, 0x10000},
2502 {"user-config", 0xea0000, 0x40000},
2503 {"qos-db", 0xee0000, 0x40000},
2504 {"certificate", 0xf20000, 0x10000},
2505 {"usb-config", 0xfb0000, 0x10000},
2506 {"log", 0xfc0000, 0x20000},
2507 {"radio-bk", 0xfe0000, 0x10000},
2508 {"radio", 0xff0000, 0x10000},
2509 {NULL, 0, 0}
2510 },
2511
2512 .first_sysupgrade_partition = "os-image",
2513 .last_sysupgrade_partition = "file-system",
2514 },
2515
2516 /** Firmware layout for the RE200 v2 */
2517 {
2518 .id = "RE200-V2",
2519 .vendor = "",
2520 .support_list =
2521 "SupportList:\n"
2522 "{product_name:RE200,product_ver:2.0.0,special_id:00000000}\n"
2523 "{product_name:RE200,product_ver:2.0.0,special_id:41520000}\n"
2524 "{product_name:RE200,product_ver:2.0.0,special_id:41550000}\n"
2525 "{product_name:RE200,product_ver:2.0.0,special_id:42520000}\n"
2526 "{product_name:RE200,product_ver:2.0.0,special_id:43410000}\n"
2527 "{product_name:RE200,product_ver:2.0.0,special_id:45530000}\n"
2528 "{product_name:RE200,product_ver:2.0.0,special_id:45550000}\n"
2529 "{product_name:RE200,product_ver:2.0.0,special_id:49440000}\n"
2530 "{product_name:RE200,product_ver:2.0.0,special_id:4a500000}\n"
2531 "{product_name:RE200,product_ver:2.0.0,special_id:4b520000}\n"
2532 "{product_name:RE200,product_ver:2.0.0,special_id:52550000}\n"
2533 "{product_name:RE200,product_ver:2.0.0,special_id:54570000}\n"
2534 "{product_name:RE200,product_ver:2.0.0,special_id:55530000}\n",
2535 .part_trail = 0x00,
2536 .soft_ver = SOFT_VER_DEFAULT,
2537
2538 .partitions = {
2539 {"fs-uboot", 0x00000, 0x20000},
2540 {"firmware", 0x20000, 0x7a0000},
2541 {"partition-table", 0x7c0000, 0x02000},
2542 {"default-mac", 0x7c2000, 0x00020},
2543 {"pin", 0x7c2100, 0x00020},
2544 {"product-info", 0x7c3100, 0x01000},
2545 {"soft-version", 0x7c4200, 0x01000},
2546 {"support-list", 0x7c5200, 0x01000},
2547 {"profile", 0x7c6200, 0x08000},
2548 {"config-info", 0x7ce200, 0x00400},
2549 {"user-config", 0x7d0000, 0x10000},
2550 {"default-config", 0x7e0000, 0x10000},
2551 {"radio", 0x7f0000, 0x10000},
2552 {NULL, 0, 0}
2553 },
2554
2555 .first_sysupgrade_partition = "os-image",
2556 .last_sysupgrade_partition = "file-system"
2557 },
2558
2559 /** Firmware layout for the RE200 v3 */
2560 {
2561 .id = "RE200-V3",
2562 .vendor = "",
2563 .support_list =
2564 "SupportList:\n"
2565 "{product_name:RE200,product_ver:3.0.0,special_id:00000000}\n"
2566 "{product_name:RE200,product_ver:3.0.0,special_id:41520000}\n"
2567 "{product_name:RE200,product_ver:3.0.0,special_id:41550000}\n"
2568 "{product_name:RE200,product_ver:3.0.0,special_id:42520000}\n"
2569 "{product_name:RE200,product_ver:3.0.0,special_id:43410000}\n"
2570 "{product_name:RE200,product_ver:3.0.0,special_id:45470000}\n"
2571 "{product_name:RE200,product_ver:3.0.0,special_id:45530000}\n"
2572 "{product_name:RE200,product_ver:3.0.0,special_id:45550000}\n"
2573 "{product_name:RE200,product_ver:3.0.0,special_id:49440000}\n"
2574 "{product_name:RE200,product_ver:3.0.0,special_id:4A500000}\n"
2575 "{product_name:RE200,product_ver:3.0.0,special_id:4B520000}\n"
2576 "{product_name:RE200,product_ver:3.0.0,special_id:52550000}\n"
2577 "{product_name:RE200,product_ver:3.0.0,special_id:54570000}\n"
2578 "{product_name:RE200,product_ver:3.0.0,special_id:55530000}\n",
2579 .part_trail = 0x00,
2580 .soft_ver = SOFT_VER_DEFAULT,
2581
2582 .partitions = {
2583 {"fs-uboot", 0x00000, 0x20000},
2584 {"firmware", 0x20000, 0x7a0000},
2585 {"partition-table", 0x7c0000, 0x02000},
2586 {"default-mac", 0x7c2000, 0x00020},
2587 {"pin", 0x7c2100, 0x00020},
2588 {"product-info", 0x7c3100, 0x01000},
2589 {"soft-version", 0x7c4200, 0x01000},
2590 {"support-list", 0x7c5200, 0x01000},
2591 {"profile", 0x7c6200, 0x08000},
2592 {"config-info", 0x7ce200, 0x00400},
2593 {"user-config", 0x7d0000, 0x10000},
2594 {"default-config", 0x7e0000, 0x10000},
2595 {"radio", 0x7f0000, 0x10000},
2596 {NULL, 0, 0}
2597 },
2598
2599 .first_sysupgrade_partition = "os-image",
2600 .last_sysupgrade_partition = "file-system"
2601 },
2602
2603 /** Firmware layout for the RE200 v4 */
2604 {
2605 .id = "RE200-V4",
2606 .vendor = "",
2607 .support_list =
2608 "SupportList:\n"
2609 "{product_name:RE200,product_ver:4.0.0,special_id:00000000}\n"
2610 "{product_name:RE200,product_ver:4.0.0,special_id:45550000}\n"
2611 "{product_name:RE200,product_ver:4.0.0,special_id:4A500000}\n"
2612 "{product_name:RE200,product_ver:4.0.0,special_id:4B520000}\n"
2613 "{product_name:RE200,product_ver:4.0.0,special_id:43410000}\n"
2614 "{product_name:RE200,product_ver:4.0.0,special_id:41550000}\n"
2615 "{product_name:RE200,product_ver:4.0.0,special_id:42520000}\n"
2616 "{product_name:RE200,product_ver:4.0.0,special_id:55530000}\n"
2617 "{product_name:RE200,product_ver:4.0.0,special_id:41520000}\n"
2618 "{product_name:RE200,product_ver:4.0.0,special_id:52550000}\n"
2619 "{product_name:RE200,product_ver:4.0.0,special_id:54570000}\n"
2620 "{product_name:RE200,product_ver:4.0.0,special_id:45530000}\n"
2621 "{product_name:RE200,product_ver:4.0.0,special_id:49440000}\n"
2622 "{product_name:RE200,product_ver:4.0.0,special_id:45470000}\n",
2623 .part_trail = 0x00,
2624 .soft_ver = SOFT_VER_TEXT("soft_ver:1.1.0\n"),
2625
2626 .partitions = {
2627 {"fs-uboot", 0x00000, 0x20000},
2628 {"firmware", 0x20000, 0x7a0000},
2629 {"partition-table", 0x7c0000, 0x02000},
2630 {"default-mac", 0x7c2000, 0x00020},
2631 {"pin", 0x7c2100, 0x00020},
2632 {"product-info", 0x7c3100, 0x01000},
2633 {"soft-version", 0x7c4200, 0x01000},
2634 {"support-list", 0x7c5200, 0x01000},
2635 {"profile", 0x7c6200, 0x08000},
2636 {"config-info", 0x7ce200, 0x00400},
2637 {"user-config", 0x7d0000, 0x10000},
2638 {"default-config", 0x7e0000, 0x10000},
2639 {"radio", 0x7f0000, 0x10000},
2640 {NULL, 0, 0}
2641 },
2642
2643 .first_sysupgrade_partition = "os-image",
2644 .last_sysupgrade_partition = "file-system"
2645 },
2646
2647 /** Firmware layout for the RE220 v2 */
2648 {
2649 .id = "RE220-V2",
2650 .vendor = "",
2651 .support_list =
2652 "SupportList:\n"
2653 "{product_name:RE220,product_ver:2.0.0,special_id:00000000}\n"
2654 "{product_name:RE220,product_ver:2.0.0,special_id:41520000}\n"
2655 "{product_name:RE220,product_ver:2.0.0,special_id:41550000}\n"
2656 "{product_name:RE220,product_ver:2.0.0,special_id:42520000}\n"
2657 "{product_name:RE220,product_ver:2.0.0,special_id:43410000}\n"
2658 "{product_name:RE220,product_ver:2.0.0,special_id:45530000}\n"
2659 "{product_name:RE220,product_ver:2.0.0,special_id:45550000}\n"
2660 "{product_name:RE220,product_ver:2.0.0,special_id:49440000}\n"
2661 "{product_name:RE220,product_ver:2.0.0,special_id:4a500000}\n"
2662 "{product_name:RE220,product_ver:2.0.0,special_id:4b520000}\n"
2663 "{product_name:RE220,product_ver:2.0.0,special_id:52550000}\n"
2664 "{product_name:RE220,product_ver:2.0.0,special_id:54570000}\n"
2665 "{product_name:RE220,product_ver:2.0.0,special_id:55530000}\n",
2666 .part_trail = 0x00,
2667 .soft_ver = SOFT_VER_DEFAULT,
2668
2669 .partitions = {
2670 {"fs-uboot", 0x00000, 0x20000},
2671 {"firmware", 0x20000, 0x7a0000},
2672 {"partition-table", 0x7c0000, 0x02000},
2673 {"default-mac", 0x7c2000, 0x00020},
2674 {"pin", 0x7c2100, 0x00020},
2675 {"product-info", 0x7c3100, 0x01000},
2676 {"soft-version", 0x7c4200, 0x01000},
2677 {"support-list", 0x7c5200, 0x01000},
2678 {"profile", 0x7c6200, 0x08000},
2679 {"config-info", 0x7ce200, 0x00400},
2680 {"user-config", 0x7d0000, 0x10000},
2681 {"default-config", 0x7e0000, 0x10000},
2682 {"radio", 0x7f0000, 0x10000},
2683 {NULL, 0, 0}
2684 },
2685
2686 .first_sysupgrade_partition = "os-image",
2687 .last_sysupgrade_partition = "file-system"
2688 },
2689
2690 /** Firmware layout for the RE305 v1 */
2691 {
2692 .id = "RE305-V1",
2693 .vendor = "",
2694 .support_list =
2695 "SupportList:\n"
2696 "{product_name:RE305,product_ver:1.0.0,special_id:45550000}\n"
2697 "{product_name:RE305,product_ver:1.0.0,special_id:55530000}\n"
2698 "{product_name:RE305,product_ver:1.0.0,special_id:4a500000}\n"
2699 "{product_name:RE305,product_ver:1.0.0,special_id:42520000}\n"
2700 "{product_name:RE305,product_ver:1.0.0,special_id:4b520000}\n"
2701 "{product_name:RE305,product_ver:1.0.0,special_id:41550000}\n"
2702 "{product_name:RE305,product_ver:1.0.0,special_id:43410000}\n",
2703 .part_trail = 0x00,
2704 .soft_ver = SOFT_VER_DEFAULT,
2705
2706 .partitions = {
2707 {"fs-uboot", 0x00000, 0x20000},
2708 {"firmware", 0x20000, 0x5e0000},
2709 {"partition-table", 0x600000, 0x02000},
2710 {"default-mac", 0x610000, 0x00020},
2711 {"pin", 0x610100, 0x00020},
2712 {"product-info", 0x611100, 0x01000},
2713 {"soft-version", 0x620000, 0x01000},
2714 {"support-list", 0x621000, 0x01000},
2715 {"profile", 0x622000, 0x08000},
2716 {"user-config", 0x630000, 0x10000},
2717 {"default-config", 0x640000, 0x10000},
2718 {"radio", 0x7f0000, 0x10000},
2719 {NULL, 0, 0}
2720 },
2721
2722 .first_sysupgrade_partition = "os-image",
2723 .last_sysupgrade_partition = "file-system"
2724 },
2725
2726 /** Firmware layout for the RE305 v3 */
2727 {
2728 .id = "RE305-V3",
2729 .vendor = "",
2730 .support_list =
2731 "SupportList:\n"
2732 "{product_name:RE305,product_ver:3.0.0,special_id:00000000}\n"
2733 "{product_name:RE305,product_ver:3.0.0,special_id:45550000}\n"
2734 "{product_name:RE305,product_ver:3.0.0,special_id:4A500000}\n"
2735 "{product_name:RE305,product_ver:3.0.0,special_id:4B520000}\n"
2736 "{product_name:RE305,product_ver:3.0.0,special_id:41550000}\n"
2737 "{product_name:RE305,product_ver:3.0.0,special_id:42520000}\n"
2738 "{product_name:RE305,product_ver:3.0.0,special_id:55530000}\n"
2739 "{product_name:RE305,product_ver:3.0.0,special_id:45530000}\n"
2740 "{product_name:RE305,product_ver:3.0.0,special_id:41530000}\n"
2741 "{product_name:RE305,product_ver:3.0.0,special_id:43410000}\n"
2742 "{product_name:RE305,product_ver:3.0.0,special_id:52550000}\n",
2743 .part_trail = 0x00,
2744 .soft_ver = SOFT_VER_TEXT("soft_ver:2.0.0\n"),
2745
2746 .partitions = {
2747 {"fs-uboot", 0x00000, 0x20000},
2748 {"firmware", 0x20000, 0x7a0000},
2749 {"partition-table", 0x7c0000, 0x02000},
2750 {"default-mac", 0x7c2000, 0x00020},
2751 {"pin", 0x7c2100, 0x00020},
2752 {"product-info", 0x7c3100, 0x01000},
2753 {"soft-version", 0x7c4200, 0x01000},
2754 {"support-list", 0x7c5200, 0x01000},
2755 {"profile", 0x7c6200, 0x08000},
2756 {"config-info", 0x7ce200, 0x00400},
2757 {"user-config", 0x7d0000, 0x10000},
2758 {"default-config", 0x7e0000, 0x10000},
2759 {"radio", 0x7f0000, 0x10000},
2760 {NULL, 0, 0}
2761 },
2762
2763 .first_sysupgrade_partition = "os-image",
2764 .last_sysupgrade_partition = "file-system"
2765 },
2766
2767 /** Firmware layout for the RE350 v1 */
2768 {
2769 .id = "RE350-V1",
2770 .vendor = "",
2771 .support_list =
2772 "SupportList:\n"
2773 "{product_name:RE350,product_ver:1.0.0,special_id:45550000}\n"
2774 "{product_name:RE350,product_ver:1.0.0,special_id:00000000}\n"
2775 "{product_name:RE350,product_ver:1.0.0,special_id:41550000}\n"
2776 "{product_name:RE350,product_ver:1.0.0,special_id:55530000}\n"
2777 "{product_name:RE350,product_ver:1.0.0,special_id:43410000}\n"
2778 "{product_name:RE350,product_ver:1.0.0,special_id:4b520000}\n"
2779 "{product_name:RE350,product_ver:1.0.0,special_id:4a500000}\n",
2780 .part_trail = 0x00,
2781 .soft_ver = SOFT_VER_DEFAULT,
2782
2783 /** We're using a dynamic kernel/rootfs split here */
2784 .partitions = {
2785 {"fs-uboot", 0x00000, 0x20000},
2786 {"firmware", 0x20000, 0x5e0000},
2787 {"partition-table", 0x600000, 0x02000},
2788 {"default-mac", 0x610000, 0x00020},
2789 {"pin", 0x610100, 0x00020},
2790 {"product-info", 0x611100, 0x01000},
2791 {"soft-version", 0x620000, 0x01000},
2792 {"support-list", 0x621000, 0x01000},
2793 {"profile", 0x622000, 0x08000},
2794 {"user-config", 0x630000, 0x10000},
2795 {"default-config", 0x640000, 0x10000},
2796 {"radio", 0x7f0000, 0x10000},
2797 {NULL, 0, 0}
2798 },
2799
2800 .first_sysupgrade_partition = "os-image",
2801 .last_sysupgrade_partition = "file-system"
2802 },
2803
2804 /** Firmware layout for the RE350K v1 */
2805 {
2806 .id = "RE350K-V1",
2807 .vendor = "",
2808 .support_list =
2809 "SupportList:\n"
2810 "{product_name:RE350K,product_ver:1.0.0,special_id:00000000,product_region:US}\n",
2811 .part_trail = 0x00,
2812 .soft_ver = SOFT_VER_DEFAULT,
2813
2814 /** We're using a dynamic kernel/rootfs split here */
2815 .partitions = {
2816 {"fs-uboot", 0x00000, 0x20000},
2817 {"firmware", 0x20000, 0xd70000},
2818 {"partition-table", 0xd90000, 0x02000},
2819 {"default-mac", 0xda0000, 0x00020},
2820 {"pin", 0xda0100, 0x00020},
2821 {"product-info", 0xda1100, 0x01000},
2822 {"soft-version", 0xdb0000, 0x01000},
2823 {"support-list", 0xdb1000, 0x01000},
2824 {"profile", 0xdb2000, 0x08000},
2825 {"user-config", 0xdc0000, 0x10000},
2826 {"default-config", 0xdd0000, 0x10000},
2827 {"device-id", 0xde0000, 0x00108},
2828 {"radio", 0xff0000, 0x10000},
2829 {NULL, 0, 0}
2830 },
2831
2832 .first_sysupgrade_partition = "os-image",
2833 .last_sysupgrade_partition = "file-system"
2834 },
2835
2836 /** Firmware layout for the RE355 */
2837 {
2838 .id = "RE355",
2839 .vendor = "",
2840 .support_list =
2841 "SupportList:\r\n"
2842 "{product_name:RE355,product_ver:1.0.0,special_id:00000000}\r\n"
2843 "{product_name:RE355,product_ver:1.0.0,special_id:55530000}\r\n"
2844 "{product_name:RE355,product_ver:1.0.0,special_id:45550000}\r\n"
2845 "{product_name:RE355,product_ver:1.0.0,special_id:4A500000}\r\n"
2846 "{product_name:RE355,product_ver:1.0.0,special_id:43410000}\r\n"
2847 "{product_name:RE355,product_ver:1.0.0,special_id:41550000}\r\n"
2848 "{product_name:RE355,product_ver:1.0.0,special_id:4B520000}\r\n"
2849 "{product_name:RE355,product_ver:1.0.0,special_id:55534100}\r\n",
2850 .part_trail = 0x00,
2851 .soft_ver = SOFT_VER_DEFAULT,
2852
2853 /* We're using a dynamic kernel/rootfs split here */
2854 .partitions = {
2855 {"fs-uboot", 0x00000, 0x20000},
2856 {"firmware", 0x20000, 0x5e0000},
2857 {"partition-table", 0x600000, 0x02000},
2858 {"default-mac", 0x610000, 0x00020},
2859 {"pin", 0x610100, 0x00020},
2860 {"product-info", 0x611100, 0x01000},
2861 {"soft-version", 0x620000, 0x01000},
2862 {"support-list", 0x621000, 0x01000},
2863 {"profile", 0x622000, 0x08000},
2864 {"user-config", 0x630000, 0x10000},
2865 {"default-config", 0x640000, 0x10000},
2866 {"radio", 0x7f0000, 0x10000},
2867 {NULL, 0, 0}
2868 },
2869
2870 .first_sysupgrade_partition = "os-image",
2871 .last_sysupgrade_partition = "file-system"
2872 },
2873
2874 /** Firmware layout for the RE450 */
2875 {
2876 .id = "RE450",
2877 .vendor = "",
2878 .support_list =
2879 "SupportList:\r\n"
2880 "{product_name:RE450,product_ver:1.0.0,special_id:00000000}\r\n"
2881 "{product_name:RE450,product_ver:1.0.0,special_id:55530000}\r\n"
2882 "{product_name:RE450,product_ver:1.0.0,special_id:45550000}\r\n"
2883 "{product_name:RE450,product_ver:1.0.0,special_id:4A500000}\r\n"
2884 "{product_name:RE450,product_ver:1.0.0,special_id:43410000}\r\n"
2885 "{product_name:RE450,product_ver:1.0.0,special_id:41550000}\r\n"
2886 "{product_name:RE450,product_ver:1.0.0,special_id:4B520000}\r\n"
2887 "{product_name:RE450,product_ver:1.0.0,special_id:55534100}\r\n",
2888 .part_trail = 0x00,
2889 .soft_ver = SOFT_VER_DEFAULT,
2890
2891 /** We're using a dynamic kernel/rootfs split here */
2892 .partitions = {
2893 {"fs-uboot", 0x00000, 0x20000},
2894 {"firmware", 0x20000, 0x5e0000},
2895 {"partition-table", 0x600000, 0x02000},
2896 {"default-mac", 0x610000, 0x00020},
2897 {"pin", 0x610100, 0x00020},
2898 {"product-info", 0x611100, 0x01000},
2899 {"soft-version", 0x620000, 0x01000},
2900 {"support-list", 0x621000, 0x01000},
2901 {"profile", 0x622000, 0x08000},
2902 {"user-config", 0x630000, 0x10000},
2903 {"default-config", 0x640000, 0x10000},
2904 {"radio", 0x7f0000, 0x10000},
2905 {NULL, 0, 0}
2906 },
2907
2908 .first_sysupgrade_partition = "os-image",
2909 .last_sysupgrade_partition = "file-system"
2910 },
2911
2912 /** Firmware layout for the RE450 v2 */
2913 {
2914 .id = "RE450-V2",
2915 .vendor = "",
2916 .support_list =
2917 "SupportList:\r\n"
2918 "{product_name:RE450,product_ver:2.0.0,special_id:00000000}\r\n"
2919 "{product_name:RE450,product_ver:2.0.0,special_id:55530000}\r\n"
2920 "{product_name:RE450,product_ver:2.0.0,special_id:45550000}\r\n"
2921 "{product_name:RE450,product_ver:2.0.0,special_id:4A500000}\r\n"
2922 "{product_name:RE450,product_ver:2.0.0,special_id:43410000}\r\n"
2923 "{product_name:RE450,product_ver:2.0.0,special_id:41550000}\r\n"
2924 "{product_name:RE450,product_ver:2.0.0,special_id:41530000}\r\n"
2925 "{product_name:RE450,product_ver:2.0.0,special_id:4B520000}\r\n"
2926 "{product_name:RE450,product_ver:2.0.0,special_id:42520000}\r\n",
2927 .part_trail = 0x00,
2928 .soft_ver = SOFT_VER_DEFAULT,
2929
2930 /* We're using a dynamic kernel/rootfs split here */
2931 .partitions = {
2932 {"fs-uboot", 0x00000, 0x20000},
2933 {"firmware", 0x20000, 0x5e0000},
2934 {"partition-table", 0x600000, 0x02000},
2935 {"default-mac", 0x610000, 0x00020},
2936 {"pin", 0x610100, 0x00020},
2937 {"product-info", 0x611100, 0x01000},
2938 {"soft-version", 0x620000, 0x01000},
2939 {"support-list", 0x621000, 0x01000},
2940 {"profile", 0x622000, 0x08000},
2941 {"user-config", 0x630000, 0x10000},
2942 {"default-config", 0x640000, 0x10000},
2943 {"radio", 0x7f0000, 0x10000},
2944 {NULL, 0, 0}
2945 },
2946
2947 .first_sysupgrade_partition = "os-image",
2948 .last_sysupgrade_partition = "file-system"
2949 },
2950
2951 /** Firmware layout for the RE450 v3 */
2952 {
2953 .id = "RE450-V3",
2954 .vendor = "",
2955 .support_list =
2956 "SupportList:\r\n"
2957 "{product_name:RE450,product_ver:3.0.0,special_id:00000000}\r\n"
2958 "{product_name:RE450,product_ver:3.0.0,special_id:55530000}\r\n"
2959 "{product_name:RE450,product_ver:3.0.0,special_id:45550000}\r\n"
2960 "{product_name:RE450,product_ver:3.0.0,special_id:4A500000}\r\n"
2961 "{product_name:RE450,product_ver:3.0.0,special_id:43410000}\r\n"
2962 "{product_name:RE450,product_ver:3.0.0,special_id:41550000}\r\n"
2963 "{product_name:RE450,product_ver:3.0.0,special_id:41530000}\r\n"
2964 "{product_name:RE450,product_ver:3.0.0,special_id:4B520000}\r\n"
2965 "{product_name:RE450,product_ver:3.0.0,special_id:42520000}\r\n",
2966 .part_trail = 0x00,
2967 .soft_ver = SOFT_VER_DEFAULT,
2968
2969 /* We're using a dynamic kernel/rootfs split here */
2970 .partitions = {
2971 {"fs-uboot", 0x00000, 0x20000},
2972 {"default-mac", 0x20000, 0x00020},
2973 {"pin", 0x20020, 0x00020},
2974 {"product-info", 0x21000, 0x01000},
2975 {"partition-table", 0x22000, 0x02000},
2976 {"soft-version", 0x24000, 0x01000},
2977 {"support-list", 0x25000, 0x01000},
2978 {"profile", 0x26000, 0x08000},
2979 {"user-config", 0x2e000, 0x10000},
2980 {"default-config", 0x3e000, 0x10000},
2981 {"config-info", 0x4e000, 0x00400},
2982 {"firmware", 0x50000, 0x7a0000},
2983 {"radio", 0x7f0000, 0x10000},
2984 {NULL, 0, 0}
2985 },
2986
2987 .first_sysupgrade_partition = "os-image",
2988 .last_sysupgrade_partition = "file-system"
2989 },
2990
2991 /** Firmware layout for the RE455 v1 */
2992 {
2993 .id = "RE455-V1",
2994 .vendor = "",
2995 .support_list =
2996 "SupportList:\r\n"
2997 "{product_name:RE455,product_ver:1.0.0,special_id:00000000}\r\n"
2998 "{product_name:RE455,product_ver:1.0.0,special_id:55530000}\r\n"
2999 "{product_name:RE455,product_ver:1.0.0,special_id:45550000}\r\n"
3000 "{product_name:RE455,product_ver:1.0.0,special_id:4A500000}\r\n"
3001 "{product_name:RE455,product_ver:1.0.0,special_id:43410000}\r\n"
3002 "{product_name:RE455,product_ver:1.0.0,special_id:41550000}\r\n"
3003 "{product_name:RE455,product_ver:1.0.0,special_id:41530000}\r\n"
3004 "{product_name:RE455,product_ver:1.0.0,special_id:4B520000}\r\n"
3005 "{product_name:RE455,product_ver:1.0.0,special_id:42520000}\r\n",
3006 .part_trail = 0x00,
3007 .soft_ver = SOFT_VER_DEFAULT,
3008
3009 /* We're using a dynamic kernel/rootfs split here */
3010 .partitions = {
3011 {"fs-uboot", 0x00000, 0x20000},
3012 {"default-mac", 0x20000, 0x00020},
3013 {"pin", 0x20020, 0x00020},
3014 {"product-info", 0x21000, 0x01000},
3015 {"partition-table", 0x22000, 0x02000},
3016 {"soft-version", 0x24000, 0x01000},
3017 {"support-list", 0x25000, 0x01000},
3018 {"profile", 0x26000, 0x08000},
3019 {"user-config", 0x2e000, 0x10000},
3020 {"default-config", 0x3e000, 0x10000},
3021 {"config-info", 0x4e000, 0x00400},
3022 {"firmware", 0x50000, 0x7a0000},
3023 {"radio", 0x7f0000, 0x10000},
3024 {NULL, 0, 0}
3025 },
3026
3027 .first_sysupgrade_partition = "os-image",
3028 .last_sysupgrade_partition = "file-system"
3029 },
3030
3031 /** Firmware layout for the RE500 */
3032 {
3033 .id = "RE500-V1",
3034 .vendor = "",
3035 .support_list =
3036 "SupportList:\r\n"
3037 "{product_name:RE500,product_ver:1.0.0,special_id:00000000}\r\n"
3038 "{product_name:RE500,product_ver:1.0.0,special_id:55530000}\r\n"
3039 "{product_name:RE500,product_ver:1.0.0,special_id:45550000}\r\n"
3040 "{product_name:RE500,product_ver:1.0.0,special_id:4A500000}\r\n"
3041 "{product_name:RE500,product_ver:1.0.0,special_id:43410000}\r\n"
3042 "{product_name:RE500,product_ver:1.0.0,special_id:41550000}\r\n"
3043 "{product_name:RE500,product_ver:1.0.0,special_id:41530000}\r\n",
3044 .part_trail = 0x00,
3045 .soft_ver = SOFT_VER_DEFAULT,
3046
3047 /* We're using a dynamic kernel/rootfs split here */
3048 .partitions = {
3049 {"fs-uboot", 0x00000, 0x20000},
3050 {"firmware", 0x20000, 0xde0000},
3051 {"partition-table", 0xe00000, 0x02000},
3052 {"default-mac", 0xe10000, 0x00020},
3053 {"pin", 0xe10100, 0x00020},
3054 {"product-info", 0xe11100, 0x01000},
3055 {"soft-version", 0xe20000, 0x01000},
3056 {"support-list", 0xe21000, 0x01000},
3057 {"profile", 0xe22000, 0x08000},
3058 {"user-config", 0xe30000, 0x10000},
3059 {"default-config", 0xe40000, 0x10000},
3060 {"radio", 0xff0000, 0x10000},
3061 {NULL, 0, 0}
3062 },
3063
3064 .first_sysupgrade_partition = "os-image",
3065 .last_sysupgrade_partition = "file-system"
3066 },
3067
3068 /** Firmware layout for the RE650 */
3069 {
3070 .id = "RE650-V1",
3071 .vendor = "",
3072 .support_list =
3073 "SupportList:\r\n"
3074 "{product_name:RE650,product_ver:1.0.0,special_id:00000000}\r\n"
3075 "{product_name:RE650,product_ver:1.0.0,special_id:55530000}\r\n"
3076 "{product_name:RE650,product_ver:1.0.0,special_id:45550000}\r\n"
3077 "{product_name:RE650,product_ver:1.0.0,special_id:4A500000}\r\n"
3078 "{product_name:RE650,product_ver:1.0.0,special_id:43410000}\r\n"
3079 "{product_name:RE650,product_ver:1.0.0,special_id:41550000}\r\n"
3080 "{product_name:RE650,product_ver:1.0.0,special_id:41530000}\r\n",
3081 .part_trail = 0x00,
3082 .soft_ver = SOFT_VER_DEFAULT,
3083
3084 /* We're using a dynamic kernel/rootfs split here */
3085 .partitions = {
3086 {"fs-uboot", 0x00000, 0x20000},
3087 {"firmware", 0x20000, 0xde0000},
3088 {"partition-table", 0xe00000, 0x02000},
3089 {"default-mac", 0xe10000, 0x00020},
3090 {"pin", 0xe10100, 0x00020},
3091 {"product-info", 0xe11100, 0x01000},
3092 {"soft-version", 0xe20000, 0x01000},
3093 {"support-list", 0xe21000, 0x01000},
3094 {"profile", 0xe22000, 0x08000},
3095 {"user-config", 0xe30000, 0x10000},
3096 {"default-config", 0xe40000, 0x10000},
3097 {"radio", 0xff0000, 0x10000},
3098 {NULL, 0, 0}
3099 },
3100
3101 .first_sysupgrade_partition = "os-image",
3102 .last_sysupgrade_partition = "file-system"
3103 },
3104 /** Firmware layout for the RE650 V2 (8MB Flash)*/
3105 {
3106 .id = "RE650-V2",
3107 .vendor = "",
3108 .support_list =
3109 "SupportList:\n"
3110 "{product_name:RE650,product_ver:2.0.0,special_id:00000000}\n"
3111 "{product_name:RE650,product_ver:2.0.0,special_id:45550000}\n"
3112 "{product_name:RE650,product_ver:2.0.0,special_id:4A500000}\n"
3113 "{product_name:RE650,product_ver:2.0.0,special_id:41550000}\n"
3114 "{product_name:RE650,product_ver:2.0.0,special_id:43410000}\n"
3115 "{product_name:RE650,product_ver:2.0.0,special_id:41530000}\n"
3116 "{product_name:RE650,product_ver:2.0.0,special_id:55530000}\n",
3117 .part_trail = 0x00,
3118 /* For RE650 v2, soft ver is required, otherwise OEM install doesn't work */
3119 .soft_ver = SOFT_VER_TEXT("soft_ver:2.0.0\n"),
3120
3121 /* We're using a dynamic kernel/rootfs split here */
3122 .partitions = {
3123 {"fs-uboot", 0x00000, 0x20000},
3124 {"firmware", 0x20000, 0x7a0000},
3125 {"partition-table", 0x7c0000, 0x02000},
3126 {"default-mac", 0x7c2000, 0x00020},
3127 {"pin", 0x7c2100, 0x00020},
3128 {"product-info", 0x7c3100, 0x01000},
3129 {"soft-version", 0x7c4200, 0x01000},
3130 {"support-list", 0x7c5200, 0x01000},
3131 {"profile", 0x7c6200, 0x08000},
3132 {"config-info", 0x7ce200, 0x00400},
3133 {"user-config", 0x7d0000, 0x10000},
3134 {"default-config", 0x7e0000, 0x10000},
3135 {"radio", 0x7f0000, 0x10000},
3136 {NULL, 0, 0}
3137 },
3138
3139 .first_sysupgrade_partition = "os-image",
3140 .last_sysupgrade_partition = "file-system"
3141 },
3142
3143 /** Firmware layout for the Mercusys MR70X */
3144 {
3145 .id = "MR70X",
3146 .vendor = "",
3147 .support_list =
3148 "SupportList:\n"
3149 "{product_name:MR70X,product_ver:1.0.0,special_id:45550000}\n"
3150 "{product_name:MR70X,product_ver:1.0.0,special_id:4A500000}\n"
3151 "{product_name:MR70X,product_ver:1.0.0,special_id:55530000}\n",
3152 .part_trail = 0x00,
3153 .soft_ver = SOFT_VER_DEFAULT,
3154
3155 .partitions = {
3156 {"fs-uboot", 0x00000, 0x40000},
3157 {"firmware", 0x40000, 0xf60000},
3158 {"default-mac", 0xfa0000, 0x00200},
3159 {"pin", 0xfa0200, 0x00100},
3160 {"device-id", 0xfa0300, 0x00100},
3161 {"product-info", 0xfa0400, 0x0fc00},
3162 {"default-config", 0xfb0000, 0x08000},
3163 {"ap-def-config", 0xfb8000, 0x08000},
3164 {"user-config", 0xfc0000, 0x0a000},
3165 {"ag-config", 0xfca000, 0x04000},
3166 {"certificate", 0xfce000, 0x02000},
3167 {"ap-config", 0xfd0000, 0x06000},
3168 {"router-config", 0xfd6000, 0x06000},
3169 {"favicon", 0xfdc000, 0x02000},
3170 {"logo", 0xfde000, 0x02000},
3171 {"partition-table", 0xfe0000, 0x00800},
3172 {"soft-version", 0xfe0800, 0x00100},
3173 {"support-list", 0xfe0900, 0x00200},
3174 {"profile", 0xfe0b00, 0x03000},
3175 {"extra-para", 0xfe3b00, 0x00100},
3176 {"radio", 0xff0000, 0x10000},
3177 {NULL, 0, 0}
3178 },
3179
3180 .first_sysupgrade_partition = "os-image",
3181 .last_sysupgrade_partition = "file-system"
3182 },
3183
3184 {}
3185 };
3186
3187 #define error(_ret, _errno, _str, ...) \
3188 do { \
3189 fprintf(stderr, _str ": %s\n", ## __VA_ARGS__, \
3190 strerror(_errno)); \
3191 if (_ret) \
3192 exit(_ret); \
3193 } while (0)
3194
3195
3196 /** Stores a uint32 as big endian */
3197 static inline void put32(uint8_t *buf, uint32_t val) {
3198 buf[0] = val >> 24;
3199 buf[1] = val >> 16;
3200 buf[2] = val >> 8;
3201 buf[3] = val;
3202 }
3203
3204 static inline bool meta_partition_should_pad(enum partition_trail_value pv)
3205 {
3206 return (pv >= 0) && (pv <= PART_TRAIL_MAX);
3207 }
3208
3209 /** Allocate a padded meta partition with a correctly initialised header
3210 * If the `data` pointer is NULL, then the required space is only allocated,
3211 * otherwise `data_len` bytes will be copied from `data` into the partition
3212 * entry. */
3213 static struct image_partition_entry init_meta_partition_entry(
3214 const char *name, const void *data, uint32_t data_len,
3215 enum partition_trail_value pad_value)
3216 {
3217 uint32_t total_len = sizeof(struct meta_header) + data_len;
3218 if (meta_partition_should_pad(pad_value))
3219 total_len += 1;
3220
3221 struct image_partition_entry entry = {
3222 .name = name,
3223 .size = total_len,
3224 .data = malloc(total_len)
3225 };
3226 if (!entry.data)
3227 error(1, errno, "failed to allocate meta partition entry");
3228
3229 struct meta_header *header = (struct meta_header *)entry.data;
3230 header->length = htonl(data_len);
3231 header->zero = 0;
3232
3233 if (data)
3234 memcpy(entry.data+sizeof(*header), data, data_len);
3235
3236 if (meta_partition_should_pad(pad_value))
3237 entry.data[total_len - 1] = (uint8_t) pad_value;
3238
3239 return entry;
3240 }
3241
3242 /** Allocates a new image partition */
3243 static struct image_partition_entry alloc_image_partition(const char *name, size_t len) {
3244 struct image_partition_entry entry = {name, len, malloc(len)};
3245 if (!entry.data)
3246 error(1, errno, "malloc");
3247
3248 return entry;
3249 }
3250
3251 /** Sets up default partition names whenever custom names aren't specified */
3252 static void set_partition_names(struct device_info *info)
3253 {
3254 if (!info->partition_names.partition_table)
3255 info->partition_names.partition_table = "partition-table";
3256 if (!info->partition_names.soft_ver)
3257 info->partition_names.soft_ver = "soft-version";
3258 if (!info->partition_names.os_image)
3259 info->partition_names.os_image = "os-image";
3260 if (!info->partition_names.support_list)
3261 info->partition_names.support_list = "support-list";
3262 if (!info->partition_names.file_system)
3263 info->partition_names.file_system = "file-system";
3264 if (!info->partition_names.extra_para)
3265 info->partition_names.extra_para = "extra-para";
3266 }
3267
3268 /** Frees an image partition */
3269 static void free_image_partition(struct image_partition_entry *entry)
3270 {
3271 void *data = entry->data;
3272
3273 entry->name = NULL;
3274 entry->size = 0;
3275 entry->data = NULL;
3276
3277 free(data);
3278 }
3279
3280 static time_t source_date_epoch = -1;
3281 static void set_source_date_epoch() {
3282 char *env = getenv("SOURCE_DATE_EPOCH");
3283 char *endptr = env;
3284 errno = 0;
3285 if (env && *env) {
3286 source_date_epoch = strtoull(env, &endptr, 10);
3287 if (errno || (endptr && *endptr != '\0')) {
3288 fprintf(stderr, "Invalid SOURCE_DATE_EPOCH");
3289 exit(1);
3290 }
3291 }
3292 }
3293
3294 /** Generates the partition-table partition */
3295 static struct image_partition_entry make_partition_table(const struct device_info *p)
3296 {
3297 struct image_partition_entry entry = alloc_image_partition(p->partition_names.partition_table, SAFELOADER_PAYLOAD_TABLE_SIZE);
3298
3299 char *s = (char *)entry.data, *end = (char *)(s+entry.size);
3300
3301 *(s++) = 0x00;
3302 *(s++) = 0x04;
3303 *(s++) = 0x00;
3304 *(s++) = 0x00;
3305
3306 size_t i;
3307 for (i = 0; p->partitions[i].name; i++) {
3308 size_t len = end-s;
3309 size_t w = snprintf(s, len, "partition %s base 0x%05x size 0x%05x\n",
3310 p->partitions[i].name, p->partitions[i].base, p->partitions[i].size);
3311
3312 if (w > len-1)
3313 error(1, 0, "flash partition table overflow?");
3314
3315 s += w;
3316 }
3317
3318 s++;
3319
3320 memset(s, 0xff, end-s);
3321
3322 return entry;
3323 }
3324
3325
3326 /** Generates a binary-coded decimal representation of an integer in the range [0, 99] */
3327 static inline uint8_t bcd(uint8_t v) {
3328 return 0x10 * (v/10) + v%10;
3329 }
3330
3331
3332 /** Generates the soft-version partition */
3333 static struct image_partition_entry make_soft_version(const struct device_info *info, uint32_t rev)
3334 {
3335 /** If an info string is provided, use this instead of
3336 * the structured data, and include the null-termination */
3337 if (info->soft_ver.type == SOFT_VER_TYPE_TEXT) {
3338 uint32_t len = strlen(info->soft_ver.text) + 1;
3339 return init_meta_partition_entry(info->partition_names.soft_ver,
3340 info->soft_ver.text, len, info->part_trail);
3341 }
3342
3343 time_t t;
3344
3345 if (source_date_epoch != -1)
3346 t = source_date_epoch;
3347 else if (time(&t) == (time_t)(-1))
3348 error(1, errno, "time");
3349
3350 struct tm *tm = gmtime(&t);
3351
3352 struct soft_version s = {
3353 .pad1 = 0xff,
3354
3355 .version_major = info->soft_ver.num[0],
3356 .version_minor = info->soft_ver.num[1],
3357 .version_patch = info->soft_ver.num[2],
3358
3359 .year_hi = bcd((1900+tm->tm_year)/100),
3360 .year_lo = bcd(tm->tm_year%100),
3361 .month = bcd(tm->tm_mon+1),
3362 .day = bcd(tm->tm_mday),
3363 .rev = htonl(rev),
3364
3365 .compat_level = htonl(info->soft_ver_compat_level)
3366 };
3367
3368 if (info->soft_ver_compat_level == 0)
3369 return init_meta_partition_entry(info->partition_names.soft_ver, &s,
3370 (uint8_t *)(&s.compat_level) - (uint8_t *)(&s),
3371 info->part_trail);
3372 else
3373 return init_meta_partition_entry(info->partition_names.soft_ver, &s,
3374 sizeof(s), info->part_trail);
3375 }
3376
3377 /** Generates the support-list partition */
3378 static struct image_partition_entry make_support_list(
3379 const struct device_info *info)
3380 {
3381 uint32_t len = strlen(info->support_list);
3382 return init_meta_partition_entry(info->partition_names.support_list, info->support_list,
3383 len, info->part_trail);
3384 }
3385
3386 /** Partition with extra-para data */
3387 static struct image_partition_entry make_extra_para(
3388 const struct device_info *info, const uint8_t *extra_para, size_t len)
3389 {
3390 return init_meta_partition_entry(info->partition_names.extra_para, extra_para, len,
3391 info->part_trail);
3392 }
3393
3394 /** Creates a new image partition with an arbitrary name from a file */
3395 static struct image_partition_entry read_file(const char *part_name, const char *filename, bool add_jffs2_eof, struct flash_partition_entry *file_system_partition) {
3396 struct stat statbuf;
3397
3398 if (stat(filename, &statbuf) < 0)
3399 error(1, errno, "unable to stat file `%s'", filename);
3400
3401 size_t len = statbuf.st_size;
3402
3403 if (add_jffs2_eof) {
3404 if (file_system_partition)
3405 len = ALIGN(len + file_system_partition->base, 0x10000) + sizeof(jffs2_eof_mark) - file_system_partition->base;
3406 else
3407 len = ALIGN(len, 0x10000) + sizeof(jffs2_eof_mark);
3408 }
3409
3410 struct image_partition_entry entry = alloc_image_partition(part_name, len);
3411
3412 FILE *file = fopen(filename, "rb");
3413 if (!file)
3414 error(1, errno, "unable to open file `%s'", filename);
3415
3416 if (fread(entry.data, statbuf.st_size, 1, file) != 1)
3417 error(1, errno, "unable to read file `%s'", filename);
3418
3419 if (add_jffs2_eof) {
3420 uint8_t *eof = entry.data + statbuf.st_size, *end = entry.data+entry.size;
3421
3422 memset(eof, 0xff, end - eof - sizeof(jffs2_eof_mark));
3423 memcpy(end - sizeof(jffs2_eof_mark), jffs2_eof_mark, sizeof(jffs2_eof_mark));
3424 }
3425
3426 fclose(file);
3427
3428 return entry;
3429 }
3430
3431 /**
3432 Copies a list of image partitions into an image buffer and generates the image partition table while doing so
3433
3434 Example image partition table:
3435
3436 fwup-ptn partition-table base 0x00800 size 0x00800
3437 fwup-ptn os-image base 0x01000 size 0x113b45
3438 fwup-ptn file-system base 0x114b45 size 0x1d0004
3439 fwup-ptn support-list base 0x2e4b49 size 0x000d1
3440
3441 Each line of the partition table is terminated with the bytes 09 0d 0a ("\t\r\n"),
3442 the end of the partition table is marked with a zero byte.
3443
3444 The firmware image must contain at least the partition-table and support-list partitions
3445 to be accepted. There aren't any alignment constraints for the image partitions.
3446
3447 The partition-table partition contains the actual flash layout; partitions
3448 from the image partition table are mapped to the corresponding flash partitions during
3449 the firmware upgrade. The support-list partition contains a list of devices supported by
3450 the firmware image.
3451
3452 The base offsets in the firmware partition table are relative to the end
3453 of the vendor information block, so the partition-table partition will
3454 actually start at offset 0x1814 of the image.
3455
3456 I think partition-table must be the first partition in the firmware image.
3457 */
3458 static void put_partitions(uint8_t *buffer, const struct flash_partition_entry *flash_parts, const struct image_partition_entry *parts) {
3459 size_t i, j;
3460 char *image_pt = (char *)buffer, *end = image_pt + SAFELOADER_PAYLOAD_TABLE_SIZE;
3461
3462 size_t base = SAFELOADER_PAYLOAD_TABLE_SIZE;
3463 for (i = 0; parts[i].name; i++) {
3464 for (j = 0; flash_parts[j].name; j++) {
3465 if (!strcmp(flash_parts[j].name, parts[i].name)) {
3466 if (parts[i].size > flash_parts[j].size)
3467 error(1, 0, "%s partition too big (more than %u bytes)", flash_parts[j].name, (unsigned)flash_parts[j].size);
3468 break;
3469 }
3470 }
3471
3472 assert(flash_parts[j].name);
3473
3474 memcpy(buffer + base, parts[i].data, parts[i].size);
3475
3476 size_t len = end-image_pt;
3477 size_t w = snprintf(image_pt, len, "fwup-ptn %s base 0x%05x size 0x%05x\t\r\n", parts[i].name, (unsigned)base, (unsigned)parts[i].size);
3478
3479 if (w > len-1)
3480 error(1, 0, "image partition table overflow?");
3481
3482 image_pt += w;
3483
3484 base += parts[i].size;
3485 }
3486 }
3487
3488 /** Generates and writes the image MD5 checksum */
3489 static void put_md5(uint8_t *md5, uint8_t *buffer, unsigned int len) {
3490 MD5_CTX ctx;
3491
3492 MD5_Init(&ctx);
3493 MD5_Update(&ctx, md5_salt, (unsigned int)sizeof(md5_salt));
3494 MD5_Update(&ctx, buffer, len);
3495 MD5_Final(md5, &ctx);
3496 }
3497
3498
3499 /**
3500 Generates the firmware image in factory format
3501
3502 Image format:
3503
3504 Bytes (hex) Usage
3505 ----------- -----
3506 0000-0003 Image size (4 bytes, big endian)
3507 0004-0013 MD5 hash (hash of a 16 byte salt and the image data starting with byte 0x14)
3508 0014-0017 Vendor information length (without padding) (4 bytes, big endian)
3509 0018-1013 Vendor information (4092 bytes, padded with 0xff; there seem to be older
3510 (VxWorks-based) TP-LINK devices which use a smaller vendor information block)
3511 1014-1813 Image partition table (2048 bytes, padded with 0xff)
3512 1814-xxxx Firmware partitions
3513 */
3514 static void * generate_factory_image(struct device_info *info, const struct image_partition_entry *parts, size_t *len) {
3515 *len = SAFELOADER_PAYLOAD_OFFSET + SAFELOADER_PAYLOAD_TABLE_SIZE;
3516
3517 size_t i;
3518 for (i = 0; parts[i].name; i++)
3519 *len += parts[i].size;
3520
3521 uint8_t *image = malloc(*len);
3522 if (!image)
3523 error(1, errno, "malloc");
3524
3525 memset(image, 0xff, *len);
3526 put32(image, *len);
3527
3528 if (info->vendor) {
3529 size_t vendor_len = strlen(info->vendor);
3530 put32(image + SAFELOADER_PREAMBLE_SIZE, vendor_len);
3531 memcpy(image + SAFELOADER_PREAMBLE_SIZE + 0x4, info->vendor, vendor_len);
3532 }
3533
3534 put_partitions(image + SAFELOADER_PAYLOAD_OFFSET, info->partitions, parts);
3535 put_md5(image + 0x04, image + SAFELOADER_PREAMBLE_SIZE, *len - SAFELOADER_PREAMBLE_SIZE);
3536
3537 return image;
3538 }
3539
3540 /**
3541 Generates the firmware image in sysupgrade format
3542
3543 This makes some assumptions about the provided flash and image partition tables and
3544 should be generalized when TP-LINK starts building its safeloader into hardware with
3545 different flash layouts.
3546 */
3547 static void * generate_sysupgrade_image(struct device_info *info, const struct image_partition_entry *image_parts, size_t *len) {
3548 size_t i, j;
3549 size_t flash_first_partition_index = 0;
3550 size_t flash_last_partition_index = 0;
3551 const struct flash_partition_entry *flash_first_partition = NULL;
3552 const struct flash_partition_entry *flash_last_partition = NULL;
3553 const struct image_partition_entry *image_last_partition = NULL;
3554
3555 /** Find first and last partitions */
3556 for (i = 0; info->partitions[i].name; i++) {
3557 if (!strcmp(info->partitions[i].name, info->first_sysupgrade_partition)) {
3558 flash_first_partition = &info->partitions[i];
3559 flash_first_partition_index = i;
3560 } else if (!strcmp(info->partitions[i].name, info->last_sysupgrade_partition)) {
3561 flash_last_partition = &info->partitions[i];
3562 flash_last_partition_index = i;
3563 }
3564 }
3565
3566 assert(flash_first_partition && flash_last_partition);
3567 assert(flash_first_partition_index < flash_last_partition_index);
3568
3569 /** Find last partition from image to calculate needed size */
3570 for (i = 0; image_parts[i].name; i++) {
3571 if (!strcmp(image_parts[i].name, info->last_sysupgrade_partition)) {
3572 image_last_partition = &image_parts[i];
3573 break;
3574 }
3575 }
3576
3577 assert(image_last_partition);
3578
3579 *len = flash_last_partition->base - flash_first_partition->base + image_last_partition->size;
3580
3581 uint8_t *image = malloc(*len);
3582 if (!image)
3583 error(1, errno, "malloc");
3584
3585 memset(image, 0xff, *len);
3586
3587 for (i = flash_first_partition_index; i <= flash_last_partition_index; i++) {
3588 for (j = 0; image_parts[j].name; j++) {
3589 if (!strcmp(info->partitions[i].name, image_parts[j].name)) {
3590 if (image_parts[j].size > info->partitions[i].size)
3591 error(1, 0, "%s partition too big (more than %u bytes)", info->partitions[i].name, (unsigned)info->partitions[i].size);
3592 memcpy(image + info->partitions[i].base - flash_first_partition->base, image_parts[j].data, image_parts[j].size);
3593 break;
3594 }
3595
3596 assert(image_parts[j].name);
3597 }
3598 }
3599
3600 return image;
3601 }
3602
3603 /** Generates an image according to a given layout and writes it to a file */
3604 static void build_image(const char *output,
3605 const char *kernel_image,
3606 const char *rootfs_image,
3607 uint32_t rev,
3608 bool add_jffs2_eof,
3609 bool sysupgrade,
3610 struct device_info *info) {
3611
3612 size_t i;
3613
3614 struct image_partition_entry parts[7] = {};
3615
3616 struct flash_partition_entry *firmware_partition = NULL;
3617 struct flash_partition_entry *os_image_partition = NULL;
3618 struct flash_partition_entry *file_system_partition = NULL;
3619 size_t firmware_partition_index = 0;
3620
3621 set_partition_names(info);
3622
3623 for (i = 0; info->partitions[i].name; i++) {
3624 if (!strcmp(info->partitions[i].name, "firmware"))
3625 {
3626 firmware_partition = &info->partitions[i];
3627 firmware_partition_index = i;
3628 }
3629 }
3630
3631 if (firmware_partition)
3632 {
3633 os_image_partition = &info->partitions[firmware_partition_index];
3634 file_system_partition = &info->partitions[firmware_partition_index + 1];
3635
3636 struct stat kernel;
3637 if (stat(kernel_image, &kernel) < 0)
3638 error(1, errno, "unable to stat file `%s'", kernel_image);
3639
3640 if (kernel.st_size > firmware_partition->size)
3641 error(1, 0, "kernel overflowed firmware partition\n");
3642
3643 for (i = MAX_PARTITIONS-1; i >= firmware_partition_index + 1; i--)
3644 info->partitions[i+1] = info->partitions[i];
3645
3646 file_system_partition->name = info->partition_names.file_system;
3647
3648 file_system_partition->base = firmware_partition->base + kernel.st_size;
3649
3650 /* Align partition start to erase blocks for factory images only */
3651 if (!sysupgrade)
3652 file_system_partition->base = ALIGN(firmware_partition->base + kernel.st_size, 0x10000);
3653
3654 file_system_partition->size = firmware_partition->size - file_system_partition->base;
3655
3656 os_image_partition->name = info->partition_names.os_image;
3657
3658 os_image_partition->size = kernel.st_size;
3659 }
3660
3661 parts[0] = make_partition_table(info);
3662 parts[1] = make_soft_version(info, rev);
3663 parts[2] = make_support_list(info);
3664 parts[3] = read_file(info->partition_names.os_image, kernel_image, false, NULL);
3665 parts[4] = read_file(info->partition_names.file_system, rootfs_image, add_jffs2_eof, file_system_partition);
3666
3667
3668 /* Some devices need the extra-para partition to accept the firmware */
3669 if (strcasecmp(info->id, "ARCHER-A6-V3") == 0 ||
3670 strcasecmp(info->id, "ARCHER-A7-V5") == 0 ||
3671 strcasecmp(info->id, "ARCHER-A9-V6") == 0 ||
3672 strcasecmp(info->id, "ARCHER-AX23-V1") == 0 ||
3673 strcasecmp(info->id, "ARCHER-C2-V3") == 0 ||
3674 strcasecmp(info->id, "ARCHER-C7-V4") == 0 ||
3675 strcasecmp(info->id, "ARCHER-C7-V5") == 0 ||
3676 strcasecmp(info->id, "ARCHER-C25-V1") == 0 ||
3677 strcasecmp(info->id, "ARCHER-C59-V2") == 0 ||
3678 strcasecmp(info->id, "ARCHER-C60-V2") == 0 ||
3679 strcasecmp(info->id, "ARCHER-C60-V3") == 0 ||
3680 strcasecmp(info->id, "ARCHER-C6U-V1") == 0 ||
3681 strcasecmp(info->id, "ARCHER-C6-V3") == 0 ||
3682 strcasecmp(info->id, "DECO-M4R-V4") == 0 ||
3683 strcasecmp(info->id, "MR70X") == 0 ||
3684 strcasecmp(info->id, "TLWR1043NV5") == 0) {
3685 const uint8_t extra_para[2] = {0x01, 0x00};
3686 parts[5] = make_extra_para(info, extra_para,
3687 sizeof(extra_para));
3688 } else if (strcasecmp(info->id, "ARCHER-C6-V2") == 0 ||
3689 strcasecmp(info->id, "TL-WA1201-V2") == 0) {
3690 const uint8_t extra_para[2] = {0x00, 0x01};
3691 parts[5] = make_extra_para(info, extra_para,
3692 sizeof(extra_para));
3693 } else if (strcasecmp(info->id, "ARCHER-C6-V2-US") == 0 ||
3694 strcasecmp(info->id, "EAP245-V3") == 0) {
3695 const uint8_t extra_para[2] = {0x01, 0x01};
3696 parts[5] = make_extra_para(info, extra_para,
3697 sizeof(extra_para));
3698 }
3699
3700 size_t len;
3701 void *image;
3702 if (sysupgrade)
3703 image = generate_sysupgrade_image(info, parts, &len);
3704 else
3705 image = generate_factory_image(info, parts, &len);
3706
3707 FILE *file = fopen(output, "wb");
3708 if (!file)
3709 error(1, errno, "unable to open output file");
3710
3711 if (fwrite(image, len, 1, file) != 1)
3712 error(1, 0, "unable to write output file");
3713
3714 fclose(file);
3715
3716 free(image);
3717
3718 for (i = 0; parts[i].name; i++)
3719 free_image_partition(&parts[i]);
3720 }
3721
3722 /** Usage output */
3723 static void usage(const char *argv0) {
3724 fprintf(stderr,
3725 "Usage: %s [OPTIONS...]\n"
3726 "\n"
3727 "Options:\n"
3728 " -h show this help\n"
3729 "\n"
3730 "Info about an image:\n"
3731 " -i <file> input file to read from\n"
3732 "Create a new image:\n"
3733 " -B <board> create image for the board specified with <board>\n"
3734 " -k <file> read kernel image from the file <file>\n"
3735 " -r <file> read rootfs image from the file <file>\n"
3736 " -o <file> write output to the file <file>\n"
3737 " -V <rev> sets the revision number to <rev>\n"
3738 " -j add jffs2 end-of-filesystem markers\n"
3739 " -S create sysupgrade instead of factory image\n"
3740 "Extract an old image:\n"
3741 " -x <file> extract all oem firmware partition\n"
3742 " -d <dir> destination to extract the firmware partition\n"
3743 " -z <file> convert an oem firmware into a sysupgade file. Use -o for output file\n",
3744 argv0
3745 );
3746 };
3747
3748
3749 static struct device_info *find_board(const char *id)
3750 {
3751 struct device_info *board = NULL;
3752
3753 for (board = boards; board->id != NULL; board++)
3754 if (strcasecmp(id, board->id) == 0)
3755 return board;
3756
3757 return NULL;
3758 }
3759
3760 static int add_flash_partition(
3761 struct flash_partition_entry *part_list,
3762 size_t max_entries,
3763 const char *name,
3764 unsigned long base,
3765 unsigned long size)
3766 {
3767 size_t ptr;
3768 /* check if the list has a free entry */
3769 for (ptr = 0; ptr < max_entries; ptr++, part_list++) {
3770 if (part_list->name == NULL &&
3771 part_list->base == 0 &&
3772 part_list->size == 0)
3773 break;
3774 }
3775
3776 if (ptr == max_entries) {
3777 error(1, 0, "No free flash part entry available.");
3778 }
3779
3780 part_list->name = calloc(1, strlen(name) + 1);
3781 if (!part_list->name) {
3782 error(1, 0, "Unable to allocate memory");
3783 }
3784
3785 memcpy((char *)part_list->name, name, strlen(name));
3786 part_list->base = base;
3787 part_list->size = size;
3788
3789 return 0;
3790 }
3791
3792 /** read the partition table into struct flash_partition_entry */
3793 enum PARTITION_TABLE_TYPE {
3794 PARTITION_TABLE_FWUP,
3795 PARTITION_TABLE_FLASH,
3796 };
3797
3798 static int read_partition_table(
3799 FILE *file, long offset,
3800 struct flash_partition_entry *entries, size_t max_entries,
3801 int type)
3802 {
3803 char buf[SAFELOADER_PAYLOAD_TABLE_SIZE];
3804 char *ptr, *end;
3805 const char *parthdr = NULL;
3806 const char *fwuphdr = "fwup-ptn";
3807 const char *flashhdr = "partition";
3808
3809 /* TODO: search for the partition table */
3810
3811 switch(type) {
3812 case PARTITION_TABLE_FWUP:
3813 parthdr = fwuphdr;
3814 break;
3815 case PARTITION_TABLE_FLASH:
3816 parthdr = flashhdr;
3817 break;
3818 default:
3819 error(1, 0, "Invalid partition table");
3820 }
3821
3822 if (fseek(file, offset, SEEK_SET) < 0)
3823 error(1, errno, "Can not seek in the firmware");
3824
3825 if (fread(buf, sizeof(buf), 1, file) != 1)
3826 error(1, errno, "Can not read fwup-ptn from the firmware");
3827
3828 buf[sizeof(buf) - 1] = '\0';
3829
3830 /* look for the partition header */
3831 if (memcmp(buf, parthdr, strlen(parthdr)) != 0) {
3832 fprintf(stderr, "DEBUG: can not find fwuphdr\n");
3833 return 1;
3834 }
3835
3836 ptr = buf;
3837 end = buf + sizeof(buf);
3838 while ((ptr + strlen(parthdr)) < end &&
3839 memcmp(ptr, parthdr, strlen(parthdr)) == 0) {
3840 char *end_part;
3841 char *end_element;
3842
3843 char name[32] = { 0 };
3844 int name_len = 0;
3845 unsigned long base = 0;
3846 unsigned long size = 0;
3847
3848 end_part = memchr(ptr, '\n', (end - ptr));
3849 if (end_part == NULL) {
3850 /* in theory this should never happen, because a partition always ends with 0x09, 0x0D, 0x0A */
3851 break;
3852 }
3853
3854 for (int i = 0; i <= 4; i++) {
3855 if (end_part <= ptr)
3856 break;
3857
3858 end_element = memchr(ptr, 0x20, (end_part - ptr));
3859 if (end_element == NULL) {
3860 error(1, errno, "Ignoring the rest of the partition entries.");
3861 break;
3862 }
3863
3864 switch (i) {
3865 /* partition header */
3866 case 0:
3867 ptr = end_element + 1;
3868 continue;
3869 /* name */
3870 case 1:
3871 name_len = (end_element - ptr) > 31 ? 31 : (end_element - ptr);
3872 strncpy(name, ptr, name_len);
3873 name[name_len] = '\0';
3874 ptr = end_element + 1;
3875 continue;
3876
3877 /* string "base" */
3878 case 2:
3879 ptr = end_element + 1;
3880 continue;
3881
3882 /* actual base */
3883 case 3:
3884 base = strtoul(ptr, NULL, 16);
3885 ptr = end_element + 1;
3886 continue;
3887
3888 /* string "size" */
3889 case 4:
3890 ptr = end_element + 1;
3891 /* actual size. The last element doesn't have a sepeartor */
3892 size = strtoul(ptr, NULL, 16);
3893 /* the part ends with 0x09, 0x0d, 0x0a */
3894 ptr = end_part + 1;
3895 add_flash_partition(entries, max_entries, name, base, size);
3896 continue;
3897 }
3898 }
3899 }
3900
3901 return 0;
3902 }
3903
3904 static void safeloader_read_partition(FILE *input_file, size_t payload_offset,
3905 struct flash_partition_entry *entry,
3906 struct image_partition_entry *part)
3907 {
3908 size_t part_size = entry->size;
3909 void *part_data = malloc(part_size);
3910
3911 if (fseek(input_file, payload_offset, SEEK_SET))
3912 error(1, errno, "Failed to seek to partition data");
3913
3914 if (!part_data)
3915 error(1, ENOMEM, "Failed to allocate partition data");
3916
3917 if (fread(part_data, 1, part_size, input_file) < part_size)
3918 error(1, errno, "Failed to read partition data");
3919
3920 part->data = part_data;
3921 part->size = part_size;
3922 part->name = entry->name;
3923 }
3924
3925 static void safeloader_parse_image(FILE *input_file, struct safeloader_image_info *image)
3926 {
3927 static const char *HEADER_ID_CLOUD = "fw-type:Cloud";
3928 static const char *HEADER_ID_QNEW = "?NEW";
3929
3930 char buf[64];
3931
3932 if (!input_file)
3933 return;
3934
3935 fseek(input_file, SAFELOADER_PREAMBLE_SIZE, SEEK_SET);
3936
3937 if (fread(buf, sizeof(buf), 1, input_file) != 1)
3938 error(1, errno, "Can not read image header");
3939
3940 if (memcmp(HEADER_ID_QNEW, &buf[0], strlen(HEADER_ID_QNEW)) == 0)
3941 image->type = SAFELOADER_TYPE_QNEW;
3942 else if (memcmp(HEADER_ID_CLOUD, &buf[0], strlen(HEADER_ID_CLOUD)) == 0)
3943 image->type = SAFELOADER_TYPE_CLOUD;
3944 else if (ntohl(*((uint32_t *) &buf[0])) <= SAFELOADER_HEADER_SIZE)
3945 image->type = SAFELOADER_TYPE_VENDOR;
3946 else
3947 image->type = SAFELOADER_TYPE_DEFAULT;
3948
3949 switch (image->type) {
3950 case SAFELOADER_TYPE_DEFAULT:
3951 case SAFELOADER_TYPE_VENDOR:
3952 case SAFELOADER_TYPE_CLOUD:
3953 image->payload_offset = SAFELOADER_PAYLOAD_OFFSET;
3954 break;
3955 case SAFELOADER_TYPE_QNEW:
3956 image->payload_offset = SAFELOADER_QNEW_PAYLOAD_OFFSET;
3957 break;
3958 }
3959
3960 /* Parse image partition table */
3961 read_partition_table(input_file, image->payload_offset, &image->entries[0],
3962 MAX_PARTITIONS, PARTITION_TABLE_FWUP);
3963 }
3964
3965 static void write_partition(
3966 FILE *input_file,
3967 size_t firmware_offset,
3968 struct flash_partition_entry *entry,
3969 FILE *output_file)
3970 {
3971 char buf[4096];
3972 size_t offset;
3973
3974 fseek(input_file, entry->base + firmware_offset, SEEK_SET);
3975
3976 for (offset = 0; sizeof(buf) + offset <= entry->size; offset += sizeof(buf)) {
3977 if (fread(buf, sizeof(buf), 1, input_file) != 1)
3978 error(1, errno, "Can not read partition from input_file");
3979
3980 if (fwrite(buf, sizeof(buf), 1, output_file) != 1)
3981 error(1, errno, "Can not write partition to output_file");
3982 }
3983 /* write last chunk smaller than buffer */
3984 if (offset < entry->size) {
3985 offset = entry->size - offset;
3986 if (fread(buf, offset, 1, input_file) != 1)
3987 error(1, errno, "Can not read partition from input_file");
3988 if (fwrite(buf, offset, 1, output_file) != 1)
3989 error(1, errno, "Can not write partition to output_file");
3990 }
3991 }
3992
3993 static int extract_firmware_partition(FILE *input_file, size_t firmware_offset, struct flash_partition_entry *entry, const char *output_directory)
3994 {
3995 FILE *output_file;
3996 char output[PATH_MAX];
3997
3998 snprintf(output, PATH_MAX, "%s/%s", output_directory, entry->name);
3999 output_file = fopen(output, "wb+");
4000 if (output_file == NULL) {
4001 error(1, errno, "Can not open output file %s", output);
4002 }
4003
4004 write_partition(input_file, firmware_offset, entry, output_file);
4005
4006 fclose(output_file);
4007
4008 return 0;
4009 }
4010
4011 /** extract all partitions from the firmware file */
4012 static int extract_firmware(const char *input, const char *output_directory)
4013 {
4014 struct safeloader_image_info info = {};
4015 struct stat statbuf;
4016 FILE *input_file;
4017
4018 /* check input file */
4019 if (stat(input, &statbuf)) {
4020 error(1, errno, "Can not read input firmware %s", input);
4021 }
4022
4023 /* check if output directory exists */
4024 if (stat(output_directory, &statbuf)) {
4025 error(1, errno, "Failed to stat output directory %s", output_directory);
4026 }
4027
4028 if ((statbuf.st_mode & S_IFMT) != S_IFDIR) {
4029 error(1, errno, "Given output directory is not a directory %s", output_directory);
4030 }
4031
4032 input_file = fopen(input, "rb");
4033 safeloader_parse_image(input_file, &info);
4034
4035 for (size_t i = 0; i < MAX_PARTITIONS && info.entries[i].name; i++)
4036 extract_firmware_partition(input_file, info.payload_offset, &info.entries[i], output_directory);
4037
4038 return 0;
4039 }
4040
4041 static struct flash_partition_entry *find_partition(
4042 struct flash_partition_entry *entries, size_t max_entries,
4043 const char *name, const char *error_msg)
4044 {
4045 for (size_t i = 0; i < max_entries; i++, entries++) {
4046 if (strcmp(entries->name, name) == 0)
4047 return entries;
4048 }
4049
4050 if (error_msg) {
4051 error(1, 0, "%s", error_msg);
4052 }
4053
4054 return NULL;
4055 }
4056
4057 static int firmware_info(const char *input)
4058 {
4059 struct safeloader_image_info info = {};
4060 struct image_partition_entry part = {};
4061 struct flash_partition_entry *e;
4062 FILE *input_file;
4063
4064 input_file = fopen(input, "rb");
4065
4066 safeloader_parse_image(input_file, &info);
4067
4068 if (info.type == SAFELOADER_TYPE_VENDOR) {
4069 char buf[SAFELOADER_HEADER_SIZE] = {};
4070 uint32_t vendor_size;
4071
4072 fseek(input_file, SAFELOADER_PREAMBLE_SIZE, SEEK_SET);
4073 fread(&vendor_size, sizeof(uint32_t), 1, input_file);
4074
4075 vendor_size = ntohl(vendor_size);
4076 fread(buf, vendor_size, 1, input_file);
4077
4078 printf("Firmware vendor string:\n");
4079 fwrite(buf, strnlen(buf, vendor_size), 1, stdout);
4080 printf("\n");
4081 }
4082
4083 printf("Firmware image partitions:\n");
4084 printf("%-8s %-8s %s\n", "base", "size", "name");
4085
4086 e = &info.entries[0];
4087 for (unsigned int i = 0; i < MAX_PARTITIONS && e->name; i++, e++)
4088 printf("%08x %08x %s\n", e->base, e->size, e->name);
4089
4090 e = find_partition(&info.entries[0], MAX_PARTITIONS, "soft-version", NULL);
4091 if (e) {
4092 struct soft_version *s;
4093 unsigned int ascii_len;
4094 const uint8_t *buf;
4095 size_t data_len;
4096 bool isstr;
4097
4098 safeloader_read_partition(input_file, info.payload_offset + e->base, e, &part);
4099 data_len = ntohl(((struct meta_header *) part.data)->length);
4100 buf = part.data + sizeof(struct meta_header);
4101
4102 /* Check for (null-terminated) string */
4103 ascii_len = 0;
4104 while (ascii_len < data_len && isascii(buf[ascii_len]))
4105 ascii_len++;
4106
4107 isstr = ascii_len == data_len;
4108
4109 printf("\n[Software version]\n");
4110 if (isstr) {
4111 fwrite(buf, strnlen((const char *) buf, data_len), 1, stdout);
4112 putchar('\n');
4113 } else if (data_len >= offsetof(struct soft_version, rev)) {
4114 s = (struct soft_version *) buf;
4115
4116 printf("Version: %d.%d.%d\n", s->version_major, s->version_minor, s->version_patch);
4117 printf("Date: %02x%02x-%02x-%02x\n", s->year_hi, s->year_lo, s->month, s->day);
4118 printf("Revision: %d\n", ntohl(s->rev));
4119 } else {
4120 printf("Failed to parse data\n");
4121 }
4122
4123 free_image_partition(&part);
4124 }
4125
4126 e = find_partition(&info.entries[0], MAX_PARTITIONS, "support-list", NULL);
4127 if (e) {
4128 size_t data_len;
4129
4130 safeloader_read_partition(input_file, info.payload_offset + e->base, e, &part);
4131 data_len = ntohl(((struct meta_header *) part.data)->length);
4132
4133 printf("\n[Support list]\n");
4134 fwrite(part.data + sizeof(struct meta_header), data_len, 1, stdout);
4135 printf("\n");
4136
4137 free_image_partition(&part);
4138 }
4139
4140 e = find_partition(&info.entries[0], MAX_PARTITIONS, "partition-table", NULL);
4141 if (e) {
4142 size_t flash_table_offset = info.payload_offset + e->base + 4;
4143 struct flash_partition_entry parts[MAX_PARTITIONS] = {};
4144
4145 if (read_partition_table(input_file, flash_table_offset, parts, MAX_PARTITIONS, PARTITION_TABLE_FLASH))
4146 error(1, 0, "Error can not read the partition table (partition)");
4147
4148 printf("\n[Partition table]\n");
4149 printf("%-8s %-8s %s\n", "base", "size", "name");
4150
4151 e = &parts[0];
4152 for (unsigned int i = 0; i < MAX_PARTITIONS && e->name; i++, e++)
4153 printf("%08x %08x %s\n", e->base, e->size, e->name);
4154 }
4155
4156 fclose(input_file);
4157
4158 return 0;
4159 }
4160
4161 static void write_ff(FILE *output_file, size_t size)
4162 {
4163 char buf[4096];
4164 size_t offset;
4165
4166 memset(buf, 0xff, sizeof(buf));
4167
4168 for (offset = 0; offset + sizeof(buf) < size ; offset += sizeof(buf)) {
4169 if (fwrite(buf, sizeof(buf), 1, output_file) != 1)
4170 error(1, errno, "Can not write 0xff to output_file");
4171 }
4172
4173 /* write last chunk smaller than buffer */
4174 if (offset < size) {
4175 offset = size - offset;
4176 if (fwrite(buf, offset, 1, output_file) != 1)
4177 error(1, errno, "Can not write partition to output_file");
4178 }
4179 }
4180
4181 static void convert_firmware(const char *input, const char *output)
4182 {
4183 struct flash_partition_entry flash[MAX_PARTITIONS] = {};
4184 struct flash_partition_entry *fwup_partition_table;
4185 struct flash_partition_entry *flash_file_system;
4186 struct flash_partition_entry *fwup_file_system;
4187 struct flash_partition_entry *flash_os_image;
4188 struct flash_partition_entry *fwup_os_image;
4189 struct safeloader_image_info info = {};
4190 size_t flash_table_offset;
4191 struct stat statbuf;
4192 FILE *output_file;
4193 FILE *input_file;
4194
4195 /* check input file */
4196 if (stat(input, &statbuf)) {
4197 error(1, errno, "Can not read input firmware %s", input);
4198 }
4199
4200 input_file = fopen(input, "rb");
4201 if (!input_file)
4202 error(1, 0, "Can not open input firmware %s", input);
4203
4204 output_file = fopen(output, "wb");
4205 if (!output_file)
4206 error(1, 0, "Can not open output firmware %s", output);
4207
4208 input_file = fopen(input, "rb");
4209 safeloader_parse_image(input_file, &info);
4210
4211 fwup_os_image = find_partition(info.entries, MAX_PARTITIONS,
4212 "os-image", "Error can not find os-image partition (fwup)");
4213 fwup_file_system = find_partition(info.entries, MAX_PARTITIONS,
4214 "file-system", "Error can not find file-system partition (fwup)");
4215 fwup_partition_table = find_partition(info.entries, MAX_PARTITIONS,
4216 "partition-table", "Error can not find partition-table partition");
4217
4218 /* the flash partition table has a 0x00000004 magic haeder */
4219 flash_table_offset = info.payload_offset + fwup_partition_table->base + 4;
4220 if (read_partition_table(input_file, flash_table_offset, flash, MAX_PARTITIONS, PARTITION_TABLE_FLASH) != 0)
4221 error(1, 0, "Error can not read the partition table (flash)");
4222
4223 flash_os_image = find_partition(flash, MAX_PARTITIONS,
4224 "os-image", "Error can not find os-image partition (flash)");
4225 flash_file_system = find_partition(flash, MAX_PARTITIONS,
4226 "file-system", "Error can not find file-system partition (flash)");
4227
4228 /* write os_image to 0x0 */
4229 write_partition(input_file, info.payload_offset, fwup_os_image, output_file);
4230 write_ff(output_file, flash_os_image->size - fwup_os_image->size);
4231
4232 /* write file-system behind os_image */
4233 fseek(output_file, flash_file_system->base - flash_os_image->base, SEEK_SET);
4234 write_partition(input_file, info.payload_offset, fwup_file_system, output_file);
4235
4236 fclose(output_file);
4237 fclose(input_file);
4238 }
4239
4240 int main(int argc, char *argv[]) {
4241 const char *info_image = NULL, *board = NULL, *kernel_image = NULL, *rootfs_image = NULL, *output = NULL;
4242 const char *extract_image = NULL, *output_directory = NULL, *convert_image = NULL;
4243 bool add_jffs2_eof = false, sysupgrade = false;
4244 unsigned rev = 0;
4245 struct device_info *info;
4246 set_source_date_epoch();
4247
4248 while (true) {
4249 int c;
4250
4251 c = getopt(argc, argv, "i:B:k:r:o:V:jSh:x:d:z:");
4252 if (c == -1)
4253 break;
4254
4255 switch (c) {
4256 case 'i':
4257 info_image = optarg;
4258 break;
4259
4260 case 'B':
4261 board = optarg;
4262 break;
4263
4264 case 'k':
4265 kernel_image = optarg;
4266 break;
4267
4268 case 'r':
4269 rootfs_image = optarg;
4270 break;
4271
4272 case 'o':
4273 output = optarg;
4274 break;
4275
4276 case 'V':
4277 sscanf(optarg, "r%u", &rev);
4278 break;
4279
4280 case 'j':
4281 add_jffs2_eof = true;
4282 break;
4283
4284 case 'S':
4285 sysupgrade = true;
4286 break;
4287
4288 case 'h':
4289 usage(argv[0]);
4290 return 0;
4291
4292 case 'd':
4293 output_directory = optarg;
4294 break;
4295
4296 case 'x':
4297 extract_image = optarg;
4298 break;
4299
4300 case 'z':
4301 convert_image = optarg;
4302 break;
4303
4304 default:
4305 usage(argv[0]);
4306 return 1;
4307 }
4308 }
4309
4310 if (info_image) {
4311 firmware_info(info_image);
4312 } else if (extract_image || output_directory) {
4313 if (!extract_image)
4314 error(1, 0, "No factory/oem image given via -x <file>. Output directory is only valid with -x");
4315 if (!output_directory)
4316 error(1, 0, "Can not extract an image without output directory. Use -d <dir>");
4317 extract_firmware(extract_image, output_directory);
4318 } else if (convert_image) {
4319 if (!output)
4320 error(1, 0, "Can not convert a factory/oem image into sysupgrade image without output file. Use -o <file>");
4321 convert_firmware(convert_image, output);
4322 } else {
4323 if (!board)
4324 error(1, 0, "no board has been specified");
4325 if (!kernel_image)
4326 error(1, 0, "no kernel image has been specified");
4327 if (!rootfs_image)
4328 error(1, 0, "no rootfs image has been specified");
4329 if (!output)
4330 error(1, 0, "no output filename has been specified");
4331
4332 info = find_board(board);
4333
4334 if (info == NULL)
4335 error(1, 0, "unsupported board %s", board);
4336
4337 build_image(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade, info);
4338 }
4339
4340 return 0;
4341 }