27 #define CRC32_WIDTH (8 * sizeof(uint32_t)) 28 #define CRC32_INIT_REMAINDER 0xFFFFFFFF 29 #define CRC32_FINAL_XOR_VALUE 0xFFFFFFFF 31 static uint8_t crc8_0107_lut[] =
33 0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15,
34 0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d,
35 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65,
36 0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d,
37 0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5,
38 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd,
39 0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85,
40 0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd,
41 0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2,
42 0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea,
43 0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, 0xa2,
44 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a,
45 0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32,
46 0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a,
47 0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42,
48 0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a,
49 0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c,
50 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4,
51 0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec,
52 0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4,
53 0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c,
54 0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44,
55 0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c,
56 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34,
57 0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b,
58 0x76, 0x71, 0x78, 0x7f, 0x6a, 0x6d, 0x64, 0x63,
59 0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b,
60 0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13,
61 0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb,
62 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83,
63 0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb,
64 0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3
67 static const uint32_t crc32_lut[] =
69 0x0, 0x4c11db7, 0x9823b6e, 0xd4326d9, 0x130476dc, 0x17c56b6b,
70 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
71 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
72 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
73 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
74 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
75 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
76 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
77 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
78 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
79 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
80 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
81 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x18aeb13, 0x54bf6a4,
82 0x808d07d, 0xcc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
83 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
84 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
85 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
86 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
87 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
88 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
89 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
90 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
91 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
92 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
93 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
94 0x3f9b762c, 0x3b5a6b9b, 0x315d626, 0x7d4cb91, 0xa97ed48, 0xe56f0ff,
95 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
96 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
97 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
98 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
99 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
100 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
101 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
102 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
103 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
104 0x18197087, 0x1cd86d30, 0x29f3d35, 0x65e2082, 0xb1d065b, 0xfdc1bec,
105 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
106 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
107 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
108 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
109 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
110 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
111 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
114 uint8_t crc8(uint8_t *msg_ptr, uint32_t byte_cnt, uint32_t oldchksum,
120 remainder = ((init ==
true) ? 0 : oldchksum);
122 for (offset = 0; offset < byte_cnt; offset++) {
123 remainder = crc8_0107_lut[remainder ^ msg_ptr[offset]];
129 uint32_t crc32(
const uint8_t *msg_ptr, uint32_t byte_cnt,
130 uint32_t oldchksum,
int init,
int last)
136 remainder = (init) ? CRC32_INIT_REMAINDER : oldchksum;
138 for (offset = 0; offset < byte_cnt; offset++) {
139 byte = (remainder >> (CRC32_WIDTH - 8)) ^
141 remainder = crc32_lut[byte] ^ (remainder << 8);
145 return(remainder ^ CRC32_FINAL_XOR_VALUE);