linux gpio按键驱动程序,Linux GPIO Key 驱动的加载

gpio-keys是基于input子系统实现的一个通用的GPIO按键驱动,基于platform来实现,位于drivers/input/keyboard/gpio_keys.c,这个文件是硬件无关的,而硬件有关的需要我们自己来注册.进入这个gpio_keys.c这个函数,第一步就是初始化.

static int __init gpio_keys_init(void)

{

return platform_driver_register(&gpio_keys_device_driver);

}

然后加载这个结构体:

static struct platform_driver gpio_keys_device_driver = {

.probe = gpio_keys_probe,

.remove = __devexit_p(gpio_keys_remove),

.driver = {

.name = "gpio-keys",

.owner = THIS_MODULE,

#ifdef CONFIG_PM

.pm = &gpio_keys_pm_ops,

#endif

}

};

进入后会执行probe函数,进行设备的probe.当然只是注册设备,没什么必要看.还比如gpio_keys_isr就是去抖动检测,这是上半部分函数.

static irqreturn_t gpio_keys_isr(int irq, void *dev_id)

{

struct gpio_button_data *bdata = dev_id;

struct gpio_keys_button *button = bdata->button;

BUG_ON(irq != gpio_to_irq(button->gpio));

if (button->debounce_interval)

mod_timer(&bdata->timer,

jiffies + msecs_to_jiffies(button->debounce_interval));

else

schedule_work(&bdata->work);

return IRQ_HANDLED;

}

然后由定时器在超时时候,触发的下半部分.

static void gpio_keys_work_func(struct work_struct *work)

{

struct gpio_button_data *bdata =

container_of(work, struct gpio_button_data, work);

gpio_keys_report_event(bdata);

}

既然gpio_keys这么简单,那么看看我们如何绑定.在此之前,先打开相应的头文件.

#ifndef _GPIO_KEYS_H

#define _GPIO_KEYS_H

struct gpio_keys_button {

/* Configuration parameters */

int code; /* input event code (KEY_*, SW_*) */

int gpio;

int active_low;

char *desc;

int type; /* input event type (EV_KEY, EV_SW) */

int wakeup; /* configure the button as a wake-up source */

int debounce_interval; /* debounce ticks interval in msecs */

bool can_disable;

};

struct gpio_keys_platform_data {

struct gpio_keys_button *buttons;

int nbuttons;

unsigned int rep:1; /* enable input subsystem auto repeat */

};

#endif

其中gpio_keys_button就是我们要引用到板级相关文件的一个重要的结构体,他的每个字段的意义,挑重点的说一说.

code字段,意思就是对应Linux的按键事件,gpio要对应gpio号,active_low是低电平有效,desc是功能描述,debounce_interval是消抖间隔.当然这个gpio_keys_button最终要关联到gpio_keys_platform_data里,其中nbuttons就是有的按键总数.在板级文件中要声明.比如做2个引脚,一个是F1,一个是F2的功能.

static struct gpio_keys_button mx28evk_buttons[] =

{

{

.gpio = MXS_PIN_TO_GPIO(MXS_PIN_ENCODE(2, 4)), /*K1 */

.code = KEY_F1,

.desc = "Button 1",

.active_low = 1,

},

{

.gpio = MXS_PIN_TO_GPIO(MXS_PIN_ENCODE(2, 6)), /*K2 */

.code = KEY_F2,

.desc = "Button 2",

.active_low = 1,

},

};

然后声明一个组合起来的platform结构.

static struct gpio_keys_platform_data mx28evk_button_data =

{

.buttons = mx28evk_buttons,

.nbuttons = ARRAY_SIZE(mx28evk_button_data),

};

最后构建device,因为所有初始化都只识别device.

static struct platform_device mx28evk_button_device =

{

.name = "gpio-keys",

.id = -1,

.dev = {

.platform_data = &mx28evk_button_data,

}

};

最后只需要注册设备,就可以顺利使用了.

static struct platform_device *mx28evk_button_device_p[] __initdata = {

&mx28evk_button_device,

};

platform_add_devices(mx28evk_button_device_p,ARRAY_SIZE(mx28evk_button_device_p));

但是,GPIO的驱动有些BUG,下次再说.可能会导致加载失败,只针对MX28平台才错误吧.关键加载如图:

cbbc60ceeda00815a1a24a301f43a9c0.png

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

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

相关文章

深度学习(3)--常用激活函数的有用性质

1 sigmoid函数 sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。 sigmoid函数由下列公式定义: σ(x)11e−x(1)\sigma(x) \frac{1}{1 e^{-x}} \tag1σ(x)1e−x1​(1) sigmoid函数的级数表示: σ(x)1214x−148x31480x5−1780640x73114515…

kvm虚拟机不通网关_linux ssh 虚拟机下CentOS7开启SSH连接

一. 没开启,连接会报错二. 开启后,连接成功在虚拟机(Vmware Workstation)下,安装了CentOS7,现在想通过SSH工具连接虚拟机中的CentOS71、 首先,要确保CentOS7安装了 openssh-server,在终端中输入 yum list i…

linux netstat服务,linux netstat查看服务和端口状态

netstat可以查看linux系统中正在使用的服务和端口情况常见参数-a (all)显示所有选项,默认不显示LISTEN相关-t (tcp)仅显示tcp相关选项-u (udp)仅显示udp相关选项-n 拒绝显示别名,能显示数字的全部转化成数字。-l 仅列出有在 Listen (监听) 的服务状态-p …

memcpy函数实现_等比例缩放c++ opencv 实现

背景&#xff1a;在目标检测算法中&#xff0c; 输入图片等比例resize时mAP比直接resize会高几个点。实现&#xff1a;使用c 和opencv实现(之所以没用python&#xff0c;是因为用于生产环境)先贴代码&#xff1a;#include <math.h> #include <opencv2/core/core.hpp&g…

睡眠音频分割及识别问题(十一)--基于Android的YAMNet音频识别(总结)

WAV文件格式介绍 WAV文件遵守资源交换文件格式之规则&#xff0c;在文件的前44(或46)字节放置标头(header)&#xff0c;使播放器或编辑器能够简单掌握文件的基本信息&#xff0c;其内容以区块(chunk)为最小单位&#xff0c;每一区块长度为4字节&#xff0c;而区块之上则由子区…

黑白棋游戏水平(2)--pytorch剪裁

系统需求 Linux系统&#xff0c;并已安装git、gcc、g、cmake⼯具 下载源码 从github克隆Pytorch仓库 git clone --recursive https://github.com/pytorch/pytorch如果已经克隆过&#xff0c;则使⽤以下命令更新 git submodule sync git submodule update --init --recurs…

二维码图像去噪文献调研(1)--Real Image Denoising with Feature Attention

简介 &#xff08;1&#xff09; 论文&#xff08;包括期刊和发表时间&#xff09;&#xff1a; Real Image Denoising with Feature Attention&#xff08;ICCV 2019&#xff09; &#xff08;2&#xff09; 论文链接&#xff1a; https://arxiv.org/pdf/1904.07396.pdf &…

idea gui插件_给 IDEA 换了酷炫的主题,研发小姐姐看到:feel so high。。。

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]IntelliJ IDEA介绍IDEA&#xff0c;全称 IntelliJ IDEA &#xff0c;是 Java 语言的集成开发环境&#xff0c; IDEA 在业界被公认为是最好的 java 开发工具之一&#xff0c;尤其在智能 代码助手、代码自动提示、重构、 J2E…

华为荣耀电脑第三方linux,【第三方Linux版】荣耀MagicBook Pro 16.1英寸全面屏如何?某东入手评测...

这款【第三方Linux版】荣耀MagicBook Pro 16.1英寸全面屏轻薄笔记本电脑(酷睿i5 8G 512G MX250 IPS)冰河银&#xff0c;看网上评测推荐的&#xff0c;后面网上种草了这款笔记本&#xff0c;用过一段日子了&#xff0c;分享使用感受如下&#xff1a;一、【第三方Linux版】荣耀Ma…

二维码提升对比度文献调研(1)--Fast Image Processing with Fully-Convolutional Networks

简介 (1) 论文 &#xff08;期刊和发表时间&#xff09; Fast Image Processing with Fully-Convolutional Networks (ICCV 会议 2017) (2) 论文链接 https://openaccess.thecvf.com/content_iccv_2017/html/Chen_Fast_Image_Processing_ICCV_2017_paper.html (3) 源代码链接 …

linux下 c语言 用write open二进制写文件,Linux下用C语言fopen、fread和fwrite函数对二进制文件的操作-Go语言中文社区...

一、前言在做一个镜头的初始化操作&#xff0c;需要加载一个648*522像素大小的文件&#xff0c;厂商提供的是一个excel表&#xff0c;如果要加载数据&#xff0c;可用加载txt文本的方式&#xff0c;我选用二进制方式加载文件&#xff1b;大家都知道电脑真正执行的不是高级语言&…

二维码提升对比度文献调研(2)--Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement

简介 论文 &#xff08;期刊和发表时间&#xff09; Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement (CVPR 会议 2020)论文链接 https://openaccess.thecvf.com/content_CVPR_2020/html/Guo_Zero-Reference_Deep_Curve_Estimation_for_Low-Light_Imag…

python打开是什么样子的图片_黑洞6问:黑洞内部是什么样子?黑洞图片发布,理论和实测的碰撞...

在科学领域&#xff0c;没有什么比你在第一次观察或实验结果中验证一个长期的理论预测时更令人兴奋的了。2012年&#xff0c;大型强子对撞机揭示了希格斯玻色子——标准模型中最后未发现的基本粒子的存在。 几年前&#xff0c;LIGO合作直接探测到了引力波&#xff0c;证实了对爱…

二维码提升对比度文献调研(3)--A Low-Complexity Algorithm for Contrast Enhancement of Digital Images

简介 &#xff08;1&#xff09;论文&#xff08;包括期刊和发表时间&#xff09;&#xff1a;A Low-Complexity Algorithm for Contrast Enhancement of Digital Images &#xff08;2&#xff09;论文链接&#xff1a; http://www.mecs-press.net/ijigsp/ijigsp-v10-n2/IJIG…

安卓checkbox无响应_【安卓手机】无法连接电脑的解决方法

转自&#xff1a;广西南宁平衡信息技术有限公司&#xff0c;作者&#xff1a;平衡LivY一般在对手机的数据采集过程中&#xff0c;尤其是安卓手机&#xff0c;最令人头疼的就是手机接入电脑后无法识别。相信以下窗口是大家在做手机取证的时候最不想看到的。那么这里大伙就会有疑…

linux s删除第一行,Linux文本处理三驾马车之一sed

sed对"行"操作动作含义a &#xff1a;新增&#xff0c; a 接字串&#xff0c;而这些字串会在新的一行出现(目前的下一行)&#xff5e;sed 1a\llll llllllll \n lllllll t.txtnl /etc/passwd | sed 2a drink teased -i $a# This is a test regular_express.txt ####文…

二维码提升对比度文献调研(4)--Attention Guided Low-light Image Enhancement

简介 &#xff08;1&#xff09;论文2&#xff1a; Attention Guided Low-light Image Enhancement with a Large Scale Low-light Simulation Dataset &#xff08;2&#xff09;论文链接&#xff1a; https://arxiv.org/pdf/1908.00682v3.pdf &#xff08;3&#xff09;源代…

函数传参string_C/C++的三种函数传值方式及其区别

C/C函数传参方式我想很多朋友应该都知道&#xff0c;但是不同传参方式的背后他们的区别是什么我想很多人并不那么清楚。本文就给大家揭露一下各传参方式的区别。传参方式有这三种&#xff1a;值传递、引用传递、指针传递大家可以去看三种传递方式的写法的区别&#xff0c;关于写…

二维码提升对比度文献调研(5)--DeepLPF: Deep Local Parametric Filters for Image Enhancement

简介 &#xff08;1&#xff09;论文名称&#xff1a; DeepLPF: Deep Local Parametric Filters for Image Enhancement CVPR 2020 &#xff08;2&#xff09;论文链接&#xff1a; https://arxiv.org/abs/2003.13985 &#xff08;3&#xff09;源代码&#xff1a; https://gi…

c语言单选题大全,C语言单选题(五)

1.C语言结构体类型变量在程序执行期间(C)。A.部分成员驻留在内存中B.只有一个成员驻留在内存中C.所有成员一直驻留在内存中D.没有成员驻留在内存中2.当定义一个结构体变量时&#xff0c;系统分配给它的内存是(D)。A.结构中最后一个成员所需内存量B.结构中第一个成员所需内存量C…