fork download
  1. #include <stdio.h>
  2.  
  3. #define RFID_AS_CRC_TABLE_SIZE 256
  4. #define RFID_AS_MSB_16 (1<<15)
  5. #define RFID_AS_MSB_8 (1<<7)
  6. #define RFID_AS_BYTE_LEN 8
  7. #define RFID_AS_CRC5_LEN 5
  8. #define RFID_AS_CRC16_LEN 16
  9. #define RFID_AS_CRC5_POLYNOMIAL (0x9)
  10. #define RFID_AS_CRC16_POLYNOMIAL (0x1021)
  11. #define RFID_AS_CRC5_POLYNOMIAL_BMSK ((1<<RFID_AS_CRC5_LEN)-1)
  12. #define RFID_AS_CRC5_SEED (0x9)
  13. #define RFID_AS_CRC16_SEED (0xFFFF)
  14. #define RFID_AS_CRC5_RESIDUAL 0x0
  15. #define RFID_AS_CRC16_RESIDUAL (0xFFFF-0x1D0F)
  16.  
  17. typedef struct
  18. {
  19. unsigned int TRext:1;
  20. unsigned int M:2;
  21. unsigned int DR:1;
  22. unsigned int Command:4; // end of byte 0
  23. unsigned int Q_high:3;
  24. unsigned int Target:1;
  25. unsigned int Session:2;
  26. unsigned int Sel:2; // end of byte 1
  27. unsigned int reserved_0:2;
  28. unsigned int CRC:5;
  29. unsigned int Q_low:1; // end of byte 2
  30. unsigned int reserved_1:8;
  31. } query_cmd_s;
  32.  
  33. unsigned char rfid_as_crc5_table[RFID_AS_CRC_TABLE_SIZE];
  34. unsigned short rfid_as_crc16_table[RFID_AS_CRC_TABLE_SIZE];
  35.  
  36. void rfid_crc5_init()
  37. {
  38. unsigned char bit_pos, remainder;
  39. unsigned short byte_val;
  40.  
  41. for(byte_val = 0; byte_val < RFID_AS_CRC_TABLE_SIZE; byte_val++)
  42. {
  43. remainder = byte_val;
  44.  
  45. for(bit_pos = 0; bit_pos < RFID_AS_BYTE_LEN; bit_pos++)
  46. {
  47. if(remainder & RFID_AS_MSB_8)
  48. {
  49. remainder = (remainder << 1) ^ (RFID_AS_CRC5_POLYNOMIAL << (RFID_AS_BYTE_LEN - RFID_AS_CRC5_LEN));
  50. }
  51. else
  52. {
  53. remainder = remainder << 1;
  54. }
  55. }
  56.  
  57. rfid_as_crc5_table[byte_val] = remainder >> (RFID_AS_BYTE_LEN - RFID_AS_CRC5_LEN);
  58.  
  59. #if 0
  60. printf("0x%02x, ", rfid_as_crc5_table[byte_val]);
  61. if((byte_val + 1)%8 == 0)
  62. printf("\n");
  63. #endif
  64. }
  65.  
  66. return;
  67. }
  68.  
  69. void rfid_crc16_init()
  70. {
  71. unsigned char bit_pos;
  72. unsigned short byte_val, remainder;
  73.  
  74.  
  75. for(byte_val = 0; byte_val < RFID_AS_CRC_TABLE_SIZE; byte_val++)
  76. {
  77. remainder = byte_val << (RFID_AS_CRC16_LEN-RFID_AS_BYTE_LEN);
  78.  
  79. for(bit_pos = 0; bit_pos < RFID_AS_BYTE_LEN; bit_pos++)
  80. {
  81. if(remainder & RFID_AS_MSB_16)
  82. {
  83. remainder = (remainder << 1) ^ RFID_AS_CRC16_POLYNOMIAL;
  84. }
  85. else
  86. {
  87. remainder = remainder << 1;
  88. }
  89. }
  90.  
  91. rfid_as_crc16_table[byte_val] = remainder;
  92.  
  93. #if 0
  94. printf("0x%04x, ", rfid_as_crc16_table[byte_val]);
  95. if((byte_val + 1)%8 == 0)
  96. printf("\n");
  97. #endif
  98. }
  99.  
  100. return;
  101. }
  102.  
  103. unsigned char rfid_crc5_cal
  104. (
  105. unsigned char *buf_ptr,
  106. unsigned short bit_len
  107. )
  108. {
  109. unsigned char crc5, last_byte;
  110.  
  111. for(crc5 = RFID_AS_CRC5_SEED; bit_len >= RFID_AS_BYTE_LEN; bit_len -= RFID_AS_BYTE_LEN, buf_ptr++)
  112. {
  113. crc5 = rfid_as_crc5_table[(crc5 << (RFID_AS_BYTE_LEN-RFID_AS_CRC5_LEN)) ^ *buf_ptr];
  114. }
  115.  
  116. if(bit_len !=0)
  117. {
  118. last_byte = *buf_ptr;
  119.  
  120. while(bit_len-- != 0)
  121. {
  122. if(((crc5 << (RFID_AS_BYTE_LEN - RFID_AS_CRC5_LEN)) ^ last_byte) & RFID_AS_MSB_8)
  123. {
  124. crc5 = ((crc5 << 1) ^ RFID_AS_CRC5_POLYNOMIAL) & RFID_AS_CRC5_POLYNOMIAL_BMSK;
  125. }
  126. else
  127. {
  128. crc5 = (crc5 << 1) & RFID_AS_CRC5_POLYNOMIAL_BMSK;
  129. }
  130.  
  131. last_byte <<= 1;
  132. }
  133. }
  134.  
  135. return crc5;
  136. }
  137.  
  138. unsigned short rfid_crc16_cal
  139. (
  140. unsigned char *buf_ptr,
  141. unsigned short bit_len
  142. )
  143. {
  144. unsigned short crc16, last_byte;
  145.  
  146. for(crc16 = RFID_AS_CRC16_SEED; bit_len >= RFID_AS_BYTE_LEN; bit_len -= RFID_AS_BYTE_LEN, buf_ptr++)
  147. {
  148. crc16 = rfid_as_crc16_table[(crc16 >> (RFID_AS_CRC16_LEN - RFID_AS_BYTE_LEN)) ^ *buf_ptr] ^ (crc16 << RFID_AS_BYTE_LEN);
  149. }
  150.  
  151. if(bit_len !=0)
  152. {
  153. last_byte = (*buf_ptr) << (RFID_AS_CRC16_LEN - RFID_AS_BYTE_LEN);
  154.  
  155. while(bit_len-- != 0)
  156. {
  157. if((crc16 ^ last_byte) & RFID_AS_MSB_16)
  158. {
  159. crc16 = (crc16 << 1) ^ RFID_AS_CRC16_POLYNOMIAL;
  160. }
  161. else
  162. {
  163. crc16 = crc16 << 1;
  164. }
  165.  
  166. last_byte <<= 1;
  167. }
  168. }
  169.  
  170. return ~crc16;
  171. }
  172.  
  173. void main()
  174. {
  175. rfid_crc5_init();
  176. rfid_crc16_init();
  177.  
  178. unsigned char data[] = {0x80,0xb6,0xa4,0x41,0xec,0xB2,0xDD,0xD9,0x01,0x40, 0xC4, 0xF3};
  179.  
  180. unsigned short crc = rfid_crc16_cal(data, 41);
  181.  
  182. printf("crc 0x%x \n", crc);
  183. }
  184.  
Success #stdin #stdout 0s 5284KB
stdin
45
stdout
crc 0xf2d1