bd20f8f4 |
1 | //----------------------------------------------------------------------------- |
2 | // This code is licensed to you under the terms of the GNU GPL, version 2 or, |
3 | // at your option, any later version. See the LICENSE.txt file for the text of |
4 | // the license. |
5 | //----------------------------------------------------------------------------- |
6 | // Generic CRC calculation code. |
7 | //----------------------------------------------------------------------------- |
68d9d60a |
8 | |
e30c654b |
9 | #ifndef __CRC_H |
10 | #define __CRC_H |
68d9d60a |
11 | |
12 | #include <stdint.h> |
73d04bb4 |
13 | #include <stddef.h> |
68d9d60a |
14 | |
15 | typedef struct crc { |
16 | uint32_t state; |
17 | int order; |
18 | uint32_t polynom; |
19 | uint32_t initial_value; |
20 | uint32_t final_xor; |
21 | uint32_t mask; |
22 | } crc_t; |
23 | |
24 | /* Initialize a crc structure. order is the order of the polynom, e.g. 32 for a CRC-32 |
25 | * polynom is the CRC polynom. initial_value is the initial value of a clean state. |
26 | * final_xor is XORed onto the state before returning it from crc_result(). */ |
27 | extern void crc_init(crc_t *crc, int order, uint32_t polynom, uint32_t initial_value, uint32_t final_xor); |
28 | |
ee4e2816 |
29 | /* Update the crc state. data is the data of length data_width bits (only the |
68d9d60a |
30 | * data_width lower-most bits are used). |
e30c654b |
31 | */ |
68d9d60a |
32 | extern void crc_update(crc_t *crc, uint32_t data, int data_width); |
33 | |
34 | /* Clean the crc state, e.g. reset it to initial_value */ |
35 | extern void crc_clear(crc_t *crc); |
36 | |
37 | /* Get the result of the crc calculation */ |
38 | extern uint32_t crc_finish(crc_t *crc); |
39 | |
73d04bb4 |
40 | // Calculate CRC-8/Maxim checksum |
ee4e2816 |
41 | uint32_t CRC8Maxim(uint8_t *buff, size_t size); |
42 | |
43 | // Calculate CRC-8/Legic checksum |
44 | uint32_t CRC8Legic(uint8_t *buff, size_t size); |
ee4e2816 |
45 | |
68d9d60a |
46 | /* Static initialization of a crc structure */ |
47 | #define CRC_INITIALIZER(_order, _polynom, _initial_value, _final_xor) { \ |
48 | .state = ((_initial_value) & ((1L<<(_order))-1)), \ |
49 | .order = (_order), \ |
50 | .polynom = (_polynom), \ |
51 | .initial_value = (_initial_value), \ |
52 | .final_xor = (_final_xor), \ |
53 | .mask = ((1L<<(_order))-1) } |
54 | |
e30c654b |
55 | #endif /* __CRC_H */ |