USB总线驱动(二)设备驱动ch341以及serial

我们以一个usb设备(ch341)驱动例子来看下用法。

一、ch341设备驱动

USB总线驱动(二)设备驱动ch341以及serial_第1张图片
USB总线驱动(二)设备驱动ch341以及serial_第2张图片

在这里插入图片描述
在这里插入图片描述
USB总线驱动(二)设备驱动ch341以及serial_第3张图片

如上,注册了一个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总线
如下

USB总线驱动(二)设备驱动ch341以及serial_第4张图片

1、分配一个usb_driver结构体
在这里插入图片描述
2、上面看到注册ch341驱动 reset_resume 有给赋值,
这里不会重新赋值为 usb_serial_reset_resume
USB总线驱动(二)设备驱动ch341以及serial_第5张图片

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总线驱动(二)设备驱动ch341以及serial_第6张图片

三、usb_serial_driver注册到总线

USB总线驱动(二)设备驱动ch341以及serial_第7张图片

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,不再赘述。
USB总线驱动(二)设备驱动ch341以及serial_第8张图片

四、serial层的入口

USB总线驱动(二)设备驱动ch341以及serial_第9张图片
1、创建了一个 tty_driver

2、注册 serial 总线

3、注册 tty_driver

4、注册 usb_driver,是serial层自带的 usb_driver

5、注册 usb_serial_driver ,是serial层自带的 usb_serial_driver

你可能感兴趣的:(Linux内核和驱动,linux)