mousedev_open()主要是创建一个mousedev_list链表(初始化该链表的部分字段),然后调用input_open_device(),做些input_handle->open++以及input_dev->user++等操作。
3.鼠标中断
前面提到的amimouse_open(),会注册一个中断amimouse_interrupt()。
amimouse_interrupt()发生时,会把数据存在一块固定地址(比如全局变量),等待用户读取(也就是后面说到的mousedev_read())。
无敌的调用关系图又要出场了:
amimouse_interrupt()
|-- input_report_rel()、input_report_key()、input_sync()
| |-- input_event()
| | |-- mousedev_event()
| | | |-- mousedev_rel_event()、mousedev_key_event()、mousedev_notify_readers()
4.读取鼠标
读取鼠标位置时,同打开文件一样,系统会调用file的f_op函数集的函数,但此时f_op已经在打开时赋值为Mousedev的操作集指针了,既mousedev_fops,其中的read函数为mousedev_read()。
mousedev_read()把相关的X/Y坐标等数据,返回给用户。
还有一点要注意,mousedev_read()中,需要等��事件list->mousedev->wait,如果不满足,那么阻塞。而在前面提到的鼠标中断函数里,会定期调用input_sync(),也即调用mousedev_notify_readers(),该函数会使能该事件,唤醒mousedev_read()。