| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- #include "include.h"
- #include "bsp_io_key.h"
- #if BSP_IOKEY_EN
- #define GPIO_SET_DIR_OUT(x, y) {x->dir&=~y; x->drv&=~y; delay_us(30);}
- #define GPIO_SET_DIR_IN(x, y) {x->dir|=y; x->pupd[0]|=y; delay_us(30);}
- key_io_typedef key_io_table_column[IO_KEY_COL_TABLE_SIZE] = {
- // {GPIOA_REG, GPIO_PIN_6},
- // {GPIOA_REG, GPIO_PIN_7},
- };
- #if IO_KEY_SCAN_MODE
- key_io_typedef key_io_table_row[IO_KEY_ROW_TABLE_SIZE] = {
- {GPIOA_REG, GPIO_PIN_0},
- {GPIOA_REG, GPIO_PIN_1},
- {GPIOA_REG, GPIO_PIN_2},
- {GPIOA_REG, GPIO_PIN_3},
- {GPIOA_REG, GPIO_PIN_4},
- {GPIOA_REG, GPIO_PIN_5},
- };
- #endif // IO_KEY_SCAN_MODE
- void bsp_io_key_init(void)
- {
- gpio_init_typedef gpio_init_structure;
- gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
- gpio_init_structure.gpio_fen = GPIO_FEN_GPIO;
- gpio_init_structure.gpio_fdir = GPIO_FDIR_SELF;
- gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
- gpio_init_structure.gpio_pupd = GPIO_PUPD_PU10K;
- /* KEY0(WK0/PP) Init */
- wko_io_config(ENABLE, DISABLE, ENABLE);
- /* KEYx Init */
- for (u8 i = 0; i < IO_KEY_COL_TABLE_SIZE; i++) {
- gpio_init_structure.gpio_pin = key_io_table_column[i].gpio_pin;
- gpio_init(key_io_table_column[i].gpiox, &gpio_init_structure);
- }
- #if IO_KEY_SCAN_MODE
- gpio_init_structure.gpio_drv = GPIO_DRV_6MA;
- gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
- for (u8 i = 0; i < IO_KEY_ROW_TABLE_SIZE; i++) {
- gpio_init_structure.gpio_pin = key_io_table_row[i].gpio_pin;
- gpio_init(key_io_table_row[i].gpiox, &gpio_init_structure);
- gpio_reset_bits(key_io_table_row[i].gpiox, key_io_table_row[i].gpio_pin);
- }
- #endif // IO_KEY_SCAN_MODE
- }
- AT(.com_text.key.scan)
- u8 bsp_get_io_key_id(void)
- {
- if (wko_io_read_bit() == RESET) { // KEY0(WK0/PP)
- return KEY_ID_PP;
- } else {
- #if IO_KEY_SCAN_MODE
- u8 column = 0;
- u8 row = 0;
- for (u8 i = 0; i < IO_KEY_COL_TABLE_SIZE; i++) {
- GPIO_SET_DIR_IN(key_io_table_column[i].gpiox, key_io_table_column[i].gpio_pin);
- column |= (gpio_read_bit(key_io_table_column[i].gpiox, key_io_table_column[i].gpio_pin))? 0x00: (0x01 << i);
- GPIO_SET_DIR_OUT(key_io_table_column[i].gpiox, key_io_table_column[i].gpio_pin);
- gpio_reset_bits(key_io_table_column[i].gpiox, key_io_table_column[i].gpio_pin);
- }
- for (u8 i = 0; i < IO_KEY_ROW_TABLE_SIZE; i++) {
- GPIO_SET_DIR_IN(key_io_table_row[i].gpiox, key_io_table_row[i].gpio_pin);
- row |= (gpio_read_bit(key_io_table_row[i].gpiox, key_io_table_row[i].gpio_pin))? 0x00: (0x01 << i);
- GPIO_SET_DIR_OUT(key_io_table_row[i].gpiox, key_io_table_row[i].gpio_pin);
- gpio_reset_bits(key_io_table_row[i].gpiox, key_io_table_row[i].gpio_pin);
- }
- /* no combination key case */
- switch (column) {
- case 0x01:
- switch (row) {
- case 0x01:
- return KEY_ID_K1;
- case 0x02:
- return KEY_ID_K2;
- case 0x04:
- break;
- case 0x08:
- break;
- case 0x10:
- break;
- case 0x20:
- break;
- default:
- break;
- }
- break;
- case 0x02:
- switch (row) {
- case 0x01:
- return KEY_ID_K3;
- case 0x02:
- return KEY_ID_K4;
- case 0x04:
- break;
- case 0x08:
- break;
- case 0x10:
- break;
- case 0x20:
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- #else // !IO_KEY_SCAN_MODE
- /* Assume that the IO definition order in key_io_table_column corresponds to the desired key_id order */
- /* Or adjust the list based on actual requirements, for example, define a list corresponding to key_io_table_column */
- u8 key_id = KEY_ID_K1;
- for (u8 i = 0; i < IO_KEY_COL_TABLE_SIZE; i++) {
- if (gpio_read_bit(key_io_table_column[i].gpiox, key_io_table_column[i].gpio_pin) == RESET) {
- return key_id;
- }
- key_id++;
- }
- #endif // IO_KEY_SCAN_MODE
- }
- return KEY_ID_NO;
- }
- #endif // BSP_IOKEY_EN
|