mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-10 09:31:51 +00:00
Merge "Update keyboard scanning for stm32 to use messages"
This commit is contained in:
@@ -455,3 +455,9 @@ void keyboard_put_char(uint8_t chr, int send_irq)
|
||||
#error "keyboard_scan needs to know what bus to use for keyboard interface"
|
||||
#endif
|
||||
}
|
||||
|
||||
/* We don't support this API yet, just return -1 */
|
||||
int keyboard_get_scan(uint8_t **buffp, int max_bytes)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -73,8 +73,12 @@ enum COL_INDEX {
|
||||
/* 15:14, 12:8, 2 */
|
||||
#define IRQ_MASK 0xdf04
|
||||
|
||||
/* The keyboard state from the last read */
|
||||
static uint8_t raw_state[KB_COLS];
|
||||
|
||||
/* The keyboard state we will return when requested */
|
||||
static uint8_t saved_state[KB_COLS];
|
||||
|
||||
/* Mask with 1 bits only for keys that actually exist */
|
||||
static const uint8_t *actual_key_mask;
|
||||
|
||||
@@ -167,6 +171,15 @@ static const uint32_t ports[] = { GPIO_A, GPIO_B, GPIO_C, GPIO_D };
|
||||
#error "Need to specify GPIO ports used by keyboard"
|
||||
#endif
|
||||
|
||||
/* Provide a default function in case the board doesn't have one */
|
||||
void __board_keyboard_scan_ready(void)
|
||||
{
|
||||
}
|
||||
|
||||
void board_keyboard_scan_ready(void)
|
||||
__attribute__((weak, alias("__board_keyboard_scan_ready")));
|
||||
|
||||
|
||||
static void select_column(int col)
|
||||
{
|
||||
int i;
|
||||
@@ -283,9 +296,12 @@ int keyboard_scan_init(void)
|
||||
STM32L_GPIO_PUPDR_OFF(ports[i]) = tmp32;
|
||||
}
|
||||
|
||||
/* Initialize raw state */
|
||||
for (i = 0; i < KB_COLS; i++)
|
||||
raw_state[i] = 0;
|
||||
/*
|
||||
* Initialize raw state since host may request it before
|
||||
* a key has been pressed (e.g. during keyboard driver init)
|
||||
*/
|
||||
for (i = 0; i < ARRAY_SIZE(raw_state); i++)
|
||||
raw_state[i] = 0x00;
|
||||
|
||||
/* TODO: method to set which keyboard we have, so we set the actual
|
||||
* key mask properly */
|
||||
@@ -395,6 +411,9 @@ static int check_keys_changed(void)
|
||||
}
|
||||
|
||||
if (change) {
|
||||
memcpy(saved_state, raw_state, sizeof(saved_state));
|
||||
board_keyboard_scan_ready();
|
||||
|
||||
uart_printf("[%d keys pressed: ", num_press);
|
||||
for (c = 0; c < KB_COLS; c++) {
|
||||
if (raw_state[c])
|
||||
@@ -472,3 +491,9 @@ int keyboard_scan_recovery_pressed(void)
|
||||
/* TODO: (crosbug.com/p/8573) needs to be implemented */
|
||||
return 0;
|
||||
}
|
||||
|
||||
int keyboard_get_scan(uint8_t **buffp, int max_bytes)
|
||||
{
|
||||
*buffp = saved_state;
|
||||
return sizeof(saved_state);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
#include "board.h"
|
||||
#include "message.h"
|
||||
#include "keyboard_scan.h"
|
||||
#include "util.h"
|
||||
|
||||
/* Our ID message - Matrix KeyBoard Protocol */
|
||||
@@ -39,6 +40,8 @@ static int message_get_response(int cmd, uint8_t **buffp, int max_len)
|
||||
case CMDC_ID:
|
||||
*buffp = (char *)proto_id;
|
||||
return sizeof(proto_id) - 1;
|
||||
case CMDC_KEY_STATE:
|
||||
return keyboard_get_scan(buffp, max_len);
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -16,4 +16,19 @@ int keyboard_scan_init(void);
|
||||
/* Returns non-zero if recovery key was pressed at boot. */
|
||||
int keyboard_scan_recovery_pressed(void);
|
||||
|
||||
/**
|
||||
* Get the scan data from the keyboard.
|
||||
*
|
||||
* This returns the results of the last keyboard scan, by pointing the
|
||||
* supplied buffer to it, and returning the number of bytes available.
|
||||
*
|
||||
* The supplied buffer can be used directly if required, but in that case
|
||||
* the number of bytes available is limited to 'max_bytes'.
|
||||
*
|
||||
* @param buffp Pointer to buffer to contain data
|
||||
* @param max_bytes Maximum number of bytes available in *buffp
|
||||
* @return number of bytes available, or -1 for error
|
||||
*/
|
||||
int keyboard_get_scan(uint8_t **buffp, int max_bytes);
|
||||
|
||||
#endif /* __CROS_KEYBOARD_SCAN_H */
|
||||
|
||||
Reference in New Issue
Block a user