platform设备驱动框架和input子系统
platform设备驱动框架分为driver和device,其中device为硬件参数,可代码写,也可配置DeviceTree由系统解析生成
input子系统分为driver,core,handler
driver层:调用input_register_device注册驱动
input_register_device(struct input_dev *dev)
input_dev 包含了参数,跟handler层的input_register_handler匹配
一般都会注册中断函数request_threaded_irq,发生中断后调用input_report_XXX上报事件到core层,最后调用input_sync结束本次事件
core层:\drivers\input\input.c。负责匹配driver(input_dev )和handler(input_handler),把driver的事件中转到handler
这里需要吐槽的是还有结构input_handle,保存了每一对input_dev和input_handler,这个结构体应该改个名,比如binder
有两个static链表分表索引input_dev和input_handler
static LIST_HEAD(input_dev_list);
static LIST_HEAD(input_handler_list);
handler层:调用input_register_handler注册input_register_handler
input_register_handler(struct input_handler *handler)
input_handler里面包含了各个函数指针,包括事件处理event,跟driver匹配回调connect等
在connect回调函数中一般调用cdev_init,cdev_add,device_add。此时会在/dev下创建字符设备节点,暴露给用户程序。而用户程序打开/dev下的文件后回调cdev_init注册的file_operations,在read该文件一般会阻塞直到driver层发生中断后通知事件发生唤醒。
同时还会调用input_register_handle,通知core层将input_dev 和input_handler绑定。
开始学了platform框架,后看了input子系统。结果有点分不清两者的区别,现在明了两者是可以一起使用的,input子系统也可以跟其他框架如i2c配合使用。
网友评论