summaryrefslogtreecommitdiff
path: root/firmware/rolo.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/rolo.c')
-rw-r--r--firmware/rolo.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/firmware/rolo.c b/firmware/rolo.c
index 0375a7ac82..0b8a4f28ba 100644
--- a/firmware/rolo.c
+++ b/firmware/rolo.c
@@ -30,6 +30,14 @@
30#include "string.h" 30#include "string.h"
31#include "buffer.h" 31#include "buffer.h"
32 32
33#ifdef MI4_FORMAT
34#include "crc32-mi4.h"
35#undef FIRMWARE_OFFSET_FILE_CRC
36#undef FIRMWARE_OFFSET_FILE_DATA
37#define FIRMWARE_OFFSET_FILE_CRC 0xC
38#define FIRMWARE_OFFSET_FILE_DATA 0x200
39#endif
40
33#if !defined(IRIVER_IFP7XX_SERIES) && \ 41#if !defined(IRIVER_IFP7XX_SERIES) && \
34 (CONFIG_CPU != PP5002) && (CONFIG_CPU != S3C2440) 42 (CONFIG_CPU != PP5002) && (CONFIG_CPU != S3C2440)
35/* FIX: this doesn't work on iFP, 3rd Gen ipods */ 43/* FIX: this doesn't work on iFP, 3rd Gen ipods */
@@ -152,7 +160,9 @@ int rolo_load(const char* filename)
152 int fd; 160 int fd;
153 long length; 161 long length;
154#if defined(CPU_COLDFIRE) || defined(CPU_PP) 162#if defined(CPU_COLDFIRE) || defined(CPU_PP)
163#if !defined(MI4_FORMAT)
155 int i; 164 int i;
165#endif
156 unsigned long checksum,file_checksum; 166 unsigned long checksum,file_checksum;
157#else 167#else
158 long file_length; 168 long file_length;
@@ -189,8 +199,11 @@ int rolo_load(const char* filename)
189 return -1; 199 return -1;
190 } 200 }
191 201
202#if !defined(MI4_FORMAT)
192 /* Rockbox checksums are big-endian */ 203 /* Rockbox checksums are big-endian */
193 file_checksum = betoh32(file_checksum); 204 file_checksum = betoh32(file_checksum);
205#endif
206
194#ifdef CPU_PP 207#ifdef CPU_PP
195 cpu_message = COP_REBOOT; 208 cpu_message = COP_REBOOT;
196 COP_CTL = PROC_WAKE; 209 COP_CTL = PROC_WAKE;
@@ -208,11 +221,17 @@ int rolo_load(const char* filename)
208 return -1; 221 return -1;
209 } 222 }
210 223
224#ifdef MI4_FORMAT
225 /* Check CRC32 to see if we have a valid file */
226 chksum_crc32gentab();
227 checksum = chksum_crc32 (audiobuf, length);
228#else
211 checksum = MODEL_NUMBER; 229 checksum = MODEL_NUMBER;
212 230
213 for(i = 0;i < length;i++) { 231 for(i = 0;i < length;i++) {
214 checksum += audiobuf[i]; 232 checksum += audiobuf[i];
215 } 233 }
234#endif
216 235
217 /* Verify checksum against file header */ 236 /* Verify checksum against file header */
218 if (checksum != file_checksum) { 237 if (checksum != file_checksum) {