1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * mkamsboot - a tool for merging bootloader code into an Sansa V2
13 * Copyright (C) 2008 Dave Chapman
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21 * KIND, either express or implied.
23 ****************************************************************************/
28 #include <sys/types.h>
36 #include "mkamsboot.h"
38 /* Header for ARM code binaries */
41 /* Win32 compatibility */
46 /* standalone executable */
47 int main(int argc
, char* argv
[])
49 char *infile
, *bootfile
, *outfile
;
56 unsigned char* of_packed
;
58 unsigned char* rb_packed
;
63 char md5sum
[33]; /* 32 digits + \0 */
67 /* VERSION comes frome the Makefile */
69 "mkamsboot Version " VERSION
"\n"
70 "This is free software; see the source for copying conditions. There is NO\n"
71 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
75 printf("Usage: mkamsboot <firmware file> <boot file> <output file>\n");
83 /* Load original firmware file */
84 buf
= load_of_file(infile
, &len
, &sum
,
85 &firmware_size
, &of_packed
, &of_packedsize
, errstr
, sizeof(errstr
));
88 fprintf(stderr
, "%s", errstr
);
89 fprintf(stderr
, "[ERR] Could not load %s\n", infile
);
93 fprintf(stderr
, "[INFO] Original firmware MD5 checksum match\n");
94 fprintf(stderr
, "[INFO] Model: Sansa %s v%d - Firmware version: %s\n",
95 model_names
[sum
.model
], hw_revisions
[sum
.model
], sum
.version
);
98 /* Load bootloader file */
99 rb_packed
= load_rockbox_file(bootfile
, sum
.model
, &bootloader_size
,
100 &rb_packedsize
, errstr
, sizeof(errstr
));
101 if (rb_packed
== NULL
) {
102 fprintf(stderr
, "%s", errstr
);
103 fprintf(stderr
, "[ERR] Could not load %s\n", bootfile
);
109 printf("[INFO] Firmware patching has begun !\n\n");
111 fprintf(stderr
, "[INFO] Original firmware size: %d bytes\n",
113 fprintf(stderr
, "[INFO] Packed OF size: %d bytes\n",
115 fprintf(stderr
, "[INFO] Bootloader size: %d bytes\n",
116 (int)bootloader_size
);
117 fprintf(stderr
, "[INFO] Packed bootloader size: %d bytes\n",
119 fprintf(stderr
, "[INFO] Dual-boot function size: %d bytes\n",
120 bootloader_sizes
[sum
.model
]);
121 fprintf(stderr
, "[INFO] UCL unpack function size: %u bytes\n",
122 (unsigned int)sizeof(nrv2e_d8
));
124 totalsize
= total_size(sum
.model
, of_packedsize
, rb_packedsize
);
126 fprintf(stderr
, "[INFO] Total size of new image: %d bytes\n", totalsize
);
128 if (totalsize
> firmware_size
) {
129 fprintf(stderr
, "[ERR] No room to insert bootloader, aborting\n");
136 patch_firmware(sum
.model
, fw_revisions
[sum
.model
], firmware_size
, buf
, len
,
137 of_packed
, of_packedsize
, rb_packed
, rb_packedsize
);
139 /* Write the new firmware */
140 fdout
= open(outfile
, O_CREAT
|O_TRUNC
|O_WRONLY
|O_BINARY
, 0666);
143 fprintf(stderr
, "[ERR] Could not open %s for writing\n", outfile
);
150 n
= write(fdout
, buf
, len
);
152 if (n
!= (unsigned)len
) {
153 fprintf(stderr
, "[ERR] Could not write firmware file\n");
164 fprintf(stderr
, "\n[INFO] Patching succeeded!\n");