2 * makeamitbin - create firmware binaries for MGB100
4 * Copyright (C) 2007 Volker Weiss <dev@tintuc.de>
5 * Christian Welzel <dev@welzel-online.ch>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 /* defaults: Level One WAP-0007 */
30 static char *ascii1
= "DDC_RUS001";
31 static char *ascii2
= "Queen";
33 static struct hdrinfo
{
35 unsigned long unknown
; /* can probably be any number, maybe version number */
40 { "bios", 0xc76be111, 1, 0x3fa000, 0x006000 }, /* BIOS */
41 { "recovery", 0xc76be222, 0, 0x3f0000, 0x004000 }, /* Recovery Loader */
42 { "linux", 0xc76bee9d, 0, 0x000000, 0x100000 }, /* Linux */
43 { "ramdisk", 0xc76bee9d, 0, 0x100000, 0x280000 }, /* ramdisk */
44 { "amitconfig", 0xc76bee8b, 0, 0x380000, 0x060000 }, /* AMIT config */
45 { "redboot", 0x00000000, 1, 0x3d0000, 0x030000 }, /* Redboot 128kB image */
46 { "redbootlow", 0, 0, 0x3e0000, 0x18000 }, /* Redboot 1. part */
47 { "redboothigh", 0, 0, 0x3fa000, 0x6000 }, /* Redboot 2. part */
48 { "linux3g", 0xcb5f06b5, 0, 0x000000, 0x100000 }, /* Linux */
49 { "ramdisk3g", 0xcb5f06b5, 0, 0x100000, 0x280000 }, /* ramdisk */
64 20060106_DDC_WAP-0007_R400b4
84 WAP-0007(R4.00b8)_2006-10-02
97 #define COPY_SHORT(d, o, v) d[o+0] = (unsigned char)((v) & 0xff); \
98 d[o+1] = (unsigned char)(((v) >> 8) & 0xff)
99 #define COPY_LONG(d, o, v) d[o+0] = (unsigned char)((v) & 0xff); \
100 d[o+1] = (unsigned char)(((v) >> 8) & 0xff); \
101 d[o+2] = (unsigned char)(((v) >> 16) & 0xff); \
102 d[o+3] = (unsigned char)(((v) >> 24) & 0xff)
103 #define READ_SHORT(d, o) ((unsigned short)(d[o+0]) + \
104 (((unsigned short)(d[o+1])) << 8))
107 00..0d ASCII product ID
108 0e..0f checksum of payload
110 1c..1f AMIT BIOS: 11e1 6bc7, Recovery Tool: 22e2 6bc7
111 Linux: 5dc3 47c8, ramdisk: 5cc3 47c8
112 AMIT FS: 21c3 47c8 VERSION NUMBER??????
113 20..23 offset in flash aligned to segment boundary
114 24..27 length in flash aligned to segment boundary
115 28..2b offset in flash (payload)
116 2c..2f length (payload)
118 40..47 always 4248 0101 5000 0001 (last maybe .....0501)
119 48..4b same as 20..23
121 4e..4f inverted checksum of header
124 unsigned short checksum(unsigned char *data
, long size
)
127 unsigned short d
, cs
= 0;
128 for (n
= 0; n
< size
; n
+= 2)
130 d
= READ_SHORT(data
, n
);
145 void showhdr(unsigned char *hdr
)
148 for (j
= 0; j
< 5; j
++)
150 for (i
= 0; i
< 16; i
++)
152 printf("%02x ", (unsigned int)(hdr
[j
* 16 + i
]));
155 for (i
= 0; i
< 16; i
++)
157 unsigned char d
= hdr
[j
* 16 + i
];
158 printf("%c", (d
>= ' ' && d
< 127) ? d
: '.');
164 void makehdr(unsigned char *hdr
, struct hdrinfo
*info
,
165 unsigned char *data
, long size
, int last
)
167 unsigned int offset
= info
->addr
+ 0x10;
168 memset(hdr
, 0, HDRSIZE
);
170 offset
= info
->addr
+ info
->size
- size
; /* top align */
171 strncpy((char *)hdr
+ 0x00, ascii1
, 14);
172 strncpy((char *)hdr
+ 0x10, ascii2
, 12);
173 COPY_LONG(hdr
, 0x1c, info
->unknown
);
174 COPY_LONG(hdr
, 0x20, info
->addr
);
175 COPY_LONG(hdr
, 0x24, info
->size
);
176 COPY_LONG(hdr
, 0x28, offset
);
177 COPY_LONG(hdr
, 0x2c, size
);
178 COPY_LONG(hdr
, 0x40, 0x01014842);
179 COPY_LONG(hdr
, 0x44, last
? 0x01050050 : 0x01000050);
180 COPY_LONG(hdr
, 0x48, info
->addr
);
181 COPY_SHORT(hdr
, 0x4c, info
->unknown
== 0xcb5f06b5 ? 0x0016 : 0x000b);
182 COPY_SHORT(hdr
, 0x0e, checksum(data
, size
));
183 COPY_SHORT(hdr
, 0x4e, ~checksum(hdr
, HDRSIZE
));
186 unsigned char *read_file(const char *name
, long *size
)
189 unsigned char *data
= NULL
;
191 f
= fopen(name
, "r");
194 if (fseek(f
, 0, SEEK_END
) == 0)
199 if (fseek(f
, 0, SEEK_SET
) == 0)
201 data
= (unsigned char *)malloc(*size
);
204 if (fread(data
, sizeof(char), *size
, f
) != *size
)
218 struct hdrinfo
*find_hdrinfo(const char *name
)
221 for (n
= 0; hdrinfo
[n
].name
!= NULL
; n
++)
223 if (strcmp(name
, hdrinfo
[n
].name
) == 0)
229 void oferror(FILE *f
)
231 printf("file error\n");
237 printf("Syntax: makeamitbin [options]\n");
238 printf("Options:\n");
239 printf(" -1 ID1\tFirmware identifier 1, e.g. 'DDC_RUS001' for manufacturer LevelOne\n");
240 printf(" -2 ID2\tFirmware identifier 2, 'Queen' in all known cases\n");
241 printf(" -o FILE\tOutput file\n");
242 printf(" -ids\t\tShow a list of known firmware identifiers.\n");
246 void show_fwids(void)
248 printf("List of known firmware identifiers:\n");
249 printf("Manufacturer\t\tProduct\t\tIdentifier\n");
250 printf("=====================================================\n");
251 printf("Conceptronic\t\tCHD2WLANU\tLLM_RUS001\n");
252 printf("Pearl\t\t\tPE6643\t\tQueen\n");
253 printf("Micronica\t\tMGB100\t\tQueen\n");
254 printf("LevelOne\t\tWAP-0007\tDDC_RUS001\n");
255 printf("SMC\t\t\tWAPS-G\t\tSMC_RUS001\n");
256 printf("OvisLink (AirLive)\tWMU-6\t\tOVS_RUS001\n");
257 printf("SafeCom SWSAPUR-5\tFMW\t\tSafeco_RPS001\n");
261 int main(int argc
, char *argv
[])
263 unsigned char hdr
[HDRSIZE
];
266 char *outfile
= NULL
;
268 struct hdrinfo
*info
;
272 for (n
= 1; n
< argc
; n
++)
274 if (strcmp(argv
[n
], "-1") == 0)
276 if (strcmp(argv
[n
], "-2") == 0)
278 if (strcmp(argv
[n
], "-o") == 0)
280 if (strcmp(argv
[n
], "-ids") == 0)
283 if (ascii1
== NULL
|| ascii2
== NULL
|| outfile
== NULL
)
285 of
= fopen(outfile
, "w");
288 for (n
= 1; n
< argc
; n
++)
290 if (strncmp(argv
[n
], "-", 1) != 0)
295 last
= ((n
+ 1) >= argc
); /* dirty, options first! */
296 info
= find_hdrinfo(type
);
299 data
= read_file(argv
[n
], &size
);
302 makehdr(hdr
, info
, data
, size
, last
);
304 if (fwrite(hdr
, HDRSIZE
, 1, of
) != 1)
306 if (fwrite(data
, size
, 1, of
) != 1)