我们以一个usb设备(ch341)驱动例子来看下用法。
一、ch341设备驱动
如上,注册了一个ch341的驱动,根据指定的产品号和设备号,这个驱动将会适配3个类型的usb转串口设备。
module_usb_serial_driver最终转开成
标准的驱动入口,所有的转开定义在serial.h(serial层)定义。
注册 usb_serial_driver 的接口 usb_serial_register_drivers也是在serial层。
二、usb总线驱动的serial层
注册usb转串口设备驱动,最终调用到usb_serial_register_drivers
属于对usb设备驱动的其中一个封装
最终这个接口会将一个usb设备驱动注册到usb总线
如下
1、分配一个usb_driver结构体
2、上面看到注册ch341驱动 reset_resume 有给赋值,
这里不会重新赋值为 usb_serial_reset_resume
3、注册usb设备驱动usb_register,
usb_register 将会最终调用到 usb总线封装的驱动注册接口,usb_register_driver 在分析usb总线时有分析。
4、usb_serial_driver 和 usb_driver 关联
usb_serial_register 注册 usb_serial_driver 到serial层
usb_serial_register 涉及到serial层的内容,后面再分析
5、driver_attach
匹配总线驱动和总线设备,前面有分析过 driver_attach
主要是遍历所有的总线上的设备,对注册的驱动,
执行总线的 match
如果匹配了将会执行总线的probe 或者 总线驱动的probe
driver_attach
三、usb_serial_driver注册到总线
1、对 usb_serial_driver 的回调做初始化(如果外面没有初始化的话,给serial层默认实现的回调)
ch341在定义 usb_serial_driver 驱动的是后有一些是初始化了的。
2、将 usb_serial_driver 放入 serial层的全局链表
3、注册 usb_serial_driver 到 seria层的总线
可以看到,调用了 driver_register ,注册到总线 usb_serial_bus_type,不再赘述。
四、serial层的入口
1、创建了一个 tty_driver
2、注册 serial 总线
3、注册 tty_driver
4、注册 usb_driver,是serial层自带的 usb_driver
5、注册 usb_serial_driver ,是serial层自带的 usb_serial_driver