news 2026/6/23 16:37:01

Linux GPIO-KEYS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux GPIO-KEYS

目录

目录

前言

DTS配置的参考

GPIO按键中断的DTS配置参考

GPIO按键轮询的DTS配置参考

内核配置的参考

GPIO按键中断的内核配置参考

GPIO按键轮询的内核配置参考

验证测试的参考

GPIO按键中断的验证测试参考

GPIO按键轮询的验证测试参考

总结


前言

GPIO-KEYS主要有两种实现方式:GPIO按键中断和GPIO按键轮询。

其中Linux内核下的`linux-x.xx/drivers/input/keyboard/gpio_keys.c`已经实现了与体系结构无关的GPIO按键中断驱动,Linux内核下的`linux-x.xx/drivers/input/keyboard/gpio_keys_polled.c`已经实现了与体系结构无关的GPIO按键轮询驱动。

使用GPIO-KEYS按键驱动,只需在设备树gpio-keys或gpio-key-polled节点添加需要的按键子节点即可,但主要适合于独立式按键。

注意:Linux内核原生的GPIO按键中断驱动只适用于支持外部中断的GPIO,而GPIO按键轮询驱动适用于支持输入功能的GPIO。


DTS配置的参考

GPIO按键中断的DTS配置参考

... #include "../../../../../../include/uapi/linux/input-event-codes.h" /* 键值定义 */ ... gpio-keys { compatible = "gpio-keys"; /* 该属性定义了设备的兼容性 */ pinctrl-names = "default"; pinctrl-0 = <&pinctrl_gpio_key_up>, <&pinctrl_gpio_key_down>, <&pinctrl_gpio_key_left>, <&pinctrl_gpio_key_right>, <&pinctrl_gpio_key_esc>, <&pinctrl_gpio_key_enter>; autorepeat; /* 若需要支持连按,可以添加autorepeat */ key_up { gpios = <&gpiod 8 GPIO_ACTIVE_LOW>; /* gpios表示GPIO管脚属性。 */ lable = "GPIO Key Up"; /* key的描述性名称。 */ linux,input-type = <1>; /* input-type表示输入事件类型,1表示键盘或按键事件。 */ linux,code = <KEY_UP>; /* code表示键值。 */ debounce-interval = <100>; /* key或button的消抖间隔时间,单位:ms。 */ }; key_down { gpios = <&gpiod 9 GPIO_ACTIVE_LOW>; lable = "GPIO Key Down"; linux,input-type = <1>; linux,code = <KEY_DOWN>; debounce-interval = <100>; }; key_left { gpios = <&gpiod 10 GPIO_ACTIVE_LOW>; lable = "GPIO Key Left"; linux,input-type = <1>; linux,code = <KEY_LEFT>; debounce-interval = <100>; }; key_right { gpios = <&gpiod 11 GPIO_ACTIVE_LOW>; lable = "GPIO Key Right"; linux,input-type = <1>; linux,code = <KEY_RIGHT>; debounce-interval = <100>; }; key_esc { gpios = <&gpiod 12 GPIO_ACTIVE_LOW>; lable = "GPIO Key Esc"; linux,input-type = <1>; linux,code = <KEY_ESC>; debounce-interval = <100>; }; key_enter { gpios = <&gpiod 13 GPIO_ACTIVE_LOW>; lable = "GPIO Key Enter"; linux,input-type = <1>; linux,code = <KEY_ENTER>; debounce-interval = <100>; }; }; pinctrl: pinctrl@xxxxxxxx { pinctrl_gpio_key_up: key_up_grp { xxx,pins = "gpiod-8"; xxx,pin-pud = <ENABLE_PULL_UP>; }; pinctrl_gpio_key_down: key_down_grp { xxx,pins = "gpiod-9"; xxx,pin-pud = <ENABLE_PULL_UP>; }; pinctrl_gpio_key_left: key_left_grp { xxx,pins = "gpiod-10"; xxx,pin-pud = <ENABLE_PULL_UP>; }; pinctrl_gpio_key_right: key_right_grp { xxx,pins = "gpd-11"; xxx,pin-pud = <ENABLE_PULL_UP>; }; pinctrl_gpio_key_esc: key_esc_grp { xxx,pins = "gpiod-12"; xxx,pin-pud = <ENABLE_PULL_UP>; }; pinctrl_gpio_key_enter: key_enter_grp { xxx,pins = "gpiod-13"; xxx,pin-pud = <ENABLE_PULL_UP>; }; };

GPIO按键轮询的DTS配置参考

... #include "../../../../../../include/uapi/linux/input-event-codes.h" /* 键值定义 */ ... gpio-keys-polled { compatible = "gpio-keys-polled"; /* 该属性定义了设备的兼容性 */ poll-interval = <100>; /* 轮询周期,单位ms。 */ autorepeat; /* 若需要支持连按,可以添加autorepeat。 */ status = "okay"; /* 状态属性。 */ pol_key { label = "GPIO Key POL"; /* key的描述性名称。 */ linux,code = <KEY_ENTER>; /* code表示键值。 */ gpios = <&pio 0 GPIO_ACTIVE_LOW>; /* gpios表示GPIO管脚属性。 */ }; };

内核配置的参考

GPIO按键中断的内核配置参考

CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_GPIO=y

GPIO按键轮询的内核配置参考

CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_GPIO_POLLED=y

验证测试的参考

GPIO按键中断的验证测试参考

1. 在系统内核启动和驱动加载后,查看内核中已经注册的INPUT设备。例如:

# cat /proc/bus/input/devices I: Bus=0019 Vendor=0001 Product=0001 Version=0100 N: Name="gpio-keys" P: Phys=gpio-keys/input0 S: Sysfs=/devices/platform/gpio-keys/input/input4 U: Uniq= H: Handlers=event4 (可以看出是设备节点为/dev/input/event4) B: PROP=0 B: EV=100003 B: KEY=1680 0 0 10000002

2. 查看GPIO按键的input设备节点的键值上报情况。例如:

# hexdump -d /dev/input/event4 (“-d”:以双字节十进制的形式显示。) 0000000 03304 25737 26302 00005 00001 00103 00001 00000 (KEY_UP按键按下) 0000010 03304 25737 26302 00005 00000 00000 00000 00000 0000020 03304 25737 45263 00007 00001 00103 00000 00000 (KEY_UP按键弹起) 0000030 03304 25737 45263 00007 00000 00000 00000 00000 ... 0000180 03435 25737 35243 00007 00001 00108 00001 00000 (KEY_DOWN按键按下) 0000190 03435 25737 35243 00007 00000 00000 00000 00000 00001a0 03435 25737 23097 00011 00001 00108 00000 00000 (KEY_DOWN按键弹起) 00001b0 03435 25737 23097 00011 00000 00000 00000 00000 ... 0000700 03534 25737 26306 00005 00001 00105 00001 00000 (KEY_LEFT按键按下) 0000710 03534 25737 26306 00005 00000 00000 00000 00000 0000720 03534 25737 59704 00008 00001 00105 00000 00000 (KEY_LEFT按键弹起) 0000730 03534 25737 59704 00008 00000 00000 00000 00000 ... 00008a0 03593 25737 37561 00012 00001 00106 00001 00000 (KEY_RIGHT按键按下) 00008b0 03593 25737 37561 00012 00000 00000 00000 00000 00008c0 03594 25737 08459 00001 00001 00106 00000 00000 (KEY_RIGHT按键弹起) 00008d0 03594 25737 08459 00001 00000 00000 00000 00000 ... 0000a20 03726 25737 07377 00003 00001 00001 00001 00000 (KEY_ESC按键按下) 0000a30 03726 25737 07377 00003 00000 00000 00000 00000 0000a40 03726 25737 40777 00006 00001 00001 00000 00000 (KEY_ESC按键弹起) 0000a50 03726 25737 40777 00006 00000 00000 00000 00000 ... 0000a60 03770 25737 37531 00012 00001 00028 00001 00000 (KEY_ENTER按键按下) 0000a70 03770 25737 37531 00012 00000 00000 00000 00000 0000a80 03771 25737 33986 00000 00001 00028 00000 00000 (KEY_ENTER按键弹起) 0000a90 03771 25737 33986 00000 00000 00000 00000 00000

GPIO按键轮询的验证测试参考

1. 在系统内核启动和驱动加载后,查看内核中已经注册的INPUT设备。例如:

# cat /proc/bus/input/devices ... I: Bus=0019 Vendor=0001 Product=0001 Version=0100 N: Name="gpio-keys-polled" P: Phys=gpio-keys-polled/input0 S: Sysfs=/devices/platform/gpio-keys-polled/input/input1 U: Uniq= H: Handlers=event1 B: PROP=0 B: EV=100003 B: KEY=10000000 ...

2. 查看GPIO按键轮询的input设备节点的键值上报情况。例如:

# hexdump -d /dev/input/event1 (“-d”:以双字节十进制的形式显示。) 0000000 01853 25737 55244 00011 00001 00028 00001 00000 (KEY_ENTER按键按下) 0000010 01853 25737 55244 00011 00000 00000 00000 00000 0000020 01853 25737 13100 00015 00001 00028 00000 00000 (KEY_ENTER按键弹起) 0000030 01853 25737 13100 00015 00000 00000 00000 00000

总结

GPIO按键是嵌入式系统中常见的输入设备,用于实现人机交互。按键通过GPIO(通用输入输出)引脚检测状态变化,但机械按键在按下或释放时会产生电平抖动,需要通过软硬件方法消除抖动以确保信号稳定。‌


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 2:39:30

OmniThoughtV:面向多模态深度思考的高质量数据蒸馏

作者&#xff1a;岳元浩(顾城)、汪诚愚(熊兮)、黄俊(临在) 背景 近年来&#xff0c;多模态人工智能技术迅猛发展&#xff0c;推动了视觉、语言、语音等多种模态信息的深度融合与理解。尤其在多模态深度推理任务中&#xff0c; GPT-4V 等前沿模型通过模拟人类的链式思维过程&a…

作者头像 李华
网站建设 2026/6/23 20:39:59

面试不是考试,而是“技术交流与信任构建”

面试官所有问题都围绕三个核心目标&#xff1a;考察你有没有&#xff1f;&#xff08;知识广度与技能匹配度&#xff09;考察深不深&#xff1f;&#xff08;原理深度与实战能力&#xff09;考察能不能一起工作&#xff1f;&#xff08;思维逻辑、沟通协作、潜力&#xff09;网…

作者头像 李华
网站建设 2026/6/21 7:02:19

45、WPF 打印与 XPS 文档处理全解析

WPF 打印与 XPS 文档处理全解析 1. 打印固定文档(Printing FixedDocuments) 在处理固定文档打印时,需要将 Canvas 添加到 FixedPage 中,再把 FixedPage 以不太方便的方式添加到 PageContent 里,最后将 PageContent 加入 FixedDocument 的 Pages 集合。其实…

作者头像 李华
网站建设 2026/6/23 3:02:32

46、WPF应用开发:从打印到过渡效果与世界浏览器应用构建

WPF应用开发:从打印到过渡效果与世界浏览器应用构建 在软件开发中,打印功能、文档处理以及界面过渡效果都是提升用户体验和应用实用性的重要方面。下面将深入探讨在WPF应用开发中这些相关内容。 打印与文档处理的回顾与展望 在过往的开发经历中,我们在各种场景下实现过打…

作者头像 李华
网站建设 2026/6/23 17:23:20

【仿真测试】基于FPGA的完整64QAM通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计

目录 1.引言 2.算法仿真效果 3.算法涉及理论知识概要 3.1 217卷积编码/维特比译码 3.2 64QAM调制解调原理 3.3 上变频/下变频 3.4 基于PN导频和cordic的频偏锁定 3.5 基于相关峰的定时点提取 3.6 帧同步 3.7 采样判决 4.Verilog核心接口 5.参考文献 6.完整算法代码…

作者头像 李华
网站建设 2026/6/23 9:57:05

Day35:DMA 原理与架构

DMA 功能&#xff1a; 直接内存访问&#xff0c;实现外设与内存或内存间数据传输&#xff0c;无需 CPU 干预 大幅提高数据传输效率&#xff0c;释放 CPU 资源 STM32 DMA 特性&#xff1a; 多个通道 (如 DMA1 有 7 个通道&#xff0c;DMA2 有 5 个通道) 支持外设到内存、内存到外…

作者头像 李华