summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/plugins/rockbox_flash.c52
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 */
265tCheckResult CheckImageFile(char* filename, int space, tImageHeader* pHeader) 265tCheckResult 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: