diff options
Diffstat (limited to 'apps/plugins/firmware_flash.c')
-rw-r--r-- | apps/plugins/firmware_flash.c | 45 |
1 files changed, 2 insertions, 43 deletions
diff --git a/apps/plugins/firmware_flash.c b/apps/plugins/firmware_flash.c index ebf4242e2a..e6f6df431c 100644 --- a/apps/plugins/firmware_flash.c +++ b/apps/plugins/firmware_flash.c | |||
@@ -255,47 +255,6 @@ bool GetFlashInfo(tFlashInfo* pInfo) | |||
255 | return false; | 255 | return false; |
256 | } | 256 | } |
257 | 257 | ||
258 | |||
259 | /*********** Utility Functions ************/ | ||
260 | |||
261 | |||
262 | /* Tool function to calculate a CRC32 across some buffer */ | ||
263 | /* third argument is either 0xFFFFFFFF to start or value from last piece */ | ||
264 | unsigned crc_32(unsigned char* buf, unsigned len, unsigned crc32) | ||
265 | { | ||
266 | /* CCITT standard polynomial 0x04C11DB7 */ | ||
267 | static const unsigned crc32_lookup[16] = | ||
268 | { /* lookup table for 4 bits at a time is affordable */ | ||
269 | 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, | ||
270 | 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005, | ||
271 | 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61, | ||
272 | 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD | ||
273 | }; | ||
274 | |||
275 | unsigned char byte; | ||
276 | unsigned t; | ||
277 | |||
278 | while (len--) | ||
279 | { | ||
280 | byte = *buf++; /* get one byte of data */ | ||
281 | |||
282 | /* upper nibble of our data */ | ||
283 | t = crc32 >> 28; /* extract the 4 most significant bits */ | ||
284 | t ^= byte >> 4; /* XOR in 4 bits of data into the extracted bits */ | ||
285 | crc32 <<= 4; /* shift the CRC register left 4 bits */ | ||
286 | crc32 ^= crc32_lookup[t]; /* do the table lookup and XOR the result */ | ||
287 | |||
288 | /* lower nibble of our data */ | ||
289 | t = crc32 >> 28; /* extract the 4 most significant bits */ | ||
290 | t ^= byte & 0x0F; /* XOR in 4 bits of data into the extracted bits */ | ||
291 | crc32 <<= 4; /* shift the CRC register left 4 bits */ | ||
292 | crc32 ^= crc32_lookup[t]; /* do the table lookup and XOR the result */ | ||
293 | } | ||
294 | |||
295 | return crc32; | ||
296 | } | ||
297 | |||
298 | |||
299 | /*********** Firmware File Functions + helpers ************/ | 258 | /*********** Firmware File Functions + helpers ************/ |
300 | 259 | ||
301 | /* test if the version number is consistent with the platform */ | 260 | /* test if the version number is consistent with the platform */ |
@@ -389,7 +348,7 @@ tCheckResult CheckFirmwareFile(char* filename, int chipsize, bool is_romless) | |||
389 | 348 | ||
390 | if (has_crc) | 349 | if (has_crc) |
391 | { | 350 | { |
392 | crc32 = crc_32(sector, SEC_SIZE, crc32); /* checksum */ | 351 | crc32 = rb->crc_32(sector, SEC_SIZE, crc32); /* checksum */ |
393 | 352 | ||
394 | /* in addition to the CRC, my files also have a platform ID */ | 353 | /* in addition to the CRC, my files also have a platform ID */ |
395 | if (sector[PLATFORM_ADR] != PLATFORM_ID) /* for our hardware? */ | 354 | if (sector[PLATFORM_ADR] != PLATFORM_ID) /* for our hardware? */ |
@@ -442,7 +401,7 @@ tCheckResult CheckFirmwareFile(char* filename, int chipsize, bool is_romless) | |||
442 | 401 | ||
443 | if (has_crc) | 402 | if (has_crc) |
444 | { | 403 | { |
445 | crc32 = crc_32(sector, got_now, crc32); /* checksum */ | 404 | crc32 = rb->crc_32(sector, got_now, crc32); /* checksum */ |
446 | } | 405 | } |
447 | } while (fileleft); | 406 | } while (fileleft); |
448 | 407 | ||