zoukankan      html  css  js  c++  java
  • Linux输入子系统

    这个大哥的博客讲的不错。。转来了。。多谢了。。
     
    地址   http://blog.csdn.net/zhenwenxian/article/details/6064234
    
    Linux输入子系统
    
    按键与触摸屏的设备驱动,在Linux系统中实现这类设备驱动的方法是利用input子系统。
    
    Linux系统提供了input子系统,按键、触摸屏、键盘、鼠标等输入都可以利用input接口函数来实现设备驱动,按键和触摸屏设备驱动都可以作为input设备驱动而实现。
    
    在Linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构体描述),不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口。驱动报告的事件经过InputCore和 Eventhandler最终到达用户空间。
    
    输入子系统支持的事件类型在文件
    kernel/include/linux/input.h 中定义:
    
     event 还定义了标准按键的编码等
    
    
     
    
     
    
    通过input子系统,具体的输入设备驱动只需要完成如下工作。
    
    l 在模块加载函数中告知input子系统它可以报告的事件。
    
    设备驱动通过set_bit()告诉input子系统它支持哪些事件,如下所示:
    
    set_bit(EV_KEY, button_dev.evbit);
    
    l 在模块加载函数中注册输入设备。
    
    注册输入设备的函数为:
    
    int input_register_device(struct input_dev *dev);
    
    l 在键被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时通过input_ report_xxx()报告发生的事件及对应的键值/坐标等状态。
    
    主要的事件类型包括EV_KEY(按键事件)、EV_REL(相对值,如光标移动,报告的是相对最后一次位置的偏移)和EV_ABS(绝对值,如触摸屏和操纵杆,它们工作在绝对坐标系统)。
    
    用于报告EV_KEY、EV_REL和EV_ABS事件的函数分别为:
    
    void input_report_key(struct input_dev *dev, unsigned int code, int value);
    
    void input_report_rel(struct input_dev *dev, unsigned int code, int value);
    
    void input_report_abs(struct input_dev *dev, unsigned int code, int value);
    
    input_sync()用于事件同步,它告知事件的接收者驱动已经发出了一个完整的报告。
    
    例如,在触摸屏设备驱动中,一次坐标及按下状态的整个报告过程如下:
    
    input_report_abs(input_dev, ABS_X, x);  //X坐标
    
    input_report_abs(input_dev, ABS_Y, y);   //Y坐标
    
    input_report_abs(input_dev, ABS_PRESSURE, pres); //压力
    
    input_sync(input_dev);  //同步
    
    在模块卸载函数中注销输入设备。注销输入设备的函数为:
    
    void input_unregister_device(struct input_dev *dev);
    
    代码清单12.28给出了一个最简单的使用input接口实现按键设备驱动的范例,它在中断服务程序中向系统报告按键及同步事件。
    
    input设备驱动
    
    1  /*在按键中断中报告事件*/
    
    2  static void button_interrupt(int irq, void *dummy, struct pt_regs *fp)
    
    3  {
    
    4    input_report_key(&button_dev, BTN_1, inb(BUTTON_PORT) &1);
    
    5    input_sync(&button_dev);
    
    6  }
    
    7 
    
    8  static int _ _init button_init(void)
    
    9  {
    
    10   /*申请中断*/
    
    11   if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL))
    
    12   {
    
    13     printk(KERN_ERR "button.c: Can't allocate irq %d/n", button_irq);
    
    14     return  - EBUSY;
    
    15   }
    
    16
    
    17   button_dev.evbit[0] = BIT(EV_KEY);    //支持EV_KEY事件
    
    18   button_dev.keybit[LONG(BTN_0)] = BIT(BTN_0);
    
    19
    
    20   input_register_device(&button_dev);   //注册input设备
    
    21 }
    
    22
    
    23 static void _ _exit button_exit(void)
    
    24 {
    
    25   input_unregister_device(&button_dev);   //注销input设备
    
    26   free_irq(BUTTON_IRQ, button_interrupt); //释放中断
    
    27 }
    
     
    
    触摸屏的注册
    
     ts->input_dev = input_allocate_device();
     ts->input_dev->name = "synaptics-rmi-touchscreen";
     set_bit(EV_SYN, ts->input_dev->evbit);
     set_bit(EV_KEY, ts->input_dev->evbit);
     set_bit(BTN_TOUCH, ts->input_dev->keybit);
     set_bit(BTN_2, ts->input_dev->keybit);
     set_bit(EV_ABS, ts->input_dev->evbit);
    
     /* ts->input_dev->name = ts->keypad_info->name; */
     ret = input_register_device(ts->input_dev);
    
     


  • 相关阅读:
    P2330 05四川 繁忙的都市
    Winform中实现更改DevExpress的RadioGroup的选项时更改其他控件(TextEdit、ColorPickEdit)的值
    Winform中实现读取xml配置文件并动态配置DevExpress的RadioGroup的选项
    Winform中对DevExpress的RadioGroup进行数据源绑定,即通过代码添加选项
    Winform中对自定义xml配置文件进行Xml节点的添加与删除
    Winform中自定义xml配置文件后对节点进行读取与写入
    C#中使用StreamReader实现文本文件的读取与写入
    Python编程书籍高清PDF免费下载
    Winform中自定义xml配置文件,并配置获取文件路径
    Winform中实现ZedGraph新增自定义Y轴上下限、颜色、标题功能
  • 原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124687.html
Copyright © 2011-2022 走看看