Skip to content

Commit fd8b974

Browse files
author
Steven Cartmell
committed
Add K64F Hardware CRC reference implementation
- Add support for all currently defined polynomials - Add 'CRC' flag to targets.json for K64F profile
1 parent e0d98bf commit fd8b974

File tree

2 files changed

+126
-1
lines changed

2 files changed

+126
-1
lines changed
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#include "crc_api.h"
2+
3+
#include "drivers/fsl_crc.h"
4+
#include "platform/mbed_assert.h"
5+
6+
#ifdef DEVICE_CRC
7+
8+
static crc_bits_t width;
9+
10+
bool hal_crc_is_supported(const uint32_t polynomial)
11+
{
12+
switch (polynomial)
13+
{
14+
case POLY_8BIT_CCITT:
15+
case POLY_7BIT_SD:
16+
case POLY_16BIT_CCITT:
17+
case POLY_16BIT_IBM:
18+
case POLY_32BIT_ANSI:
19+
return true;
20+
default:
21+
return false;
22+
}
23+
}
24+
25+
void hal_crc_compute_partial_start(const uint32_t polynomial)
26+
{
27+
crc_config_t config;
28+
29+
switch (polynomial)
30+
{
31+
case POLY_32BIT_ANSI:
32+
{
33+
width = kCrcBits32;
34+
35+
config.polynomial = polynomial;
36+
config.seed = 0xFFFFFFFFU;
37+
config.reflectIn = true;
38+
config.reflectOut = true;
39+
config.complementChecksum = true;
40+
config.crcBits = width;
41+
config.crcResult = kCrcFinalChecksum;
42+
43+
break;
44+
}
45+
case POLY_16BIT_IBM:
46+
{
47+
width = kCrcBits16;
48+
49+
config.polynomial = polynomial;
50+
config.seed = 0;
51+
config.reflectIn = true;
52+
config.reflectOut = true;
53+
config.complementChecksum = false;
54+
config.crcBits = width;
55+
config.crcResult = kCrcFinalChecksum;
56+
57+
break;
58+
}
59+
case POLY_16BIT_CCITT:
60+
{
61+
width = kCrcBits16;
62+
63+
config.polynomial = polynomial;
64+
config.seed = 0xFFFFFFFFU;
65+
config.reflectIn = false;
66+
config.reflectOut = false;
67+
config.complementChecksum = false;
68+
config.crcBits = width;
69+
config.crcResult = kCrcFinalChecksum;
70+
71+
break;
72+
}
73+
case POLY_8BIT_CCITT:
74+
{
75+
width = kCrcBits16;
76+
77+
config.polynomial = polynomial;
78+
config.seed = 0U;
79+
config.reflectIn = false;
80+
config.reflectOut = false;
81+
config.complementChecksum = false;
82+
config.crcBits = width;
83+
config.crcResult = kCrcFinalChecksum;
84+
85+
break;
86+
}
87+
case POLY_7BIT_SD:
88+
{
89+
width = kCrcBits16;
90+
91+
config.polynomial = polynomial;
92+
config.seed = 0U;
93+
config.reflectIn = false;
94+
config.reflectOut = false;
95+
config.complementChecksum = false;
96+
config.crcBits = width;
97+
config.crcResult = kCrcFinalChecksum;
98+
99+
break;
100+
}
101+
}
102+
103+
CRC_Init(CRC0, &config);
104+
}
105+
106+
void hal_crc_compute_partial(const uint8_t *data, const size_t size)
107+
{
108+
CRC_WriteData(CRC0, data, size);
109+
}
110+
111+
uint32_t hal_crc_get_result(void)
112+
{
113+
switch (width)
114+
{
115+
case kCrcBits16:
116+
return CRC_Get16bitResult(CRC0);
117+
case kCrcBits32:
118+
return CRC_Get32bitResult(CRC0);
119+
default:
120+
MBED_ASSERT("Unhandled switch case");
121+
return 0;
122+
}
123+
}
124+
125+
#endif // DEVICE_CRC

targets/targets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@
631631
"macros": ["CPU_MK64FN1M0VMD12", "FSL_RTOS_MBED"],
632632
"inherits": ["Target"],
633633
"detect_code": ["0240"],
634-
"device_has": ["ANALOGIN", "ANALOGOUT", "EMAC", "I2C", "I2CSLAVE", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPI_ASYNCH", "SPISLAVE", "STDIO_MESSAGES", "STORAGE", "TRNG", "FLASH"],
634+
"device_has": ["ANALOGIN", "ANALOGOUT", "CRC", "EMAC", "I2C", "I2CSLAVE", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_FC", "SERIAL_ASYNCH", "SLEEP", "SPI", "SPI_ASYNCH", "SPISLAVE", "STDIO_MESSAGES", "STORAGE", "TRNG", "FLASH"],
635635
"features": ["LWIP", "STORAGE"],
636636
"release_versions": ["2", "5"],
637637
"device_name": "MK64FN1M0xxx12",

0 commit comments

Comments
 (0)