qdec.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /**
  2. * @file qdec.h
  3. * @author chipsea
  4. * @brief
  5. * @version 0.1
  6. * @date 2020-11-30
  7. * @copyright Copyright (c) 2020, CHIPSEA Co., Ltd.
  8. * @note
  9. */
  10. /*******************************************************************************
  11. * @file qdec.h
  12. * @brief Contains all functions support for key scan driver
  13. * @version 0.0
  14. * @date 13. Nov. 2017
  15. * @author Ding
  16. *
  17. *
  18. *******************************************************************************/
  19. #ifndef __QDEC__H__
  20. #define __QDEC__H__
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. #include "types.h"
  25. #include "gpio.h"
  26. #define QDEC_IRQ_ENABLE *(volatile unsigned int *) 0xe000e100 |= BIT(30)
  27. #define ENABLE_CHN(n) *(volatile unsigned int *) 0x4000B000 |= BIT(4*n)
  28. #define DISABLE_CHN(n) *(volatile unsigned int *) 0x4000B000 &= ~BIT(4*n)
  29. #define EN_INT_QUAN(n) *(volatile unsigned int *) 0x4000B004 |= BIT(8*n)
  30. #define EN_INT_INCN(n) *(volatile unsigned int *) 0x4000B004 |= BIT(4+8*n)
  31. #define DIS_INT_QUAN(n) *(volatile unsigned int *) 0x4000B004 &= ~BIT(8*n)
  32. #define DIS_INT_INCN(n) *(volatile unsigned int *) 0x4000B004 &= ~BIT(4+8*n)
  33. #define SET_INT_MODE_QUAN(chn,mod) subWriteReg(0x4000B004,2+8*chn,2+8*chn,mod)
  34. #define SET_INT_MODE_INCN(chn,mod) subWriteReg(0x4000B004,6+8*chn,6+8*chn,mod)
  35. #define EN_INT_F20_QUAN(n) *(volatile unsigned int *) 0x4000B004 |= BIT(24+2*n)
  36. #define EN_INT_02F_QUAN(n) *(volatile unsigned int *) 0x4000B004 |= BIT(25+2*n)
  37. #define DIS_INT_F20_QUAN(n) *(volatile unsigned int *) 0x4000B004 &= ~BIT(24+2*n)
  38. #define DIS_INT_02F_QUAN(n) *(volatile unsigned int *) 0x4000B004 &= ~BIT(25+2*n)
  39. #define CLR_INT_F20_QUAN(n) *(volatile unsigned int *) 0x4000B008 |= BIT(24+2*n)
  40. #define CLR_INT_02F_QUAN(n) *(volatile unsigned int *) 0x4000B008 |= BIT(25+2*n)
  41. #define CLR_INT_QUAN(n) *(volatile unsigned int *) 0x4000B008 |= BIT(8*n)
  42. #define CLR_INT_INCN(n) *(volatile unsigned int *) 0x4000B008 |= BIT(4+8*n)
  43. #define STATUS_INT_QUAN(n) read_reg(0x4000B00C) & BIT(8*n)
  44. #define STATUS_INT_INCN(n) read_reg(0x4000B00C) & BIT(4+8*n)
  45. #define STATUS_INT_F20_QUAN(n) read_reg(0x4000B00C) & BIT(24+2*n)
  46. #define STATUS_INT_02F_QUAN(n) read_reg(0x4000B00C) & BIT(25+2*n)
  47. #define SET_MODE_QUAN(chn,mod) subWriteReg(0x4000B010 + 0x14*chn,1,0, mod)
  48. #define SET_MODE_INCN(chn,mod) subWriteReg(0x4000B010 + 0x14*chn,17,16,mod)
  49. #define SET_HIT_QUAN(chn,mod) write_reg(0x4000B014 + 0x14*chn,mod)
  50. #define SET_HIT_INCN(chn,mod) write_reg(0x4000B018 + 0x14*chn,mod)
  51. #define GET_CNT_QUAN(n) read_reg(0x4000B01C + 0x14*n)
  52. #define GET_CNT_INCN(n) read_reg(0x4000B020 + 0x14*n)
  53. /*************************************************************
  54. * @brief enum variable used for setting channel
  55. *
  56. */
  57. typedef enum{
  58. QDEC_CHX = 0,
  59. QDEC_CHY = 1,
  60. QDEC_CHZ = 2
  61. }QDEC_CHN_e;
  62. /*************************************************************
  63. * @brief enum variable used for setting quadrature count mode
  64. *
  65. */
  66. typedef enum{
  67. QDEC_MODE_1X = 1,
  68. QDEC_MODE_2X = 2,
  69. QDEC_MODE_4X = 3
  70. }QDEC_QUA_MODE_e;
  71. /*************************************************************
  72. * @brief enum variable used for setting index count mode
  73. *
  74. */
  75. typedef enum{
  76. HIGH_LEVEL = 0,
  77. POS_EDGE = 1,
  78. NEG_EDGE = 2,
  79. POS_OR_NEG_EDGE = 3,
  80. }QDEC_INC_MODE_e;
  81. /*************************************************************
  82. * @brief enum variable used for setting interupt mode
  83. *
  84. */
  85. typedef enum{
  86. INT_BY_CHANGE = 0,
  87. INT_BY_HIT = 1
  88. }QDEC_INT_MODE_e;
  89. typedef struct {
  90. int32_t count;
  91. } qdec_Evt_t;
  92. typedef void (*qdec_Hdl_t)(qdec_Evt_t* pev);
  93. typedef struct {
  94. GpioPin_t cha_pin;
  95. GpioPin_t chb_pin;
  96. QDEC_CHN_e qdec_chn;
  97. QDEC_QUA_MODE_e quaMode;
  98. QDEC_INT_MODE_e intMode;
  99. qdec_Hdl_t evt_handler;
  100. bool use_inc;
  101. bool use_inc_irq;
  102. GpioPin_t chi_pin;
  103. QDEC_INC_MODE_e incMode;
  104. } qdec_Cfg_t;
  105. typedef struct {
  106. bool enable;
  107. qdec_Cfg_t cfg;
  108. int32_t count;
  109. uint8_t pin_state[3];
  110. GpioPin_t pin_arr[3];
  111. uint8_t qdec_task_id;
  112. uint16_t timeout_event;
  113. } qdec_Ctx_t;
  114. static void qdec_hw_config(void);
  115. static void qdec_sleep_handler(void);
  116. static void qdec_wakeup_handler(void);
  117. static void hal_qdec_set_cha(QDEC_CHN_e qdecCHN,GpioPin_t pin);
  118. static void hal_qdec_set_chb(QDEC_CHN_e qdecCHN,GpioPin_t pin);
  119. static void hal_qdec_set_chi(QDEC_CHN_e qdecCHN,GpioPin_t pin);
  120. static void hal_qdec_set_qua_irq(QDEC_CHN_e chn, QDEC_INT_MODE_e intMode);
  121. static void hal_qdec_set_inc_irq(QDEC_CHN_e chn, QDEC_INC_MODE_e incMode, QDEC_INT_MODE_e intMode);
  122. int hal_qdec_init(qdec_Cfg_t cfg, uint8 task_id, uint16 event);
  123. void hal_qdec_timeout_handler(void);
  124. void hal_qdec_IRQHandler(void);
  125. #ifdef __cplusplus
  126. }
  127. #endif
  128. #endif