Linux学习第33天:Linux INPUT 子系统实验(二):Linux 自带按键驱动程序的使用

news2024/12/23 20:07:21

Linux版本号4.1.15   芯片I.MX6ULL                                    大叔学Linux    品人间百味  思文短情长 


        本节笔记主要内容是学会如何使用Linux自带的按键驱动程序。

一、自带按键驱动程序源码简析

        配置选项路径如下:

-> 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 内核的按
键驱动工作正常。


本文为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内存学习(3):DRAM的基础存储结构(存储层级、读写过程,刷新与暂存)

1 DRAM背景简介 DRAM&#xff0c;全称为 Dynamic Random Access Memory &#xff0c;中文名是“动态随机存取存储器”。所谓“动态”是和“静态”相对应的&#xff0c;芯片世界里还有一种 SRAM 静态随机存取存储器的存在。 笼统地说&#xff0c;DRAM 的结构比 SRAM 更简单&am…

UE5——源码阅读——2

这个是非常大的作用域&#xff0c;当程序离开这个东西&#xff0c;就会把它释放掉&#xff0c;设置了一个作用域把当前线程标记为主线程 插入了一个默认的Main,这个东西其实是标记点&#xff0c;这个标记是在UE内部有个性能分析工具可以看到这个标记点&#xff0c;主要是确定位…

【java学习—十三】处理流之三:标准输入输出流(3)

文章目录 1. 相关概念2. 举例与练习2.1. 举例2.2. 练习 1. 相关概念 System.in 和 System.out 分别代表了系统标准的输入和输出设备&#xff0c;默认输入设备是键盘&#xff0c;输出设备是显示器。     System.in 的类型是 InputStream     System.out 的类型是 PrintS…

SpringMvc从菜鸟到大拿完成蜕变

SpringMvc从菜鸟到大拿完成蜕 介绍 Why springmvc Servlet缺点: servlet中的service:方法一次只能处理一类请求;单拿用户表来说,得需要创建五个Servlet;在url中输入的是urlpattern;默认只访问service方法;如何减少Servlet的个数呢? 增加了一个method参数;其他人有可能会喜欢…

腾讯云CVM S5服务器优惠价格表,买一年送3个月

腾讯云服务器CVM标准型S5有活动&#xff0c;CVM 2核2G S5优惠价280.8元一年自带1M带宽&#xff0c;15个月313.2元、2核4G配置748.2元15个月、4核8G配置1437.24元15个月、8核16G优惠价3048.48元15个月&#xff0c;公网带宽可选1M、3M、5M或10M&#xff0c;腾讯云服务器网txyfwq.…

【算法练习Day39】单词拆分多重背包的介绍

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 单词拆分多重背包总结&…

[BUUCTF NewStar 2023] week5 Crypto/pwn

最后一周几个有难度的题 Crypto last_signin 也是个板子题&#xff0c;不过有些人存的板子没到&#xff0c;所以感觉有难度&#xff0c;毕竟这板子也不是咱自己能写出来的。 给了部分p, p是1024位给了922-101位差两头。 from Crypto.Util.number import * flag b?e 655…

Winform 实现俄罗斯方块游戏(一)

第一步&#xff0c;先用GDI绘制小正方形方块&#xff0c;其它形状的用这个方块合成 如何绘制一个方块&#xff1f;先绘制两个正方形&#xff0c;如下&#xff1a; 然后四周用梯形填充&#xff0c;内部颜色用渐变&#xff0c;这样更有立体感&#xff0c;下篇介绍如何实现。

D-link未授权访问以及远程代码执行

随便输入一个错误密码&#xff0c;会跳转到页面&#xff1a; /page/login/login.html?errorfail继续访问有效页面漏洞url&#xff1a; /Admin.shtml然后访问管理页面去更改管理密码 直接构造payload访问漏洞url&#xff1a; /cgi-bin/execute_cmd.cgi?cmdid执行命令&#…

2023年11月5日网规考试备忘

早上题目回忆&#xff1a; pki体系 ipsec&#xff0c;交换安全&#xff08;流量抑制&#xff09; aohdlc bob metclaf —ethernet pon tcp三次握手 OSPF lsa&#xff1f;交换机组ospf配置问题&#xff0c;ping网关可通&#xff0c;AB不通 raid6 300G*8 网络利用率 停等协议10…

腾讯云CVM S5服务器4核8G配置性能测评和优惠价格表

腾讯云4核8G服务器CVM标准型S5实例性能测评&#xff0c;包括CPU型号、内存、系统盘、CVM实例规格性能测评&#xff0c;腾讯云4核8G租用优惠价格表&#xff0c;腾讯云服务器网txyfwq.com分享腾讯云4核8G服务器CVM S5性能测评和优惠价格表&#xff1a; 腾讯云4核8G服务器CVM S5性…

dupeGuru 清理微信重复文件

本文摘录于&#xff1a;https://www.bilibili.com/video/BV13p4y1G75Y/?spm_id_from333.337.search-card.all.click&vd_source483e5c52353ea59d1a5eadac7737591a只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 微信用了七八年,文件…

Java异常你还没有了解吗?

&#x1f937;‍♀️&#x1f937;‍♀️&#x1f937;‍♀️ 今天和大家一起学习一下Java中的异常&#xff01; 清风的CSDN博客个人主页 &#x1f302;c/java领域新星创作者 &#x1f389;欢迎&#x1f44d;点赞✍评论❤️收藏 &#x1f61b;&#x1f61b;&#x1f61b;希望我…

【JavaScript】window 对象、location 对象、navigator 对象和 history 对象

1. window 对象 BOM (Browser Object Model ) 是浏览器对象模型&#xff1a; window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都是window的所有通过var定义在全…

【Java 进阶篇】JSP 简单入门

在现代Web开发中&#xff0c;JavaServer Pages&#xff08;JSP&#xff09;是一项非常重要的技术。JSP允许开发者将Java代码嵌入HTML页面&#xff0c;以实现动态内容的生成和呈现。本文将详细介绍JSP的概念、原理以及如何使用JSP来构建Web应用程序。 第一部分&#xff1a;JSP …

基于Google Colaboratory安装Go语言编译器操作流程

文章目录 1. 什么是Google Colaboratory2. 访问Google Colaboratory3. 创建新的笔记本4.【方法①】使用apt命令安装golang5.【方法②】使用Go安装包安装golang6. 参考链接 1. 什么是Google Colaboratory Colab是一种托管的笔记本电脑服务&#xff0c;不需要安装即可使用&#x…

Perl安装教程

1. perl简介 Perl 是 Practical Extraction and Report Language 的缩写&#xff0c;可翻译为 “实用报表提取语言”。Perl 是高级、通用、直译式、动态的程序语言。Perl 最初的设计者为拉里沃尔&#xff08;Larry Wall&#xff09;&#xff0c;于1987年12月18日发表。Perl 借…

PCTA认证考试-01_TiDB数据库架构概述

TiDB 数据库架构概述 一、学习目标 理解 TiDB 数据库整体结构。了解 TiDB Server&#xff0c;TiKV&#xff0c;TiFlash 和 PD 的主要功能。 二、TiDB 体系架构 1. TiDB Server 2. TiKV OLTP 3. Placement Driver 4. TiFlash OLAP OLTPOLAPHTAP

【Go 编程实践】从零到一:创建、测试并发布自己的 Go 库

为什么需要开发自己的 Go 库 在编程语言中&#xff0c;包&#xff08;Package&#xff09;和库&#xff08;Library&#xff09;是代码组织和复用的重要工具。在 Go 中&#xff0c;包是代码的基本组织单位&#xff0c;每个 Go 程序都由包构成。包的作用是帮助组织代码&#xf…

高等数学教材重难点题型总结(十二)无穷级数

最后一更&#xff01;原谅博主已经开始瞎写字了&#xff0c;最近压力太大&#xff0c;以后有时间用mathPix打出来&#xff0c;看起来更舒适一些~ 高数最后一章&#xff0c;重点在于审敛法和求解幂级数的收敛半径~ 高数基础笔记全部更新完毕&#xff0c;共12*336期&#xff0c…