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

news2025/1/16 2:42:26

在前几篇笔记之中都是使用的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之中,通过原子变量控制读操作不会产生并发竞争。

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

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

相关文章

【Vue】v-if和v-show的区别

v-if&#xff1a;按条件渲染&#xff0c;判定为true时渲染&#xff0c;否则不渲染 v-show&#xff1a;按条件展示&#xff0c;区别在于切换的是display属性的值 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&l…

掌握JavaScript的练习之道:十个手写函数让你信手拈来!

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

企业知识库系统:从0开始,部署企业知识库模型

当今竞争激烈的商业环境中&#xff0c;企业需要不断提高效率和降低成本&#xff0c;以保持竞争力。而建立一个高效的智能知识库&#xff0c;可以帮助企业实现这一目标。 部署企业知识库 但是知识库目前也需要相关专业的工具创建才能满足企业的业务需求&#xff0c;以HelpLook为…

将数组拆分成斐波那契序列

题目描述 示例 代码如下&#xff1a; public class SplitIntoFibonacci {LinkedList<Integer> res new LinkedList<>();public List<Integer> splitIntoFibonacci(String num) {if(num.length() < 3) return res;if(dfs(num, 0)) return res;return new…

【API篇】四、Flink物理分区算子API

文章目录 1、 分区算子&#xff1a;随机分区2、分区算子&#xff1a;轮询分区3、分区算子&#xff1a;重缩放分区4、分区算子&#xff1a;广播5、分区算子&#xff1a;全局分区6、自定义分区 重分区&#xff0c;即数据"洗牌"&#xff0c;将数据分配到下游算子的并行子…

优思学院|六西格玛品质管理概念,实现卓越品质的艺术

在竞争激烈的商业环境中&#xff0c;企业必须不断提高产品和服务的质量&#xff0c;以满足不断增长的客户需求。在这个背景下&#xff0c;六西格玛&#xff08;6σ&#xff09;管理理念应运而生。由摩托罗拉公司的比尔史密斯于1986年提出&#xff0c;六西格玛是一种管理策略&am…

Spring5学习笔记之整合MyBatis

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

这4个网站太厉害了, 每一个都能帮你打开新世界大门

又是一期满满的干货&#xff01;今天给大家推荐几个小众但超好用的网站&#xff0c;每一个都能帮你打开新世界的大门&#xff01; 一、音分轨——在线人声分离网站 在线从任何音、视频中提取人声、伴奏和各种乐器&#xff0c;针对某一视频可以单独从里面提取人声或背景音乐&am…

Dreambooth工作原理

什么是Dreambooth 中文名&#xff1a;梦想亭。 Dreambooth 由 Google 研究团队于 2022 年发布&#xff0c;是一种通过向模型注入自定义主题来微调扩散模型&#xff08;如稳定扩散&#xff09;的技术。 所谓自定义主体&#xff0c;就是一张照片&#xff0c;但是照片主体要鲜明…

高校教务系统登录页面JS分析——广东工业大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

分布式定时任务xxljob

xxl-job的xxl为作者名徐雪里拼音首字母。 xxl-job的作者是2015年开始开发这个项目&#xff0c;那时候springmvcbootstrapadminlte 大行其道&#xff0c;所以这个框架调度器一直沿用这个架构。 一、运行调度器 调度器可以集群或单点运行&#xff0c;以单点运行为例 下载代码…

Python学习笔记——文件操作、异常捕获、模块

食用说明&#xff1a;本笔记适用于有一定编程基础的伙伴们。希望有助于各位&#xff01; 文件读取 文件操作比较常见&#xff0c;通常我们需要对文件进行读取操作&#xff1a; f1 open(assets/Files/测试文件.txt, r, encodingUTF-8)# 辨别是否可读print(f1.readable())# 读取…

MYSQL常用函数详解

今天查缺陷发现同事写的一个MYSQL的SQL中用到函数JSON_CONTAINS&#xff0c;我当时第一反应是这个函数是Mysql8新加的么&#xff1f;原来小丑尽是我自己。 有必要巩固一下Mysql函数知识&#xff0c;并记录一下。&#xff08;如果对您也有用&#xff0c;麻烦您动动发财的手点个赞…

第六届“中国法研杯”司法人工智能挑战赛进行中!

第六届“中国法研杯”司法人工智能挑战赛 赛题上新&#xff01; 第六届“中国法研杯”司法人工智能挑战赛&#xff08;LAIC2023&#xff09;目前已发布司法大模型数据和服务集成调度 、证据推理、司法大数据征文比赛、案件要素识别四大任务。本届大赛中&#xff0c;“案件要素…

找不到msvcr120.dll怎么办?msvcr120.dll丢失如何修复?

MSVCR120.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2012 Redistributable Package的一部分。这个文件包含了许多用于运行C应用程序的函数和类。当我们的计算机上缺少这个文件时&#xff0c;就会导致一些程序无法正常运行&#xff0c;甚至会出现系统崩溃的情…

汽车屏类产品(四):仪表Cluster

###前言 仪表Cluster/仪表盘Dashboard,作为伴随汽车诞生就存在的一个主要零部件之一,从机械到电子到数字,可以说也是逐渐发展到现在的。 目前的主流框图如下,中间processor就是主控芯片,可能有buttons/switches,有display显示屏+backlight背光,有audio->speake…

黑客技术(网络安全)学习

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

2023年中国多功能折叠刀产量、销量及市场规模分析[图]

多功能折叠刀是一种集多种功能于一身的刀具&#xff0c;通常包括切割、开瓶、剥皮、锯木等功能&#xff0c;可以通过折叠和展开的方式来实现不同的功能&#xff0c;具有便携、多用途、安全等特点&#xff0c;广泛应用于户外探险、露营、自驾旅行等场景。 多功能折叠刀行业分类…

【AIGC核心技术剖析】扩大富有表现力的人体姿势和形状估计SMPLer-X模型

富有表现力的人体姿势和形状估计 (EHPS) 将身体、手和面部运动捕捉与众多应用结合起来。尽管取得了令人鼓舞的进展,但当前最先进的方法仍然在很大程度上依赖于有限的训练数据集。在这项工作中,我们研究了将 EHPS 扩展到第一个通用基础模型(称为 SMPLer-X),以 ViT-Huge 作为…

layui中页面切分

1.引入Split插件 2.切屏比例设置 pallet与material为标签的id 3.html内部标签上设置切分盒子 4参考网站 : 网站链接