秦皇岛高端网站设计,企业建站系统漏洞,外行学习个人网站建设,wordpress前台浏览量插件Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本节笔记主要内容是学会如何使用Linux自带的按键驱动程序。
一、自带按键驱动程序源码简析 配置选项路径如下#xff1a;
- Device Drivers -
- Device Drivers - Input device support - Generic input layer (needed for keyboard, mouse, ...) (INPUT [y]) - Keyboards (INPUT_KEYBOARD [y]) -GPIO Buttons 如果要使用设备树来描述 KEY 设备信息的话设备节点的 compatible 属性值要设置为“gpio-keys”。 当设备和驱动匹配以后 gpio_keys_probe 函数就会执行
pdata gpio_keys_get_devtree_pdata(dev); 调用 gpio_keys_get_devtree_pdata 函数从设备树中获取到 KEY 相关的设备节点 信息。
input devm_input_allocate_device(dev); 使用 devm_input_allocate_device 函数申请 input_dev。
726 input-name pdata-name ? : pdev-name;
727 input-phys gpio-keys/input0;
728 input-dev.parent pdev-dev;
729 input-open gpio_keys_open;
730 input-close gpio_keys_close;
731
732 input-id.bustype BUS_HOST;
733 input-id.vendor 0x0001;
734 input-id.product 0x0001;
735 input-id.version 0x0100; 初始化 input_dev。 __set_bit(EV_REP, input-evbit); 设置 input_dev 事件这里设置了 EV_REP 事件。
error gpio_keys_setup_key(pdev, input, bdata, button); 调用 gpio_keys_setup_key 函数继续设置 KEY此函数会设置 input_dev 的EV_KEY 事件码(也就是 KEY 模拟为哪个按键)。
error input_register_device(input); 调用 input_register_device 函数向 Linux 系统注册 input_dev。 gpio_keys_setup_key 函数此函数内容如下
input_set_capability(input, button-type ?: EV_KEY,
button-code); 调用 input_set_capability 函数设置 EV_KEY 事件以及 KEY 的按键类型也就是 KEY 作为哪个按键我们会在设备树里面设置指定的 KEY 作为哪个按键。 事件上报是在 gpio_keys_irq_isr 函数中完成的
input_event(input, EV_KEY, button-code, 1); 向 Linux 系统上报 EV_KEY 事件表示按键按下。
input_sync(input); 使用 input_sync 函数向系统上报 EV_REP 同步事件。 综上所述 Linux 内核自带的 gpio_keys.c 驱动文件思路和我们前面编写的 keyinput.c 驱动 文件基本一致。都是申请和初始化 input_dev设置事件向 Linux 内核注册 input_dev。最终在 按键中断服务函数或者消抖定时器中断服务函数中上报事件和按键值。
二、自带按键驱动程序的使用 在设备树中添加指定的设备节点即可节点要求如下
①、节点名字为“gpio-keys”。 ②、 gpio-keys 节点的 compatible 属性值一定要设置为“gpio-keys”。 ③、所有的 KEY 都是 gpio-keys 的子节点每个子节点可以用如下属性描述自己 gpios KEY 所连接的 GPIO 信息。 interrupts KEY 所使用 GPIO 中断信息不是必须的可以不写。 label KEY 名字 linux,code KEY 要模拟的按键 ④、如果按键要支持连按的话要加入 autorepeat。
1 gpio-keys {
2 compatible gpio-keys;
3 #address-cells 1;
4 #size-cells 0;
5 autorepeat;
6 key0 {
7 label GPIO Key Enter;
8 linux,code KEY_ENTER;
9 gpios gpio1 18 GPIO_ACTIVE_LOW;
10 };
11 }; 第 5 行 autorepeat 表示按键支持连按。 第 6~10 行 ALPHA 开发板 KEY 按键信息名字设置为“GPIO Key Enter”这里我们将开发板上的 KEY 按键设置为“EKY_ENTER”这个按键也就是回车键效果和键盘上的回车键一样。 最后设置 KEY 所使用的 IO 为 GPIO1_IO18一定要检查一下设备树看看此 GPIO 有没有 被用到其他外设上如果有的话要删除掉相关代码 重新编译设备树然后用新编译出来的 imx6ull-alientek-emmc.dtb 启动 Linux 系统系统启 动以后查看/dev/input 目录看看都有哪些文件结果如图 可以看出存在 event1 这个文件这个文件就是 KEY 对应的设备文件使用hexdump 命令来查看/dev/input/event1 文件输入如下命令
hexdump /dev/input/event1 然后按下 ALPHA 开发板上的按键终端输出图 如果按下 KEY 按键以后会在终端上输出图所示的信息那么就表示 Linux 内核的按 键驱动工作正常。 本文为参考正点原子开发板配套教程整理而得仅用于学习交流使用不得用于商业用途。