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
5 //-----------------------------------------------------------------------------
7 //-----------------------------------------------------------------------------
11 unsigned short update_crc16( unsigned short crc
, unsigned char c
)
13 unsigned short i
, v
, tcrc
= 0;
16 for (i
= 0; i
< 8; i
++) {
17 tcrc
= ( (tcrc
^ v
) & 1 ) ? ( tcrc
>> 1 ) ^ 0x8408 : tcrc
>> 1;
21 return ((crc
>> 8) ^ tcrc
)&0xffff;
24 uint16_t crc16(uint8_t const *message
, int length
, uint16_t remainder
, uint16_t polynomial
) {
26 if (length
== 0) return (~remainder
);
28 for (int byte
= 0; byte
< length
; ++byte
) {
29 remainder
^= (message
[byte
] << 8);
30 for (uint8_t bit
= 8; bit
> 0; --bit
) {
31 if (remainder
& 0x8000) {
32 remainder
= (remainder
<< 1) ^ polynomial
;
34 remainder
= (remainder
<< 1);
41 uint16_t crc16_ccitt(uint8_t const *message
, int length
) {
42 return crc16(message
, length
, 0xffff, 0x1021);
45 uint16_t crc16_ccitt_kermit(uint8_t const *message
, int length
) {
46 return bit_reverse_uint16(crc16(message
, length
, 0x0000, 0x1021));
49 uint16_t bit_reverse_uint16 (uint16_t value
) {
50 const uint16_t mask0
= 0x5555;
51 const uint16_t mask1
= 0x3333;
52 const uint16_t mask2
= 0x0F0F;
53 const uint16_t mask3
= 0x00FF;
55 value
= (((~mask0
) & value
) >> 1) | ((mask0
& value
) << 1);
56 value
= (((~mask1
) & value
) >> 2) | ((mask1
& value
) << 2);
57 value
= (((~mask2
) & value
) >> 4) | ((mask2
& value
) << 4);
58 value
= (((~mask3
) & value
) >> 8) | ((mask3
& value
) << 8);