kscan.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /**
  2. * @file kscan.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 kscan.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 __KSCAN__H__
  20. #define __KSCAN__H__
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif
  24. #include "types.h"
  25. #include "gpio.h"
  26. #define MULTI_KEY_NUM 6
  27. #define MULTI_KEY_READ_ADDR (&(AP_KSCAN->mkc[0]))//0x400240CCUL
  28. //#define MULTI_KEY_READ_ADDR 0x4000d0CCUL//0x400240CCUL
  29. const static uint8_t KSCAN_ROW_GPIO[11] =
  30. {
  31. P0,
  32. P2,
  33. P15,
  34. P25,
  35. P10,
  36. P18,
  37. P23,
  38. P32,
  39. P34,
  40. P27,
  41. P7,
  42. };
  43. const static uint8_t KSCAN_COL_GPIO[12] =
  44. {
  45. P1,
  46. P3,
  47. P14,
  48. P24,
  49. P9,
  50. P20,
  51. P33,
  52. P31,
  53. P26,
  54. P17,
  55. P16,
  56. P11,
  57. };
  58. #define NUM_KEY_ROWS 4
  59. #define NUM_KEY_COLS 4
  60. #define MAX_KEY_NUM 10
  61. #define MAX_KEY_ROWS (sizeof(KSCAN_ROW_GPIO)/sizeof(uint8_t))
  62. #define MAX_KEY_COLS (sizeof(KSCAN_COL_GPIO)/sizeof(uint8_t))
  63. #define KSCAN_ALL_ROW_NUM 11
  64. #define KSCAN_ALL_COL_NUM 12
  65. /*************************************************************
  66. * @brief enum variable used for setting rows
  67. *
  68. */
  69. typedef enum
  70. {
  71. KEY_ROW_P00 = 0,
  72. KEY_ROW_P02 = 1,
  73. KEY_ROW_P15 = 2,
  74. KEY_ROW_P25 = 3,
  75. KEY_ROW_P10 = 4,
  76. KEY_ROW_P18 = 5,
  77. KEY_ROW_P23 = 6,
  78. KEY_ROW_P32 = 7,
  79. KEY_ROW_P34 = 8,
  80. KEY_ROW_P27 = 9,
  81. KEY_ROW_P07 = 10,
  82. }KSCAN_ROWS_e;
  83. /*************************************************************
  84. * @brief enum variable used for setting cols
  85. *
  86. */
  87. typedef enum
  88. {
  89. KEY_COL_P01 = 0,
  90. KEY_COL_P03 = 1,
  91. KEY_COL_P14 = 2,
  92. KEY_COL_P24 = 3,
  93. KEY_COL_P09 = 4,
  94. KEY_COL_P20 = 5,
  95. KEY_COL_P33 = 6,
  96. KEY_COL_P31 = 7,
  97. KEY_COL_P26 = 8,
  98. // KEY_COL_P17 = 9,
  99. // KEY_COL_P16 = 10,
  100. KEY_COL_P11 = 11,
  101. }KSCAN_COLS_e;
  102. /*************************************************************
  103. * @brief enum variable used for setting multiple key press
  104. *
  105. */
  106. typedef enum{
  107. NOT_IGNORE_MULTI_KEY = 0,
  108. IGNORE_MULTI_KEY = 1
  109. }KSCAN_MULTI_KEY_STATE_e;
  110. /*************************************************************
  111. * @brief enum variable used for setting whether ignore ghost key
  112. *
  113. */
  114. typedef enum{
  115. NOT_IGNORE_GHOST_KEY = 0,
  116. IGNORE_GHOST_KEY = 1
  117. }KSCAN_GHOST_KEY_STATE_e;
  118. /*************************************************************
  119. * @brief enum variable used for setting key press sense type
  120. *
  121. */
  122. typedef enum{
  123. SENCE_HIGH = 0,
  124. SENCE_LOW = 1
  125. }KSCAN_POLARITY_e;
  126. /*************************************************************
  127. * @brief enum variable used for setting key press sense type
  128. *
  129. */
  130. typedef enum{
  131. NO_KEY_PRESS = 0x00,
  132. ONE_KEY_PRESS = 0x01,
  133. MULTI_KEY_PRESS = 0x02
  134. }KSCAN_KEY_PRESS_STATE_e;
  135. typedef enum{
  136. KEY_RELEASED = 0,
  137. KEY_PRESSED,
  138. } kscan_Evt_Type_t;
  139. typedef struct {
  140. uint8_t row;
  141. uint8_t col;
  142. kscan_Evt_Type_t type;
  143. } kscan_Key_t;
  144. typedef struct kscan_Evt_t_{
  145. uint8_t num;
  146. kscan_Key_t* keys;
  147. } kscan_Evt_t;
  148. typedef void (*kscan_Hdl_t)(kscan_Evt_t* pev);
  149. typedef struct {
  150. KSCAN_GHOST_KEY_STATE_e ghost_key_state;
  151. KSCAN_ROWS_e* key_rows;
  152. KSCAN_COLS_e* key_cols;
  153. kscan_Hdl_t evt_handler;
  154. uint8_t interval;
  155. } kscan_Cfg_t;
  156. //PUBLIC FUNCTIONS
  157. int hal_kscan_init(kscan_Cfg_t cfg, uint8 task_id, uint16 event);
  158. void hal_kscan_timeout_handler(void);
  159. void __attribute__((weak)) hal_KSCAN_IRQHandler(void);
  160. #ifdef __cplusplus
  161. }
  162. #endif
  163. #endif