在linux中提供一种输入子系统的驱动模型,其主要是实现在input.c中。

在输入子系统这套模型中,他把驱动分层分类。首先分为上下两层,上层为input.c 。下层为驱动的实现,下层分为两部分,一部分为drive部分,主要实现和硬件无关的代码,一本分为device部分,这部分就是与硬件相关的代码。

在内核代码中drive部分已经为我们写好了,你也可以自己写,我一般用的是evdev.c这个文件里面的代码。我们所要做的就是编写device里面的代码。这样就可以减轻程序员的编写负担。免得每次写驱动程序都要编写与硬件无关的程序。

下面看我写的device部分的代码:

 #include <linux/module.h>
#include <linux/version.h> #include <linux/init.h>
#include <linux/fs.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/sched.h>
#include <linux/pm.h>
#include <linux/sysctl.h>
#include <linux/proc_fs.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/irq.h> #include <asm/gpio.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h> //////////////这里声明了一个结构体指针 为构建整套系统所必须的
static struct input_dev *buttons_dev; //////////////定义了一个时钟的结构体,程序里面关键是为了防抖
static struct timer_list buttons_timer;
24
//////////////////////////
static struct pin_desc *irq_pd;

/////////////////这个结构体存储了一些必要的数据
struct pin_desc{
int irq;
char *name;
unsigned int pin;
unsigned int key_val;
}; struct pin_desc pins_desc[] = {
{IRQ_EINT8, "K1", S3C2410_GPG0, KEY_L},
{IRQ_EINT11, "K2", S3C2410_GPG3, KEY_S},
{IRQ_EINT13, "K3", S3C2410_GPG5, KEY_ENTER},
{IRQ_EINT14, "K4", S3C2410_GPG6, KEY_LEFTSHIFT},
}; /////////中断处理函数 里面主要是设置定时器的时钟 用来防抖
static irqreturn_t buttons_irq(int irq, void *dev_id)
{
irq_pd = (struct pin_desc *) dev_id;
mod_timer(&buttons_timer, jiffies+HZ/);
return IRQ_RETVAL(IRQ_HANDLED);
} //////////此函数为定时器函数 定时的时间到了后这个函数被执行 主要用于检测按键被按下 然后上报事件
static void buttons_timer_function(unsigned long data)
{
struct pin_desc * pindesc = irq_pd; unsigned int pinval; if (!pindesc)
return; pinval = s3c2410_gpio_getpin(pindesc->pin); if (pinval)
{
/* 松开 : 最后一个参数: 0-松开, 1-按下 */
input_event(buttons_dev, EV_KEY, pindesc->key_val, );
input_sync(buttons_dev);
}
else
{
/* 按下 */
input_event(buttons_dev, EV_KEY, pindesc->key_val, );
input_sync(buttons_dev);
} return ;
} //////////各种初始化 关于input_dev结构体的分配 和赋值什么的 这个关键是要看input.c里面的内容
static int buttons_init(void)
{
int i;
/* 1.分配一个imput_dev结构体*/
buttons_dev = input_allocate_device(); /*2. 设置*/ /*2.1 能产生哪类事件*/
set_bit(EV_KEY, buttons_dev->evbit);
set_bit(EV_REP, buttons_dev->evbit); /*2.2 能够产生哪些事件*/
set_bit(KEY_L, buttons_dev->keybit);
set_bit(KEY_S, buttons_dev->keybit);
set_bit(KEY_ENTER, buttons_dev->keybit);
set_bit(KEY_LEFTSHIFT, buttons_dev->keybit); /*3. 注册*/
input_register_device(buttons_dev); /*4. 硬件相关的操作*/
init_timer(&buttons_timer);
buttons_timer.function = buttons_timer_function;
add_timer(&buttons_timer); for(i = ; i < ; i++)
{
request_irq(pins_desc[i].irq, buttons_irq, IRQT_BOTHEDGE, pins_desc[i].name, &pins_desc[i]);
} return ; } ///////////这个函数就是各种卸载啦
static void buttons_exit(void)
{
int i;
for (i = ; i < ; i++)
{
free_irq(pins_desc[i].irq, &pins_desc[i]);
} del_timer(&buttons_timer);
input_unregister_device(buttons_dev);
input_free_device(buttons_dev); return ;
} module_init(buttons_init);
module_exit(buttons_exit);
MODULE_LICENSE("GPL");

以上的程序没有什么太大的难点,但是细细研究还是有很多东西值得我们去研究的。

我们研究的只是device这部分的代码,要深入的理解还是要看内核源码啊。

linux驱动模型<输入子系统>的更多相关文章

  1. Linux驱动之输入子系统简析

    输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如鼠标移动.键盘按下等通过Driver->Inputcore->Event handler->userspac ...

  2. Linux 驱动框架---input子系统框架

    前面从具体(Linux 驱动框架---input子系统)的工作过程学习了Linux的input子系统相关的架构知识,但是前面的学习比较实际缺少总结,所以今天就来总结一下输入子系统的架构分层,站到远处来 ...

  3. Linux 驱动框架---input子系统

    input 子系统也是作为内核的一个字符设备模块存在的,所以他也是字符设备自然也会有字符设备的文件接口.input子系统的注册过程主要分为两步,先注册了一个input class然后再注册一个字符设备 ...

  4. ARM Linux内核Input输入子系统浅解

    --以触摸屏驱动为例 第一章.了解linux input子系统         Linux输入设备总类繁杂,常见的包括有按键.键盘.触摸屏.鼠标.摇杆等等,他们本身就是字符设备,而linux内核将这些 ...

  5. linux驱动模型——platform(1)

    一.驱动模型包含什么? 1.1. 类class 1.1.2. 它能够自动创建/dev下的设备节点,不需要mknod /dev/xxx c x x创建.当然class还有其另外的作用,且自动创建设备节点 ...

  6. Linux驱动模型解析bus之platform bus

    这是内核启动之后要调用的驱动模型的开始代码: drivers/base/init.c/** * driver_init - initialize driver model. * * Call the ...

  7. linux驱动模型——platform(2)

    一. platform 组织架构 1.1. platform工作体系都定义在drivers/base/platform.c中 1.2. platform相关函数声明在include/linux/pla ...

  8. Linux驱动之一个简单的输入子系统程序编写

    的在Linux驱动之输入子系统简析已经分析过了输入子系统的构成,它是由设备层.核心层.事件层共同组成的.其中核心层提供一些设备层与事件层公用的函数,比如说注册函数.反注册函数.事件到来的处理函数等等: ...

  9. Linux输入子系统 转载

    NQian 记录成长~ 首页 新随笔 联系 订阅 管理 随笔 - 305  文章 - 0  评论 - 254 12.Linux之输入子系统分析(详解)   在此节之前,我们学的都是简单的字符驱动,涉及 ...

随机推荐

  1. 解决ubuntu字体发虚,网页字体发虚

    好吧,哥也不知所以然,只是突然间所有东西的字体都发虚了~~后来发现是应该是语言支持搞的鬼,卸载掉下面的东东就没事了 sudo apt-get remove fonts-arphic-ukai ttf- ...

  2. Android -- 获取摄像头帧数据解码

    由于Android下摄像头预览数据只能  ImageFormat.NV21 格式的,所以解码时要经过一翻周折. Camera mCamera = Camera.open(); Camera.Param ...

  3. css3动画笔记

    ------------------------------------------------------------------------------------ @keyframes anim ...

  4. 《我是IT一只小小鸟》读后感

    <我是IT一只小小鸟>读后感 首先,非常感谢我的老师给我推荐了这么一本书,虽然刚开始因为这门课学分太低,所以我对老师布置了字数这么多的作业存在有很大的不满,但在看了这本书后我的不满立马得到 ...

  5. 先进的自动布局工具箱(autolayout)

    原文:Advanced Auto Layout Toolbox 这篇文章并没有具体介绍自动布局的一些基本概念,主要讲解了一些高级的使用方法和调试技巧,文中有的句子比较长,意思也有点难懂,所以需要静下心 ...

  6. map线程

    来看看map线程到底是如何运行的 很早就知道一个map是一个线程,以后有可能改成一个map一个进程,那就先来看看一个map一个线程是如何运作的 其实刚开始整个服务器就是两个线程,但发现这样服务器支持的 ...

  7. aspx页面生成html

              /// <summary>         /// aspx生成Html         /// </summary>         /// <pa ...

  8. Spring中自动装配(转)

    Spring中有四种自动装配类型,分别为:byName,byType,constructor,autodetect,下面来分别介绍一下这些是如何自动装配的 <bean id="foo& ...

  9. Codeforces Round #254DIV2

    C:万恶的一道题: 开始想用贪心做:每次去除一个点,相应的去除相连边,结果BUG了,想想也对,因为有一次去掉多个点的情况, 后来被送一助攻,队友给出一个猜想:可能枚举一条边即可产生最大值:然后小小证明 ...

  10. 使用jQuery动态加载js脚本

    动态加载Javascript是一项非常强大且有用的技术.这方面的主题在本站已经讨论了不少,我也经常会在一些个人项目上使用RequireJS和Dojo加载js.它们很强大,但有时候也会得不偿失.如果你使 ...