0

0

DRV_05_GPIO按键驱动分析与使用

雪夜

雪夜

发布时间:2025-06-27 09:38:28

|

332人浏览过

|

来源于php中文网

原创

资料下载

由于无法通过浏览器直接访问,需要使用Git工具进行下载:

git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git

您可以观看百问网的驱动大全视频,以获取更多相关信息。

GPIO按键驱动分析与使用参考资料:

Linux 5.x内核 Documentation\devicetree\bindings\input\gpio-keys.txt drivers\input\keyboard\gpio_keys.c Linux 4.x内核 Documentation\devicetree\bindings\input\gpio-keys.txt drivers\input\keyboard\gpio_keys.c

设备树示例: IMX6ULL:Linux-4.9.88/arch/arm/boot/dts/100ask_imx6ull-14x14.dts STM32MP157:Linux-5.4/arch/arm/boot/dts/stm32mp15xx-100ask.dtsi QEMU:linux-4.9.88/arch/arm/boot/dts/100ask_imx6ull_qemu.dts

  1. 驱动程序框架

DRV_05_GPIO按键驱动分析与使用

  1. 设备树示例

2.1 设备树讲解属性:

必备:compatible = "gpio-keys"; 可选:autorepeat:表示自动重复,按下按键不松开,驱动会自动重复上报按键值 对于每一个GPIO按键,都是一个子节点,有这些属性: gpios:使用哪个GPIO interrupts:对应的中断 linux,code:对应的按键值 注意:gpiosinterrupts至少要保留一个,不能都省略 debounce-interval:消除抖动的间隔,单位:ms,默认是5ms

2.2 100ASK_IMX6ULL

gpio-keys {
    compatible = "gpio-keys";
    pinctrl-names = "default";
    user1 {
        label = "User1 Button";
        gpios = ;
        gpio-key,wakeup;
        linux,code = ;
    };
    user2 {
        label = "User2 Button";
        gpios = ;
        gpio-key,wakeup;
        linux,code = ;
    };
};

2.3 100ASK_STM32MP157

joystick {
    compatible = "gpio-keys";
    #size-cells = ;
    button-0 {
        label = "usr_button0";
        linux,code = ;
        interrupt-parent = ;
        interrupts = ;
    };
    button-1 {
        label = "usr_button1";
        linux,code = ;
        interrupt-parent = ;
        interrupts = ;
    };
};

2.4 QEMU

gpio-keys@0 {
    compatible = "gpio-keys";
    pinctrl-names = "default";
    pinctrl-0 = ;
    status = "okay";
    Key0 {
        label = "Key 0";
        gpios = ;
        linux,code = ;
    };
};
gpio-keys@1 {
    compatible = "gpio-keys";
    pinctrl-names = "default";
    pinctrl-0 = ;
    status = "okay";
    Key0 {
        label = "Key 1";
        gpios = ;
        linux,code = ;
    };
};
  1. gpio_keys.c驱动程序分析

3.1 套路

根据设备树获得硬件信息:哪个GPIO、对于什么按键分配/设置/注册input_dev结构体 request_irq:在中断处理函数中确定按键值、上报按键值 有两种IRQ函数 gpio_keys_gpio_isr:设备树中的用gpios来描述用到的引脚 gpio_keys_irq_isr:设备树中的用interrupts来描述用到的引脚

3.2 gpio_keys_gpio_isr分析

理想状况是:按下、松开按键,各产生一次中断,也只产生一次中断。 但是对于机械开关,它的金属弹片会反复震动。GPIO电平会反复变化,最后才稳定。一般是几十毫秒才会稳定。 如果不处理抖动的话,用户只操作一次按键,会发生多次中断,驱动程序可能会上报多个数据。

DRV_05_GPIO按键驱动分析与使用

怎么处理按键抖动?

在按键中断程序中,可以循环判断几十亳秒,发现电平稳定之后再上报 使用定时器 显然第1种方法太耗时,违背“中断要尽快处理”的原则,你的系统会很卡。

怎么使用定时器?看下图:

DRV_05_GPIO按键驱动分析与使用

核心在于:在GPIO中断中并不立刻记录按键值,而是修改定时器超时时间,10ms后再处理。 如果10ms内又发生了GPIO中断,那就认为是抖动,这时再次修改超时时间为10ms。 只有10ms之内再无GPIO中断发生,那么定时器的函数才会被调用。 在定时器函数中上报按键值。

3.3 gpio_keys_irq_isr分析

有个变量key_pressed,用来表示当前按键状态:初始值是false,表示按键没有被按下。

Android开发笔记 模拟器、应用教程pdf版
Android开发笔记 模拟器、应用教程pdf版

Android开发笔记,内容涉及模拟器参数、进程与线程、Android 释放手机资源,进程释放优先级、分析HelloAndroid、添加编辑框与按钮、使用Intent启动另一个Activity、在不同Task中启动Activity、Intent与Intent filters、添加新的Activity等相关知识。

下载

发生中断 上报"按下的值":input_event(input, EV_KEY, button->code, 1); input_sync(input); 如果不延迟(!bdata->release_delay) 马上上报"松开的值":input_event(input, EV_KEY, button->code, 0); input_sync(input); 如果延迟(bdata->release_delay) 启动定时器,过若干毫秒再上报"松开的值" 所以,使用gpio_keys_irq_isr时,一次中断就会导致上报2个事件:按下、松开 缺点:无法准确判断一个按键确实已经被松开了

  1. QEMU上机实验

IMX6ULL、STM32MP157的出厂系统都已经配置的GPIO按键。 可以执行以下命令确认设备节点:

cat /proc/bus/input/devices

然后执行hexdump /dev/input/event?(?表示某个数值),并且操作按键来观察输出信息。

也可以在QEMU上做实验:原理图如下:

DRV_05_GPIO按键驱动分析与使用

4.1 设置工具链

在Ubuntu中执行:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin

4.2 配置内核

QEMU的内核里已经配置了GPIO按键的设备树,只需要编译出gpio_keys驱动程序即可。 配置内核:执行make menuconfig

-> Device Drivers
  -> Input device support
    -> Generic input layer
      -> Keyboards
           GPIO Buttons

4.3 编译驱动

book@100ask:~/100ask_imx6ull-qemu$ cd linux-4.9.88
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make modules

成功的话,可以得到:

drivers/input/keyboard/gpio_keys.ko

复制到如下目录:

$ cp drivers/input/keyboard/gpio_keys.ko ~/nfs_rootfs/

4.4 启动QEMU

在Ubuntu中执行:

$ cd ubuntu-18.04_imx6ul_qemu_system
$ ./qemu-imx6ull-gui.sh

4.5 挂载NFS、实验

在QEMU中执行:

$ mount -t nfs -o nolock,vers=3 10.0.2.2:/home/book/nfs_rootfs /mnt
$ insmod /mnt/gpio_keys.ko
$ cat /proc/bus/input/devices   // 确认设备节点
$ hexdump /dev/input/event3

在QEMU的GUI界面操作:

DRV_05_GPIO按键驱动分析与使用

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

187

2025.07.04

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2023.11.24

自建git服务器
自建git服务器

git服务器是目前流行的分布式版本控制系统之一,可以让多人协同开发同一个项目。本专题为大家提供自建git服务器相关的各种文章、以及下载和课程。

637

2023.07.05

git和svn的区别
git和svn的区别

git和svn的区别:1、定义不同;2、模型类型不同;3、存储单元不同;4、是否拥有全局版本号;5、内容完整性不同;6、版本库不同;7、克隆目录速度不同;8、分支不同。php中文网为大家带来了git和svn的相关知识、以及相关文章等内容。

526

2023.07.06

git撤销提交的commit
git撤销提交的commit

Git是一个强大的版本控制系统,它提供了很多功能帮助开发人员有效地管理和控制代码的变更,本专题为大家提供git 撤销提交的commit相关的各种文章内容,供大家免费下载体验。

264

2023.07.24

git提交错误怎么撤回
git提交错误怎么撤回

git提交错误撤回的方法:git reset head^:撤回最后一次提交,恢复到提交前状态。git revert head:创建新提交,内容与之前提交相反。git reset :使用提交的 sha-1 哈希撤回指定提交。交互式舞台区:标记要撤回的特定更改,然后提交,排除已撤回更改。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

543

2024.04.09

git怎么对比两个版本的文件内容
git怎么对比两个版本的文件内容

要对比两个版本的 git 文件,请使用 git diff 命令:git diff 比较工作树和暂存区之间的差异。git diff 比较两个提交或标签之间的差异。git diff 输出显示差异块,其中 + 表示添加的行,- 表示删除的行, 表示修改的行。可使用 gitkraken、meld、beyond compare 等可视化工具更直观地查看差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

512

2024.04.09

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

97

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
c语言项目php解释器源码分析探索
c语言项目php解释器源码分析探索

共7课时 | 0.4万人学习

光速学会docker容器
光速学会docker容器

共33课时 | 1.9万人学习

PHP WEB 项目实战
PHP WEB 项目实战

共16课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号