Merge "Update keyboard scanning for stm32 to use messages"

This commit is contained in:
Gerrit
2012-04-11 17:21:21 -07:00
committed by Gerrit Code Review
4 changed files with 52 additions and 3 deletions

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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 */