正点原子嵌入式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输出功能,还没有用过GPIO输入功能,本章就来学习一下如果在Linux下编写GPIO输入驱动程序。正点原子STM32MP1开发板上有三个按键,就使用这些按键来完成GPIO输入驱动程序,同时利用原子操作来对按键值进…...
java--强制类型转换
类型范围大的数据或者变量,直接赋值给小范围的变量,会报错 1.强制类型转换 强行将类型范围大的变量、数据赋值给类型范围小的变量 2.强制类型转换在计算机中的执行原理 解释说明1:a是int类型有8个字节32位,然后在执行下一行代码…...
java后端调用接口Basic auth认证
该方法接收一个JSON字符串参数phoneNum 内容: {"phone":"13712312312"} 然后解析参数中的手机号,作为data去调用URL接口,接收接口返回的复合JSON并解析,拿到想要的数据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 演讲,李本超根据自己在开源社区的贡献经历,基于他在贡献开源社区过程中的一些小故事和思考,如何克服困难,在开源社区取得突破&#x…...
seata的TCC模式分析
TCC是 Try- Confirm-Cancel 这3个名词的首字母简称,是一个2阶段提交的变体思路。 Try:对资源的检查和预留; Confirm: 确认对预留资源的消耗,执行业务操作; Cancel:预留资源的释放; TCC的事务…...
常用linux命令【主要用于日志查询,目录切换】
Xshell设置登录 :主机,端口号 用户身份验证:账号/密码登录脚本:等待-[hcuserserver02 ]$ 发送-cd /data/logs/pl-capital-processer-server/$(date “%Y-%m-%d”) 下方-添加按钮/编辑 发送文本,追加 grep --color de…...
Python学习基础笔记七十六——Python装饰器2
装饰器,英文名字decorator。 我们开发Python代码的时候,经常碰到装饰器。 通常被装饰后的函数,会在原来的函数的基础上,增加一些功能。 通常装饰器本事也是一个函数,那么装饰器是怎么装饰另外一个函数的呢?…...
生产环境解决用户登录问题的实践
目录 1 前言2 问题提出3 问题分析和解决4 技术分析和改进5 结语 1 前言 在开发管理软件平台为美术馆时,我们致力于提供一个多系统集成平台,其中包括艺术品管理、志愿者管理和数字资产管理等子系统。为了确保用户享有流畅的体验,我们采用了一…...
通讯协议学习之路:QSPI协议理论
通讯协议之路主要分为两部分,第一部分从理论上面讲解各类协议的通讯原理以及通讯格式,第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN;视频会发布在bilibili(UID:399951374) 一、…...
pip安装修改镜像源
使用pip安装报错时,例如 raise ReadTimeoutError(self._pool, None, “Read timed out.”) pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host‘download.pytorch.org’, port443): Read timed out 可以选择国内的镜像源,如下…...
QCC51XX-QCC30XX系列开发教程(实战篇) 之 12.4-空间音频手机侧和耳机侧接口设计时序图
查看全部教程开发请点击:全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中) ==================================================================== 版权归作者所有,未经允许,请勿转载。 ==========================================...
Mysql创建视图中文乱码修改docker里的配置
问题现象: 创建的视图查询无数据,查看创建语句得知,where条件里的中文变成了“???”。 在客户端里查询字符编码: show VARIABLES like %char%;就是character_set_server导致的,它配置的竟然不是utf8,…...
uniapp checkbox样式失效,选中框选中按钮不显示
找了很多方法 最后网上一个博主找到了解决方法 在项目的main.css里面 如果你不知道你的css样式在哪个文件夹 直接全局搜索‘ 找到注释两个地方 第一个 checkbox::before 找到这一行 注释箭头指的地方就可以 第二个 checkbox .uni-checkbox-input::before, 注释这两个地方…...
机器学习-最小二乘法
概况 最小二乘法其实就是为数据(二维)拟合出一条直线,为(三维)数据拟合出一个面。来最大程度的是我们的样本点落在该直线上。 使得我们找到一条直线使所以的样本点尽可能靠近该直线,即每个样本点到直线的距离最短。 YWXB,W是权重࿰…...
Linux文件管理与用户管理
一、查看文件内容 1、回顾之前的命令 cat命令、tac命令、head命令、tail命令、扩展:tail -f动态查看一个文件的内容 2、more分屏显示文件内容(了解) 基本语法: # more 文件名称 特别注意:more命令在加载文件时并不…...
java中什么是不可变类
什么是不可变类 不可变类是指一旦创建对象后,其状态(属性值)就不能被修改的类。 一个不可变类具有以下特征: 类的实例变量声明为私有的,并且没有提供修改这些变量值的公共方法。类是final的,防止被继承。类的实例变量声明为fin…...
使用Perl和WWW::Mechanize库编写
以下是一个使用Perl和WWW::Mechanize库编写的网络爬虫程序的内容。代码必须使用以下代码:jshk.com.cn/get_proxy 首先,确保已经安装了Perl和WWW::Mechanize库。如果没有,请使用以下命令安装: cpan WWW::Mechanize创建一个新的Pe…...
智荟雄安,创想未来 | 竹云董事长受邀出席雄安新区2023软件和信息技术服务业创新发展论坛并作主题演讲
10月18日,以“智荟雄安 创想未来”为主题的雄安新区2023软件和信息技术服务业创新发展论坛在雄安新区国际酒店会议中心召开。河北省委常委,雄安新区党工委书记、管委会主任张国华出席活动。 中国科学院院士朱鲁华现场致辞,中国工程院院士邬贺…...
Pixel Couplet Gen 社区贡献指南:在CSDN分享你的使用心得与创意
Pixel Couplet Gen 社区贡献指南:在CSDN分享你的使用心得与创意 1. 为什么要分享你的使用经验 当你成功部署并体验了Pixel Couplet Gen后,可能会发现一些独特的用法或优化技巧。把这些经验分享出来,不仅能帮助其他开发者少走弯路࿰…...
【科研必备】Elsevier Tracker:5分钟搞定学术投稿监控的终极解决方案
【科研必备】Elsevier Tracker:5分钟搞定学术投稿监控的终极解决方案 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 你是否也曾为了追踪Elsevier期刊的审稿状态而反复刷新页面?每天登录系统…...
GB28181视频监控平台EasyCVR助力景区数字化转型,打造一体化视频监控解决方案
随着文旅行业数字化转型进程持续加速,旅游景区的安全管理、服务优化与运营效率提升已成为行业发展的核心诉求。景区场景普遍具有面积广阔、人员流动性强等特点,传统监控方案存在设备兼容性差、可视化管控能力不足等诸多短板,难以满足当前景区…...
Linux 中的硬链接和软连接是什么,二者有什么区别?
在 Linux 文件系统中,**硬链接(Hard Link)和软链接(Soft Link,又称符号链接 Symbolic Link)**是两种不同的文件引用方式。它们都允许用户通过不同的路径访问同一个文件内容,但它们的实现机制、限…...
伯克利Octo机器人框架实战:5步搞定跨平台任务迁移(附代码)
伯克利Octo机器人框架实战:5步搞定跨平台任务迁移(附代码) 在机器人开发领域,硬件平台的多样性一直是阻碍算法快速部署的主要瓶颈。想象一下,你花费数月为WidowX机械臂开发的抓取算法,当实验室新购入UR5工业…...
Qt跨平台即时通讯实战:从界面设计到TCP通信的完整实现
1. Qt跨平台即时通讯开发概述 用Qt框架开发即时通讯软件最大的优势就是"一次编写,到处运行"。我去年接手过一个项目,需要在Windows和Linux双平台上部署聊天工具,当时尝试过多种技术方案,最终Qt以绝对优势胜出。想象一下…...
DanKoe 视频笔记:深度工作:改变生活的常规 [特殊字符]
在本教程中,我们将学习一套能极大提升专注力与生产力的深度工作常规。这套方法的核心在于理解并管理你的注意力,将其视为最宝贵的资源,并像管理计算机内存一样去优化它。我们将从核心概念开始,逐步拆解具体步骤,帮助你…...
DS4Windows手柄适配工具全解析:从安装到高级配置的完美指南
DS4Windows手柄适配工具全解析:从安装到高级配置的完美指南 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 在PC游戏领域,手柄支持一直是玩家体验的关键环节。许多…...
吃透哈希槽:Redis集群核心分片机制,从原理到实战避坑
在分布式Redis集群中,“数据如何均匀分片、节点如何高效协同”是核心难题。上一篇我们详解了一致性哈希,它通过环形结构解决了传统哈希的节点迁移痛点,但在Redis集群的实际落地中,官方并没有采用一致性哈希,而是选择了…...
无损视频剪辑终极指南:如何用LosslessCut保持原始画质快速编辑
无损视频剪辑终极指南:如何用LosslessCut保持原始画质快速编辑 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在视频编辑的世界里,质量与速度…...
