matrix_keypad 矩阵按键驱动分析
//主要函数调用过程
matrix_keypad_probe
matrix_keypad_parse_dt //根据设备树构造 pdata
pdata->num_row_gpios = nrow = of_gpio_named_count(np, "row-gpios");
pdata->num_col_gpios = ncol = of_gpio_named_count(np, "col-gpios");
of_get_property(np, "linux,no-autorepeat", NULL)
of_get_property(np, "linux,wakeup", NULL)
of_get_property(np, "gpio-activelow", NULL)
of_property_read_u32(np, "debounce-delay-ms", &pdata->debounce_ms);
of_property_read_u32(np, "col-scan-delay-us",&pdata->col_scan_delay_us);
for (i = 0; i < pdata->num_row_gpios; i++)
gpios[i] = of_get_named_gpio(np, "row-gpios", i);
for (i = 0; i < pdata->num_col_gpios; i++)
gpios[pdata->num_row_gpios + i] = of_get_named_gpio(np, "col-gpios", i)
matrix_keypad_build_keymap
matrix_keypad_parse_of_keymap
of_get_property(np, "linux,keymap", &proplen);
matrix_keypad_map_key(input_dev, rows, cols, row_shift, key)
unsigned int row = KEY_ROW(key);
unsigned int col = KEY_COL(key);
unsigned short code = KEY_VAL(key);
keymap[MATRIX_SCAN_CODE(row, col, row_shift)] = code;
__set_bit(code, input_dev->keybit);
matrix_keypad_init_gpio
gpio_request(pdata->col_gpios[i], "matrix_kbd_col")
gpio_direction_output(pdata->col_gpios[i], !pdata->active_low);
gpio_request(pdata->row_gpios[i], "matrix_kbd_row");
gpio_direction_input(pdata->row_gpios[i]);
request_any_context_irq
input_register_device
//具体分析
//矩阵按键驱动源码在”drivers/input/keyboard/matrix_keypad.c”中
static int matrix_keypad_probe(struct platform_device *pdev)
{
const struct matrix_keypad_platform_data *pdata;
struct matrix_keypad *keypad;
struct input_dev *input_dev;
int err;
pdata = dev_get_platdata(&pdev->dev); // 获取设备的platform_data ;这个应该时传统的 平台设备匹配模型。
if (!pdata) {
//如果执行到这里,说明不是使用传统的平台设备模型,而是使用 设备树进行匹配的;
// 那么接下来的重点就是分析 matrix_keypad_parse_dt
pdata = matrix_keypad_parse_dt(&pdev->dev); //根据设备树的信息,构造 pdata
if (IS_ERR(pdata)) {
dev_err(&pdev->dev,