hpm_qei_drv.h 15 KB

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