Linux keypad 设备树,matrix_keypad 矩阵按键驱动分析

本文深入分析了Linux矩阵按键驱动`matrix_keypad`,包括`matrix_keypad_probe`函数调用过程,解析设备树构造`pdata`,以及`matrix_keypad_init_gpio`初始化GPIO。驱动通过`matrix_keypad_parse_dt`根据设备树信息构造平台数据,并使用`matrix_keypad_build_keymap`构建按键映射。文章详细解释了矩阵按键驱动的关键函数和结构体,展示了如何在Linux中处理矩阵按键输入事件。
摘要由CSDN通过智能技术生成

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, 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值