2 * trx2usr - Convert a TRX firmware image to a U.S. Robotics firmware
3 * image by prepending a 28-byte header.
5 * This program was modeled after the usr-hdr.c program from the GPL'ed
6 * firmware for the U.S. Robotics Wireless MAXg Router (USR5461). The
7 * output file of this program can be uploaded via the web interface
8 * of the original U.S. Robotics firmware. Note that this program only
9 * works on a little-endian host platform.
11 * Copyright (C) 2006 Dick Streefland
13 * This is free software, licensed under the terms of the GNU General
14 * Public License as published by the Free Software Foundation.
23 #define TRX_MAGIC "HDR0"
25 #define USR_MAGIC 0x30525355 // "USR0"
26 #define EPI_VERSION 0x06235d03
27 #define COMPAT_ID 1 // USR5461
28 #define HARDWARE_REV 1
30 #define CRC32_INIT 0xffffffff
31 #define CHUNK (64*1024)
33 typedef unsigned char uint8
;
34 typedef unsigned short uint16
;
35 typedef unsigned int uint32
;
39 uint32 magic
; // "USR0"
40 uint32 len
; // file length without this header
41 uint32 crc32
; // CRC32 of the file without header
42 uint32 version
; // EPI_VERSION
43 uint16 compatibility_id
; // COMPAT_ID
44 uint16 hardware_revision
; // HARDWARE_REV
48 static const uint32 crc_32_tab
[] = // CRC polynomial 0xedb88320
50 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
51 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
52 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
53 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
54 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
55 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
56 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
57 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
58 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
59 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
60 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
61 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
62 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
63 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
64 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
65 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
66 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
67 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
68 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
69 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
70 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
71 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
72 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
73 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
74 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
75 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
76 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
77 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
78 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
79 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
80 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
81 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
82 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
83 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
84 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
85 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
86 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
87 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
88 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
89 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
90 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
91 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
92 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
95 static char buf
[CHUNK
];
97 static uint32
crc32(uint32 crc
, uint8
* p
, size_t n
)
101 crc
= crc_32_tab
[(crc
^ *p
++) & 0xff] ^ (crc
>> 8);
106 static int trx2usr(FILE* trx
, FILE* usr
)
108 struct usr_header hdr
;
111 hdr
.magic
= USR_MAGIC
;
113 hdr
.crc32
= CRC32_INIT
;
114 hdr
.version
= EPI_VERSION
;
115 hdr
.compatibility_id
= COMPAT_ID
;
116 hdr
.hardware_revision
= HARDWARE_REV
;
119 fwrite(& hdr
, sizeof(hdr
), 1, usr
);
120 while ((n
= fread(buf
, 1, CHUNK
, trx
)))
122 if (hdr
.len
== 0 && strncmp(buf
, TRX_MAGIC
, strlen(TRX_MAGIC
)) != 0)
126 fwrite(& buf
, 1, n
, usr
);
128 hdr
.crc32
= crc32( hdr
.crc32
, (uint8
*) & buf
, n
);
130 fseek(usr
, 0L, SEEK_SET
);
131 fwrite(& hdr
, sizeof(hdr
), 1, usr
);
134 fprintf(stderr
, "Input is not a TRX file\n");
139 fprintf(stderr
, "Empty input\n");
144 fprintf(stderr
, "Read error\n");
149 fprintf(stderr
, "Write error\n");
155 extern int main(int argc
, char *argv
[])
163 fprintf(stderr
, "Usage: trx2usr <trx input> <usr output>\n");
166 in
= fopen(argv
[1], "rb");
169 fprintf(stderr
, "Cannot open \"%s\": %s\n", argv
[1], strerror(errno
));
172 out
= fopen(argv
[2], "wb");
175 fprintf(stderr
, "Cannot create \"%s\": %s\n", argv
[2], strerror(errno
));
178 ret
= trx2usr(in
, out
);
This page took 0.052452 seconds and 5 git commands to generate.