1 2 /* locals */ 3 static unsigned int crc_table[256]; 4 5 6 /* ---- 7 * crc_init() 8 * ---- 9 */ 10 11 void crc_init(void)12crc_init(void) 13 { 14 int i; 15 unsigned int t, *p, *q; 16 unsigned int poly = 0x864CFB; 17 18 p = q = crc_table; 19 *q++ = 0; 20 *q++ = poly; 21 22 for (i = 1; i < 128; i++) { 23 t = *(++p); 24 if (t & 0x800000) { 25 t <<= 1; 26 *q++ = t ^ poly; 27 *q++ = t; 28 } 29 else { 30 t <<= 1; 31 *q++ = t; 32 *q++ = t ^ poly; 33 } 34 } 35 } 36 37 38 /* ---- 39 * crc_calc() 40 * ---- 41 * 24-bit crc 42 */ 43 44 unsigned int crc_calc(unsigned char * data,int len)45crc_calc(unsigned char *data, int len) 46 { 47 unsigned int crc = 0; 48 int i; 49 50 for (i = 0; i < len; i++) 51 crc = (crc << 8) ^ crc_table[(unsigned char)(crc >> 16) ^ *data++]; 52 53 /* ok */ 54 return (crc & 0xFFFFFF); 55 } 56 57