bsp_io_key.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "include.h"
  2. #include "bsp_io_key.h"
  3. #if BSP_IOKEY_EN
  4. #define GPIO_SET_DIR_OUT(x, y) {x->dir&=~y; x->drv&=~y; delay_us(30);}
  5. #define GPIO_SET_DIR_IN(x, y) {x->dir|=y; x->pupd[0]|=y; delay_us(30);}
  6. key_io_typedef key_io_table_column[IO_KEY_COL_TABLE_SIZE] = {
  7. // {GPIOA_REG, GPIO_PIN_6},
  8. // {GPIOA_REG, GPIO_PIN_7},
  9. };
  10. #if IO_KEY_SCAN_MODE
  11. key_io_typedef key_io_table_row[IO_KEY_ROW_TABLE_SIZE] = {
  12. {GPIOA_REG, GPIO_PIN_0},
  13. {GPIOA_REG, GPIO_PIN_1},
  14. {GPIOA_REG, GPIO_PIN_2},
  15. {GPIOA_REG, GPIO_PIN_3},
  16. {GPIOA_REG, GPIO_PIN_4},
  17. {GPIOA_REG, GPIO_PIN_5},
  18. };
  19. #endif // IO_KEY_SCAN_MODE
  20. void bsp_io_key_init(void)
  21. {
  22. gpio_init_typedef gpio_init_structure;
  23. gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
  24. gpio_init_structure.gpio_fen = GPIO_FEN_GPIO;
  25. gpio_init_structure.gpio_fdir = GPIO_FDIR_SELF;
  26. gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
  27. gpio_init_structure.gpio_pupd = GPIO_PUPD_PU10K;
  28. /* KEY0(WK0/PP) Init */
  29. wko_io_config(ENABLE, DISABLE, ENABLE);
  30. /* KEYx Init */
  31. for (u8 i = 0; i < IO_KEY_COL_TABLE_SIZE; i++) {
  32. gpio_init_structure.gpio_pin = key_io_table_column[i].gpio_pin;
  33. gpio_init(key_io_table_column[i].gpiox, &gpio_init_structure);
  34. }
  35. #if IO_KEY_SCAN_MODE
  36. gpio_init_structure.gpio_drv = GPIO_DRV_6MA;
  37. gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
  38. for (u8 i = 0; i < IO_KEY_ROW_TABLE_SIZE; i++) {
  39. gpio_init_structure.gpio_pin = key_io_table_row[i].gpio_pin;
  40. gpio_init(key_io_table_row[i].gpiox, &gpio_init_structure);
  41. gpio_reset_bits(key_io_table_row[i].gpiox, key_io_table_row[i].gpio_pin);
  42. }
  43. #endif // IO_KEY_SCAN_MODE
  44. }
  45. AT(.com_text.key.scan)
  46. u8 bsp_get_io_key_id(void)
  47. {
  48. if (wko_io_read_bit() == RESET) { // KEY0(WK0/PP)
  49. return KEY_ID_PP;
  50. } else {
  51. #if IO_KEY_SCAN_MODE
  52. u8 column = 0;
  53. u8 row = 0;
  54. for (u8 i = 0; i < IO_KEY_COL_TABLE_SIZE; i++) {
  55. GPIO_SET_DIR_IN(key_io_table_column[i].gpiox, key_io_table_column[i].gpio_pin);
  56. column |= (gpio_read_bit(key_io_table_column[i].gpiox, key_io_table_column[i].gpio_pin))? 0x00: (0x01 << i);
  57. GPIO_SET_DIR_OUT(key_io_table_column[i].gpiox, key_io_table_column[i].gpio_pin);
  58. gpio_reset_bits(key_io_table_column[i].gpiox, key_io_table_column[i].gpio_pin);
  59. }
  60. for (u8 i = 0; i < IO_KEY_ROW_TABLE_SIZE; i++) {
  61. GPIO_SET_DIR_IN(key_io_table_row[i].gpiox, key_io_table_row[i].gpio_pin);
  62. row |= (gpio_read_bit(key_io_table_row[i].gpiox, key_io_table_row[i].gpio_pin))? 0x00: (0x01 << i);
  63. GPIO_SET_DIR_OUT(key_io_table_row[i].gpiox, key_io_table_row[i].gpio_pin);
  64. gpio_reset_bits(key_io_table_row[i].gpiox, key_io_table_row[i].gpio_pin);
  65. }
  66. /* no combination key case */
  67. switch (column) {
  68. case 0x01:
  69. switch (row) {
  70. case 0x01:
  71. return KEY_ID_K1;
  72. case 0x02:
  73. return KEY_ID_K2;
  74. case 0x04:
  75. break;
  76. case 0x08:
  77. break;
  78. case 0x10:
  79. break;
  80. case 0x20:
  81. break;
  82. default:
  83. break;
  84. }
  85. break;
  86. case 0x02:
  87. switch (row) {
  88. case 0x01:
  89. return KEY_ID_K3;
  90. case 0x02:
  91. return KEY_ID_K4;
  92. case 0x04:
  93. break;
  94. case 0x08:
  95. break;
  96. case 0x10:
  97. break;
  98. case 0x20:
  99. break;
  100. default:
  101. break;
  102. }
  103. break;
  104. default:
  105. break;
  106. }
  107. #else // !IO_KEY_SCAN_MODE
  108. /* Assume that the IO definition order in key_io_table_column corresponds to the desired key_id order */
  109. /* Or adjust the list based on actual requirements, for example, define a list corresponding to key_io_table_column */
  110. u8 key_id = KEY_ID_K1;
  111. for (u8 i = 0; i < IO_KEY_COL_TABLE_SIZE; i++) {
  112. if (gpio_read_bit(key_io_table_column[i].gpiox, key_io_table_column[i].gpio_pin) == RESET) {
  113. return key_id;
  114. }
  115. key_id++;
  116. }
  117. #endif // IO_KEY_SCAN_MODE
  118. }
  119. return KEY_ID_NO;
  120. }
  121. #endif // BSP_IOKEY_EN