133 lines
3.1 KiB
C
133 lines
3.1 KiB
C
|
|
/*
|
|||
|
|
* crc.c
|
|||
|
|
*
|
|||
|
|
* Created on: 7 <EFBFBD><EFBFBD><EFBFBD>. 2024 <EFBFBD>.
|
|||
|
|
* Author: seklyuts
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include "f28x_project.h"
|
|||
|
|
|
|||
|
|
|
|||
|
|
const int order = 6;
|
|||
|
|
const unsigned long polynom = 0x43;
|
|||
|
|
const int direct = 1;
|
|||
|
|
const unsigned long crcinit = 0x0000;
|
|||
|
|
const unsigned long crcxor = 0xffff;
|
|||
|
|
const int refin = 0;
|
|||
|
|
const int refout = 0;
|
|||
|
|
// internal global values:
|
|||
|
|
unsigned long crcmask;
|
|||
|
|
unsigned long crchighbit;
|
|||
|
|
unsigned long crcinit_direct;
|
|||
|
|
unsigned long crcinit_nondirect;
|
|||
|
|
unsigned long crctab[256];
|
|||
|
|
|
|||
|
|
|
|||
|
|
unsigned long reflect (unsigned long crc, int bitnum) {
|
|||
|
|
// reflects the lower <20>bitnum<75> bits of <20>crc<72>
|
|||
|
|
unsigned long i, j=1, crcout=0;
|
|||
|
|
for (i=(unsigned long)1<<(bitnum-1); i; i>>=1) {
|
|||
|
|
if (crc & i) crcout|=j;
|
|||
|
|
j<<= 1;
|
|||
|
|
}
|
|||
|
|
return (crcout);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
unsigned long crcbitbybit(unsigned char* p, unsigned long len) {
|
|||
|
|
// bit by bit algorithm with augmented zero bytes.
|
|||
|
|
// does not use lookup table, suited for polynom orders between 1...32.
|
|||
|
|
unsigned long i, j, c, bit;
|
|||
|
|
unsigned long crc = crcinit_nondirect;
|
|||
|
|
for (i=0; i<len; i++) {
|
|||
|
|
c = (unsigned long)*p++;
|
|||
|
|
if (refin) c = reflect(c, 8);
|
|||
|
|
for (j=0x80; j; j>>=1) {
|
|||
|
|
bit = crc & crchighbit;
|
|||
|
|
crc<<= 1;
|
|||
|
|
if (c & j) crc|= 1;
|
|||
|
|
if (bit) crc^= polynom;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
for (i=0; i<order; i++) {
|
|||
|
|
bit = crc & crchighbit;
|
|||
|
|
crc<<= 1;
|
|||
|
|
if (bit) crc^= polynom;
|
|||
|
|
}
|
|||
|
|
if (refout) crc=reflect(crc, order);
|
|||
|
|
crc^= crcxor;
|
|||
|
|
crc&= crcmask;
|
|||
|
|
return(crc);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//unsigned long crcbitbybitfast(unsigned char* p, unsigned long len) {
|
|||
|
|
uint16_t crcbitbybitfast(uint64_t data)
|
|||
|
|
{
|
|||
|
|
// fast bit by bit algorithm without augmented zero bytes.
|
|||
|
|
// does not use lookup table, suited for polynom orders between 1...32.
|
|||
|
|
unsigned long i, j, c, bit;
|
|||
|
|
unsigned long crc = crcinit_direct;
|
|||
|
|
|
|||
|
|
crcmask = ((((uint64_t)1<<(order-1))-1)<<1)|1;
|
|||
|
|
crchighbit = (uint64_t)1<<(order-1);
|
|||
|
|
|
|||
|
|
uint16_t p[5];
|
|||
|
|
p[4] = data & 0xFF;
|
|||
|
|
p[3] = (data >> 8) & 0xFF;
|
|||
|
|
p[2] = (data >> 16) & 0xFF;
|
|||
|
|
p[1] = (data >> 24) & 0xFF;
|
|||
|
|
p[0] = (data >> 32) & 0xFF;
|
|||
|
|
for (i=0; i<5; i++) {
|
|||
|
|
c = p[i];
|
|||
|
|
// if (refin) c = reflect(c, 8);
|
|||
|
|
for (j=0x80; j; j>>=1) {
|
|||
|
|
bit = crc & crchighbit;
|
|||
|
|
crc<<= 1;
|
|||
|
|
if (c & j) bit^= crchighbit;
|
|||
|
|
if (bit) crc^= polynom;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
// if (refout) crc=reflect(crc, order);
|
|||
|
|
crc^= crcxor;
|
|||
|
|
crc&= crcmask;
|
|||
|
|
return(crc);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#define ALL_BITS 38
|
|||
|
|
#define CS_BITS 6
|
|||
|
|
|
|||
|
|
|
|||
|
|
uint16_t calcCRC(uint64_t data) // 38 bit -> 6 bit // x6 + x1 + 1/// poly = 0b1000011 = 0x86;
|
|||
|
|
{
|
|||
|
|
uint64_t temp1, temp2, crc = 0;
|
|||
|
|
uint64_t poly = (uint64_t)0b1000011 << (ALL_BITS - CS_BITS - 1);
|
|||
|
|
uint16_t i = 0;
|
|||
|
|
crc = poly;
|
|||
|
|
temp1 = data;
|
|||
|
|
crc ^= temp1;
|
|||
|
|
|
|||
|
|
for(i=0; i < (ALL_BITS - CS_BITS); i++)
|
|||
|
|
{
|
|||
|
|
// crc = (crc & ((uint64_t)1 << (ALL_BITS-1))) ? ((crc ^ poly) << 1) : (crc << 1);
|
|||
|
|
|
|||
|
|
temp2 = ((uint64_t)1 << (ALL_BITS-1));
|
|||
|
|
|
|||
|
|
if(crc & temp2)
|
|||
|
|
{
|
|||
|
|
crc = ((crc ^ poly) << 1);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
crc = (crc << 1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return (crc >> (ALL_BITS - CS_BITS));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|