2026/5/21 17:01:46
网站建设
项目流程
网站的建设期,烟台网站建设策划方案,潮州网站搭建找谁,温州建校网站接前一篇文章#xff1a;Linux设备驱动之gpio-keys#xff08;2#xff09; 本文内容参考#xff1a;
Linux设备驱动之gpio-keys_linux gpio-keys-CSDN博客
Linux gpio-keys驱动解析-CSDN博客
GPIO-KEY的实现原理及使用方法_gpio-keys-CSDN博客
linux gpio key 实现方式…接前一篇文章Linux设备驱动之gpio-keys2本文内容参考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 pbhandhelds.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驱动。米尔开发板这部分的原理图如下更多内容请看下回。