/* Copyright 2022 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "cros_cbi.h" #include "ec_commands.h" #include "hooks.h" #include "keyboard_raw.h" #include "keyboard_scan.h" LOG_MODULE_DECLARE(nissa, CONFIG_NISSA_LOG_LEVEL); static bool key_pad = FW_KB_NUMERIC_PAD_ABSENT; static const struct ec_response_keybd_config craask_kb = { .num_top_row_keys = 10, .action_keys = { TK_BACK, /* T1 */ TK_REFRESH, /* T2 */ TK_FULLSCREEN, /* T3 */ TK_OVERVIEW, /* T4 */ TK_SNAPSHOT, /* T5 */ TK_BRIGHTNESS_DOWN, /* T6 */ TK_BRIGHTNESS_UP, /* T7 */ TK_VOL_MUTE, /* T8 */ TK_VOL_DOWN, /* T9 */ TK_VOL_UP, /* T10 */ }, .capabilities = KEYBD_CAP_SCRNLOCK_KEY, }; static const struct ec_response_keybd_config craask_kb_w_kb_numpad = { .num_top_row_keys = 10, .action_keys = { TK_BACK, /* T1 */ TK_REFRESH, /* T2 */ TK_FULLSCREEN, /* T3 */ TK_OVERVIEW, /* T4 */ TK_SNAPSHOT, /* T5 */ TK_BRIGHTNESS_DOWN, /* T6 */ TK_BRIGHTNESS_UP, /* T7 */ TK_VOL_MUTE, /* T8 */ TK_VOL_DOWN, /* T9 */ TK_VOL_UP, /* T10 */ }, .capabilities = KEYBD_CAP_SCRNLOCK_KEY | KEYBD_CAP_NUMERIC_KEYPAD, }; __override const struct ec_response_keybd_config * board_vivaldi_keybd_config(void) { if (key_pad == FW_KB_NUMERIC_PAD_ABSENT) return &craask_kb; else return &craask_kb_w_kb_numpad; } /* * Keyboard function decided by FW config. */ static void kb_init(void) { int ret; uint32_t val; ret = cros_cbi_get_fw_config(FW_KB_NUMERIC_PAD, &val); if (ret != 0) { LOG_ERR("Error retrieving CBI FW_CONFIG field %d", FW_KB_NUMERIC_PAD); } if (val == FW_KB_NUMERIC_PAD_ABSENT) { /* Disable scanning KSO13 & 14 if keypad isn't present. */ keyboard_raw_set_cols(KEYBOARD_COLS_NO_KEYPAD); key_pad = FW_KB_NUMERIC_PAD_ABSENT; } else { key_pad = FW_KB_NUMERIC_PAD_PRESENT; /* Setting scan mask KSO11, KSO12, KSO13 and KSO14 */ keyscan_config.actual_key_mask[11] = 0xfe; keyscan_config.actual_key_mask[12] = 0xff; keyscan_config.actual_key_mask[13] = 0xff; keyscan_config.actual_key_mask[14] = 0xff; } } DECLARE_HOOK(HOOK_INIT, kb_init, HOOK_PRIO_POST_FIRST); /* * We have total 30 pins for keyboard connecter {-1, -1} mean * the N/A pin that don't consider it and reserve index 0 area * that we don't have pin 0. */ const int keyboard_factory_scan_pins[][2] = { { -1, -1 }, { 0, 5 }, { 1, 1 }, { 1, 0 }, { 0, 6 }, { 0, 7 }, { -1, -1 }, { -1, -1 }, { 1, 4 }, { 1, 3 }, { -1, -1 }, { 1, 6 }, { 1, 7 }, { 3, 1 }, { 2, 0 }, { 1, 5 }, { 2, 6 }, { 2, 7 }, { 2, 1 }, { 2, 4 }, { 2, 5 }, { 1, 2 }, { 2, 3 }, { 2, 2 }, { 3, 0 }, { -1, -1 }, { 0, 4 }, { -1, -1 }, { 8, 2 }, { -1, -1 }, { -1, -1 }, }; const int keyboard_factory_scan_pins_used = ARRAY_SIZE(keyboard_factory_scan_pins);