Hardware and Software CRC implementation for K64F

Fork of FastCRC by tom dunigan

Committer:
pkozyra
Date:
Thu Dec 01 19:32:15 2016 +0000
Revision:
3:1a167cf7f3bb
Parent:
2:8741619dfd64
zmiana opisu

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pkozyra 2:8741619dfd64 1
pkozyra 2:8741619dfd64 2 #include "CRC_HW.h"
pkozyra 2:8741619dfd64 3
pkozyra 2:8741619dfd64 4 // ===============================================
pkozyra 2:8741619dfd64 5
pkozyra 2:8741619dfd64 6 typedef struct {
pkozyra 2:8741619dfd64 7 union {
pkozyra 2:8741619dfd64 8 uint32_t CRC; //CRC Data register
pkozyra 2:8741619dfd64 9 struct {
pkozyra 2:8741619dfd64 10 uint16_t CRC16;
pkozyra 2:8741619dfd64 11 uint16_t CRC16_1;
pkozyra 2:8741619dfd64 12 };
pkozyra 2:8741619dfd64 13 struct {
pkozyra 2:8741619dfd64 14 uint8_t CRC8;
pkozyra 2:8741619dfd64 15 uint8_t CRC8_1;
pkozyra 2:8741619dfd64 16 uint8_t CRC8_2;
pkozyra 2:8741619dfd64 17 uint8_t CRC8_3;
pkozyra 2:8741619dfd64 18 };
pkozyra 2:8741619dfd64 19 };
pkozyra 2:8741619dfd64 20 uint32_t GPOLY; //CRC Polynomial register
pkozyra 2:8741619dfd64 21 uint32_t CTRL; //CRC Control register
pkozyra 2:8741619dfd64 22 } CRC_T;
pkozyra 2:8741619dfd64 23
pkozyra 2:8741619dfd64 24 static volatile CRC_T * const rCRC = (CRC_T *)0x40032000;
pkozyra 2:8741619dfd64 25
pkozyra 2:8741619dfd64 26 #define CRC_CTRL_WAS 25 // Write CRC Data Register As Seed(1) / Data(0)
pkozyra 2:8741619dfd64 27 #define CRC_CTRL_TCRC 24 // Width of CRC protocol (0=16 BIT, 1=32 BIT)
pkozyra 2:8741619dfd64 28 #define CRC_CTRL_TOTR1 29 // TOTR[1]
pkozyra 2:8741619dfd64 29
pkozyra 2:8741619dfd64 30 // ================= 16-BIT CRC ===================
pkozyra 2:8741619dfd64 31
pkozyra 2:8741619dfd64 32 /** Constructor
pkozyra 2:8741619dfd64 33 * Enables CRC-clock
pkozyra 2:8741619dfd64 34 */
pkozyra 2:8741619dfd64 35 FastCRC16::FastCRC16(){
pkozyra 2:8741619dfd64 36 SIM_SCGC6 |= SIM_SCGC6_CRC_MASK;
pkozyra 2:8741619dfd64 37 }
pkozyra 2:8741619dfd64 38
pkozyra 2:8741619dfd64 39 /** XMODEM
pkozyra 2:8741619dfd64 40 * @param data Pointer to Data
pkozyra 2:8741619dfd64 41 * @param datalen Length of Data
pkozyra 2:8741619dfd64 42 * @return CRC value
pkozyra 2:8741619dfd64 43 */
pkozyra 2:8741619dfd64 44 uint16_t FastCRC16::xmodem(uint16_t poly, uint16_t data)
pkozyra 2:8741619dfd64 45 {
pkozyra 2:8741619dfd64 46 //width=16 poly=0x1021 init=0x0000 refin=false refout=false xorout=0x0000
pkozyra 2:8741619dfd64 47 return generic(poly, 0, CRC_FLAG_TOT00_TOTR00, data);
pkozyra 2:8741619dfd64 48 }
pkozyra 2:8741619dfd64 49
pkozyra 2:8741619dfd64 50 /** Update
pkozyra 2:8741619dfd64 51 * Call for subsequent calculations with previous seed
pkozyra 2:8741619dfd64 52 * @param data Pointer to Data
pkozyra 2:8741619dfd64 53 * @param datalen Length of Data
pkozyra 2:8741619dfd64 54 * @return CRC value
pkozyra 2:8741619dfd64 55 */
pkozyra 2:8741619dfd64 56 uint16_t FastCRC16::update(uint16_t data)
pkozyra 2:8741619dfd64 57 {
pkozyra 2:8741619dfd64 58 uint16_t src = data;
pkozyra 2:8741619dfd64 59 rCRC->CRC16_1 = src; //Write 16 Bit
pkozyra 2:8741619dfd64 60
pkozyra 2:8741619dfd64 61 return rCRC->CRC16_1;
pkozyra 2:8741619dfd64 62 }
pkozyra 2:8741619dfd64 63
pkozyra 2:8741619dfd64 64 /** generic function for all 16-Bit CRCs
pkozyra 2:8741619dfd64 65 * @param polynom Polynom
pkozyra 2:8741619dfd64 66 * @param seed Seed
pkozyra 2:8741619dfd64 67 * @param flags Flags
pkozyra 2:8741619dfd64 68 * @param data Pointer to Data
pkozyra 2:8741619dfd64 69 * @param datalen Length of Data
pkozyra 2:8741619dfd64 70 * @return CRC value
pkozyra 2:8741619dfd64 71 */
pkozyra 2:8741619dfd64 72 uint16_t FastCRC16::generic(const uint16_t polynom, const uint16_t seed, const uint32_t flags, uint16_t data)
pkozyra 2:8741619dfd64 73 {
pkozyra 2:8741619dfd64 74
pkozyra 2:8741619dfd64 75 rCRC->CTRL = flags | (1<<CRC_CTRL_TCRC) | (1<<CRC_CTRL_WAS);// 32-Bit Mode, prepare to write seed(25)
pkozyra 2:8741619dfd64 76 rCRC->GPOLY = ((uint32_t)polynom)<<16; // set polynom
pkozyra 2:8741619dfd64 77 rCRC->CRC = ((uint32_t)seed<<16); // this is the seed
pkozyra 2:8741619dfd64 78 rCRC->CTRL = flags | (1<<CRC_CTRL_TCRC); // Clear WAS Bit - prepare to write data
pkozyra 2:8741619dfd64 79
pkozyra 2:8741619dfd64 80 return update(data);
pkozyra 2:8741619dfd64 81 }
pkozyra 2:8741619dfd64 82
pkozyra 2:8741619dfd64 83 // ================= 32-BIT CRC ===================
pkozyra 2:8741619dfd64 84
pkozyra 2:8741619dfd64 85 /** Constructor
pkozyra 2:8741619dfd64 86 * Enables CRC-clock
pkozyra 2:8741619dfd64 87 */
pkozyra 2:8741619dfd64 88 FastCRC32::FastCRC32(){
pkozyra 2:8741619dfd64 89 SIM_SCGC6 |= SIM_SCGC6_CRC_MASK;
pkozyra 2:8741619dfd64 90 }
pkozyra 2:8741619dfd64 91
pkozyra 2:8741619dfd64 92 /** CRC32
pkozyra 2:8741619dfd64 93 * @param data Pointer to Data
pkozyra 2:8741619dfd64 94 * @param datalen Length of Data
pkozyra 2:8741619dfd64 95 * @return CRC value
pkozyra 2:8741619dfd64 96 */
pkozyra 2:8741619dfd64 97 uint32_t FastCRC32::crc32(const uint8_t *data, const uint16_t datalen)
pkozyra 2:8741619dfd64 98 {
pkozyra 2:8741619dfd64 99 // poly=0x04c11db7 init=0xffffffff refin=false refout=false xorout=0xffffffff
pkozyra 2:8741619dfd64 100 return generic(0x04C11DB7L, 0XFFFFFFFFL, CRC_FLAG_TOT00_TOTR00, data, datalen);
pkozyra 2:8741619dfd64 101 }
pkozyra 2:8741619dfd64 102
pkozyra 2:8741619dfd64 103 /** Update
pkozyra 2:8741619dfd64 104 * Call for subsequent calculations with previous seed
pkozyra 2:8741619dfd64 105 * @param data Pointer to Data
pkozyra 2:8741619dfd64 106 * @param datalen Length of Data
pkozyra 2:8741619dfd64 107 * @return CRC value
pkozyra 2:8741619dfd64 108 */
pkozyra 3:1a167cf7f3bb 109
pkozyra 2:8741619dfd64 110 uint32_t FastCRC32::update(const uint8_t *data, const uint16_t datalen)
pkozyra 2:8741619dfd64 111 {
pkozyra 2:8741619dfd64 112
pkozyra 2:8741619dfd64 113 const uint8_t *src = data;
pkozyra 2:8741619dfd64 114
pkozyra 2:8741619dfd64 115 rCRC->CRC8_3 = *src++; //Write 8 BIT
pkozyra 2:8741619dfd64 116
pkozyra 2:8741619dfd64 117 return rCRC->CRC;
pkozyra 2:8741619dfd64 118 }
pkozyra 2:8741619dfd64 119
pkozyra 2:8741619dfd64 120 /** generic function for all 32-Bit CRCs
pkozyra 2:8741619dfd64 121 * @param polynom Polynom
pkozyra 2:8741619dfd64 122 * @param seed Seed
pkozyra 2:8741619dfd64 123 * @param flags Flags
pkozyra 2:8741619dfd64 124 * @param data Pointer to Data
pkozyra 2:8741619dfd64 125 * @param datalen Length of Data
pkozyra 2:8741619dfd64 126 * @return CRC value
pkozyra 2:8741619dfd64 127 */
pkozyra 2:8741619dfd64 128 uint32_t FastCRC32::generic(const uint32_t polynom, const uint32_t seed, const uint32_t flags, const uint8_t *data, const uint16_t datalen)
pkozyra 2:8741619dfd64 129 {
pkozyra 2:8741619dfd64 130
pkozyra 2:8741619dfd64 131 rCRC->CTRL = flags | (1<<CRC_CTRL_TCRC) | (1<<CRC_CTRL_WAS); // 32Bit Mode, prepare to write seed(25)
pkozyra 2:8741619dfd64 132 rCRC->GPOLY = polynom; // Set polynom
pkozyra 2:8741619dfd64 133 rCRC->CRC = seed; // This is the seed
pkozyra 2:8741619dfd64 134 rCRC->CTRL = flags | (1<<CRC_CTRL_TCRC); // Clear WAS Bit - prepare to write data
pkozyra 2:8741619dfd64 135
pkozyra 2:8741619dfd64 136 return update(data, datalen);
pkozyra 2:8741619dfd64 137 }