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