| /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| /* Keyboard scanner module for Chrome EC */ |
| |
| #ifndef __CROS_EC_KEYBOARD_SCAN_H |
| #define __CROS_EC_KEYBOARD_SCAN_H |
| |
| #include "common.h" |
| #include "keyboard_config.h" |
| |
| struct keyboard_scan_config { |
| /* Delay between setting up output and waiting for it to settle */ |
| uint16_t output_settle_us; |
| /* Times for debouncing key-down and key-up */ |
| uint16_t debounce_down_us; |
| uint16_t debounce_up_us; |
| /* Time between start of scans when in polling mode */ |
| uint16_t scan_period_us; |
| /* |
| * Minimum time between end of one scan and start of the next one. |
| * This ensures keyboard scanning doesn't starve the rest of the system |
| * if the scan period is set too short, or if other higher-priority |
| * system activity is starving the keyboard scan task too. |
| */ |
| uint16_t min_post_scan_delay_us; |
| |
| /* Revert to interrupt mode after no keyboard activity for this long */ |
| uint32_t poll_timeout_us; |
| /* Mask with 1 bits only for keys that actually exist */ |
| uint8_t actual_key_mask[KEYBOARD_COLS]; |
| }; |
| |
| /** |
| * Initializes the module. |
| */ |
| void keyboard_scan_init(void); |
| |
| /** |
| * Return a pointer to the keyboard scan config. |
| */ |
| struct keyboard_scan_config *keyboard_scan_get_config(void); |
| /* |
| * Which is probably this. |
| */ |
| extern struct keyboard_scan_config keyscan_config; |
| |
| /* Key held down at keyboard-controlled reset boot time. */ |
| enum boot_key { |
| BOOT_KEY_NONE, /* No keys other than keyboard-controlled reset keys */ |
| BOOT_KEY_ESC, |
| BOOT_KEY_DOWN_ARROW, |
| BOOT_KEY_OTHER = -1, /* None of the above */ |
| }; |
| |
| #ifdef HAS_TASK_KEYSCAN |
| /** |
| * Return the key held down at boot time in addition to the keyboard-controlled |
| * reset keys. Returns BOOT_KEY_OTHER if none of the keys specifically checked |
| * was pressed, or reset was not caused by a keyboard-controlled reset. |
| */ |
| enum boot_key keyboard_scan_get_boot_key(void); |
| #else |
| static inline enum boot_key keyboard_scan_get_boot_key(void) |
| { |
| return BOOT_KEY_NONE; |
| } |
| #endif |
| |
| /** |
| * Return a pointer to the current debounced keyboard matrix state, which is |
| * KEYBOARD_COLS bytes long. |
| */ |
| const uint8_t *keyboard_scan_get_state(void); |
| |
| enum kb_scan_disable_masks { |
| /* Reasons why keyboard scanning should be disabled */ |
| KB_SCAN_DISABLE_LID_CLOSED = (1<<0), |
| KB_SCAN_DISABLE_POWER_BUTTON = (1<<1), |
| KB_SCAN_DISABLE_LID_ANGLE = (1<<2), |
| }; |
| |
| #ifdef HAS_TASK_KEYSCAN |
| /** |
| * Enable/disable keyboard scanning. Scanning will be disabled if any disable |
| * reason bit is set. Scanning is enabled only if no disable reasons are set. |
| * |
| * @param enable Clear(=1) or set(=0) disable-bits from the mask. |
| * @param mask Disable reasons from kb_scan_disable_masks |
| */ |
| void keyboard_scan_enable(int enable, enum kb_scan_disable_masks mask); |
| #else |
| static inline void keyboard_scan_enable(int enable, |
| enum kb_scan_disable_masks mask) { } |
| #endif |
| |
| #ifdef CONFIG_KEYBOARD_SUPPRESS_NOISE |
| /** |
| * Indicate to audio codec that a key has been pressed. |
| * |
| * Boards may supply this function to suppress audio noise. |
| */ |
| void keyboard_suppress_noise(void); |
| #endif |
| |
| #endif /* __CROS_EC_KEYBOARD_SCAN_H */ |