InPlay API
hal_crc.h
1 
12 #ifndef HAL_CRC_H
13 #define HAL_CRC_H
14 #include "in_mmap.h"
15 #include <stdint.h>
16 #if !CFG_NO_OS
17 #include "cmsis_os.h"
18 #endif
19 #include "./hal/hal_power.h"
20 #define CRC_OUT_MASK8 (0xFFU)
21 #define CRC_OUT_MASK16 (0xFFFFU)
22 #define CRC_OUT_MASK24 (0xFFFFFFU)
23 #define CRC_OUT_MASK32 (0xFFFFFFFFU)
24 enum crc_error {
25  CRC_ERR_OK = 0,
26  CRC_ERR_INVALID_PARAM = -1,
27  CRC_ERR_TIMEOUT = -2,
28  CRC_ERR_BUSY = -3,
29  CRC_ERR_UNSPEC = -4,
30 };
31 
32 typedef enum {
33  CRC_32 = 0,
34  CRC_16CCITT,
35  CRC_CUSTOM,
36 } crc_mode_t;
37 
38 typedef enum crc_input_bytes {
39  CRC_1_BYTE = 0,
40  CRC_2_BYTE = 1,
41  CRC_3_BYTE = 2,
42  CRC_4_BYTE = 3
43 } crc_input_bytes_t;
44 
45 enum crc_poly {
46  CRC_POLY_8 = 0,
47  CRC_POLY_16,
48  CRC_POLY_24,
49  CRC_POLY_32,
50 };
51 enum crc_order {
52  CRC_MSB = 0,
53  CRC_LSB,
54 };
55 
56 
57 typedef struct {
58  int mode;
59  int irq_prio;
60  int en_dma;
61  void *arg;
62  void (*callback)(void* arg);
63 
64 } crc_init_t;
65 typedef struct crc_conf {
66  char bit_order;
67  char byte_order;
68  uint8_t bit_rev;
69  uint8_t byte_rev;
70  uint8_t append_zero;
71  char poly_order;
72  char output_len;
73  char pad;
74  uint32_t poly_val;
75  uint32_t init_val;
76  uint32_t init_xor_val;
77  uint32_t final_xor_val;
78 
79 } crc_conf_t;
80 
81 typedef struct {
82  void *arg;
83  void (*callback)(void* arg);
84  char irq_prio;
85  char en_dma;
86  char used;
87  char start;
88  char en_isr;
89  char output_len;
90  char pad[2];
91  crc_conf_t cfg;
92 #if !CFG_NO_OS
93  osSemaphoreId semaphore;
94  osMutexId mutex;
95 #endif // !CFG_NO_OS
96 #if CFG_PM_EN
97  int resume;
98  int power_state;
99  struct pm_module pmd;
100 #endif
101 } crc_dev_t;
102 
103 static __inline void crc_clk_enble(int en)
104 {
105  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
106  if (en) {
107  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_CLK_ENABLE;
108  } else {
109  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_CLK_ENABLE;
110  }
111  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
112 }
113 static __inline void crc_enble(int en)
114 {
115  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
116  if (en) {
117  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_ENABLE;
118  } else {
119  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_ENABLE;
120  }
121  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
122 }
123 static __inline void crc_start(int val)
124 {
125  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
126  if (val) {
127  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_START;
128  } else {
129  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_START;
130  }
131  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
132 }
133 static __inline void crc_stop(int val)
134 {
135  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
136  if (val) {
137  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_STOP;
138  } else {
139  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_STOP;
140  }
141  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
142 }
143 static __inline void crc_shiftin_bit_order(int lsb)
144 {
145  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
146  if (lsb) {
147  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_SHIFTIN_BIT_ORDER;
148  } else {
149  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_SHIFTIN_BIT_ORDER;
150  }
151  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
152 }
153 static __inline void crc_shiftin_byte_order(int lsb)
154 {
155  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
156  if (lsb) {
157  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_SHIFTIN_BYTE_ORDER;
158  } else {
159  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_SHIFTIN_BYTE_ORDER;
160  }
161  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
162 }
163 static __inline void crc_final_bit_rev(int val)
164 {
165  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
166  if (val) {
167  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_FINAL_BIT_REVERSE;
168  } else {
169  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_FINAL_BIT_REVERSE;
170  }
171  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
172 }
173 static __inline void crc_final_byte_rev(int val)
174 {
175  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
176  if (val) {
177  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_FINAL_BYTE_REVERSE;
178  } else {
179  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_FINAL_BYTE_REVERSE;
180  }
181  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
182 }
183 static __inline void crc_append_zero(int val)
184 {
185  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
186  if (val) {
187  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_FINAL_APPEND_ZERO;
188  } else {
189  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_FINAL_APPEND_ZERO;
190  }
191  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
192 }
193 static __inline void crc_dma_enble(int en)
194 {
195  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
196  if (en) {
197  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_DMA_ENABLE;
198  } else {
199  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_DMA_ENABLE;
200  }
201  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
202 }
203 static __inline void crc_unknow_input_len(int val)
204 {
205  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
206  if (val) {
207  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_UNKNOWN_INPUT_LENGTH;
208  } else {
209  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_UNKNOWN_INPUT_LENGTH;
210  }
211  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
212 }
213 static __inline void crc_clr_total_byte_cnt(int val)
214 {
215  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
216  if (val) {
217  reg |= PWM_REGS_CRC_MISC_CTRL_CTL_CRC_CLR_TOTAL_BYTE_CNT;
218  } else {
219  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_CLR_TOTAL_BYTE_CNT;
220  }
221  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
222 }
223 static __inline void crc_poly_order(int val)
224 {
225  uint32_t reg = RD_WORD(PWM_REGS_CRC_MISC_CTRL);
226  reg &= ~PWM_REGS_CRC_MISC_CTRL_CTL_CRC_POLY_ORDER;
227  reg |= (val&PWM_REGS_CRC_MISC_CTRL_CTL_CRC_POLY_ORDER_MASK)<<PWM_REGS_CRC_MISC_CTRL_CTL_CRC_POLY_ORDER_SHIFT;
228  WR_WORD(PWM_REGS_CRC_MISC_CTRL, reg);
229 }
230 static __inline void crc_poly(uint32_t val)
231 {
232  WR_WORD(PWM_REGS_CRC_POLY, val);
233 }
234 static __inline void crc_init_val(uint32_t val)
235 {
236  WR_WORD(PWM_REGS_CRC_INIT_VAL, val);
237 }
238 static __inline void crc_init_xor_val(uint32_t val)
239 {
240  WR_WORD(PWM_REGS_CRC_INIT_XOR_VAL, val);
241 }
242 static __inline void crc_final_xor_val(uint32_t val)
243 {
244  WR_WORD(PWM_REGS_CRC_FINAL_XOR_VAL, val);
245 }
246 static __inline void crc_input_num_byte(int num)
247 {
248  uint32_t reg = RD_WORD(PWM_REGS_CRC_INPUT_INFO);
249  reg &= ~PWM_REGS_CRC_INPUT_INFO_CTL_CRC_INPUT_NUM_BYTE;
250  reg |= (num&PWM_REGS_CRC_INPUT_INFO_CTL_CRC_INPUT_NUM_BYTE_MASK)<<PWM_REGS_CRC_INPUT_INFO_CTL_CRC_INPUT_NUM_BYTE_SHIFT;
251  WR_WORD(PWM_REGS_CRC_INPUT_INFO, reg);
252 }
253 static __inline void crc_input_last(int val)
254 {
255  uint32_t reg = RD_WORD(PWM_REGS_CRC_INPUT_INFO);
256  if (val)
257  reg |= PWM_REGS_CRC_INPUT_INFO_CTL_CRC_INPUT_LAST;
258  else
259  reg &= ~PWM_REGS_CRC_INPUT_INFO_CTL_CRC_INPUT_LAST;
260  WR_WORD(PWM_REGS_CRC_INPUT_INFO, reg);
261 }
262 static __inline uint32_t crc_wait_input(void)
263 {
264  return (RD_WORD(PWM_REGS_CRC_INPUT_INFO)>>3)&0x1;
265 
266 }
267 static __inline void crc_input_total_byte(uint32_t num)
268 {
269  uint32_t reg = RD_WORD(PWM_REGS_CRC_INPUT_INFO);
270  reg &= ~PWM_REGS_CRC_INPUT_INFO_CTL_CRC_INPUT_TOTAL_NUM_BYTE;
271  reg |= (num&PWM_REGS_CRC_INPUT_INFO_CTL_CRC_INPUT_TOTAL_NUM_BYTE_MASK)<<PWM_REGS_CRC_INPUT_INFO_CTL_CRC_INPUT_TOTAL_NUM_BYTE_SHIFT;
272  WR_WORD(PWM_REGS_CRC_INPUT_INFO, reg);
273 }
274 static __inline void crc_input(uint32_t val)
275 {
276  WR_WORD(PWM_REGS_CRC_INPUT, val);
277 }
278 static __inline uint32_t crc_curr_status(void)
279 {
280  return RD_WORD(PWM_REGS_CRC_STATUS)&PWM_REGS_CRC_STATUS_STS_CRC_CURR_STATUS_MASK;
281 }
282 static __inline uint32_t crc_curr_done(void)
283 {
284  return (RD_WORD(PWM_REGS_CRC_STATUS)&PWM_REGS_CRC_STATUS_STS_CRC_DONE)>>8;
285 }
286 static __inline uint32_t crc_curr_byte_cnt(void)
287 {
288  return RD_WORD(PWM_REGS_CRC_STATUS)&PWM_REGS_CRC_BYTE_CNT_STS_CRC_CURR_BYTE_CNT_SHIFT;
289 }
290 static __inline uint32_t crc_value(void)
291 {
292  return RD_WORD(PWM_REGS_CRC_VALUE);
293 }
302 int hal_crc_open(crc_init_t *init);
303 
310 int hal_crc_close(void);
311 
321 int hal_crc_start(uint8_t *buf, uint32_t len, uint32_t *crc_val);
322 
329 int hal_crc_stream_start(void);
330 
340 int hal_crc_stream_input(uint8_t *buf, uint32_t len, int last);
341 
349 int hal_crc_stream_end(uint32_t *crc_val);
350 
351 int hal_crc_cfg(crc_conf_t *conf);
352 int hal_crc_open_status(void);
353 int hal_crc_isr_status(void);
354 
355 #endif