input子系统 软件设计流程及相关API


input子系统的软件设计流程

软件设计流程如下所示:

分配一个输入设备——注册一个输入设备——上报输入事件——注销一个输入设备——释放一个输入设备

 

设计有关的API

分配一个输入设备

1         struct input_dev *input_allocate_device*(void);

注册一个输入设备

1         int input_register_device(struct input_dev *dev);

驱动实现-事件支持

1         Set_bit(EV_KEY,button_dev.evbit)

2         //Set_bit告诉inout子系统它支持哪些事件

3         //Struct input_dev中有两个成员,一个是evbit;一个是keybit;分别用来表示设备所支持的事件类型和按键类型。

事件类型

Linux中输入设备的事件类型有(这里只列出了常用的一些,更多请看linux/input.h中):

1         EV_SYN 0x00 同步事件

2         EV_KEY 0x01 按键事件

3         EV_REL 0x02 相对坐标

4         EV_ABS 0x03 绝对坐标

5         EV_MSC 0x04 其它

6         EV_LED 0x11 LED

7         EV_SND 0x12 声音

8         EV_REP 0x14 Repeat

9         EV_FF 0x15 Force feedback事件

按键类型

当事件类型为EV_KEY时,还需指明按键类型:

1         BTN_LEFT 鼠标左键

2         BTN_RIGHT 鼠标右键

3         BTN_MIDDLE 鼠标中键

4         BTN_0 数字0

5         BTN_1 数字1

上述set_bit函数实则完成了把EV_KEY赋值到button_dev.evbit

 

驱动实现-报告事件

1         Void input_event(struct input_dev *dev,unsigned int type,unsigned int code,intvalue);//报告指定type,code的输入事件

2         Void input_report_key(struct input_dev *dev,unsigned int code,int value);/*报告键值,code : 事件的代码,如果事件是ev_key,该代码则为设备的键盘代码。例如鼠标按键代码为0x110~0x116,其中0x110(BTN_LEFT),0x111(BTN_RIGHT),0x112(BTN_MIDDLE)。其它带按摩含义参考include/linux/input.h文件 value : 事件的值,如果事件的类型是EV_KEY,当按键按下时值为1,松开时为0。 */

3         Void input_report_rel(struct input_dev *dev,unsigned int code,int value);//报告相对坐标

4         Void input_report_abs(struct input_dev *dev,unsigned int code,int value);//报告绝对坐标

5         Void input_sync(struct input_dev *dev);/*报告同步事件,input_sync()用于高速input core 此次报告已经结束,能够根据上报的信息往后面处理了*/

在触摸屏驱动设计中,一次坐标及按下状态的整个报告过程如下:

1         Input_report_abs(input_dev,ABS_X,x);//X坐标

2         Input_report_abs(input_dev,ABS_Y,y);//Y坐标

3         Input_report_abs(input_dev,ABS_PRESSURE,pres);//压力

4         input_sync(struct input_dev *dev);//同步 

 

释放与注销设备

1         Void input_free_device(struct input_dev *dev);

2         Void input_unregister_device(struct input_dev *);




  1. #include <asm/irq.h> 
  2. #include <asm/io.h> 

  3. static struct input_dev *button_dev;/*输入设备结构体*/ 

  4. static irqreturn_t button_interrupt(int,irq,void *dummy)/*中断处理函数*/ 
  5.  { 
  6.         input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1); 
  7.         /*向输入子系统报告产生按键事件*/ 
  8.         input_sync(button_dev); 
  9.         /*通知接收者,一个报告发送完毕*/ 
  10.         return IRQ_HANDLED; 
  11.  } 

  12.  static int __init button_init(void) /*加载函数*/ 
  13.  { 
  14.         int error; 
  15.         if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL)) 
  16.         /*申请中断处理函数*/ 
  17.         { 
  18.                 /*申请失败,则打印出错信息*/ 
  19.                 printk(KERN_ERR "button.c: Can't allocate irq %d\n", button_irq); 
  20.                 return -EBUSY; 
  21.         } 
  22.         button_dev = input_allocate_device(); /*分配一个设备结构体*/ 
  23.         if (!button_dev) /*判断分配是否成功*/ 
  24.         { 
  25.                 printk(KERN_ERR "button.c: Not enough memory\n"); 
  26.                 error = -ENOMEM; 
  27.                 goto err_free_irq; 
  28.         } 
  29.         button_dev->evbit[0] = BIT_MASK(EV_KEY);/*设置按键信息*/ 
  30.         button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0); 
  31.         error = input_register_device(button_dev); /*注册一个输入设备*/ 
  32.          if (error) 
  33.         { 
  34.                 printk(KERN_ERR "button.c: Failed to register device\n"); 
  35.                 goto err_free_dev; 
  36.         } 
  37.         return 0; 
  38.         err_free_dev: /*以下是错误处理*/ 
  39.                 input_free_device(button_dev); 
  40.         err_free_irq: 
  41.                 free_irq(BUTTON_IRQ, button_interrupt); 
  42.         return error; 
  43. } 

  44. static void __exit button_exit(void) 
  45. /*卸载函数*/ 
  46. { 
  47.         input_unregister_device(button_dev); 
  48.         /*注销按键设备*/ 
  49.         free_irq(BUTTON_IRQ, button_interrupt); /*释放按键占用的中断线*/ 
  50. } 

  51. module_init(button_init); 
  52. module_exit(button_exit);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值