1 /* Includes ------------------------------------------------------------------*/
2 #include "air32f10x_crc.h"
3 
4 /**
5   * @brief  Resets the CRC Data register (DR).
6   * @param  None
7   * @retval None
8   */
CRC_ResetDR(void)9 void CRC_ResetDR(void)
10 {
11   /* Reset CRC generator */
12   CRC->CR = CRC_CR_RESET;
13 }
14 
15 /**
16   * @brief  Computes the 32-bit CRC of a given data word(32-bit).
17   * @param  Data: data word(32-bit) to compute its CRC
18   * @retval 32-bit CRC
19   */
CRC_CalcCRC(uint32_t Data)20 uint32_t CRC_CalcCRC(uint32_t Data)
21 {
22   CRC->DR = Data;
23 
24   return (CRC->DR);
25 }
26 
27 /**
28   * @brief  Computes the 32-bit CRC of a given buffer of data word(32-bit).
29   * @param  pBuffer: pointer to the buffer containing the data to be computed
30   * @param  BufferLength: length of the buffer to be computed
31   * @retval 32-bit CRC
32   */
CRC_CalcBlockCRC(uint32_t Type,uint32_t pBuffer[],uint32_t BufferLength)33 uint32_t CRC_CalcBlockCRC(uint32_t Type,uint32_t pBuffer[], uint32_t BufferLength)
34 {
35     uint32_t index = 0;
36 
37     if (Type == CRC_16_IBM || Type == CRC_16_MAXIM || Type == CRC_16_USB || Type == CRC_16_MODBUS || \
38         Type == CRC_16_CCITT || Type == CRC_16_CCITT_FALSE || Type == CRC_16_X25 || Type == CRC_16_XMODEM )
39     {
40         switch (Type)
41         {
42             case CRC_16_IBM:
43                 CRC->INI =  CRC_INIT_VALUE_0;
44                 CRC->CR = CRC_CR_RESET;
45                 CRC->CSR =  (CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET) & (~XOR_OUT_SEL_SET) & ~POLY_SEL_SET & ~TYPE_SEL_SET;
46 
47                 break;
48 
49             case CRC_16_MAXIM:
50                 CRC->INI = CRC_INIT_VALUE_0;
51                 CRC->CR = CRC_CR_RESET;
52                 CRC->CSR = (CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET | XOR_OUT_SEL_SET) & ~POLY_SEL_SET & ~TYPE_SEL_SET;
53                 break;
54 
55             case CRC_16_USB:
56                 CRC->INI = CRC16_INIT_VALUE_FF;
57                 CRC->CR = CRC_CR_RESET;
58                 CRC->CSR = (CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET | XOR_OUT_SEL_SET) & ~POLY_SEL_SET & ~TYPE_SEL_SET;
59                 break;
60 
61             case CRC_16_MODBUS:
62                 CRC->INI = CRC16_INIT_VALUE_FF;
63                 CRC->CR = CRC_CR_RESET;
64                 CRC->CSR = (CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET) & (~XOR_OUT_SEL_SET) & ~POLY_SEL_SET & ~TYPE_SEL_SET;
65                 break;
66 
67             case CRC_16_CCITT:
68                 CRC->INI = CRC_INIT_VALUE_0;
69                 CRC->CR = CRC_CR_RESET;
70                 CRC->CSR = (((CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET) & (~XOR_OUT_SEL_SET)) | POLY_SEL_SET) & ~TYPE_SEL_SET;
71                 break;
72 
73             case CRC_16_CCITT_FALSE:
74                 CRC->INI = CRC16_INIT_VALUE_FF;
75                 CRC->CR = CRC_CR_RESET;
76                 CRC->CSR = ((((CRC->CSR & ~REV_OUT_SEL_SET) & ~REV_IN_SEL_SET) & ~XOR_OUT_SEL_SET) | POLY_SEL_SET) & ~TYPE_SEL_SET;
77                 break;
78 
79             case CRC_16_X25:
80                 CRC->INI = CRC16_INIT_VALUE_FF;
81                 CRC->CR = CRC_CR_RESET;
82                 CRC->CSR = (CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET | XOR_OUT_SEL_SET | POLY_SEL_SET) & ~TYPE_SEL_SET;
83                 break;
84 
85             case CRC_16_XMODEM:
86                 CRC->INI = CRC_INIT_VALUE_0;
87                 CRC->CR = CRC_CR_RESET;
88                 CRC->CSR = ((((CRC->CSR & ~REV_OUT_SEL_SET) & ~REV_IN_SEL_SET) & ~XOR_OUT_SEL_SET) | POLY_SEL_SET) & ~TYPE_SEL_SET;
89                 break;
90 
91             default:
92                 break;
93         }
94 
95         for(index = 0; index < BufferLength; index++)
96         {
97             CRC->DR = pBuffer[index];
98         }
99         return (CRC->DR & 0xFFFF);
100     }
101     else if(Type == CRC_32 || Type == CRC_32_MPEG_2)
102     {
103         switch (Type)
104         {
105             case CRC_32:
106                 CRC->INI = CRC32_INIT_VALUE_FF;
107                 CRC->CR = CRC_CR_RESET;
108                 CRC->CSR = CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET | XOR_OUT_SEL_SET | TYPE_SEL_SET;
109                 break;
110 
111             case CRC_32_MPEG_2:
112                 CRC->INI = CRC32_INIT_VALUE_FF;
113                 CRC->CR = CRC_CR_RESET;
114                 CRC->CSR = (((CRC->CSR & ~REV_OUT_SEL_SET) & ~REV_IN_SEL_SET) & ~XOR_OUT_SEL_SET) | TYPE_SEL_SET ;
115                 break;
116 
117             default:
118                 break;
119         }
120         for(index = 0; index < BufferLength; index++)
121         {
122             CRC->DR = pBuffer[index];
123         }
124         return (CRC->DR);
125     }
126     else
127     {
128         return 0;
129     }
130 }
131 
132 /**
133   * @brief  Returns the current CRC value.
134   * @param  None
135   * @retval 32-bit CRC
136   */
CRC_GetCRC(void)137 uint32_t CRC_GetCRC(void)
138 {
139   return (CRC->DR);
140 }
141 
142 /**
143   * @brief  Stores a 8-bit data in the Independent Data(ID) register.
144   * @param  IDValue: 8-bit value to be stored in the ID register
145   * @retval None
146   */
CRC_SetIDRegister(uint8_t IDValue)147 void CRC_SetIDRegister(uint8_t IDValue)
148 {
149   CRC->IDR = IDValue;
150 }
151 
152 /**
153   * @brief  Returns the 8-bit data stored in the Independent Data(ID) register
154   * @param  None
155   * @retval 8-bit value of the ID register
156   */
CRC_GetIDRegister(void)157 uint8_t CRC_GetIDRegister(void)
158 {
159   return (CRC->IDR);
160 }
161 
162 /**
163   * @}
164   */
165 
166 /**
167   * @}
168   */
169 
170 /**
171   * @}
172   */
173