diff options
author | Jörg Hohensohn <hohensoh@rockbox.org> | 2004-01-18 17:34:12 +0000 |
---|---|---|
committer | Jörg Hohensohn <hohensoh@rockbox.org> | 2004-01-18 17:34:12 +0000 |
commit | e692b0e34b4d3ebe115924fc38def10e8851dc0c (patch) | |
tree | 5b2bfb83e395facf21ad6718a03753065d90d325 /apps | |
parent | a8c9dd2e11d8f4eb3485e4b15c9518734127709b (diff) | |
download | rockbox-e692b0e34b4d3ebe115924fc38def10e8851dc0c.tar.gz rockbox-e692b0e34b4d3ebe115924fc38def10e8851dc0c.zip |
prepared to flash uncompressed ucl such that suitable Rockbox builds directly execute from ROM
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@4252 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/plugins/rockbox_flash.c | 52 |
1 files changed, 33 insertions, 19 deletions
diff --git a/apps/plugins/rockbox_flash.c b/apps/plugins/rockbox_flash.c index 661203b8b8..eb04fbb566 100644 --- a/apps/plugins/rockbox_flash.c +++ b/apps/plugins/rockbox_flash.c | |||
@@ -243,7 +243,7 @@ tImageHeader* GetSecondImage(void) | |||
243 | 243 | ||
244 | if (pImage1->destination != ROCKBOX_DEST || | 244 | if (pImage1->destination != ROCKBOX_DEST || |
245 | pImage1->execute != ROCKBOX_EXEC) | 245 | pImage1->execute != ROCKBOX_EXEC) |
246 | return 0; /* seems to be no Rockbox stuff in here */ | 246 | return 0; /* seems to be no Archos/Rockbox image in here */ |
247 | 247 | ||
248 | if (pImage1->size != 0) | 248 | if (pImage1->size != 0) |
249 | { | 249 | { |
@@ -262,7 +262,8 @@ tImageHeader* GetSecondImage(void) | |||
262 | /*********** Image File Functions ************/ | 262 | /*********** Image File Functions ************/ |
263 | 263 | ||
264 | /* so far, only compressed images in UCL NRV algorithm 2e supported */ | 264 | /* so far, only compressed images in UCL NRV algorithm 2e supported */ |
265 | tCheckResult CheckImageFile(char* filename, int space, tImageHeader* pHeader) | 265 | tCheckResult CheckImageFile(char* filename, int space, tImageHeader* pHeader, |
266 | UINT8* pos) | ||
266 | { | 267 | { |
267 | int i; | 268 | int i; |
268 | int fd; | 269 | int fd; |
@@ -311,13 +312,6 @@ tCheckResult CheckImageFile(char* filename, int space, tImageHeader* pHeader) | |||
311 | } | 312 | } |
312 | } | 313 | } |
313 | 314 | ||
314 | /* check for supported algorithm */ | ||
315 | if (ucl_header[12] != 0x2E) | ||
316 | { | ||
317 | rb->close(fd); | ||
318 | return eWrongAlgorithm; | ||
319 | } | ||
320 | |||
321 | pHeader->size = Read32(ucl_header + 22); /* compressed size */ | 315 | pHeader->size = Read32(ucl_header + 22); /* compressed size */ |
322 | if (pHeader->size != filesize - sizeof(ucl_header) - 8) | 316 | if (pHeader->size != filesize - sizeof(ucl_header) - 8) |
323 | { | 317 | { |
@@ -325,15 +319,39 @@ tCheckResult CheckImageFile(char* filename, int space, tImageHeader* pHeader) | |||
325 | return eMultiBlocks; | 319 | return eMultiBlocks; |
326 | } | 320 | } |
327 | 321 | ||
322 | /* fill in the hardcoded defaults of the header */ | ||
323 | pHeader->destination = ROCKBOX_DEST; | ||
324 | pHeader->execute = ROCKBOX_EXEC; | ||
325 | |||
328 | if (Read32(ucl_header + 18) > pHeader->size) /* compare with uncompressed | 326 | if (Read32(ucl_header + 18) > pHeader->size) /* compare with uncompressed |
329 | size */ | 327 | size */ |
330 | { /* normal case */ | 328 | { /* compressed, normal case */ |
331 | pHeader->flags = 0x00000001; /* flags for UCL compressed */ | 329 | pHeader->flags = 0x00000001; /* flags for UCL compressed */ |
330 | |||
331 | /* check for supported algorithm */ | ||
332 | if (ucl_header[12] != 0x2E) | ||
333 | { | ||
334 | rb->close(fd); | ||
335 | return eWrongAlgorithm; | ||
336 | } | ||
332 | } | 337 | } |
333 | else | 338 | else |
334 | { | 339 | { /* uncompressed, either to be copied or run directly in flash */ |
335 | pHeader->flags = 0x00000000; /* very unlikely, content was not | 340 | UINT32 reset_vector; /* image has to start with reset vector */ |
336 | compressible */ | 341 | |
342 | pHeader->flags = 0x00000000; /* uncompressed */ | ||
343 | |||
344 | read = rb->read(fd, &reset_vector, sizeof(reset_vector)); | ||
345 | fileread += read; | ||
346 | if (read != sizeof(reset_vector)) | ||
347 | { | ||
348 | rb->close(fd); | ||
349 | return eReadErr; | ||
350 | } | ||
351 | pHeader->execute = reset_vector; | ||
352 | if (reset_vector != ROCKBOX_EXEC) /* nonstandard address? */ | ||
353 | /* assume in-place, executing directly in flash */ | ||
354 | pHeader->destination = (UINT32)(pos + sizeof(tImageHeader)); | ||
337 | } | 355 | } |
338 | 356 | ||
339 | /* check if we can read the whole file */ | 357 | /* check if we can read the whole file */ |
@@ -348,10 +366,6 @@ tCheckResult CheckImageFile(char* filename, int space, tImageHeader* pHeader) | |||
348 | if (fileread != filesize) | 366 | if (fileread != filesize) |
349 | return eReadErr; | 367 | return eReadErr; |
350 | 368 | ||
351 | /* fill in the hardcoded rest of the header */ | ||
352 | pHeader->destination = ROCKBOX_DEST; | ||
353 | pHeader->execute = ROCKBOX_EXEC; | ||
354 | |||
355 | return eOK; | 369 | return eOK; |
356 | } | 370 | } |
357 | 371 | ||
@@ -567,7 +581,7 @@ void DoUserDialog(char* filename, bool show_greet) | |||
567 | space = FlashInfo.size - (pos-FB + sizeof(ImageHeader)); | 581 | space = FlashInfo.size - (pos-FB + sizeof(ImageHeader)); |
568 | /* size minus start */ | 582 | /* size minus start */ |
569 | 583 | ||
570 | rc = CheckImageFile(filename, space, &ImageHeader); | 584 | rc = CheckImageFile(filename, space, &ImageHeader, pos); |
571 | if (rc != eOK) | 585 | if (rc != eOK) |
572 | { | 586 | { |
573 | rb->lcd_clear_display(); /* make room for error message */ | 587 | rb->lcd_clear_display(); /* make room for error message */ |
@@ -743,7 +757,7 @@ void DoUserDialog(char* filename, bool show_greet) | |||
743 | space = FlashInfo.size - (pos-FB + sizeof(ImageHeader)); | 757 | space = FlashInfo.size - (pos-FB + sizeof(ImageHeader)); |
744 | /* size minus start */ | 758 | /* size minus start */ |
745 | 759 | ||
746 | rc = CheckImageFile(filename, space, &ImageHeader); | 760 | rc = CheckImageFile(filename, space, &ImageHeader, pos); |
747 | rb->lcd_puts(0, 0, "Checked:"); | 761 | rb->lcd_puts(0, 0, "Checked:"); |
748 | switch (rc) { | 762 | switch (rc) { |
749 | case eOK: | 763 | case eOK: |