学习
实践
活动
专区
工具
TVP
写文章

按键驱动编写

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

10310

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

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

37531
  • 广告
    关闭

    热门业务场景教学

    个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。

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

    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驱动实现原理及代码技巧。 按键状态发生变化时,会触发中断,在中断子服务函数中,先通过消抖参数值判断是否消抖,如果消抖就启用定时器上报,若无需消抖就就直接上报按键事件。

    1.6K30

    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测试运行有两种

    2.4K70

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

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

    1.9K31

    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 <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h

    80590

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

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

    763100

    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; //按键按下时是否重复提交按键

    32830

    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中断队列里,这样,一有按键按下时

    80860

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

    /* SW2 */ key2-gpio = <&gpio5 11 GPIO_ACTIVE_LOW>; /* 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 编译按键驱动程序

    18020

    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打印数据提示到终端。

    30640

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

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

    16110

    第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插入新的按键对象之后,单链表长啥样呢?

    73030

    【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的超时设置,在超时等待的时间里

    17520

    vim按键整理

    vim按键整理 1 一般模式下光标移动、搜索替换、复制粘贴 光标移动 h / b / ← 光标向左移动一个字符 j / ↓ 光标向下移动一个字符 k / ↑ 光标向上移动一个字符 l / w / → 光标向下移动 n 行 (常用) 翻页 [Ctrl] + [f] 屏幕向『下』移动一页,相当于 [Page Down]按键 (常用) [Ctrl] + [b] 屏幕向『上』移动一页,相当于 [Page Up] 按键 (常用) [Ctrl] + [d] 屏幕向『下』移动半页 [Ctrl] + [u] 屏幕向『上』移动半页 搜索替换 /word 向光标之下寻找一个名称为 word 的字符串 ? word 向光标之上寻找一个名称为 word 的字符串 n n 是英文按键,重复前一个搜寻的动作 N N 是英文按键,反向进行前一个搜寻动作 :n1,n2s/word1/word2/g n1 与 n2 ) :1,$s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 (常用) 删除、复制、粘贴 x, X x 向后删除一个字符 ([del] 按键

    57450

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    相关产品

    • GPU 云服务器

      GPU 云服务器

      腾讯GPU 云服务器是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券