首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

按键驱动编写

硬件原理 从图中可以看到按键断开时,由于接了上拉电阻,所以CPU检测到默认是高电平的,当按键被按下时,电路导通,所以KEY0引脚变成低电平,即低电平有效。 那么按键是接到CPU哪个引脚呢?...通过在电路原理图中搜索KEY0,可以发现他是接到了UART1_CTS上,再搜索UART1_CTS,发现它接到了CPU的K15,做按键驱动我们需要将其复用为普通IO即可,即GPIO1_IO18,硬件电路分析完毕...软件编写 这里采用kernel的dts,gpio和pinctrl子系统去完成对按键引脚的初始化和电平读取等。...编写按键驱动程序 key.c #include #include #include #include <...正常我们注册一般的字符设备驱动需要以下步骤: alloc_chrdev_region // 注册字符设备驱动 cdev_init cdev_add class_create //创建类 device_create

1.4K10

Linux驱动开发-编写按键驱动

杂项设备注册函数 这篇文章介绍,如何使用杂项设备框架编写一个简单的按键驱动,完成编写、编译、安装、测试等流程,了解一个杂项字符设备驱动的开发流程。...编写按键驱动 使用杂项设备注册按键驱动,应用层使用read接口读取按键值。 编写驱动之前需要先找到按键的原理图,找到按键接到CPU那个IO上的。...2.1 按键驱动源代码 #include #include #include #include <linux...(*GPX3DAT&1<<5)) //判断按键是否按下 { key_val=0x4; } /*数据拷贝函数: 给应用层空间赋值--将驱动层的数据拷贝给应用层*/ /*copy_to_user...杂项设备的注册函数*/ misc_register(&misc); printk("按键: 驱动安装成功\n"); return 0; } static void __exit tiny4412

19.7K31
您找到你想要的搜索结果了吗?
是的
没有找到

gpio_key按键驱动

1.gpio_key.c介绍 1.1 功能介绍 Linux内核下的 drivers/input/keyboard/gpio_keys.c实现了一个体系结构无关的GPIO按键驱动,使用此按键驱动,只需在设备树...gpio-key节点添加需要的按键子节点即可。...驱动的实现非常简单,但是较适合于实现独立式按键驱动。 1.2 架构介绍 gpio-keys是基于input架构实现的一个通用GPIO按键驱动。...该驱动基于platform_driver架构,实现了驱动和设备分离,符合Linux设备驱动模型的思想。本文以自己的理解介绍gpio_keys.c驱动实现原理及代码技巧。...按键状态发生变化时,会触发中断,在中断子服务函数中,先通过消抖参数值判断是否消抖,如果消抖就启用定时器上报,若无需消抖就就直接上报按键事件。

3.2K30

13.Linux键盘按键驱动 (详解)

在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标:        实现键盘驱动,让开发板的4个按键代表键盘中的L、S、空格键、回车键...// type : 要上报哪类事件, 比如按键事件,则填入: EV_KEY // code: 对应的事件里支持的哪个变量,比如按下按键L则填入: KEY_L //value:对应的变量里的数值,...比如松开按键则填入1,松开按键则填入0 input_sync(struct input_dev *dev); //同步事件通知 为什么使用了input_event()上报事件函数,就要使用这个函数?...->keybit); //支持按键 空格 set_bit(KEY_ENTER,buttons_dev->keybit); //支持按键 enter /*3...在上一节输入子系统里分析到:输入子系统的主设备号为13,其中event驱动本身的此设备号是从64开始的,如上图,内核启动时,会加载自带触摸屏驱动,所以我们的键盘驱动的次设备号=64+1 3.1测试运行有两种

5K70

开源按键组件MultiButton支持菜单操作(事件驱动型)

之前一个老友写的MultiButton开源按键组件的剖析讲解,它的设计思想简洁且高效,这篇文章我上周也分享出来给大家共同来学习了。...第1期 | MultiButton,一个小巧简单易用的事件驱动按键驱动模块 至于介绍和使用在这里我就不多说了,相信看上面这篇文章你应该就懂了,但我想,能不能跟菜单操作绑定在一块呢?...这样我不就可以利用起来,实现一个高效稳定的菜单+按键结合的状态机框架?...通常一些手持式设备都会有各种各样的按键,比如左、中、右、确定、返回、电源键等等(非矩阵键盘),以我目前公司的产品,一般就这几个按键。...我们公司的产品主要的业务逻辑还是应用,应用逻辑最大的工作量其实就是利用按键+页面的形式来体现,这就少不了需要实现一套简单、高效、稳定、可拓展、可维护的菜单+按键的软件框架,有了这么一套好用的框架,后面随便换一个产品

2.7K31

Linux keypad 设备树,matrix_keypad 矩阵按键驱动分析

matrix_keypad 矩阵按键驱动分析 //主要函数调用过程 matrix_keypad_probe matrix_keypad_parse_dt //根据设备树构造 pdata pdata->num_row_gpios...gpio_direction_input(pdata->row_gpios[i]); request_any_context_irq input_register_device //具体分析 //矩阵按键驱动源码在...*/ disable_row_irqs(keypad); return 0; … return err; } 通过probe函数,可以确定我们写平台设备时只需通过platform_data成员提供平台驱动所需的信息...再确定结构体matrix_keypad_platform_data的每个成员的作用即可,如不清楚具体用途,可以在驱动代码里通过查看对成员值的访问反推出用途....unsigned int clustered_irq_flags; bool active_low; //键按下时,行线是否为低电平 bool wakeup; bool no_autorepeat; //按键按下时是否重复提交按键

1.7K30

7.自己写中断方式按键驱动程序(详解)

request_irq()和free_irq()分析完毕后,接下来开始编写上升沿中断的按键驱动 如下图,需要设置4个按键的EINT0, EINT2, EINT11, EINT19的模式为双边沿,且设置按键引脚为中断引脚....release成员second_drv_class()函数释放中断, 然后cat /proc/interrupts会发现申请的中断已经注销掉了,在-sh进程fd文件里也没有文件描述符5 7.改进中断按键驱动程序...使用dev_id来获取不同按键的状态,是上升沿还是下降沿触发?...当没有按键按下时,这个进程就处于静止状态staitc,如下图所示: ? 在等待队列(休眠状态)下,该进程占用了CPU0%资源,如下图所示: ? 当有按键按下时,便打印数据,如下图所示: ?...下节继续改进按键程序—使用poll机制 本节驱动代码如下: #include #include #include <linux/fs.h

1.4K90

11.按键驱动之定时器防抖(详解)

本节目标:  通过定时器来防止按键抖动,测试程序是使用上节的:阻塞操作的测试程序 1.在没有定时器防抖情况下,按键没有稳定之前会多次进入中断,使得输出多个相同信息出来 2.按键波形图,如下所示:...3.如何消去按键抖动 通过定时器延时10ms,然后每当按键进入中断时就更新定时器延时10ms,若延时10ms到了说明已经过了抖动范围,然后再打印按键电平信息 4.定时器结构体和函数介绍 我们先来看看两个全局变量...button_async, SIGIO, POLL_IN); //发送SIGIO信号给应用层 } 6.测试效果 如下图所示,当定时器expire成员<=jiffies时会进入一次定时器超时函数,我们按键驱动就不需要这个...如下图所示,我们运行测试程序,来快速按下按键试试: ?...even_press ) //没有按键按下 return -1; } /*阻塞操作,则直接进入休眠状态,直到有按键按下为止

1.4K100

8.中断按键驱动程序之poll机制(详解)

本节继续在上一节中断按键程序里改进,添加poll机制. 那么我们为什么还需要poll机制呢。...如果我们不想让程序停在这个位置,而是希望当有按键按下时,我们再去read,因此我们编写poll函数,测试程序调用poll函数根据返回值,来决定是否执行read函数。...这就要分析我们的驱动程序.poll函数(第2小节开始分析.poll函数) 2写驱动程序.poll函数,并分析.poll函数: 在上一节驱动程序里添加以下代码: #include <linux/poll.h...third_poll()函数, 所以当我们有按键按下时, 驱动函数third_poll()就会返回mask非0值,然后在内核函数do_poll里的count就++,poll机制并退出睡眠. 2.2分析在内核中...button_wait中断下    add_wait_queue(wait_address, &entry->wait); } 它是将poll进程添加到了button_wait中断队列里,这样,一有按键按下时

1.7K60

【i.MX6ULL】驱动开发7——按键输入捕获

/* SW2 */ key2-gpio = ; /* SW4 */ status = "okay"; }; 2.2 编写按键驱动程序...按键驱动,也属于字符设备驱动,和之前的字符设备驱动的框架一样,主要的修改点在按键的硬件初始化配置已经按键的读取。...新建一个key-App.c 按键的应用层程序,主要就通过驱动程序提供的按键读取接口,来循环读取按键的值,并在按键按下时,将按键的值打印出来。...\r\n"); return -1; } filename = argv[1]; /* 打开key驱动 */ fd = open(filename,...return 0; } 3 实验测试 3.1 编译程序 3.1.1 编译设备树 编译设备树文件,并将编译出的dtb文件复制到启动文件夹: 网络方式启动开发板,查看key节点: 3.1.2 编译按键驱动程序

52820

嵌入式C语言实现事件型按键驱动

本项目是一个小巧简单易用的事件驱动按键驱动模块,可无限量扩展按键按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。...; 2.初始化按键对象,绑定按键的GPIO电平读取接口read_button_pin() ,后一个参数设置有效触发电平 button_init(&button1, read_button_pin, 0,...,依次进入 button_handler(struct Button* handle) 状态机处理,所以每个按键的状态彼此独立。...3、按键事件 事件 说明 PRESS_DOWN 按键按下,每次按下都触发 PRESS_UP 按键弹起,每次松开都触发 PRESS_REPEAT 重复按下触发,变量repeat计数连击次数 SINGLE_CLICK...单击按键事件 DOUBLE_CLICK 双击按键事件 LONG_PRESS_START 达到长按时间阈值时触发一次 LONG_PRESS_HOLD 长按期间一直触发 4、示例 #include "button.h

26510

Linux驱动开发-外部中断的注册使用(按键为例)

外部中断介绍 前面有篇文章使用杂项设备完成了按键驱动的编写,实现了按键轮询检测,通过read函数向应用层传递按键值,这篇文章使用按键为例,介绍Linux内核里中断的注册方法,使用中断的方式检测按键是否按下...,中断在单片机、设备驱动开发里使用的都非常多,可以更加实时的检测到按键触发的情况。...外部中断驱动编写 2.1 按键原理图 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ElkgCQ6V-1648429520818)(https://gitee.com/dsxiaolong.../blog-drawing-bed/raw/master/img/image-20211226144741837.png)] 2.2 驱动示例代码 insmod 安装驱动之后就直接注册按键中断,没有注册字符设备框架...,当按键按下之后,直接在驱动层通过printk打印数据提示到终端。

4.8K40

第1期 | MultiButton,一个小巧简单易用的事件驱动按键驱动模块

MultiButton 本期给大家带来的开源项目是 MultiButton,一个小巧简单易用的事件驱动按键驱动模块,作者 0x1abin,目前收获 222 个star,遵循 MIT 开源许可。...这个项目非常精简,只有两个文件,可无限量扩展按键按键事件的回调异步处理方式可以简化程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。...(按键对象) /* USER CODE BEGIN PV */ //申请一个按键结构 struct Button button1; /* USER CODE END PV */ ③ 初始化按键对象...面向对象思想 MultiButton中每个按键都抽象为了一个按键对象,每个按键对象是独立的,系统中所有的按键对象使用单链表串起来,结构如下: 其中在变量后面跟冒号的语法称为位域,使用位域的优势是节省内存...用户插入一个按键对象的代码如下: //启动按键 button_start(&button1); 那么,button_start插入新的按键对象之后,单链表长啥样呢?

1.2K30

面试加分项|一个优秀的按键驱动框架

前言 按键是嵌入式产品中不可或缺的一部分,但往往受制于结构尺寸等因素,按键数量有限,如何利用有限的按键实现更多的骚操作,本文介绍一种优雅的按键实现方法,纯c语言实现,只需要与底层接口对接便可以轻松移植到嵌入式平台...实现效果 原理及代码接口分析 源码来自: https://github.com/jiejieTop Button_drive是一个小巧的按键驱动,支持单击、双击、长按、连续触发等(后续可以在按键控制块中添加触发事件...),写按键驱动的目的是想要将用户按键逻辑与按键处理事件分离,用户无需处理复杂麻烦的逻辑事件。...按键驱动移植应用 光说不练假把式,文章开始就说了,此按键驱动非常好移植到嵌入式平台,那有多好移植呢,且看... cubemx配置 此次用到的资源比较少,硬件上1个按键、串口、定时器,来看看如何配置,基础配置可以参考以下文章...配置比较简单,不啰嗦啦 应用代码编写 代码在上节裸机多任务工程上添加,再来添加进来本次的按键驱动代码,按键驱动代码使用方法: 1、创建句柄 Button_t Button1; Button_t Button2

40510

MultiButton事件触发型按键驱动模块在高云FPGA上的移植

串口命令解析器在高云FPGA GW1NSR-4C SoC上的移植: letter-shell串口终端在高云FPGA上的移植 cmd-parser串口命令解析器在高云FPGA上的移植 本文介绍一个非常简单、功能强大的按键驱动模块...MultiButton简介 MultiButton, 一个小巧简单易用的事件驱动按键驱动模块,可无限量扩展按键按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰...支持多种按键触发方式: PRESS_DOWN,按键按下,每次按下都触发 PRESS_UP,按键弹起,每次松开都触发 PRESS_REPEAT,重复按下触发,变量repeat计数连击次数 SINGLE_CLICK...,单击按键事件 DOUBLE_CLICK,双击按键事件 LONG_PRESS_START,达到长按时间阈值时触发一次 LONG_PRESS_HOLD,长按期间一直触发 2....); //按键按下触发一次 button_attach(&btn1, PRESS_UP, button_callback); //按键松开触发一次 button_attach

47930

【i.MX6ULL】驱动开发10——阻塞&非阻塞式按键读取

上篇文章:【i.MX6ULL】驱动开发9——Linux IO模型分析,介绍了linux中的五种I/O模型,本篇,就来使用阻塞式I/O和非用阻塞式I/O两种方式进行按键的读取实验,并对比之前使用输入捕获和中断法检测的按键程序...1.2.1驱动程序 阻塞读取逻辑如下,首先要定义一个等待队列,当按键没有按下时,就要阻塞等待了(将等待队列添加到等待队列头),然后进行行一次任务切换,交出CPU的使用权。...开始测试,按如下图,当没有按键按下时,应用程序被阻塞: 按键程序在后台运行,此时使用top指令开查看CPU的使用率,可以发现阻塞式按键驱动这种方式,CPU的暂用率几乎为0,虽然按键应用程序中仍实现循环读取的方式...2 非阻塞I/O方式的按键检测 按键应用程序以非阻塞的方式读取,按键驱动程序也要以非阻塞的方式立即返回。...按键程序在后台运行,此时使用top指令开查看CPU的使用率,可以发现非阻塞式按键驱动这种方式,CPU的暂用率也几乎为0,虽然按键应用程序中仍实现循环读取的方式,但poll函数有500ms的超时设置,在超时等待的时间里

53120
领券