aboutsummaryrefslogtreecommitdiff
path: root/lib/chibios-contrib/ext/mcux-sdk/components/crc/fsl_adapter_software_crc.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chibios-contrib/ext/mcux-sdk/components/crc/fsl_adapter_software_crc.c')
-rw-r--r--lib/chibios-contrib/ext/mcux-sdk/components/crc/fsl_adapter_software_crc.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/chibios-contrib/ext/mcux-sdk/components/crc/fsl_adapter_software_crc.c b/lib/chibios-contrib/ext/mcux-sdk/components/crc/fsl_adapter_software_crc.c
new file mode 100644
index 000000000..4e7815ca7
--- /dev/null
+++ b/lib/chibios-contrib/ext/mcux-sdk/components/crc/fsl_adapter_software_crc.c
@@ -0,0 +1,94 @@
1/*
2 * Copyright 2018 NXP
3 * All rights reserved.
4 *
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9#include "fsl_common.h"
10#include "fsl_adapter_crc.h"
11
12/*******************************************************************************
13 * Code
14 ******************************************************************************/
15uint32_t HAL_CrcCompute(hal_crc_config_t *crcConfig, uint8_t *dataIn, uint32_t length)
16{
17 uint32_t shiftReg = crcConfig->crcSeed << ((4U - crcConfig->crcSize) << 3U);
18 uint32_t crcPoly = crcConfig->crcPoly << ((4U - crcConfig->crcSize) << 3U);
19 uint32_t crcXorOut = crcConfig->crcXorOut << ((4U - crcConfig->crcSize) << 3U);
20 uint16_t startOffset = crcConfig->crcStartByte;
21 uint8_t crcBits = 8U * crcConfig->crcSize;
22 uint32_t computedCRC = 0;
23 uint32_t i, j;
24 uint8_t data = 0;
25 uint8_t bit;
26
27 /* Size 0 will bypass CRC calculation. */
28 if (crcConfig->crcSize != 0U)
29 {
30 for (i = 0UL + startOffset; i < length; i++)
31 {
32 data = dataIn[i];
33
34 if (crcConfig->crcRefIn == KHAL_CrcRefInput)
35 {
36 bit = 0U;
37 for (j = 0U; j < 8U; j++)
38 {
39 bit = (bit << 1);
40 bit |= ((data & 1U) != 0U) ? 1U : 0U;
41 data = (data >> 1);
42 }
43 data = bit;
44 }
45
46 for (j = 0; j < 8U; j++)
47 {
48 bit = ((data & 0x80U) != 0U) ? 1U : 0U;
49 data = (data << 1);
50
51 if ((shiftReg & 1UL << 31) != 0U)
52 {
53 bit = (bit != 0U) ? 0U : 1U;
54 }
55
56 shiftReg = (shiftReg << 1);
57
58 if (bit != 0U)
59 {
60 shiftReg ^= crcPoly;
61 }
62
63 if ((bool)bit && ((crcPoly & (1UL << (32U - crcBits))) != 0U))
64 {
65 shiftReg |= (1UL << (32U - crcBits));
66 }
67 else
68 {
69 shiftReg &= ~(1UL << (32U - crcBits));
70 }
71 }
72 }
73
74 shiftReg ^= crcXorOut;
75
76 if (crcConfig->crcByteOrder == KHAL_CrcMSByteFirst)
77 {
78 computedCRC = (shiftReg >> (32U - crcBits));
79 }
80 else
81 {
82 computedCRC = 0;
83 j = 1U;
84 for (i = 0; i < 32U; i++)
85 {
86 computedCRC = (computedCRC << 1);
87 computedCRC |= ((shiftReg & j) != 0U) ? 1U : 0U;
88 j = (j << 1);
89 }
90 }
91 }
92
93 return computedCRC;
94}