Linux input子系统实例分析(一)
这是一个简单的输入设备驱动实例。这个输入设备只有一个按键,按键被连接到一条中断线上,当按键被按下时,将产生一个中断,内核将检测到这个中断,并对其进行处理。该实例的代码如下:
1: #include <linux/module.h>
2: #include <linux/init.h>
3: #include <linux/fs.h>
4: #include <linux/interrupt.h>
5: #include <linux/irq.h>
6: #include <linux/sched.h>
7: #include <linux/spinlock.h>
8: #include <linux/pm.h>
9: #include <linux/slab.h>
10: #include <linux/sysctl.h>
11: #include <linux/proc_fs.h>
12: #include <linux/delay.h>
13: #include <linux/platform_device.h>
14: #include <linux/input.h>
15: #include <linux/workqueue.h>
16: #include <linux/gpio.h>
17:
18:
19: #define gpio_key 32*4+30 //PD(30) 即将使用的gpio
20: #define DEV_NAME "gpio_key"
21:
22: int g_irq = -1; //中断号
23: static struct input_dev *button_dev; //输入子系统设备结构
24:
25:
26: //中断处理函数
27: static irqreturn_t button_interrupt(int irq, void *p)
28: {
29: /*get pin value <down 0, up 1> */
30:
31: int val = gpio_get_value(gpio_key);
32:
33: input_report_key(button_dev, KEY_1, val);
34:
35: input_sync(button_dev);
36:
37: return IRQ_RETVAL(IRQ_HANDLED);
38: }
39:
40:
41:
42: static int __init button_init(void)
43: {
44: int irq = -1, err = -1;
45: unsigned long irqflags;
46: //申请gpio
47: err = gpio_request(gpio_key, "test_key");
48: if(err < 0){
49: printk("request gpio[%d] failed...\n", gpio_key);
50: goto end1;
51: }
52:
53: //gpio输入
54: err = gpio_direction_input(gpio_key);
55: if (err < 0) {
56: //dev_err(dev, "failed to configure"
57: // " direction for GPIO %d, error %d\n",
58: // gpio_key, error);
59: goto end2;
60: }
61: //申请gpio中断号
62: g_irq = (irq = gpio_to_irq(gpio_key));
63: if (irq < 0) {
64: err = irq;
65: //dev_err(dev, "Unable to get irq number for GPIO %d, error %d\n",
66: // gpio_key, irq);
67: goto end2;
68: }
69: //中断类型
70: irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
71: /* 申请中断 */
72: if (request_irq(irq, button_interrupt, irqflags, DEV_NAME, NULL)) {
73:
74: printk(KERN_ERR"cannotallocate irq");
75: err= -EBUSY;
76: goto end2;
77: }
78:
79: /*分配input_dev */
80: button_dev = input_allocate_device();
81: if (button_dev == NULL) {
82: printk(KERN_ERR "notenough memory\n");
83: err= - ENOMEM;
84: goto end3;
85:
86: }
87: /*设置输入设备支持的事件类型和事件代码 */
88: button_dev->name = "key_gpio";
89: set_bit(EV_KEY, button_dev->evbit);
90: set_bit(KEY_1, button_dev->keybit);
91:
92: /*把输入设备注册进核心层 */
93: err = input_register_device(button_dev);
94: if(err) {
95: printk(KERN_ERR "failedto register device\n");
96: goto end4;
97: }
98:
99: printk("initialized\n");
100: return 0;
101:
102: end4:
103: input_free_device(button_dev);
104: end3:
105: free_irq(irq, NULL);
106: end2:
107: gpio_free(gpio_key);
108: end1:
109: return err;
110:
111: }
112:
113:
114:
115: static void __exit button_exit(void)
116: {
117: input_unregister_device(button_dev);
118: input_free_device(button_dev);
119:
120: gpio_free(gpio_key);
121: free_irq(g_irq, NULL);
122: }
123:
124:
125:
126: module_init(button_init);
127: module_exit(button_exit);
128:
129: MODULE_LICENSE("GPL");
130: MODULE_AUTHOR("xuyonghong@duotin.com>");
131:
132:
133:
134:
135:
136:
当编译进内核烧写板子后可以看到相应的设备文件:
root@CarRadio:/sys/devices# ls virtual/input/input2/
capabilities id name power subsystem uniq
event2 modalias phys properties uevent
root@CarRadio:/sys/devices# cat virtual/input/input2/name
key_gpio
root@CarRadio:/sys/devices#
这样就可以监控event2来捕捉按键
root@CarRadio:/# ls dev/input/event2
dev/input/event2
root@CarRadio:/#
驱动分析:
1.申请gpio
gpio_request(gpio_key, "test_key");
2.设置为gpio输入模式
gpio_direction_input(gpio_key);
3.申请gpio中断号,注册中断
//申请gpio中断号 g_irq = (irq = gpio_to_irq(gpio_key));
/* 申请中断 */
request_irq(irq, button_interrupt, irqflags, DEV_NAME, NULL);
4.分配input_dev设备
/*分配input_dev */
button_dev = input_allocate_device();
5.把输入设备注册进核心层
input_register_device(button_dev);
Linux input子系统实例分析(一)的更多相关文章
- Linux input子系统实例分析(二)
紧接着上一节的实例我们来分析调用的input子系统的接口: 1. input_dev,用来标识输入设备 1: struct input_dev { 2: const char *name; //设备名 ...
- Linux input子系统分析
输入输出是用户和产品交互的手段,因此输入驱动开发在Linux驱动开发中很常见.同时,input子系统的分层架构思想在Linux驱动设计中极具代表性和先进性,因此对Linux input子系统进行深入分 ...
- Linux Input子系统
先贴代码: //input.c int input_register_handler(struct input_handler *handler) { //此处省略很多代码 list_for_each ...
- Linux Input子系统浅析(二)-- 模拟tp上报键值【转】
转自:https://blog.csdn.net/xiaopangzi313/article/details/52383226 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...
- Linux input子系统 io控制字段【转】
转自:http://www.cnblogs.com/leaven/archive/2011/02/12/1952793.html http://blog.csdn.net/guoshaobei/arc ...
- Linux input子系统编程、分析与模板
输入设备都有共性:中断驱动+字符IO,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用主设备号13,同时输入子系 ...
- linux input子系统详解
首先,什么是linux的子系统: 输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如鼠标移动通过Driver->Input core->Event handler- ...
- Android驱动之 Linux Input子系统之TP——A/B(Slot)协议
将A/B协议这部分单独拿出来说一方面是因为这部分内容是比较容易忽视的,周围大多数用到input子系统的开发人员也不甚理解:另一方面是由于这部分知识一旦扩展到TP(触摸屏Touch Panel)的多点触 ...
- Linux输入子系统框架分析(1)
在Linux下的输入设备键盘.触摸屏.鼠标等都能够用输入子系统来实现驱动.输入子系统分为三层,核心层和设备驱动层.事件层.核心层和事件层由Linux输入子系统本身实现,设备驱动层由我们实现.我们在设备 ...
随机推荐
- Python自动发送邮件(可带附件)
Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件 ...
- 【drp 12】再识转发和重定向:SpringMVC无法跳转页面
最近再使用SpringMVC进行页面跳转的时候,不知道发生了什么,始终都无法正确跳转.后来问题解决了,发现是对于转发和重定向没有能很好的理解,以此写篇博客,权当做积累了! 声明:本博客的所有代码,均为 ...
- 九度oj 题目1131:合唱队形
题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们 ...
- tomcat的管理(manager)报错403
管理tomcat的时候遇到了以下问题: 1.刚开始需要用户名密码,不知道用户名和密码是什么,但是输入什么都不正确. 解决办法: 自己在tomcat-users.xml中按格式添加用户 conf文件夹里 ...
- MapReduce和Hadoop流
MapReduce:分布式计算的框架 MapReduce是一个软件框架,可以将单个计算作业分配给多台计算机执行. MapReduce在大量节点组成的集群上运行.它的工作流程是:单个作业被分成很多小份, ...
- 【Luogu】P2258子矩阵(状态压缩,DP)
233今天蒟蒻我连文化课都没听光想着这个了 然后我调了一下午终于过了!!! 一看数据范围似乎是状压,然而216等于65536.开一个65536*65536的二维数组似乎不太现实. 所以Rqy在四月还是 ...
- 谈Elasticsearch下分布式存储的数据分布
对于一个分布式存储系统来说,数据是分散存储在多个节点上的.如何让数据均衡的分布在不同节点上,来保证其高可用性?所谓均衡,是指系统中每个节点的负载是均匀的,并且在发现有不均匀的情况或者有节点增加/删除 ...
- Redis的持久化——RDB
前面说到redis的三大特性:缓存.分布式内存数据库.持久化,所以今天将为大家介绍redis的两种数据持久化技术RDB和AOF, 先介绍RDB吧. 一.RDB是什么? 1.RDB全称redis dat ...
- 【离散化树状数组】Nordic Collegiate Programming Contest G.Galactic Collegiate Programming Contest
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; struct node { in ...
- 【SPOJ220】Relevant Phrases of Annihilation(后缀数组,二分)
题意: n<=10,len<=1e4 思路: #include<cstdio> #include<cstring> #include<string> # ...