当前位置: 首页 > news >正文

Linux设备驱动之gpio-keys(3)

接前一篇文章:Linux设备驱动之gpio-keys(2)

本文内容参考:

Linux设备驱动之gpio-keys_linux gpio-keys-CSDN博客

Linux gpio-keys驱动解析-CSDN博客

GPIO-KEY的实现原理及使用方法_gpio-keys-CSDN博客

linux gpio key 实现方式_llinux gpio key 长按-CSDN博客

Linux设备树深度剖析

特此致谢!

上一回开始对于gpio-keys的核心功能与架构进行详细解析,讲了设备树(DTS)相关配置,本回继续沿着流程往下进行解析。

二、详细解析

2. gpio-keys的platform驱动

前文书已经讲过,gpio-keys驱动基于input子系统及平台架构(platform_bus、platform_driver、platform_device),其主文件为<Linux内核源码根目录>/drivers/input/keyboard/gpio_keys.c。

先来看gpio_keys.c的入口代码:

static int __init gpio_keys_init(void) { return platform_driver_register(&gpio_keys_device_driver); } static void __exit gpio_keys_exit(void) { platform_driver_unregister(&gpio_keys_device_driver); } late_initcall(gpio_keys_init); module_exit(gpio_keys_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Phil Blundell <pb@handhelds.org>"); MODULE_DESCRIPTION("Keyboard driver for GPIOs"); MODULE_ALIAS("platform:gpio-keys");

gpio_keys_device_driver的定义就在上边,代码如下:

static struct platform_driver gpio_keys_device_driver = { .probe = gpio_keys_probe, .shutdown = gpio_keys_shutdown, .driver = { .name = "gpio-keys", .pm = &gpio_keys_pm_ops, .of_match_table = gpio_keys_of_match, .dev_groups = gpio_keys_groups, } };

首先重点关注以下一行代码:

.of_match_table = gpio_keys_of_match,

gpio_keys_of_match的定义和初始化代码也在同文件(drivers/input/keyboard/gpio_keys.c)中,如下:

static const struct of_device_id gpio_keys_of_match[] = { { .compatible = "gpio-keys", }, { }, }; MODULE_DEVICE_TABLE(of, gpio_keys_of_match);

设备树通过compatible属性实现与驱动的匹配,反过来也就是,这里的平台驱动(platform_driver)通过成员.of_match_table对应的struct of_device_id gpio_keys_of_match中的compitable字段实现与设备树的匹配。

这里以Linux内核中的arch/arm64/boot/dts/rockchip/rk3399-orangepi.dts(应该是以RK3399为主芯片的香橙派)为例,看一下驱动和设备树是如何对应起来的。

rk3399-orangepi.dts中的对应代码(片段)如下:

keys: gpio-keys { compatible = "gpio-keys"; autorepeat; key-power { debounce-interval = <100>; gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; label = "GPIO Power"; linux,code = <KEY_POWER>; linux,input-type = <1>; pinctrl-names = "default"; pinctrl-0 = <&pwr_btn>; wakeup-source; }; };

由代码可知,在香橙派中,PA5对应的为按键,使用了gpio-keys驱动。

再举一例,以笔者最近使用的米尔电子T113开发板为例,看一下其中的gpio-keys的相关代码,在device/config/chips/t113_i/configs/myir_image_yt113i/linux-5.4/board.dts中,如下所示:

gpio-keys { compatible = "gpio-keys"; status = "okay"; vol-down-key { gpios = <&pio PE 1 GPIO_ACTIVE_LOW>; linux,code = <114>; label = "user key"; debounce-interval = <10>; wakeup-source = <0x1>; }; };

由代码可知,在米尔开发板中,PE1为按键,使用了gpio-keys驱动。米尔开发板这部分的原理图如下:

更多内容请看下回。

http://www.jsqmd.com/news/226546/

相关文章:

  • 实现AI Agent的动态任务优先级调度
  • 一、Mujoco-开始篇
  • 提升论文原创性的有效方法:六款AI工具改写文本的实用操作指南
  • AI与人类开发者的协作模式
  • 论文查重与改写一体化方案:六款AI工具提升文本原创性的实用方法
  • 学术论文降重必备工具:六种AI改写技术的高效应用与优化建议
  • 计算机网络:应用层
  • 计算机网络:物理层
  • 基于MLflow的推荐系统模型生命周期管理
  • 优化论文查重结果的智能方案:六款AI改写工具的详细使用教程
  • 学术写作中的AI改写工具:六种高效优化论文查重结果的详细指南
  • 通信原理篇---AMI码
  • UG NX 光顺曲线串合并G1相切线
  • 中望3D2026 光顺曲线串合并G1相切线(把多条曲线合并成一条曲线)
  • 如何快速配置DOL汉化包:新手完整教程
  • 提示系统弹性伸缩架构选型:如何根据业务需求选择合适的方案?
  • VisionPro二开之相机类设计
  • 查重比例超标?五个实用技巧帮你快速优化论文内容。
  • 论文重复率过高?五种有效策略助你轻松调整文本结构。
  • 数据服务熔断机制在大数据平台中的实现
  • 如何处理Java自定义控件与Compose状态的联动?
  • 学霸同款2026 AI论文工具TOP9:本科生毕业论文写作全攻略
  • C++语音技术
  • 重复率超过30%?运用这些技巧,让你的论文轻松达标。
  • 导师不会说的7款AI论文神器,30分钟生成5万字查重无忧!
  • 论文相似度过高?五个实用技巧帮你高效优化文本内容
  • 重复率高于30%?五种科学策略助你轻松达标学术规范。
  • 论文查重率超过30%?掌握这五个关键方法,快速降低重复比例。
  • 亲测好用9个AI论文软件,助你搞定研究生毕业论文!
  • 相似度高于30%?五种科学改写方法助你符合学术要求。