summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chip/stm32/keyboard_scan.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/chip/stm32/keyboard_scan.c b/chip/stm32/keyboard_scan.c
index 1705528a90..de537cc931 100644
--- a/chip/stm32/keyboard_scan.c
+++ b/chip/stm32/keyboard_scan.c
@@ -44,6 +44,20 @@ static struct mutex scanning_enabled;
/* The keyboard state from the last read */
static uint8_t raw_state[KB_OUTPUTS];
+/* Mask with 1 bits only for keys that actually exist */
+static const uint8_t *actual_key_mask;
+
+/* All actual key masks (todo: move to keyboard matrix definition) */
+/* TODO: (crosbug.com/p/7485) fill in real key mask with 0-bits for coords that
+ aren't keys */
+static const uint8_t actual_key_masks[4][KB_OUTPUTS] = {
+ {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+ {0},
+ {0},
+ {0},
+ };
+
/* Key masks for special boot keys */
#define MASK_INDEX_ESC 1
#define MASK_VALUE_ESC 0x02
@@ -265,6 +279,9 @@ static int check_keys_changed(void)
/* Invert it so 0=not pressed, 1=pressed */
r ^= 0xff;
+ /* Mask off keys that don't exist so they never show
+ * as pressed */
+ r &= actual_key_mask[c];
#ifdef OR_WITH_CURRENT_STATE_FOR_TESTING
/* KLUDGE - or current state in, so we can make sure
@@ -353,6 +370,10 @@ int keyboard_scan_init(void)
/* Tri-state (put into Hi-Z) the outputs */
select_column(COL_TRI_STATE_ALL);
+ /* TODO: method to set which keyboard we have, so we set the actual
+ * key mask properly */
+ actual_key_mask = actual_key_masks[0];
+
/* Initialize raw state */
check_keys_changed();