• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_QEI_DRV_H
9 #define HPM_QEI_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_qei_regs.h"
13 /**
14  * @brief QEI driver APIs
15  * @defgroup qei_interface QEI driver APIs
16  * @ingroup io_interfaces
17  * @{
18  *
19  */
20 #define QEI_EVENT_WDOG_FLAG_MASK (1U << 31) /**< watchdog flag */
21 #define QEI_EVENT_HOME_FLAG_MASK (1U << 30) /**< home flag */
22 #define QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK (1U << 29) /**< postion compare match flag */
23 #define QEI_EVENT_Z_PHASE_FLAG_MASK (1U << 28) /**< z input flag */
24 
25 /**
26  * @brief counting mode of Z-phase counter
27  *
28  */
29 typedef enum qei_z_count_inc_mode {
30     qei_z_count_inc_on_z_input_assert = 0, /**< zcnt will increment or decrement when Z input assert */
31     qei_z_count_inc_on_phase_count_max = 1, /**< zcnt will increment when phcnt upcount to phmax, decrement when phcnt downcount to 0 */
32 } qei_z_count_inc_mode_t;
33 
34 /**
35  * @brief motor rotation direction
36  *
37  */
38 typedef enum qei_rotation_dir_cmp {
39     qei_rotation_dir_cmp_positive = 0,  /**< position compare need positive rotation */
40     qei_rotation_dir_cmp_negative = 1,   /**< position compare need negative rotation */
41     qei_rotation_dir_cmp_ignore = 2,    /**< ignore */
42 } qei_rotation_dir_cmp_t;
43 
44 /**
45  * @brief counter type
46  *
47  */
48 typedef enum qei_counter_type {
49     qei_counter_type_z = 0, /**< Z counter */
50     qei_counter_type_phase = 1, /**< Phase counter */
51     qei_counter_type_speed = 2, /**< Speed counter */
52     qei_counter_type_timer = 3, /**< Timer counter */
53 } qei_counter_type_t;
54 
55 /**
56  * @brief qei work mode
57  *
58  */
59 typedef enum qei_work_mode {
60     qei_work_mode_abz = 0,  /**< Orthogonal decoder mode */
61     qei_work_mode_pd = 1,   /**< Directional (PD) mode */
62     qei_work_mode_ud = 2,   /**< Up and Down (UD) mode */
63 } qei_work_mode_t;
64 
65 /**
66  * @brief speed history type
67  *
68  */
69 typedef enum qei_speed_his_type {
70     qei_speed_his0 = QEI_SPDHIS_SPDHIS0, /**< Speed history0 */
71     qei_speed_his1 = QEI_SPDHIS_SPDHIS1, /**< Speed history1 */
72     qei_speed_his2 = QEI_SPDHIS_SPDHIS2, /**< Speed history2 */
73     qei_speed_his3 = QEI_SPDHIS_SPDHIS3, /**< Speed history3 */
74 } qei_speed_his_type_t;
75 
76 #ifdef __cplusplus
77 extern "C" {
78 #endif
79 
80 /**
81  * @brief enable qei watchdog
82  *
83  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
84  */
qei_wdog_enable(QEI_Type * qei_x)85 static inline void qei_wdog_enable(QEI_Type *qei_x)
86 {
87     qei_x->WDGCFG |= QEI_WDGCFG_WDGEN_MASK;
88 }
89 
90 /**
91  * @brief disable qei watchdog
92  *
93  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
94  */
qei_wdog_disable(QEI_Type * qei_x)95 static inline void qei_wdog_disable(QEI_Type *qei_x)
96 {
97     qei_x->WDGCFG &= ~QEI_WDGCFG_WDGEN_MASK;
98 }
99 
100 /**
101  * @brief config watchdog
102  *
103  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
104  * @param[in] timeout watchdog timeout time
105  * @param[in] enable
106  *  @arg 1 - enable watchdog, You can use the @ref qei_wdog_disable  open watchdog
107  *  @arg 0 - disable watchdog, You can use the @ref qei_wdog_enable  open watchdog
108  */
qei_wdog_config(QEI_Type * qei_x,uint32_t timeout,bool enable)109 static inline void qei_wdog_config(QEI_Type *qei_x, uint32_t timeout, bool enable)
110 {
111     qei_x->WDGCFG = QEI_WDGCFG_WDGTO_SET(timeout) | QEI_WDGCFG_WDGEN_SET(enable);
112 }
113 
114 /**
115  * @brief
116  *
117  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
118  * @param[in] phase_count maximum phcnt number, phcnt will rollover to 0 when it upcount to phmax
119  * @param[in] mode
120  *  @arg 1 zcnt will increment when phcnt upcount to phmax, decrement when phcnt downcount to 0
121  *  @arg 0 zcnt will increment or decrement when Z input assert
122  * @param[in] z_calibrate  1- phcnt will set to phidx when Z input assert
123  */
qei_phase_config(QEI_Type * qei_x,uint32_t phase_count,qei_z_count_inc_mode_t mode,bool z_calibrate)124 static inline void qei_phase_config(QEI_Type *qei_x, uint32_t phase_count,
125                               qei_z_count_inc_mode_t mode, bool z_calibrate)
126 {
127     qei_x->PHCFG = QEI_PHCFG_ZCNTCFG_SET(mode) | QEI_PHCFG_PHCALIZ_SET(z_calibrate)
128                 | QEI_PHCFG_PHMAX_SET(phase_count - 1);
129 }
130 
131 /**
132  * @brief set phase index
133  *
134  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
135  * @param[in] phase_index phcnt reset value, phcnt will reset to phidx when phcaliz set to 1
136  */
qei_phase_set_index(QEI_Type * qei_x,uint32_t phase_index)137 static inline void qei_phase_set_index(QEI_Type *qei_x, uint32_t phase_index)
138 {
139     qei_x->PHIDX = QEI_PHIDX_PHIDX_SET(phase_index);
140 }
141 
142 /**
143  * @brief enable trigger event
144  *
145  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
146  * @param[in] event_mask
147  *  @arg @ref QEI_EVENT_WDOG_FLAG_MASK
148  *  @arg @ref QEI_EVENT_HOME_FLAG_MASK
149  *  @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
150  *  @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
151  */
qei_output_trigger_event_enable(QEI_Type * qei_x,uint32_t event_mask)152 static inline void qei_output_trigger_event_enable(QEI_Type *qei_x, uint32_t event_mask)
153 {
154     qei_x->TRGOEN |= event_mask;
155 }
156 
157 /**
158  * @brief disable trigger event
159  *
160  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
161  * @param[in] event_mask
162  *  @arg @ref QEI_EVENT_WDOG_FLAG_MASK
163  *  @arg @ref QEI_EVENT_HOME_FLAG_MASK
164  *  @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
165  *  @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
166  */
qei_output_trigger_event_disable(QEI_Type * qei_x,uint32_t event_mask)167 static inline void qei_output_trigger_event_disable(QEI_Type *qei_x, uint32_t event_mask)
168 {
169     qei_x->TRGOEN &= ~event_mask;
170 }
171 
172 /**
173  * @brief enable load read  trigger event
174  *
175  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
176  * @param[in] event_mask
177  *  @arg @ref QEI_EVENT_WDOG_FLAG_MASK
178  *  @arg @ref QEI_EVENT_HOME_FLAG_MASK
179  *  @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
180  *  @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
181  */
qei_load_read_trigger_event_enable(QEI_Type * qei_x,uint32_t event_mask)182 static inline void qei_load_read_trigger_event_enable(QEI_Type *qei_x, uint32_t event_mask)
183 {
184     qei_x->READEN |= event_mask;
185 }
186 
187 /**
188  * @brief disable load read trigger event
189  *
190  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
191  * @param[in] event_mask
192  *  @arg @ref QEI_EVENT_WDOG_FLAG_MASK
193  *  @arg @ref QEI_EVENT_HOME_FLAG_MASK
194  *  @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
195  *  @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
196  */
qei_load_read_trigger_event_disable(QEI_Type * qei_x,uint32_t event_mask)197 static inline void qei_load_read_trigger_event_disable(QEI_Type *qei_x, uint32_t event_mask)
198 {
199     qei_x->READEN &= ~event_mask;
200 }
201 
202 /**
203  * @brief set zcnt postion compare value
204  *
205  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
206  * @param[in] cmp zcnt postion compare value
207  */
qei_z_cmp_set(QEI_Type * qei_x,uint32_t cmp)208 static inline void qei_z_cmp_set(QEI_Type *qei_x, uint32_t cmp)
209 {
210     qei_x->ZCMP = QEI_ZCMP_ZCMP_SET(cmp);
211 }
212 
213 /**
214  * @brief set spdcnt position compare value
215  *
216  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
217  * @param[in] cmp spdcnt position compare value
218  */
qei_speed_cmp_set(QEI_Type * qei_x,uint32_t cmp)219 static inline void qei_speed_cmp_set(QEI_Type *qei_x, uint32_t cmp)
220 {
221     qei_x->SPDCMP = QEI_SPDCMP_SPDCMP_SET(cmp);
222 }
223 
224 /**
225  * @brief set Phase comparator value
226  *
227  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
228  * @param[in] cmp phcnt position compare value
229  * @param[in] cmp_z 1- postion compare not include zcnt
230  * @param[in] rotation_dir @ref qei_rotation_dir_cmp_t
231  */
qei_phase_cmp_set(QEI_Type * qei_x,uint32_t cmp,bool cmp_z,qei_rotation_dir_cmp_t rotation_dir)232 static inline void qei_phase_cmp_set(QEI_Type *qei_x, uint32_t cmp,
233                             bool cmp_z, qei_rotation_dir_cmp_t rotation_dir)
234 {
235     qei_x->PHCMP = QEI_PHCMP_PHCMP_SET(cmp)
236         | QEI_PHCMP_ZCMPDIS_SET(!cmp_z)
237         | ((rotation_dir == qei_rotation_dir_cmp_ignore)
238                 ? QEI_PHCMP_DIRCMPDIS_MASK : (QEI_PHCMP_DIRCMP_SET(rotation_dir)));
239 }
240 
241 /**
242  * @brief clear qei status register
243  *
244  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
245  * @param[in] mask
246  *  @arg @ref QEI_EVENT_WDOG_FLAG_MASK
247  *  @arg @ref QEI_EVENT_HOME_FLAG_MASK
248  *  @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
249  *  @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
250  */
qei_clear_status(QEI_Type * qei_x,uint32_t mask)251 static inline void qei_clear_status(QEI_Type *qei_x, uint32_t mask)
252 {
253     qei_x->SR = mask;
254 }
255 
256 /**
257  * @brief get qei status
258  *
259  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
260  * @retval qei status:
261  *  @arg @ref QEI_EVENT_WDOG_FLAG_MASK
262  *  @arg @ref QEI_EVENT_HOME_FLAG_MASK
263  *  @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
264  *  @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
265  */
qei_get_status(QEI_Type * qei_x)266 static inline uint32_t qei_get_status(QEI_Type *qei_x)
267 {
268     return qei_x->SR;
269 }
270 
271 /**
272  * @brief get qei bit status
273  *
274  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
275  * @param[in] mask
276  *  @arg @ref QEI_EVENT_WDOG_FLAG_MASK
277  *  @arg @ref QEI_EVENT_HOME_FLAG_MASK
278  *  @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
279  *  @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
280  * @retval true or false
281  */
qei_get_bit_status(QEI_Type * qei_x,uint32_t mask)282 static inline bool qei_get_bit_status(QEI_Type *qei_x, uint32_t mask)
283 {
284     if ((qei_x->SR & mask) == mask) {
285         return true;
286     } else {
287         return false;
288     }
289 }
290 
291 /**
292  * @brief enable qei irq
293  *
294  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
295  * @param[in] mask
296  *  @arg @ref QEI_EVENT_WDOG_FLAG_MASK
297  *  @arg @ref QEI_EVENT_HOME_FLAG_MASK
298  *  @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
299  *  @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
300  */
qei_irq_enable(QEI_Type * qei_x,uint32_t mask)301 static inline void qei_irq_enable(QEI_Type *qei_x, uint32_t mask)
302 {
303     qei_x->IRQEN |= mask;
304 }
305 
306 /**
307  * @brief disable qei irq
308  *
309  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
310  * @param[in] mask
311  *  @arg @ref QEI_EVENT_WDOG_FLAG_MASK
312  *  @arg @ref QEI_EVENT_HOME_FLAG_MASK
313  *  @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
314  *  @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
315  */
qei_irq_disable(QEI_Type * qei_x,uint32_t mask)316 static inline void qei_irq_disable(QEI_Type *qei_x, uint32_t mask)
317 {
318     qei_x->IRQEN &= ~mask;
319 }
320 
321 /**
322  * @brief enable dma request
323  *
324  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
325  * @param[in] mask
326  *  @arg @ref QEI_EVENT_WDOG_FLAG_MASK
327  *  @arg @ref QEI_EVENT_HOME_FLAG_MASK
328  *  @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
329  *  @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
330  */
qei_dma_request_enable(QEI_Type * qei_x,uint32_t mask)331 static inline void qei_dma_request_enable(QEI_Type *qei_x, uint32_t mask)
332 {
333     qei_x->DMAEN |= mask;
334 }
335 
336 /**
337  * @brief disable qei dma
338  *
339  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
340  * @param[in] mask
341  *  @arg @ref QEI_EVENT_WDOG_FLAG_MASK
342  *  @arg @ref QEI_EVENT_HOME_FLAG_MASK
343  *  @arg @ref QEI_EVENT_POSITIVE_COMPARE_FLAG_MASK
344  *  @arg @ref QEI_EVENT_Z_PHASE_FLAG_MASK
345  */
qei_dma_request_disable(QEI_Type * qei_x,uint32_t mask)346 static inline void qei_dma_request_disable(QEI_Type *qei_x, uint32_t mask)
347 {
348     qei_x->DMAEN &= ~mask;
349 }
350 
351 /**
352  * @brief get current counter value
353  *
354  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
355  * @param[in] type @ref qei_counter_type_t
356  * @retval counter value
357  */
qei_get_current_count(QEI_Type * qei_x,qei_counter_type_t type)358 static inline uint32_t qei_get_current_count(QEI_Type *qei_x,
359                                             qei_counter_type_t type)
360 {
361     return *(&qei_x->COUNT[QEI_COUNT_CURRENT].Z + type);
362 }
363 
364 /**
365  * @brief get current phcnt value
366  *
367  * @param qei_x QEI base address, HPM_QEIx(x=0...n)
368  * @return phcnt value
369  */
qei_get_current_phase_phcnt(QEI_Type * qei_x)370 static inline uint32_t qei_get_current_phase_phcnt(QEI_Type *qei_x)
371 {
372     return QEI_COUNT_PH_PHCNT_GET(qei_get_current_count(qei_x, qei_counter_type_phase));
373 }
374 
375 /**
376  * @brief get current a phase status
377  *
378  * @param qei_x QEI base address, HPM_QEIx(x=0...n)
379  * @return a phase level
380  */
qei_get_current_phase_astat(QEI_Type * qei_x)381 static inline bool qei_get_current_phase_astat(QEI_Type *qei_x)
382 {
383     return QEI_COUNT_PH_ASTAT_GET(qei_get_current_count(qei_x, qei_counter_type_phase));
384 }
385 
386 /**
387  * @brief get current b phase status
388  *
389  * @param qei_x QEI base address, HPM_QEIx(x=0...n)
390  * @return b phase level
391  */
qei_get_current_phase_bstat(QEI_Type * qei_x)392 static inline bool qei_get_current_phase_bstat(QEI_Type *qei_x)
393 {
394     return QEI_COUNT_PH_BSTAT_GET(qei_get_current_count(qei_x, qei_counter_type_phase));
395 }
396 
397 /**
398  * @brief get current phase dir
399  *
400  * @param qei_x QEI base address, HPM_QEIx(x=0...n)
401  * @return dir
402  */
qei_get_current_phase_dir(QEI_Type * qei_x)403 static inline bool qei_get_current_phase_dir(QEI_Type *qei_x)
404 {
405     return QEI_COUNT_PH_DIR_GET(qei_get_current_count(qei_x, qei_counter_type_phase));
406 }
407 
408 /**
409  * @brief get read event count value
410  *
411  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
412  * @param[in] type @ref qei_counter_type_t
413  * @retval counter value
414  */
qei_get_count_on_read_event(QEI_Type * qei_x,qei_counter_type_t type)415 static inline uint32_t qei_get_count_on_read_event(QEI_Type *qei_x,
416                                             qei_counter_type_t type)
417 {
418     return *(&(qei_x->COUNT[QEI_COUNT_READ].Z) + type);
419 }
420 
421 /**
422  * @brief read the value of each phase snapshot 0 counter
423  *
424  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
425  * @param[in] type @ref qei_counter_type_t
426  * @retval counter value
427  */
qei_get_count_on_snap0_event(QEI_Type * qei_x,qei_counter_type_t type)428 static inline uint32_t qei_get_count_on_snap0_event(QEI_Type *qei_x,
429                                             qei_counter_type_t type)
430 {
431     return *(&qei_x->COUNT[QEI_COUNT_SNAP0].Z + type);
432 }
433 
434 /**
435  * @brief read the value of each phase snapshot 1 counter
436  *
437  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
438  * @param[in] type @ref qei_counter_type_t
439  * @retval  counter value
440  */
qei_get_count_on_snap1_event(QEI_Type * qei_x,qei_counter_type_t type)441 static inline uint32_t qei_get_count_on_snap1_event(QEI_Type *qei_x,
442                                             qei_counter_type_t type)
443 {
444     return *(&qei_x->COUNT[QEI_COUNT_SNAP1].Z + type);
445 }
446 
447 /**
448  * @brief get speed history
449  *
450  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
451  * @param[in] hist_index @ref qei_speed_his_type_t
452  * @retval speed history value
453  *  @arg counter value
454  */
qei_get_speed_history(QEI_Type * qei_x,qei_speed_his_type_t hist_index)455 static inline uint32_t qei_get_speed_history(QEI_Type *qei_x, qei_speed_his_type_t hist_index)
456 {
457     return QEI_SPDHIS_SPDHIS0_GET(qei_x->SPDHIS[hist_index]);
458 }
459 
460 /**
461  * @brief load phcnt, zcnt, spdcnt and tmrcnt into their read registers
462  *
463  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
464  */
qei_load_counter_to_read_registers(QEI_Type * qei_x)465 static inline void qei_load_counter_to_read_registers(QEI_Type *qei_x)
466 {
467     qei_x->CR |= QEI_CR_READ_MASK;
468 }
469 
470 /**
471  * @brief reset spdcnt/phcnt/zcnt
472  *
473  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
474  * @param[in] counter_mask
475  *  @arg 1 reset zcnt when H assert
476  *  @arg (1<<1) reset phcnt when H assert
477  *  @arg (1<<2) reset spdcnt when H assert
478  */
qei_reset_counter_on_h_assert(QEI_Type * qei_x,uint32_t counter_mask)479 static inline void qei_reset_counter_on_h_assert(QEI_Type *qei_x,
480                                                uint32_t counter_mask)
481 {
482     qei_x->CR |= counter_mask << 16;
483 }
484 
485 /**
486  * @brief  pause spdcnt when PAUSE assert
487  *
488  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
489  * @param[in] counter_mask
490  *  @arg 1 pause spdcnt when PAUSE assert
491  *  @arg (1<<1)  pause spdcnt when PAUSE assert
492  *  @arg (1<<2) pause spdcnt when PAUSE assert
493  */
qei_pause_counter_on_pause(QEI_Type * qei_x,uint32_t counter_mask)494 static inline void qei_pause_counter_on_pause(QEI_Type *qei_x,
495                                                uint32_t counter_mask)
496 {
497     qei_x->CR |= counter_mask << 12;
498 }
499 
500 /**
501  * @brief  load phcnt, zcnt, spdcnt and tmrcnt into their snap registers
502  *
503  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
504  */
qei_snap_enable(QEI_Type * qei_x)505 static inline void qei_snap_enable(QEI_Type *qei_x)
506 {
507     qei_x->CR |= QEI_CR_SNAPEN_MASK;
508 }
509 
510 /**
511  * @brief disable snap
512  *
513  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
514  */
qei_snap_disable(QEI_Type * qei_x)515 static inline void qei_snap_disable(QEI_Type *qei_x)
516 {
517     qei_x->CR &= ~QEI_CR_SNAPEN_MASK;
518 }
519 
520 /**
521  * @brief reset zcnt, spdcnt and tmrcnt to 0
522  *
523  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
524  */
qei_counter_reset_assert(QEI_Type * qei_x)525 static inline void qei_counter_reset_assert(QEI_Type *qei_x)
526 {
527     qei_x->CR |= QEI_CR_RSTCNT_MASK;
528 }
529 
530 /**
531  * @brief qei counter reset release
532  *
533  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
534  */
qei_counter_reset_release(QEI_Type * qei_x)535 static inline void qei_counter_reset_release(QEI_Type *qei_x)
536 {
537     qei_x->CR &= ~QEI_CR_RSTCNT_MASK;
538 }
539 
540 /**
541  * @brief set work mode
542  *
543  * @param[in] qei_x QEI base address, HPM_QEIx(x=0...n)
544  * @param[in] mode @ref qei_work_mode_t
545  */
qei_set_work_mode(QEI_Type * qei_x,qei_work_mode_t mode)546 static inline void qei_set_work_mode(QEI_Type *qei_x, qei_work_mode_t mode)
547 {
548     qei_x->CR = (qei_x->CR & ~QEI_CR_ENCTYP_MASK) | QEI_CR_ENCTYP_SET(mode);
549 }
550 
551 #ifdef __cplusplus
552 }
553 #endif
554 /**
555  * @}
556  */
557 #endif /* HPM_QEI_DRV_H */
558