Hardware and Software CRC implementation for K64F
Fork of FastCRC by
CRC_HW.cpp@2:8741619dfd64, 2016-11-23 (annotated)
- Committer:
- pkozyra
- Date:
- Wed Nov 23 22:08:34 2016 +0000
- Revision:
- 2:8741619dfd64
- Child:
- 3:1a167cf7f3bb
Hardware implementation for K64F.
Who changed what in which revision?
User | Revision | Line number | New 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 | 2:8741619dfd64 | 109 | //#pragma GCC diagnostic ignored "-Wpointer-arith" |
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 | } |