chg: adjusted the input parameters for crc16 implementations.

This commit is contained in:
iceman1001 2018-01-28 12:19:04 +01:00
commit 205e4b2300
8 changed files with 206 additions and 61 deletions

View file

@ -70,7 +70,8 @@ void crc_update(crc_t *crc, uint32_t data, int data_width)
uint32_t crc_finish(crc_t *crc) {
uint32_t val = crc->state;
if (crc->refout) val = reflect(val, crc->order);
if (crc->refout)
val = reflect(val, crc->order);
return ( val ^ crc->final_xor ) & crc->mask;
}
@ -159,20 +160,3 @@ uint32_t CRC16_CCITT(uint8_t *buff, size_t size) {
crc_update(&crc, buff[i], 8);
return crc_finish(&crc);
}
//width=16 poly=0x8408 init=0xffff refin=false refout=true xorout=0xffff check=0xF0B8 name="CRC-16/ISO/IEC 13239"
uint32_t CRC16_Iso15693(uint8_t *buff, size_t size) {
crc_t crc;
crc_init_ref(&crc, 16, 0x8408, 0xFFFF, 0xFFFF, true, false);
for ( int i=0; i < size; ++i)
crc_update(&crc, buff[i], 8);
return reflect16(crc_finish(&crc));
}
//width=16 poly=0x8408 init=0xffff refin=true refout=true xorout=0x0BC3 check=0xF0B8 name="CRC-16/ICLASS"
uint32_t CRC16_ICLASS(uint8_t *buff, size_t size) {
crc_t crc;
crc_init_ref(&crc, 16, 0x8408, 0xFFFF, 0x0BC3, false, false);
for ( int i=0; i < size; ++i)
crc_update(&crc, buff[i], 8);
return crc_finish(&crc);
}

View file

@ -70,8 +70,6 @@ uint32_t CRC16Legic(uint8_t *buff, size_t size, uint8_t uidcrc);
// test crc 16.
uint32_t CRC16_DNP(uint8_t *buff, size_t size);
uint32_t CRC16_CCITT(uint8_t *buff, size_t size);
uint32_t CRC16_Iso15693(uint8_t *buff, size_t size);
uint32_t CRC16_ICLASS(uint8_t *buff, size_t size);
/* Static initialization of a crc structure */
#define CRC_INITIALIZER(_order, _polynom, _initial_value, _final_xor) { \

View file

@ -30,7 +30,7 @@ uint16_t update_crc16( uint16_t crc, uint8_t c ) {
// two ways.
// msb or lsb loop.
//
uint16_t crc16(uint8_t const *d, int length, uint16_t remainder, uint16_t polynomial, bool refin, bool refout) {
uint16_t crc16(uint8_t const *d, size_t length, uint16_t remainder, uint16_t polynomial, bool refin, bool refout) {
if (length == 0)
return (~remainder);
@ -63,35 +63,44 @@ uint16_t crc16(uint8_t const *d, int length, uint16_t remainder, uint16_t polyno
return remainder;
}
uint16_t crc16_ccitt(uint8_t const *d, int n) {
uint16_t crc16_ccitt(uint8_t const *d, size_t n) {
return crc16(d, n, 0xffff, CRC16_POLY_CCITT, false, false);
}
//poly=0x1021 init=0x0000 refin=true refout=true xorout=0x0000 name="KERMIT"
uint16_t crc16_ccitt_kermit(uint8_t const *message, int length){
return crc16_kermit(message, length);
uint16_t crc16_ccitt_kermit(uint8_t const *d, size_t n){
return crc16_kermit(d, n);
}
uint16_t crc16_kermit(uint8_t const *d, int n) {
uint16_t crc16_kermit(uint8_t const *d, size_t n) {
return crc16(d, n, 0x0000, CRC16_POLY_CCITT, true, true);
}
//FeliCa uses XMODEM
//poly=0x1021 init=0x0000 refin=false refout=false xorout=0x0000 name="XMODEM"
uint16_t crc16_xmodem(uint8_t const *d, int n) {
uint16_t crc16_xmodem(uint8_t const *d, size_t n) {
return crc16(d, n, 0x0000, CRC16_POLY_CCITT, false, false);
}
//ISO 15693 uses X-25, CRC_B (or 14443-3 )
//poly=0x1021 init=0xffff refin=true refout=true xorout=0xffff name="X-25"
uint16_t crc16_x25(uint8_t const *d, int n) {
uint16_t crc16_x25(uint8_t const *d, size_t n) {
uint16_t crc = crc16(d, n, 0xffff, CRC16_POLY_CCITT, true, true);
crc ^= 0xFFFF;
return crc;
}
//CRC-A (14443-3)
//poly=0x1021 init=0xc6c6 refin=true refout=true xorout=0x0000 name="CRC-A"
uint16_t crc16_a(uint8_t const *d, int n) {
uint16_t crc16_a(uint8_t const *d, size_t n) {
return crc16(d, n, 0xc6c6, 0x1021, true, true);
}
bool check_crc16_ccitt(uint8_t const *d, int n) {
//width=16 poly=0x8408 init=0xffff refin=true refout=true xorout=0x0BC3 check=0xF0B8 name="CRC-16/ICLASS"
uint16_t crc16_iclass(uint8_t const *d, size_t n) {
uint16_t crc = crc16(d, n, 0xffff, CRC16_POLY_CCITT, true, true);
crc ^= 0x0BC3;
return crc;
}
// CHECK functions.
bool check_crc16_ccitt(uint8_t const *d, size_t n) {
if (n < 3) return false;
uint16_t crc = crc16_ccitt(d, n - 2);

View file

@ -17,17 +17,18 @@
uint16_t update_crc16_ex( uint16_t crc, uint8_t c, uint16_t polynomial );
uint16_t update_crc16(uint16_t crc, uint8_t c);
uint16_t crc16(uint8_t const *message, int length, uint16_t remainder, uint16_t polynomial, bool refin, bool refout);
uint16_t crc16_ccitt(uint8_t const *message, int length);
uint16_t crc16(uint8_t const *message, size_t length, uint16_t remainder, uint16_t polynomial, bool refin, bool refout);
uint16_t crc16_ccitt_kermit(uint8_t const *message, int length);
uint16_t crc16_kermit(uint8_t const *message, int length);
uint16_t crc16_xmodem(uint8_t const *d, int n);
uint16_t crc16_ccitt(uint8_t const *d, size_t n);
uint16_t crc16_ccitt_kermit(uint8_t const *d, size_t n);
uint16_t crc16_kermit(uint8_t const *d, size_t n);
uint16_t crc16_xmodem(uint8_t const *d, size_t n);
uint16_t crc16_x25(uint8_t const *d, size_t n);
uint16_t crc16_a(uint8_t const *d, size_t n);
uint16_t crc16_iclass(uint8_t const *d, size_t size);
uint16_t crc16_x25(uint8_t const *d, int n);
uint16_t crc16_a(uint8_t const *d, int n);
bool check_crc16_ccitt(uint8_t const *d, int n);
//checks
bool check_crc16_ccitt(uint8_t const *d, size_t n);
//felica imp
void felica_test();