diff options
-rw-r--r-- | flash/make_firmware/make_firmware.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/flash/make_firmware/make_firmware.c b/flash/make_firmware/make_firmware.c index 220db4e5f1..ffc366fe5e 100644 --- a/flash/make_firmware/make_firmware.c +++ b/flash/make_firmware/make_firmware.c | |||
@@ -37,6 +37,7 @@ | |||
37 | #define SECTORSIZE 4096 | 37 | #define SECTORSIZE 4096 |
38 | 38 | ||
39 | #define BOOTLOAD_DEST 0x0FFFF500 // for the "normal" one | 39 | #define BOOTLOAD_DEST 0x0FFFF500 // for the "normal" one |
40 | #define FLASH_START 0x02000000 | ||
40 | #define BOOTLOAD_SCR 0x02000100 | 41 | #define BOOTLOAD_SCR 0x02000100 |
41 | #define ROCKBOX_DEST 0x09000000 | 42 | #define ROCKBOX_DEST 0x09000000 |
42 | #define ROCKBOX_EXEC 0x09000200 | 43 | #define ROCKBOX_EXEC 0x09000200 |
@@ -130,6 +131,7 @@ UINT32 PlaceImage(char* filename, UINT32 pos, UINT8* pFirmware, UINT32 limit) | |||
130 | FILE* pFile; | 131 | FILE* pFile; |
131 | UINT32 align; | 132 | UINT32 align; |
132 | UINT32 flags; | 133 | UINT32 flags; |
134 | UINT32 load_addr = ROCKBOX_DEST, exec_addr = ROCKBOX_EXEC; // defaults | ||
133 | 135 | ||
134 | // magic file header for compressed files | 136 | // magic file header for compressed files |
135 | static const UINT8 magic[8] = { 0x00,0xe9,0x55,0x43,0x4c,0xff,0x01,0x1a }; | 137 | static const UINT8 magic[8] = { 0x00,0xe9,0x55,0x43,0x4c,0xff,0x01,0x1a }; |
@@ -151,7 +153,8 @@ UINT32 PlaceImage(char* filename, UINT32 pos, UINT8* pFirmware, UINT32 limit) | |||
151 | fread(ucl_header, 1, sizeof(ucl_header), pFile); | 153 | fread(ucl_header, 1, sizeof(ucl_header), pFile); |
152 | if (memcmp(magic, ucl_header, sizeof(magic)) == 0) | 154 | if (memcmp(magic, ucl_header, sizeof(magic)) == 0) |
153 | { | 155 | { |
154 | if (ucl_header[12] != 0x2E) // check algorithm | 156 | if (ucl_header[12] != 0x2E // check algorithm |
157 | && ucl_header[12] != 0x2B) // or uncompressed | ||
155 | { | 158 | { |
156 | printf("UCL compressed files must use algorithm 2e, not %d\n", ucl_header[12]); | 159 | printf("UCL compressed files must use algorithm 2e, not %d\n", ucl_header[12]); |
157 | printf("Generate with: uclpack --best --2e rockbox.bin %s\n", filename); | 160 | printf("Generate with: uclpack --best --2e rockbox.bin %s\n", filename); |
@@ -163,6 +166,15 @@ UINT32 PlaceImage(char* filename, UINT32 pos, UINT8* pFirmware, UINT32 limit) | |||
163 | { // normal case | 166 | { // normal case |
164 | flags = 0x00000001; // flags for UCL compressed | 167 | flags = 0x00000001; // flags for UCL compressed |
165 | } | 168 | } |
169 | |||
170 | if (ucl_header[12] == 0x2B) // uncompressed means "ROMbox", for direct flash execution | ||
171 | { | ||
172 | UINT8 reset_vec[4]; | ||
173 | fread(reset_vec, 1, sizeof(reset_vec), pFile); // read the reset vector from image | ||
174 | fseek(pFile, 0-sizeof(reset_vec), SEEK_CUR); // wind back | ||
175 | load_addr = FLASH_START + pos + 16; // behind 16 byte header | ||
176 | exec_addr = Read32(reset_vec); | ||
177 | } | ||
166 | } | 178 | } |
167 | else | 179 | else |
168 | { | 180 | { |
@@ -177,9 +189,9 @@ UINT32 PlaceImage(char* filename, UINT32 pos, UINT8* pFirmware, UINT32 limit) | |||
177 | 189 | ||
178 | // write header | 190 | // write header |
179 | align = (pos + 16 + size + SECTORSIZE-1) & ~(SECTORSIZE-1); // round up to next flash sector | 191 | align = (pos + 16 + size + SECTORSIZE-1) & ~(SECTORSIZE-1); // round up to next flash sector |
180 | Write32(pFirmware + pos, ROCKBOX_DEST); // load address | 192 | Write32(pFirmware + pos, load_addr); // load address |
181 | Write32(pFirmware + pos + 4, align - (pos + 16)); // image size | 193 | Write32(pFirmware + pos + 4, align - (pos + 16)); // image size |
182 | Write32(pFirmware + pos + 8, ROCKBOX_EXEC); // execution address | 194 | Write32(pFirmware + pos + 8, exec_addr); // execution address |
183 | Write32(pFirmware + pos + 12, flags); // compressed or not | 195 | Write32(pFirmware + pos + 12, flags); // compressed or not |
184 | pos += 16; | 196 | pos += 16; |
185 | 197 | ||