当前位置: 首页 > 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;中国工程院院士邬贺…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...