Linux驱动修炼之道-INPUT子系统(下)

努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/05/19/6433337.aspx

input子系统最重要的部分就是向上层report了。这里还是先介绍几个数据结构:

这里的次设备号是EVDEV_MINOR_BASE(64),也就是说evdev_handler所表示的设备文件范围(13,64)~(13,64+32)。
如下一个结构体:evdev_handler匹配所有设备。

这个是evdev_handler是fops,下面的讲解中会用到其中的open,read函数。

在驱动程序中我们会调用input_report_abs等函数:

跟踪input_event如下:

跟踪input_handle_event如下:

如果该事件需要input device来完成,就会将disposition设置成INPUT_PASS_TO_DEVICE,如果需要input handler来完成,就会将disposition设置成INPUT_PASS_TO_DEVICE,如果需要两者都参与,则将disposition设置成INPUT_PASS_TO_ALL。
跟踪input_pass_event如下:

比如下边的evdev_handler的evdev_event:

这里总结一下事件的传递过程:首先在驱动层中,调用inport_report_abs,然后他调用了input core层的input_event,input_event调用了input_handle_event对事件进行分派,调用input_pass_event,在这里他会把事件传递给具体的handler层,然后在相应handler的event处理函数中,封装一个event,然后把它投入evdev的那个client_list上的client的事件buffer中,等待用户空间来读取。

下边看一下用户程序打开文件时的过程,首先调用了input_open_file:

这里还是假设handler是evdev_handler。

下面是用户进程读取event的底层实现:

这里总结一下:如果两个进程打开同一个文件,每个进程在打开时都会生成一个evdev_client,evdev_client被挂在evdev的client_list,在handle收到一个事件的时候,会把事件copy到挂在client_list上的所有evdev_client的buffer中。这样所有打开同一个设备的进程都会收到这个消息而唤醒。

你可能感兴趣的:(数据结构,linux,F#,Access,UP)