]>
Commit | Line | Data |
---|---|---|
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 | |
e36b07ef | 12 | #include "common.h" //stdint, stddef, stdbool |
3e134b4c | 13 | #include "util.h" // reflect, bswap_16 |
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; | |
3e134b4c | 22 | int topbit; |
23 | bool refin; /* Parameter: Reflect input bytes? */ | |
24 | bool refout; /* Parameter: Reflect output CRC? */ | |
68d9d60a | 25 | } crc_t; |
26 | ||
3e134b4c | 27 | /* Initialize a crc structure. order is the order of the polynom, e.g. 32 for a CRC-32 |
28 | * polynom is the CRC polynom. initial_value is the initial value of a clean state. | |
29 | * final_xor is XORed onto the state before returning it from crc_result(). | |
30 | * refin is the setting for reversing (bitwise) the bytes during crc | |
31 | * refot is the setting for reversing (bitwise) the crc byte before returning it. | |
32 | */ | |
33 | extern void crc_init_ref(crc_t *crc, int order, uint32_t polynom, uint32_t initial_value, uint32_t final_xor, bool refin, bool refout); | |
34 | ||
68d9d60a | 35 | /* Initialize a crc structure. order is the order of the polynom, e.g. 32 for a CRC-32 |
36 | * polynom is the CRC polynom. initial_value is the initial value of a clean state. | |
37 | * final_xor is XORed onto the state before returning it from crc_result(). */ | |
38 | extern void crc_init(crc_t *crc, int order, uint32_t polynom, uint32_t initial_value, uint32_t final_xor); | |
39 | ||
3e134b4c | 40 | |
ee4e2816 | 41 | /* Update the crc state. data is the data of length data_width bits (only the |
68d9d60a | 42 | * data_width lower-most bits are used). |
e30c654b | 43 | */ |
68d9d60a | 44 | extern void crc_update(crc_t *crc, uint32_t data, int data_width); |
22f4dca8 | 45 | extern void crc_update2(crc_t *crc, uint32_t data, int data_width); |
68d9d60a | 46 | |
47 | /* Clean the crc state, e.g. reset it to initial_value */ | |
48 | extern void crc_clear(crc_t *crc); | |
49 | ||
50 | /* Get the result of the crc calculation */ | |
51 | extern uint32_t crc_finish(crc_t *crc); | |
52 | ||
73d04bb4 | 53 | // Calculate CRC-8/Maxim checksum |
ee4e2816 | 54 | uint32_t CRC8Maxim(uint8_t *buff, size_t size); |
55 | ||
3e134b4c | 56 | // Calculate CRC-4/Legic checksum |
57 | uint32_t CRC4Legic(uint8_t *buff, size_t size); | |
58 | ||
ee4e2816 | 59 | // Calculate CRC-8/Legic checksum |
60 | uint32_t CRC8Legic(uint8_t *buff, size_t size); | |
ee4e2816 | 61 | |
3e134b4c | 62 | // Calculate CRC-16/Legic checksum |
63 | // the initial_value is based on the previous legic_Crc8 of the UID. | |
64 | // ie: uidcrc = 0x78 then initial_value == 0x7878 | |
65 | uint32_t CRC16Legic(uint8_t *buff, size_t size, uint8_t uidcrc); | |
66 | ||
3e134b4c | 67 | // test crc 16. |
68 | uint32_t CRC16_DNP(uint8_t *buff, size_t size); | |
ba4ad25b | 69 | uint32_t CRC16_CCITT(uint8_t *buff, size_t size); |
82e690f4 | 70 | uint32_t CRC16_Iso15693(uint8_t *buff, size_t size); |
71 | uint32_t CRC16_ICLASS(uint8_t *buff, size_t size); | |
3e134b4c | 72 | |
68d9d60a | 73 | /* Static initialization of a crc structure */ |
74 | #define CRC_INITIALIZER(_order, _polynom, _initial_value, _final_xor) { \ | |
75 | .state = ((_initial_value) & ((1L<<(_order))-1)), \ | |
76 | .order = (_order), \ | |
77 | .polynom = (_polynom), \ | |
78 | .initial_value = (_initial_value), \ | |
79 | .final_xor = (_final_xor), \ | |
3e134b4c | 80 | .mask = ((1L<<(_order))-1) \ |
81 | .refin = FALSE, \ | |
82 | .refout = FALSE \ | |
83 | } | |
68d9d60a | 84 | |
e30c654b | 85 | #endif /* __CRC_H */ |