2 * mkbrnimg.c - partially based on OpenWrt's wndr3700.c
4 * Copyright (C) 2011 Tobias Diedrich <ranma+openwrt@tdiedrich.de>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License,
8 * version 2 as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 #include <netinet/in.h>
31 #define BPB 8 /* bits/byte */
33 static uint32_t crc32
[1<<BPB
];
35 static void init_crc32()
37 const uint32_t poly
= ntohl(0x2083b8ed);
40 for (n
= 0; n
< 1<<BPB
; n
++) {
44 for (bit
= 0; bit
< BPB
; bit
++)
45 crc
= (crc
& 1) ? (poly
^ (crc
>> 1)) : (crc
>> 1);
50 static uint32_t crc32buf(unsigned char *buf
, size_t len
)
52 uint32_t crc
= 0xFFFFFFFF;
54 for (; len
; len
--, buf
++)
55 crc
= crc32
[(uint8_t)crc
^ *buf
] ^ (crc
>> BPB
);
59 static void usage(const char *) __attribute__ (( __noreturn__
));
61 static void usage(const char *mess
)
63 fprintf(stderr
, "Error: %s\n", mess
);
64 fprintf(stderr
, "Usage: mkbrnimg [-o output_file] [-m magic] [-s signature] kernel_file [additional files]\n");
65 fprintf(stderr
, "\n");
69 static char *output_file
= "default-brnImage";
70 static uint32_t magic
= 0x12345678;
71 static char *signature
= "BRNDTW502";
73 static void parseopts(int *argc
, char ***argv
)
78 while ((res
= getopt(*argc
, *argv
, "o:m:s:")) != -1) {
81 usage("Unknown option");
87 magic
= strtoul(optarg
, &endptr
, 0);
88 if (endptr
== optarg
|| *endptr
!= 0)
89 usage("magic must be a decimal or hexadecimal 32-bit value");
100 static void appendfile(int outfd
, char *path
, int kernel
) {
102 size_t len
, padded_len
;
108 memset(padding
, 0xff, sizeof(padding
));
111 if ((fd
= open(path
, O_RDONLY
)) < 0
112 || (len
= lseek(fd
, 0, SEEK_END
)) < 0
113 || (input_file
= mmap(0, len
, PROT_READ
, MAP_SHARED
, fd
, 0)) == (void *) (-1)
116 fprintf(stderr
, "Error mapping file '%s': %s\n", path
, strerror(errno
));
120 // kernel should be lzma compressed image, not uImage
122 (input_file
[0] != (char)0x5d ||
123 input_file
[1] != (char)0x00 ||
124 input_file
[2] != (char)0x00 ||
125 input_file
[3] != (char)0x80)) {
126 fprintf(stderr
, "lzma signature not found on kernel image.\n");
131 crc
= crc32buf(input_file
, len
);
132 fprintf(stderr
, "crc32 for '%s' is %08x.\n", path
, crc
);
135 write(outfd
, input_file
, len
);
138 padded_len
= ((len
+ sizeof(footer
) + sizeof(padding
) - 1) & ~(sizeof(padding
) - 1)) - sizeof(footer
);
139 fprintf(stderr
, "len=%08x padded_len=%08x\n", len
, padded_len
);
140 write(outfd
, padding
, padded_len
- len
);
143 footer
[0] = (len
>> 0) & 0xff;
144 footer
[1] = (len
>> 8) & 0xff;
145 footer
[2] = (len
>> 16) & 0xff;
146 footer
[3] = (len
>> 24) & 0xff;
147 footer
[4] = (magic
>> 0) & 0xff;
148 footer
[5] = (magic
>> 8) & 0xff;
149 footer
[6] = (magic
>> 16) & 0xff;
150 footer
[7] = (magic
>> 24) & 0xff;
151 footer
[8] = (crc
>> 0) & 0xff;
152 footer
[9] = (crc
>> 8) & 0xff;
153 footer
[10] = (crc
>> 16) & 0xff;
154 footer
[11] = (crc
>> 24) & 0xff;
155 write(outfd
, footer
, sizeof(footer
));
157 munmap(input_file
, len
);
160 int main(int argc
, char **argv
)
165 parseopts(&argc
, &argv
);
168 usage("wrong number of arguments");
170 if ((outfd
= open(output_file
, O_WRONLY
|O_CREAT
|O_TRUNC
, 0644)) == -1)
172 fprintf(stderr
, "Error opening '%s' for writing: %s\n", output_file
, strerror(errno
));
176 for (i
=0; i
<argc
; i
++) {
177 appendfile(outfd
, argv
[i
], i
== 0);
179 write(outfd
, signature
, strlen(signature
)+1);
This page took 0.057498 seconds and 5 git commands to generate.