1 /* 2 * Keyboard matrix helper functions 3 * 4 * Copyright (c) 2012 The Chromium OS Authors. 5 * 6 * SPDX-License-Identifier: GPL-2.0+ 7 */ 8 9 #ifndef _KEY_MATRIX_H 10 #define _KEY_MATRIX_H 11 12 #include <common.h> 13 14 /* Information about a matrix keyboard */ 15 struct key_matrix { 16 /* Dimensions of the keyboard matrix, in rows and columns */ 17 int num_rows; 18 int num_cols; 19 int key_count; /* number of keys in the matrix (= rows * cols) */ 20 21 /* 22 * Information about keycode mappings. The plain_keycode array must 23 * exist but fn may be NULL in which case it is not decoded. 24 */ 25 const u8 *plain_keycode; /* key code for each row / column */ 26 const u8 *fn_keycode; /* ...when Fn held down */ 27 int fn_pos; /* position of Fn key in key (or -1) */ 28 int ghost_filter; /* non-zero to enable ghost filter */ 29 }; 30 31 /* Information about a particular key (row, column pair) in the matrix */ 32 struct key_matrix_key { 33 uint8_t row; /* row number (0 = first) */ 34 uint8_t col; /* column number (0 = first) */ 35 uint8_t valid; /* 1 if valid, 0 to ignore this */ 36 }; 37 38 /** 39 * Decode a set of pressed keys into key codes 40 * 41 * Given a list of keys that are pressed, this converts this list into 42 * a list of key codes. Each of the keys has a valid flag, which can be 43 * used to mark a particular key as invalid (so that it is ignored). 44 * 45 * The plain keymap is used, unless the Fn key is detected along the way, 46 * at which point we switch to the Fn key map. 47 * 48 * If key ghosting is detected, we simply ignore the keys and return 0. 49 * 50 * @param config Keyboard matrix config 51 * @param keys List of keys to process (each is row, col) 52 * @param num_keys Number of keys to process 53 * @param keycode Returns a list of key codes, decoded from input 54 * @param max_keycodes Size of key codes array (suggest 8) 55 * 56 */ 57 int key_matrix_decode(struct key_matrix *config, struct key_matrix_key *keys, 58 int num_keys, int keycode[], int max_keycodes); 59 60 /** 61 * Read the keyboard configuration out of the fdt. 62 * 63 * Decode properties of named "linux,<type>keymap" where <type> is either 64 * empty, or "fn-". Then set up the plain key map (and the FN keymap if 65 * present). 66 * 67 * @param config Keyboard matrix config 68 * @param blob FDT blob 69 * @param node Node containing compatible data 70 * @return 0 if ok, -1 on error 71 */ 72 int key_matrix_decode_fdt(struct key_matrix *config, const void *blob, 73 int node); 74 75 /** 76 * Set up a new key matrix. 77 * 78 * @param config Keyboard matrix config 79 * @param rows Number of rows in key matrix 80 * @param cols Number of columns in key matrix 81 * @param ghost_filter Non-zero to enable ghost filtering 82 * @return 0 if ok, -1 on error 83 */ 84 int key_matrix_init(struct key_matrix *config, int rows, int cols, 85 int ghost_filter); 86 87 #endif 88