浅析Input 子系统

原创 2012年03月22日 10:08:01

作者:陈刚,华清远见嵌入式培训中心讲师。

在android中,定时alarm功能是很常用的,现在来分析下怎么实现的,这里将采用自下而上的方式讲解。

输入子系统又叫input子系统。其构建非常灵活,只需要调用一些简单的函数,就可以将一个输入设备的功能呈现给应用程序。

Input子系统 主要有下面几个结构:

struct input_dev;         //表示一个输入设备,包含输入设备的一些相关信息(如支持的按键码,s设备的名称,设备支持的事件。)
        struct input_handler;         //表示对输入事件的具体处理。为输入设备的功能实现了一个接口。输入事件最终传递到handler处理。
        struct input_handle;         用来关联struct input_dev和struct input_handler

输入子系统由驱动层,输入子系统核心层(input core)和事件处理层(event handler) 3部分组成。一个shuru事件,如键盘按键等通过驱动层-> 系统核心层->事件处理层->用户空间的顺序到达用户空间并传给应用程序使用。其中input core由内核源码下driver/input/input.c 及相关头文件实现。核心层对下提供了设备驱动的接口,对上提供了事件处理层的编程接口。输入子系统主要涉及上面三个结构体。

做linux驱动,一般用结构体来描述设备;我们需要做的是申请相应的结构体空间,然后填充相关结构体内成员;之后注册这个结构体;主要就这么三步;

struct input_dev *input_dev;
        input_dev = input_allocate_device();         //申请相应的结构体空间

input_dev ->evbit[0] = 0xb;
        input_dev ->keybit[0xa] = 0x400;
        input_set_abs_params(input_dev, ABS_X, 0, 0x3FF, 0, 0);
        input_set_abs_params(input_dev, ABS_Y, 0, 0x3FF, 0, 0);
        input_set_abs_params(input_dev, ABS_PRESSURE, 0, 1, 0, 0);
        input_dev ->name = s3c2410ts_name;
        input_dev ->id.bustype = BUS_RS232;
        input_dev ->id.vendor = 0xDEAD;
        input_dev ->id.product = 0xBEEF;
        input_dev ->id.version = S3C2410TSVERSION;         //填充相关结构体内成员;

input_register_device(input_dev);        // 注册struct input_dev这个结构体

然后跟代码会发现注册input_dev,做了如下步骤;

input_register_device()
                -->input_attach_handler();
                        -->input_match_device();
                        -->handler->connect();

注册这个设备后,它回去找与它匹配的struct handler结构;找到之后调用struct handler的connect()方法;

简单的实例

#include <linux/module.h>
        #include <linux/kernel.h>
        #include <linux/init.h>
        #include <linux/fs.h>
        #include <linux/cdev.h>
        #include <linux/irqreturn.h>
        #include <asm/io.h>
        #include <asm/irq.h>
        #include <linux/input.h>
        struct file_operations hello_fops = {
                .owner = THIS_MODULE
        };
                static struct input_dev *button_dev; /*输入设备结构体*/
                static irqreturn_t button_interrupt(int irq, void *dummy)
                /*中断处理函数*/
                {
                        input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1);
                        /*向输入子系统报告产生按键事件*/
                        input_sync(button_dev); /*通知接收者,一个报告发送完毕*/
                        return IRQ_HANDLED;
                }
                static int __init button_init(void) /*加载函数*/
                {
                        int error;
                        int result;
                        dev = MKDEV (hello_major, hello_minor);
                        result = register_chrdev_region (dev, number_of_devices, "hello");
                        if (result<0) {
                        printk (KERN_WARNING "hello: can't get major number %d\n", hello_major);
                        return result;
                        }
                        /* dynamic allocation */
                        cdev_init (cdev, &hello_fops);
                        cdev->owner = THIS_MODULE;
                        result = cdev_add (cdev, dev, 1);
                        if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL))
                        /*申请中断处理函数*/
                        {
                                /*申请失败,则打印出错信息*/
                                printk(KERN_ERR "button.c: Can't allocate irq %d\n", button_
                                irq);
                                return -EBUSY;
                        }
                        button_dev = input_allocate_device(); /*分配一个设备结构体*/
                        if (!button_dev) /*判断分配是否成功*/
                        {
                                printk(KERN_ERR "button.c: Not enough memory\n");
                                error = -ENOMEM;
                                goto err_free_irq;
                        }
                        button_dev->evbit[0] = BIT_MASK(EV_KEY); /*设置按键信息*/
                        button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0);
                        error = input_register_device(button_dev); /*注册一个输入设备*/
                        if (error)
                        {
                                printk(KERN_ERR "button.c: Failed to register device\n");
                                goto err_free_dev;
                        }
                        return 0;
                        err_free_dev: /*以下是错误处理*/
                                input_free_device(button_dev);
                        err_free_irq:
                                free_irq(BUTTON_IRQ, button_interrupt);
                        return error;
                }
                static void __exit button_exit(void) /*卸载函数*/
                {
                        input_unregister_device(button_dev); /*注销按键设备*/
                        free_irq(BUTTON_IRQ, button_interrupt); /*释放按键占用的中断线*/
                }
                module_init(button_init);
                module_exit(button_exit);

 

浅析Linux Input 子系统

在android中,定时alarm功能是很常用的,现在来分析下怎么实现的,这里将采用自下而上的方式讲解。 输入子系统又叫input子系统。其构建非常灵活,只需要调用一些简单的函数,就可以将一个输入设...
  • sungang860820
  • sungang860820
  • 2014年09月28日 10:29
  • 280

input 子系统浅析

Input子系统内核 重要结构体解析: struct input_dev {          const char *name;          const char *phys;   ...
  • zhu85564043
  • zhu85564043
  • 2013年03月20日 19:42
  • 991

input子系统——架构、驱动、应用程序

一、input子系统架构 input子系统由驱动层drivers,输入子系统核心层input core,事件处理层event handler组成。 一个输入事件,通过输入设备发给系统如鼠标移动,键盘...
  • luckywang1103
  • luckywang1103
  • 2015年01月01日 22:30
  • 4937

Android Framework------之Input子系统

http://www.cnblogs.com/haiming/p/3318614.html 下面这是基于Android4.2代码的关于Input子系统的笔记。在这篇笔记中,只涉及Android相...
  • wangkaiblog
  • wangkaiblog
  • 2013年09月27日 11:25
  • 10947

Linux/Android——input子系统核心 (三)

之前的博客有涉及到linux的input子系统,这里学习记录一下input模块. input子系统,作为管理输入设备与系统进行交互的中枢,任何的输入设备驱动都要通过input向内核注册其设备, 常...
  • jscese
  • jscese
  • 2014年12月26日 15:10
  • 4890

Android 5.0(Lollipop)事件输入系统(Input System) 《-- 推荐阅读这篇

http://blog.csdn.net/jinzhuojun/article/details/41909159 其实Android 5.0中事件输入子系统的框架和流程没有本质变化。Service...
  • thinkinwm
  • thinkinwm
  • 2015年10月19日 21:53
  • 1714

linux input子系统(一)

root@xxx:/sys/class/input/input0 # cat name                               sungpiokey root@xxxx:/...
  • lbaihao
  • lbaihao
  • 2015年07月27日 10:08
  • 276

Linux input 子系统详解与代码示例

由于linux 的驱动模型增加了input层,导致几乎所有的底层驱动都把数据封装在event里上报给input子系统。由此看来,这种改变让kernel 更具有模块化,各个模块的耦合度更低了。 下面我...
  • HELPLEE601276804
  • HELPLEE601276804
  • 2014年01月09日 21:33
  • 1357

input 子系统

----------------------------------------------------------------------------------------------------...
  • quanguoheme
  • quanguoheme
  • 2013年12月01日 22:16
  • 491

input 子系统

在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层...
  • subingxi
  • subingxi
  • 2015年08月11日 16:18
  • 469
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅析Input 子系统
举报原因:
原因补充:

(最多只允许输入30个字)