2024-07-09 Linux 使用gpio-keyboard标准方式获取按键事件实例代码

一、kernel dts 配置修改:

diff --git a/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-evb1-v11.dts b/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-evb1-v11.dts
index d0d059a3b..584f3a00a 100755
--- a/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-evb1-v11.dts
+++ b/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-evb1-v11.dts
@@ -11,7 +11,19 @@
 	model = "Rockchip RV1106G EVB1 V11 Board";
 	compatible = "rockchip,rv1106g-evb1-v11", "rockchip,rv1106";
 
-	
+	gpio-keys {
+        compatible = "gpio-keys";
+        pinctrl-names = "default";
+        pinctrl-0 = <&pinctrl_gpio_keys>;
+
+        button@1 {
+            label = "KEY1";
+            linux,code = <KEY_ENTER>;
+            gpios = <&gpio1 RK_PD3 GPIO_ACTIVE_LOW>;
+        };
+
+    };
+    
 	leds {
 		compatible = "gpio-leds";
         led_green {
@@ -52,6 +64,12 @@
 
 &pinctrl {
 
+	pinctrl_gpio_keys {
+		pinctrl_gpio_keys: pinctrl-gpio-keys {
+			rockchip,pins = <1 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>;
+		};
+	};
+	
 	led_green_gpio {
 		led_green_gpio: led-green-gpio {
 			rockchip,pins = <1 RK_PC4 RK_FUNC_GPIO &pcfg_pull_up>;
diff --git a/sysdrv/source/kernel/arch/arm/configs/rv1106-evb.config b/sysdrv/source/kernel/arch/arm/configs/rv1106-evb.config
index f7ba90247..dbb2ae82d 100755
--- a/sysdrv/source/kernel/arch/arm/configs/rv1106-evb.config
+++ b/sysdrv/source/kernel/arch/arm/configs/rv1106-evb.config
@@ -51,6 +51,7 @@ CONFIG_WIRELESS=y
 CONFIG_WLAN=y
 CONFIG_AIC_WLAN_SUPPORT=y
 CONFIG_AIC8800_WLAN_SUPPORT=m
+CONFIG_KEYBOARD_GPIO=y
 # CONFIG_6LOWPAN is not set
 # CONFIG_AD2S1200 is not set
 # CONFIG_AD2S1210 is not set
@@ -508,7 +509,6 @@ CONFIG_KEYBOARD_ADC=y
 # CONFIG_KEYBOARD_BCM is not set
 # CONFIG_KEYBOARD_CAP11XX is not set
 # CONFIG_KEYBOARD_DLINK_DIR685 is not set
-# CONFIG_KEYBOARD_GPIO is not set
 # CONFIG_KEYBOARD_GPIO_POLLED is not set
 # CONFIG_KEYBOARD_LKKBD is not set
 # CONFIG_KEYBOARD_LM8333 is not set

二、测试代码

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/types.h>
#include <linux/input.h>

#define DEVICE "/dev/input/event0" // 替换X为实际的设备编号

void handle_key_event(int fd) {
    struct input_event ev;
    if (read(fd, &ev, sizeof(struct input_event)) != sizeof(struct input_event)) {
        perror("Error reading from input device");
        return;
    }

    if (ev.type == EV_KEY) {
        printf("Key code:%d has been %s\n", ev.code,ev.value == 1 ? "pressed" : "released");
    }
}

int main() {
    int fd, ret;
    fd_set readfds;
    struct timeval timeout;

    // 打开输入设备
    fd = open(DEVICE, O_RDONLY | O_NONBLOCK);
    if (fd < 0) {
        perror("Cannot open input device");
        return 1;
    }

    printf("Waiting for key events on %s (press Ctrl+C to exit) KEY_ENTER=%d\n", DEVICE,KEY_ENTER);

    while (1) {
        FD_ZERO(&readfds);
        FD_SET(fd, &readfds);

        // 设置超时时间,这里设置为5秒
        timeout.tv_sec = 5;
        timeout.tv_usec = 0;

        // 等待按键事件
        ret = select(fd + 1, &readfds, NULL, NULL, &timeout);

        if (ret == -1) {
            perror("Select failed");
            break;
        } else if (ret == 0) {
            printf("Select timed out!\n");
            continue;
        }

        if (FD_ISSET(fd, &readfds)) {
            handle_key_event(fd);
        }
    }

    close(fd);
    return 0;
}

三、查看/proc/bus/input/devices设备

四、运行效果

五、参考文章

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

MX6ULL学习笔记(十三)Linux 自带按键驱动程序_linux自带按键驱动程序-CSDN博客

Linux 输入设备 自定义键盘 input输入子系统 gpio-keys按键驱动_label = "key-ec11-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【效率提升】多功能组织和整理软件一Notion

Notion下载地址&#xff1a;https://www.notion.so/desktop Notion 是一款多功能办公软件&#xff0c;非常适合进行知识整理、团队协作、项目整理等。 下面是几个我推荐Notion的关键点&#xff1a; 一、排版高度自由&#xff1a;Notion的页面可以嵌套&#xff0c;在页面中还支…

关于腾讯的那些事(6月新闻纪要)

祝贺&#xff01;深圳市科技进步一等奖 这份文件是关于腾讯云数据库TDSQL获得深圳市科技进步一等奖的详细报道。以下是详细总结分析&#xff1a; 获奖荣誉&#xff1a; 腾讯云数据库TDSQL荣获2022年深圳市科技进步一等奖&#xff0c;成为唯一入选的数据库产品。该奖项由深圳市…

213.贪心算法:跳跃游戏||(力扣)

class Solution { public:int jump(vector<int>& nums) {if (nums.size() 1) return 0; // 如果数组长度为1&#xff0c;已经在终点&#xff0c;不需要跳跃int cur 0; // 当前跳跃能到达的最远位置int flag 0; // 记录跳跃次数int next 0; // 下一次跳跃能到…

JavaScript 闭包

目录 一、前言 二、JavaScript 变量作用域 1、变量作用域 2、如何从函数外部访问内部变量 三、JavaScript 闭包 1、闭包的定义 2、闭包的组成 3、实例说明 四、闭包的优缺点 1、优点 2、缺点 五、一个有趣的实例&#xff08;定时器与闭包&#xff09; 一、前言 先…

OpenCV对图片中的水果进行识别计算其面积长度等

本项目所用到的技术有&#xff1a; OpenCV Python的一些库&#xff1a;sys,openpyxl,numpy,PyQt5,PIL 本文可以做一些课程设计的项目 本文为作者原创&#xff0c;转载请注明出处&#xff0c;如果需要完整的代码&#xff0c;可以关注我私信 上面是用到的样例图片&#xff0c;一张…

如何在OpenFOAM的案例文件夹中确定数据的点和面,确定点和网格之间的关系,从而用于深度学习预测和构建模型呢(分析数据格式及其含义)

在OpenFOAM中&#xff0c;点&#xff08;points&#xff09;和面&#xff08;faces&#xff09;的定义是通过不同的文件来进行的。在案例一级目录下面的constant/polyMesh目录下&#xff0c;会有points, faces, owner, neighbour等文件&#xff0c;来描述网格的几何和拓扑结构。…

最新深度技术Win7精简版系统:免费下载!

在Win7电脑操作中&#xff0c;用户想要给电脑安装上深度技术Win7精简版系统&#xff0c;但不知道去哪里才能找到该系统版本&#xff1f;接下来系统之家小编给大家带来了深度技术Win7系统精简版本的下载地址&#xff0c;方便大家点击下载安装。系统安装步骤已简化&#xff0c;新…

数据解读加密世界的重新定位:全球流动性困境下的转型之痛

全球每一天将会产生50亿次以上的搜索&#xff0c;每一天有491EB的数据出现在我们的生活中&#xff0c;如果这些数据量全部以Email的形式展现&#xff0c;那相当于1个人1天需要处理36亿封电子邮件。随着区块链技术的不断发展&#xff0c;从链下到链上&#xff0c;链上数据构建的…

SVM - 径向基函数核 Radial Basis Function Kernel,简称RBF核或者高斯核

SVM - 径向基函数核 Radial Basis Function Kernel&#xff0c;简称RBF核或者高斯核 flyfish 径向基函数核&#xff08;Radial Basis Function Kernel&#xff0c;简称RBF核&#xff09;&#xff0c;也称为高斯核&#xff0c;是一种常用的核函数&#xff0c;用于支持向量机&a…

百度文心4.0 Turbo开放,领跑国内AI大模型赛道!

百度文心4.0 Turbo开放&#xff0c;领跑国内AI大模型赛道&#xff01; 前言 文心一言大模型 就在7月5日&#xff0c;在2024世界人工智能大会 (WAIC) 上&#xff0c;百度副总裁谢广军宣布文心大模型4.0 Turbo正式向企业客户全面开放&#xff01;这一举动直接引发了业界的关注。那…

国产PLC能否使用无线通讯终端来实现无线通讯?让我们一探究竟

在工业生产车间内&#xff0c;PLC被广泛应用于自动化控制的各个环节。随着智能化工厂的建设&#xff0c;许多PLC仍处于信息孤岛状态&#xff0c;现要将厂区内分散的PLC都建立通讯&#xff0c;如果重新布线工厂量大且不美观&#xff0c;此时就需要用到工业PLC无线通讯设备来解决…

Knife4j的介绍与使用

目录 一、简单介绍1.1 简介1.2 主要特点和功能&#xff1a; 二、使用步骤&#xff1a;2.1 添加依赖&#xff1a;2.2 yml数据源配置2.3 创建knife4j配置类2.4 注解的作用 最后 一、简单介绍 1.1 简介 Knife4j 是一款基于Swagger的开源文档管理工具&#xff0c;主要用于生成和管…

【Android应用】生成证书和打包

安卓生成证书和打包 &#x1f4d6;1. 生成自有证书&#x1f4d6;2. 安卓打包✅步骤一&#xff1a;导入签名文件✅步骤二&#xff1a;设置打包版本✅步骤三&#xff1a;生成签名包或APK &#x1f4d6;1. 生成自有证书 地址&#xff1a;https://www.yunedit.com/createcert 说明…

Cesium版本升级webgl问题,glsl代码关键字修改

简介 Cesium 从1.102.0 开始&#xff0c;Cesium 默认使用 WebGL2 上下文。一些webgl特效代码在webgl1中支持&#xff0c;但是在版本升级后&#xff0c;运行会报各种glsl代码错误。现在有两种解决方案。详细办法描述如下所示。 1、修改配置使用WebGL1 地球初始化配置如下&…

【计算机毕业设计】基于Springboot的IT技术交流和分享平台【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

20240709每日后端--------最优解决Invalid bound statement (not found)

目标 最优解决Invalid bound statement (not found) 步骤 1、打包 2、查看target下是否成双成对出现 3、核对无误后&#xff0c;即可解决问题。

开发者必看:MySQL主从复制与Laravel读写分离的完美搭配

介绍 主从同步配置的主要性不用多说&#xff0c;本文将详细介绍了如何在MySQL数据库中设置主从复制&#xff0c;以及如何在Laravel框架中实现数据库的读写分离。 通过一系列的步骤&#xff0c;包括修改MySQL配置、创建同步账户、获取二进制日志文件名和位置、导出主服务器数据…

原创作品—数据可视化大屏

设计数据可视化大屏时&#xff0c;用户体验方面需注重以下几点&#xff1a;首先&#xff0c;确保大屏信息层次分明&#xff0c;主要数据突出显示&#xff0c;次要信息适当弱化&#xff0c;帮助用户快速捕捉关键信息。其次&#xff0c;设计应直观易懂&#xff0c;避免复杂难懂的…

南方CASS:测绘工作者的得力助手

初识南方CASS 南方CASS&#xff0c;这款软件在我的工作和生活中扮演了不可或缺的角色。作为一名长期的使用者&#xff0c;我深感它的功能之强大与便捷。今天&#xff0c;我愿以季羡林先生的口吻&#xff0c;带大家走进南方CASS的世界&#xff0c;分享我与它的点滴故事。 功能…

GTK是如何加密WLAN组播和广播数据的?

1. References WLAN 4-Way Handshake如何生成GTK&#xff1f;_tk bigtk gtk igtk-CSDN博客 2. 概述 在Wi-Fi网络中&#xff0c;单播、组播和广播帧的加密算法是由AP决定的。其中组播帧和广播帧的加密使用GTK密钥&#xff0c;其PTK的密钥结构如下图所示&#xff1a; GTK的组成…