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

正点原子嵌入式linux驱动开发——Linux按键输入

在前几篇笔记之中都是使用的GPIO输出功能,还没有用过GPIO输入功能,本章就来学习一下如果在Linux下编写GPIO输入驱动程序。正点原子STM32MP1开发板上有三个按键,就使用这些按键来完成GPIO输入驱动程序,同时利用原子操作来对按键值进行保护

Linux下按键驱动原理

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

注意,本章例程只是为了演示Linux下GPIO输入驱动的编写,实际中的按键驱动并不会采用本章中所讲解的方法,Linux下的input子系统专门用于输入设备!

硬件原理图分析

开发板上有三个按键:KEY0、KEY1和WK_UP,原理图如下图所示:
按键原理图
从上图可以看出,按键KEY0 、KEY1和WK_UP这三个按键分别连接到正点原子STM32MP1开发板的PG3、PH7和PA0这三个IO上。本节只用到KEY0这个按键,从上图可以看出,KEY0接了一个10K的上拉电阻,因此KEY0没有按下的时候PG3应该是
高电平,当KEY0按下以后PG3就是低电平

实验程序编写

修改设备树文件

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

示例代码29.3.1.1 创建KEY节点 
1 key { 
2     compatible = "alientek,key"; 
3     status = "okay"; 
4     key-gpio = <&gpiog 3 GPIO_ACTIVE_LOW>; 
5 };

按键驱动程序编写

这里总体跟驱动LED的结构是类似的。

首先在设备结构体key_dev中,定义一个原子变量atomic_t的keyvalue。

在初始化函数keyio_init中,与之前的区别就是在最后调用gpio_direction_input设定gpio为输入模式。

key_open中,只要调用keyio_init初始化按键。

key_read中,通过gpio_get_value来读取IO口当前电平,如果读到0,也就是低电平,在维持高电平,也就是按键持续按下进入while循环等待释放,释放后设置atomic_set为KEY0VALUE(0XF0)。然后通过atomic_read读取原子变量。

在mykey_init中,调用(atomic_t)ATOMIC_INIT(0)初始化原子变量,然后通过atomic_set设置原子变量为INVAKEY(0X00)。

编写测试APP

这里就是在open这个字符设备之后,在while死循环中,read值,以此来判断按键是否按下。

运行测试

编译驱动程序和测试APP

编译驱动程序

把Makefile的obj-m改成key.o,然后“make”就可以了。

编译测试APP

可以通过如下命令编译keyApp.c:

arm-none-linux-gnueabihf-gcc keyApp.c -o keyApp

运行测试

将上一小节编译出来的key.ko和keyApp这两个文件拷贝到rootfs/lib/modules/5.4.31目录中,重启开发板,进入到目录lib/modules/5.4.31中,输入如下命令加载key.ko驱动模块:

depmod //第一次加载驱动的时候需要运行此命令
modprobe key.ko //加载驱动

加载成功后通过如下命令来测试:

./keyApp /dev/key

按下开发板上的KEY0,keyApp就会过去并输出案件信息,如下图所示:
按键运行结果
从上图可以看出,当按下KEY0以后就会打印出“KEY0 Press, value = 0XF0”表示按键按下。但是可能会发现,有时候按下一次KEY0但是会输出好几行“KEY0 Press, value = 0XF0”,这是因为代码没有做按键消抖处理。

如果要卸载驱动可以使用如下命令:

rmmod key.ko

总结

按键输入和之前的LED驱动是很相似的,只是在驱动之中要换成gpio_direction_input表示这个GPIO是输入的。然后使用原子变量的时候是在key_read之中,通过原子变量控制读操作不会产生并发竞争。

相关文章:

正点原子嵌入式linux驱动开发——Linux按键输入

在前几篇笔记之中都是使用的GPIO输出功能&#xff0c;还没有用过GPIO输入功能&#xff0c;本章就来学习一下如果在Linux下编写GPIO输入驱动程序。正点原子STM32MP1开发板上有三个按键&#xff0c;就使用这些按键来完成GPIO输入驱动程序&#xff0c;同时利用原子操作来对按键值进…...

java--强制类型转换

类型范围大的数据或者变量&#xff0c;直接赋值给小范围的变量&#xff0c;会报错 1.强制类型转换 强行将类型范围大的变量、数据赋值给类型范围小的变量 2.强制类型转换在计算机中的执行原理 解释说明1&#xff1a;a是int类型有8个字节32位&#xff0c;然后在执行下一行代码…...

java后端调用接口Basic auth认证

该方法接收一个JSON字符串参数phoneNum 内容&#xff1a; {"phone":"13712312312"} 然后解析参数中的手机号&#xff0c;作为data去调用URL接口&#xff0c;接收接口返回的复合JSON并解析&#xff0c;拿到想要的数据public String queryUserResumeURLIn…...

App爬虫之强大的Airtest的操作总结

App爬虫之强大的Airtest的操作总结 App爬虫之强大的Airtest的操作总结 # Python使用该框架需要安装的依赖库 pip install airtest pip install poco pip install pocouifrom airtest.core.api import * from airtest.cli.parser import cli_setup from poco.drivers.android.…...

MODBUS-TCP转MODBUS-RTU通信应用(S7-1200和串口服务器通信)

在学习本博客之前,大家需要熟悉MODBUS-TCP和MODBUS-RTU通信,这2个通信的编程应用,大家可以查看下面文章链接: MODBUS-RTU通信 MODBUS-RTU通信协议功能码+数据帧解读(博途PLC梯形图代码)-CSDN博客MODBUS通信详细代码编写,请查看下面相关链接,这篇博客主要和大家介绍MODB…...

开源贡献难吗?

本文整理自字节跳动 Flink SQL 技术负责人李本超在 CommunityOverCode Asia 2023 上的 Keynote 演讲&#xff0c;李本超根据自己在开源社区的贡献经历&#xff0c;基于他在贡献开源社区过程中的一些小故事和思考&#xff0c;如何克服困难&#xff0c;在开源社区取得突破&#x…...

seata的TCC模式分析

TCC是 Try- Confirm-Cancel 这3个名词的首字母简称&#xff0c;是一个2阶段提交的变体思路。 Try&#xff1a;对资源的检查和预留&#xff1b; Confirm: 确认对预留资源的消耗&#xff0c;执行业务操作&#xff1b; Cancel&#xff1a;预留资源的释放&#xff1b; TCC的事务…...

常用linux命令【主要用于日志查询,目录切换】

Xshell设置登录 &#xff1a;主机&#xff0c;端口号 用户身份验证&#xff1a;账号/密码登录脚本&#xff1a;等待-[hcuserserver02 ]$ 发送-cd /data/logs/pl-capital-processer-server/$(date “%Y-%m-%d”) 下方-添加按钮/编辑 发送文本&#xff0c;追加 grep --color de…...

Python学习基础笔记七十六——Python装饰器2

装饰器&#xff0c;英文名字decorator。 我们开发Python代码的时候&#xff0c;经常碰到装饰器。 通常被装饰后的函数&#xff0c;会在原来的函数的基础上&#xff0c;增加一些功能。 通常装饰器本事也是一个函数&#xff0c;那么装饰器是怎么装饰另外一个函数的呢&#xff1f…...

生产环境解决用户登录问题的实践

目录 1 前言2 问题提出3 问题分析和解决4 技术分析和改进5 结语 1 前言 在开发管理软件平台为美术馆时&#xff0c;我们致力于提供一个多系统集成平台&#xff0c;其中包括艺术品管理、志愿者管理和数字资产管理等子系统。为了确保用户享有流畅的体验&#xff0c;我们采用了一…...

通讯协议学习之路:QSPI协议理论

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 一、…...

pip安装修改镜像源

使用pip安装报错时&#xff0c;例如 raise ReadTimeoutError(self._pool, None, “Read timed out.”) pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host‘download.pytorch.org’, port443): Read timed out 可以选择国内的镜像源&#xff0c;如下…...

QCC51XX-QCC30XX系列开发教程(实战篇) 之 12.4-空间音频手机侧和耳机侧接口设计时序图

查看全部教程开发请点击:全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中) ==================================================================== 版权归作者所有,未经允许,请勿转载。 ==========================================...

Mysql创建视图中文乱码修改docker里的配置

问题现象&#xff1a; 创建的视图查询无数据&#xff0c;查看创建语句得知&#xff0c;where条件里的中文变成了“???”。 在客户端里查询字符编码&#xff1a; show VARIABLES like %char%;就是character_set_server导致的&#xff0c;它配置的竟然不是utf8&#xff0c;…...

uniapp checkbox样式失效,选中框选中按钮不显示

找了很多方法 最后网上一个博主找到了解决方法 在项目的main.css里面 如果你不知道你的css样式在哪个文件夹 直接全局搜索‘ 找到注释两个地方 第一个 checkbox::before 找到这一行 注释箭头指的地方就可以 第二个 checkbox .uni-checkbox-input::before, 注释这两个地方…...

机器学习-最小二乘法

概况 最小二乘法其实就是为数据(二维)拟合出一条直线&#xff0c;为(三维)数据拟合出一个面。来最大程度的是我们的样本点落在该直线上。 使得我们找到一条直线使所以的样本点尽可能靠近该直线&#xff0c;即每个样本点到直线的距离最短。 YWXB&#xff0c;W是权重&#xff0…...

Linux文件管理与用户管理

一、查看文件内容 1、回顾之前的命令 cat命令、tac命令、head命令、tail命令、扩展&#xff1a;tail -f动态查看一个文件的内容 2、more分屏显示文件内容&#xff08;了解&#xff09; 基本语法&#xff1a; # more 文件名称 特别注意&#xff1a;more命令在加载文件时并不…...

java中什么是不可变类

什么是不可变类 不可变类是指一旦创建对象后&#xff0c;其状态(属性值)就不能被修改的类。 一个不可变类具有以下特征&#xff1a; 类的实例变量声明为私有的&#xff0c;并且没有提供修改这些变量值的公共方法。类是final的&#xff0c;防止被继承。类的实例变量声明为fin…...

使用Perl和WWW::Mechanize库编写

以下是一个使用Perl和WWW::Mechanize库编写的网络爬虫程序的内容。代码必须使用以下代码&#xff1a;jshk.com.cn/get_proxy 首先&#xff0c;确保已经安装了Perl和WWW::Mechanize库。如果没有&#xff0c;请使用以下命令安装&#xff1a; cpan WWW::Mechanize创建一个新的Pe…...

智荟雄安,创想未来 | 竹云董事长受邀出席雄安新区2023软件和信息技术服务业创新发展论坛并作主题演讲

10月18日&#xff0c;以“智荟雄安 创想未来”为主题的雄安新区2023软件和信息技术服务业创新发展论坛在雄安新区国际酒店会议中心召开。河北省委常委&#xff0c;雄安新区党工委书记、管委会主任张国华出席活动。 中国科学院院士朱鲁华现场致辞&#xff0c;中国工程院院士邬贺…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...