Calibration: Difference between revisions
No edit summary |
|||
Line 6: | Line 6: | ||
= CAL0 = | = CAL0 = | ||
This is the raw data stored under the PRODINFO partition | This is the raw data stored under the PRODINFO partition. | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
Line 298: | Line 296: | ||
|- | |- | ||
|} | |} | ||
== Error detection == | |||
Each block of raw calibration data (with the exception of blocks with SHA256 hashes) is padded to 16 bytes, being the last 2 bytes a CRC-16 over said block. | |||
XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX | |||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 YY YY | |||
XX == data | |||
00 == padding | |||
YY == crc | |||
The CRC-16 is generated as follows: | |||
unsigned int crc_16_table[16] = { | |||
0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, | |||
0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400 }; | |||
unsigned short int get_crc_16 (char *p, int n) { | |||
unsigned short int crc = 0x55AA; | |||
int r; | |||
while (n-- > 0) { | |||
r = crc_16_table[crc & 0xF]; | |||
crc = (crc >> 4) & 0x0FFF; | |||
crc = crc ^ r ^ crc_16_table[*p & 0xF]; | |||
r = crc_16_table[crc & 0xF]; | |||
crc = (crc >> 4) & 0x0FFF; | |||
crc = crc ^ r ^ crc_16_table[(*p >> 4) & 0xF]; | |||
p++; | |||
} | |||
return(crc); | |||
} |