blob: d87a5df4f7d8083694b347310acaae2c1fd78e9b [file] [log] [blame]
Rafaël Carré96165ab2009-05-28 18:27:08 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * mkamsboot.h - a tool for merging bootloader code into an Sansa V2
11 * (AMS) firmware file
12 *
13 * Copyright (C) 2008 Dave Chapman
14 *
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.
19 *
20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21 * KIND, either express or implied.
22 *
23 ****************************************************************************/
24
25#ifndef MKAMSBOOT_H
26#define MKAMSBOOT_H
27
28#include <stdint.h>
29#include <sys/types.h>
30
Dominik Wengercb55d5c2009-08-15 14:09:05 +000031#ifdef __cplusplus
32extern "C" {
Rafaël Carréb6c20c12010-02-19 14:10:26 +000033#endif
Dominik Wengercb55d5c2009-08-15 14:09:05 +000034
Rafaël Carréef7ad192009-07-05 08:25:44 +000035/* Supported models */
36enum {
37 MODEL_UNKNOWN = -1,
38 MODEL_FUZE = 0,
39 MODEL_CLIP,
40 MODEL_CLIPV2,
41 MODEL_E200V2,
42 MODEL_M200V4,
43 MODEL_C200V2,
Rafaël Carré8b926e92010-01-13 03:05:29 +000044 MODEL_CLIPPLUS,
Thomas Martitzf6540e82010-02-26 13:55:17 +000045 MODEL_FUZEV2,
Rafaël Carréff6b0422010-05-24 10:06:52 +000046 /* new models go here */
47
48 NUM_MODELS
Rafaël Carréef7ad192009-07-05 08:25:44 +000049};
50
Rafaël Carré96165ab2009-05-28 18:27:08 +000051
Thomas Martitzf9eeab22009-07-05 02:30:33 +000052/* Holds info about the OF */
53struct md5sums {
54 int model;
55 char *version;
56 char *md5;
57};
58
Dominik Riebelingea617802009-11-04 20:58:40 +000059extern const unsigned short hw_revisions[];
60extern const unsigned short fw_revisions[];
61extern const char* model_names[];
62extern const int bootloader_sizes[];
63
Rafaël Carré96165ab2009-05-28 18:27:08 +000064/* load_rockbox_file()
65 *
66 * Loads a rockbox bootloader file into memory
67 *
68 * ARGUMENTS
69 *
70 * filename : bootloader file to load
Rafaël Carréff6b0422010-05-24 10:06:52 +000071 * model : will be set to this bootloader's model
Rafaël Carré96165ab2009-05-28 18:27:08 +000072 * bootloader_size : set to the uncompressed bootloader size
73 * rb_packed_size : set to the size of compressed bootloader
74 * errstr : provided buffer to store an eventual error
75 * errstrsize : size of provided error buffer
76 *
77 * RETURN VALUE
78 * pointer to allocated memory containing the content of compressed bootloader
79 * or NULL in case of error (errstr will hold a description of the error)
80 */
81
82unsigned char* load_rockbox_file(
Rafaël Carréff6b0422010-05-24 10:06:52 +000083 char* filename, int *model, int* bootloader_size, int* rb_packedsize,
Rafaël Carré96165ab2009-05-28 18:27:08 +000084 char* errstr, int errstrsize);
85
86
87/* load_of_file()
88 *
89 * Loads a Sansa AMS Original Firmware file into memory
90 *
91 * ARGUMENTS
92 *
93 * filename : firmware file to load
Rafaël Carréff6b0422010-05-24 10:06:52 +000094 * model : desired player's model
Rafaël Carré96165ab2009-05-28 18:27:08 +000095 * bufsize : set to firmware file size
96 * md5sum : set to file md5sum, must be at least 33 bytes long
Rafaël Carré96165ab2009-05-28 18:27:08 +000097 * firmware_size : set to firmware block's size
98 * of_packed : pointer to allocated memory containing the compressed
99 * original firmware block
100 * of_packedsize : size of compressed original firmware block
101 * errstr : provided buffer to store an eventual error
102 * errstrsize : size of provided error buffer
103 *
104 * RETURN VALUE
105 * pointer to allocated memory containing the content of Original Firmware
106 * or NULL in case of error (errstr will hold a description of the error)
107 */
108
109unsigned char* load_of_file(
Rafaël Carréff6b0422010-05-24 10:06:52 +0000110 char* filename, int model, off_t* bufsize, struct md5sums *sum,
Thomas Martitzf9eeab22009-07-05 02:30:33 +0000111 int* firmware_size, unsigned char** of_packed,
Rafaël Carré96165ab2009-05-28 18:27:08 +0000112 int* of_packedsize, char* errstr, int errstrsize);
113
114
115/* patch_firmware()
116 *
117 * Patches a Sansa AMS Original Firmware file
118 *
119 * ARGUMENTS
120 *
121 * model : firmware model (MODEL_XXX)
122 * fw_version : firmware format version (1 or 2)
123 * firmware_size : size of uncompressed original firmware block
124 * buf : pointer to original firmware file
125 * len : size of original firmware file
126 * of_packed : pointer to compressed original firmware block
127 * of_packedsize : size of compressed original firmware block
128 * rb_packed : pointer to compressed rockbox bootloader
129 * rb_packed_size : size of compressed rockbox bootloader
130 */
131
132void patch_firmware(
133 int model, int fw_version, int firmware_size, unsigned char* buf,
134 int len, unsigned char* of_packed, int of_packedsize,
135 unsigned char* rb_packed, int rb_packedsize);
136
137
Rafaël Carréb6c20c12010-02-19 14:10:26 +0000138/* check_sizes()
Rafaël Carré96165ab2009-05-28 18:27:08 +0000139 *
Rafaël Carréb6c20c12010-02-19 14:10:26 +0000140 * Verify if the given bootloader can be embedded in the OF file, while still
141 * allowing both the bootloader and the OF to be unpacked at runtime
Rafaël Carré96165ab2009-05-28 18:27:08 +0000142 *
143 * ARGUMENTS
144 *
145 * model : firmware model (MODEL_XXX)
146 * rb_packed_size : size of compressed rockbox bootloader
Rafaël Carréb6c20c12010-02-19 14:10:26 +0000147 * rb_unpacked_size : size of compressed rockbox bootloader
148 * of_packed_size : size of compressed original firmware block
149 * of_unpacked_size : size of compressed original firmware block
150 * total_size : will contain the size of useful data that would be
151 * written to the firmware block, even in case of an
152 * error
153 * errstr : provided buffer to store an eventual error
154 * errstrsize : size of provided error buffer
Rafaël Carré96165ab2009-05-28 18:27:08 +0000155 *
156 * RETURN VALUE
Rafaël Carréb6c20c12010-02-19 14:10:26 +0000157 * 0 if the conditions aren't met, 1 if we can go and patch the firmware
Rafaël Carré96165ab2009-05-28 18:27:08 +0000158*/
159
Rafaël Carréb6c20c12010-02-19 14:10:26 +0000160int check_sizes(int model, int rb_packed_size, int rb_unpacked_size,
161 int of_packed_size, int of_unpacked_size, int *total_size,
162 char *errstr, int errstrsize);
Rafaël Carré96165ab2009-05-28 18:27:08 +0000163
Dominik Wengera66dfa42009-08-15 13:04:21 +0000164/* firmware_revision()
165 *
166 * returns the firmware revision for a particular model
167 *
168 * ARGUMENTS
169 *
170 * model : firmware model (MODEL_XXX)
171 *
172 * RETURN VALUE
173 * firmware version
174*/
175int firmware_revision(int model);
176
Dominik Wengercb55d5c2009-08-15 14:09:05 +0000177#ifdef __cplusplus
178};
Rafaël Carréb6c20c12010-02-19 14:10:26 +0000179#endif
Dominik Wengercb55d5c2009-08-15 14:09:05 +0000180
Rafaël Carré96165ab2009-05-28 18:27:08 +0000181#endif