1、在linux开发中,输入子系统能产生那些事件呢??

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

EV_SYN 0x00 同步事件
EV_KEY 0x01 按键事件
EV_REL 0x02 相对坐标
EV_ABS 0x03 绝对坐标
EV_MSC 0x04 其它
EV_LED 0x11 LED
EV_SND 0x12 声音
EV_REP 0x14 Repeat
EV_FF 0x15 力反馈
~~~~~~~~~~~~~~~~~~~~~~~~
EV_PWR 电源
EV_FF_STATUS 状态

2、输入子系统的组成

输入子系统由驱动层、输入子系统核心、事件处理层三部分组成。一个输入事件,如鼠标移动、键盘按下等通过Driver->Inputcore->Event handler->userspace的顺序到达用户控件的应用程序。

驱动层:将底层的硬件输入转化为统一事件形式,想输入核心(Input Core)汇报。

输入子系统核心:承上启下。为驱动层提供输入设备注册与操作接口,如:input_register_device;通知事件处理层对事件进行处理;在/Proc下产生相应的设备信息

事件处理层:主要是和用户空间交互。(Linux中在用户空间将所有的设备都当文件来处理,由于在一般的驱动程序中都有提供fops接口,以及在/dev下生成相应的设备文件nod,这些操作在输入子系统中由事件处理层完成)

3、实现input驱动

3.1 设备描述:input_dev结构

3.2 实现设备驱动核心工作是:向系统报告按键、触摸屏等输入事件(event,通过input_event结构描述),不再需要关心文件操作接口。驱动报告事件经过inputCore和Eventhandler到达用户空间。

3.3 注册输入设备函数:int input_register_device(struct input_dev *dev)

3.4 注销输入设备函数:void input_unregister_device(struct input_dev *dev)

3.5 驱动实现——初始化(事件支持):

set_bit()告诉input输入子系统支持哪些事件,哪些按键。例如:

set_bit(EV_KEY,button_dev.evbit) (其中button_dev是struct input_dev类型)

3.6 struct input_dev中有两个成员为:

evbit:

事件类型(包括

EV_RST,EV_REL,EV_MSC,EV_KEY,EV_ABS,EV_REP等)

keybit:

按键类型(当事件类型为EV_KEY时包括

BTN_LEFT,BTN_0,BTN_1,BTN_MIDDLE等)

3.7 驱动实现——报告事件:

用于报告EV_KEY,EV_REL,EV_ABS事件的函数分别为

void input_report_key(struct input_dev *dev,unsigned int code,int value)

void input_report_rel(structinput_dev *dev,unsigned int code,int value)

void input_report_abs(structinput_dev *dev,unsigned int code,int value)

驱动实现——报告结束:

input_sync()同步用于告诉input core子系统报告结束。

实例1:触摸屏设备驱动中,一次点击的整个报告过程如下:

input_reprot_abs(input_dev,ABS_X,x); //x坐标

input_reprot_abs(input_dev,ABS_Y,y); // y坐标

input_reprot_abs(input_dev,ABS_PRESSURE,1);

input_sync(input_dev);//同步结束

实例分析2(按键中断程序):

//按键初始化

static int __init button_init(void)

{//申请中断

if(request_irq(BUTTON_IRQ,button_interrupt,0,”button”,NUll))

return –EBUSY;

set_bit(EV_KEY,button_dev.evbit); //支持EV_KEY事件

set_bit(BTN_0,button_dev.keybit); //支持设备两个键

set_bit(BTN_1,button_dev.keybit); //

input_register_device(&button_dev);//注册input设备

}

/*在按键中断中报告事件*/

Static void button_interrupt(int irq,void *dummy,struct pt_regs *fp)

{

input_report_key(&button_dev,BTN_0,inb(BUTTON_PORT0));//读取寄存器BUTTON_PORT0的值

input_report_key(&button_dev,BTN_1,inb(BUTTON_PORT1));

input_sync(&button_dev);

}

总结:input子系统仍然是字符设备驱动程序,但是代码量减少很多,input子系统只需要完成两个工作:初始化和事件报告(这里在linux中是通过中断来实现的)。读者不妨用sourceinsignt 输入input_init去搜关于输入子系统的实现

更多相关文章

  1. Linux input子系统学习总结(一)
  2. Inotify: 高效、实时的Linux文件系统事件监控框架
  3. mysql创建任务事件
  4. C#的委托事件在winform窗体中实现传值备忘
  5. Android中RecyclerView的item中控件的点击事件添加删除一行、上
  6. android 屏幕触摸事件及处理机制解读
  7. Android事件分发机制(下)
  8. Android 事件输入系统整体框架
  9. android-----关于事件分发机制中几点困惑测试

随机推荐

  1. android 源码
  2. Android检测网络是否可用
  3. Android Study ING
  4. android常用应用的包名和startAcitivity
  5. Android中获取网页表单中的数据
  6. 2011.09.20(4)——— android SpannableStr
  7. Android中获取IMEI码
  8. android 返回到首页
  9. AndroidManifest文件中android属性
  10. Unity调用安卓