diff options
author | Daisuke Nojiri <dnojiri@chromium.org> | 2018-12-14 16:18:50 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-12-17 20:47:01 -0800 |
commit | 1817c17273dac363a93e5a6b6169d88b79479bd4 (patch) | |
tree | 9b454ae9db6e329f8da4063d7f70c03471555b9e /common/keyboard_scan.c | |
parent | 2577c1cddd38b7c0c04cb57f6941b10c205b99e7 (diff) | |
download | chrome-ec-1817c17273dac363a93e5a6b6169d88b79479bd4.tar.gz |
Keyboard: Consolidate keyboard factory tests
This patch consolidates keyboard factory tests, which are currently
duplicated under the chip directories.
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
BUG=none
BRANCH=none
TEST=buildall
Change-Id: I1ab8bc96808e1c284d991d3c2f1f82a37329676e
Reviewed-on: https://chromium-review.googlesource.com/1378654
Commit-Ready: Daisuke Nojiri <dnojiri@chromium.org>
Tested-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'common/keyboard_scan.c')
-rw-r--r-- | common/keyboard_scan.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/common/keyboard_scan.c b/common/keyboard_scan.c index f9a64eb806..24fc7bc73c 100644 --- a/common/keyboard_scan.c +++ b/common/keyboard_scan.c @@ -861,6 +861,69 @@ DECLARE_HOST_COMMAND(EC_CMD_MKBP_SIMULATE_KEY, EC_VER_MASK(0)); #ifdef CONFIG_KEYBOARD_FACTORY_TEST + +/* Run keyboard factory testing, scan out KSO/KSI if any shorted. */ +int keyboard_factory_test_scan(void) +{ + int i, j, flags; + uint16_t shorted = 0; + int port, id; + + /* Disable keyboard scan while testing */ + keyboard_scan_enable(0, KB_SCAN_DISABLE_LID_CLOSED); + flags = gpio_get_default_flags(GPIO_KBD_KSO2); + + /* Set all of KSO/KSI pins to internal pull-up and input */ + for (i = 0; i < keyboard_factory_scan_pins_used; i++) { + + if (keyboard_factory_scan_pins[i][0] < 0) + continue; + + port = keyboard_factory_scan_pins[i][0]; + id = keyboard_factory_scan_pins[i][1]; + + gpio_set_alternate_function(port, 1 << id, -1); + gpio_set_flags_by_mask(port, 1 << id, + GPIO_INPUT | GPIO_PULL_UP); + } + + /* + * Set start pin to output low, then check other pins + * going to low level, it indicate the two pins are shorted. + */ + for (i = 0; i < keyboard_factory_scan_pins_used; i++) { + + if (keyboard_factory_scan_pins[i][0] < 0) + continue; + + port = keyboard_factory_scan_pins[i][0]; + id = keyboard_factory_scan_pins[i][1]; + + gpio_set_flags_by_mask(port, 1 << id, GPIO_OUT_LOW); + + for (j = 0; j < i; j++) { + + if (keyboard_factory_scan_pins[j][0] < 0) + continue; + + if (keyboard_raw_is_input_low( + keyboard_factory_scan_pins[j][0], + keyboard_factory_scan_pins[j][1])) { + shorted = i << 8 | j; + goto done; + } + } + gpio_set_flags_by_mask(port, 1 << id, + GPIO_INPUT | GPIO_PULL_UP); + } +done: + gpio_config_module(MODULE_KEYBOARD_SCAN, 1); + gpio_set_flags(GPIO_KBD_KSO2, flags); + keyboard_scan_enable(1, KB_SCAN_DISABLE_LID_CLOSED); + + return shorted; +} + static int keyboard_factory_test(struct host_cmd_handler_args *args) { struct ec_response_keyboard_factory_test *r = args->response; |