08_Linux按键输入

news2024/10/1 5:41:52

目录

Linux下按键驱动原理

修改设备树文件

添加KEY设备节点

按键驱动程序编写

编写测试APP

运行测试


Linux下按键驱动原理

按键驱动和LED驱动原理上来讲基本都是一样的,都是操作GPIO,只不过一个是读取GPIO 的高低电平,一个是从GPIO输出高低电平。实现按键输入,在驱动程序中使用一个整形变量来表示按键值,应用程序通过read函数来读取按键值,判断按键有没有按下。在这里,这个保存按键值的变量就是个共享资源,驱动程序要向其写入按键值,应用程序要读取按键值。所以我们要对其进行保护,对于整形变量而言我们首选的就是原子操作,使用原子操作对变量进行赋值以及读取。Linux下的按键驱动原理很简单,接下来开始编写驱动。

修改设备树文件

添加pinctrl节点

 第3行,将GPIO_IO18这个PIN复用为GPIO1_IO18。

添加KEY设备节点

在根节点“/”下创建KEY节点,节点名为“key”,节点内容如下:

 第6行, pinctrl-0属性设置KEY所使用的PIN对应的pinctrl节点。

第7行, key-gpio属性指定了KEY所使用的GPIO

按键驱动程序编写

 第36-46行,结构体key_dev为按键的设备结构体,第45行的原子变量keyvalue用于记录按键值。

第56-74行,函数keyio_init用于初始化按键,从设备树中获取按键的gpio信息,然后设置为输入。将按键的初始化代码提取出来,将其作为独立的一个函数有利于提高程序的模块化设计。

第83-94行, key_open函数通过调用keyio_init函数来始化按键所使用的IO,应用程序每次打开按键驱动文件的时候都会初始化一次按键IO。

第104-120行, keyread函数,应用程序通过read函数读取按键值的时候此函数就会执行。

第110行读取按键IO的电平,如果为0 的话就表示按键按下了,如果按键按下的话

第111行就等待按键释放。按键释放以后标记按键值为KEYOVALUE。

第135-171行,驱动入口函数,

第138行调用atomic_set 函数初始化原子变量默认为无效值。

第178-187行,驱动出口函数。

key.c文件代码很简单,重点就是key_read函数读取按键值,要对keyvalue进行保护。

编写测试APP

 第51~56行,循环读取/dev/key文件,也就是循环读取按键值,并且将按键值打印出来。

运行测试

 按下开发板上的KEY0按键,keyApp就会获取并且输出按键信息,如图所示:

 从图可以看出,当我们按下KEY0以后就会打印出"KEYO Press, value=0XF0",表示按键按下。但是大家可能会发现,有时候按下一次KEYO但是会输出好几行"KEYO Press,value =0XF0",这是因为我们的代码没有做按键消抖处理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx的安装与自启动配置

1. nginx源码下载 nginx源码下载 2. nginx编译安装 2.1 解压安装包 tar -zxvf nginx-1.24.0.tar.gz2.2 编译安装 cd nginx-1.24.0 ./configure make make install执行./configure时可能出现如下的error,需要安装依赖库: 缺少pcre库 下载pcre安装包…

链码的安装、实例化、查询、调用

目录 1、首先保证网络已经处于启动状态 2、进入CLI容器 3、检查当前节点已经加入到哪些通道中(刚进来,默认是 peer0.example.com) 链码的安装 1、检查通道名称是否设置正确 2、使用install安装链码 3、实例化链码 4、查詢链码 发起交易 …

English Learning - L3 作业打卡 Lesson7 Day52 2023.6.27 周二

English Learning - L3 作业打卡 Lesson7 Day52 2023.6.27 周二 引言🍉句1: And that is when it dawned on me that I didn’t have to be 5,5 ft. anymore.成分划分弱读连读爆破语调 🍉句2: I could be as tall as I wanted, or as short as I wanted …

【电子学会】2023年05月图形化三级 -- 躲避陨石

文章目录 躲避陨石1. 准备工作2. 功能实现3. 设计思路与实现(1)角色、舞台背景设置a. 角色设置b. 舞台背景设置 (2)脚本编写a. 角色:Rocketshipb. 角色:Ball 4. 评分标准5. 知识块 躲避陨石 飞船在陨石乱飞…

MySQL数据库第一课 ---------安装

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com 目录 虚拟环境虚拟环境 安装虚拟机 自主安装 简易安装 ———————————————————————————————————————— 虚拟环境虚拟环境 我们现在运行代码的环境是在 PyCharm…

大型语言模型作为属性化训练数据生成器

大型语言模型作为属性化训练数据生成器,提出一种使用多样化属性提示的数据生成方法,可以生成具有多样性和属性的训练数据,从而提高了模型的性能和数据生成的效率。 动机:大型语言模型(LLM)最近被用作各种自然语言处理(NLP)任务的…

从零开始——腾讯云服务器安装运行部署教程

一、腾讯云 1、购买腾讯云服务器 现在腾讯云服务器有优惠活动(大家可以在网上搜索各个服务器的优惠活动,有很多) 活动链接:上云精选_云服务器秒杀_开发者上云推荐-腾讯云 (tencent.com) 这里我选2G/2核/4M/50G轻量级服务器 这…

Linux基础服务6——Apache

文章目录 一、基本了解1.1 自带工具1.2 服务配置文件1.3 访问控制法则1.4 web相关的命令1.4.1 curl命令1.4.2 httpd命令 二、安装配置2.1 安装服务2.2 访问网页2.3 虚拟主机配置2.3.1 相同ip,不同端口2.3.2 相同端口,不同ip2.3.3 域名访问 三、https3.1 …

深度剖析 Linux 伙伴系统的设计与实现

目录 伙伴系统的核心数据结构 总结: 到底什么是伙伴 伙伴系统的内存分配原理 伙伴系统的内存回收原理 伙伴系统的实现 从 CPU 高速缓存列表中获取内存页 伙伴系统的核心数据结构 如上图所示,内核会为 NUMA 节点中的每个物理内存区域 zone 分配一个…

《计算机网络--自顶向下方法》第四章--网络层:数据平面

4.1网络层概述 每台路由器的数据平面的主要作用是从其输入链路向其输出链路转发数据报;控制平面的主要作用是协调这些本地路由器转发动作,使得数据报沿着源和目的地主机之间的路由器路径进行端到端传送 路由器具有截断的协议栈,即没有网络层…

[RISC-V]Milk-V开发板 i2c测试oled及波形输出

I2C3 引脚图 修改i2c3复用功能 build\boards\cv180x\cv1800b_sophpi_duo_sd\u-boot\cvi_board_init.c //I2C3 pin6 7 PINMUX_CONFIG(SD1_CMD, IIC3_SCL); PINMUX_CONFIG(SD1_CLK, IIC3_SDA);扫描I2C3上的设备 [rootcvitek]~# i2cdetect -y -r 3 0 1 2 3 4 5 6 7 8 9 a b c …

大数据Doris(五十四):BACKUP数据备份原理和语法

文章目录 BACKUP数据备份原理和语法 一、BACKUP数据备份原理 1、快照及快照上传 2、元数据准备及上传 二、BACKUP数据备份语法 BACKUP数据备份原理和语法 通过Doris数据导出的各种方式我们可以将Doris中的数据进行备份,除了export方式之外,Doris 还…

高压线路零序电流方向保护程序逻辑原理(二)

二、零序电流方向保护的采样中断服务程序 零序电流方向保护与其他微机保护的采样中断服务程序相同,均有电压求和自检和电流求和自检及相电流差突变量起动元件DI1。零序电流方向保护的采样中断服务程序中最突出的问题是通过3U。突变量元件来实现闭锁保护&#xff0c…

使用Dependency Walker和Process Explorer排查程序缺少ucrtbase.dll等运行时库以及报0xC000007B错误问题总结

目录 1、问题描述 2、分析软件问题的常用分析工具 3、使用Dependency Walker排查启动程序时报找不到ucrtbase.dll、vcruntime140.dll等运行时库的问题 3.1、使用Dependency Walker查看exe程序的库依赖关系,排查找不到ucrtbase.dll、vcruntime140.dll库问题 3.2…

华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路

一、题目描述 相对开音节构成的结构为辅音元音(aeiou)辅音(r除外)e,常见的单词有life,time,woke,coke,joke,note,nose,communicate,use,gate,same,late等。 给定一个字符串,以空格…

关于 Camera 产品的功能分析

1、问题背景 通过最近做的一些项目,发现 Tuning 一款 Camera 产品前,要考虑到的事情有很多,不是简单的点亮,按要求调完效果就结束了。 从目前的经验来看,准备工作做的越充分,后期遇到的问题也就越少。本文…

MQTT(三)MQTTX工具使用

MQTTX工具使用 MQTTX是一种开源的MQTT客户端工具,用于帮助开发人员测试和调试MQTT(Message Queuing Telemetry Transport)协议。MQTT是一种轻量级的消息传输协议,通常用于物联网设备和应用程序之间的通信。 MQTTX提供了一个用户…

MySQL中常用查看锁和事务的SQL语句

MySQL中常用查看锁和事务的SQL语句 当我们在使用MySQL数据库时,了解如何查看锁和事务的状态是非常重要的。这些信息可以帮助我们调试和优化数据库性能,以及解决并发访问的问题。在本博客中,我将介绍一些常用的MySQL查询语句,用于查…

文心一言 VS 讯飞星火 VS chatgpt (53)-- 算法导论6.2 5题

五、MAX-HEAPIFY的代码效率较高,但第 10 行中的递归调用可能例外,它可能使某些编译器产生低效的代码。请用循环控制结构取代递归,重写 MAX-HEAPIFY代码。 文心一言: 以下是使用循环控制结构取代递归调用的 MAX-HEAPIFY 代码&…

搜索引擎——倒排索引

搜索引擎——倒排索引 什么是倒排索引 倒排索引(Inverted Index)是一种用于快速查找文档的数据结构,常用于搜索引擎中。与正向索引(Forward Index)相反,倒排索引是基于单词或术语来组织文档的索引。 倒排…