USB 驱动的作用,是让 Linux 内核能够识别、管理并和 USB 设备通信。 以 i.MX6ULL 的 OTG2 接口连接 RTL8723BU USB WiFi 为例,整体流程可以
1、usb phy层:首先,设备树中的 usbphy2 节点会被转换成 platform_device,并匹配到 mxs_phy_probe(),用于初始化 USB PHY 相关的硬件功能,例如 D+ / D- 信号、电源、时钟和线状态检测等。
2、of platform层 : usbotg2 节点会引用 usbphy2,同时自身也会被 OF platform 机制转换成 platform 设备,因此可以在 /sys/bus/platform/devices/2184200.usb 下看到对应设备。
3、iMx Glue层:2184200.usb 会根据设备树中的 compatible 自动匹配到 i.MX 平台相关的 glue 驱动,也就是 ci_hdrc_imx_probe()。这一层主要负责提取 i.MX SoC 相关的 USB 资源信息,例如时钟、PHY、usbmisc 等,并进一步注册 USB 控制器设备,生成 /sys/bus/platform/devices/ci_hdrc.0
4、ChipIdea Core层:ci_hdrc.0 会继续匹配 ChipIdea Core 驱动 ci_hdrc_probe(),完成 USB 控制器核心功能初始化,并根据设备树中的 dr_mode = "host" 将控制器设置为 Host 模式。
5、USB Core / HCD 层;内核会注册 root hub,并开始扫描 USB 端口、枚举外部 USB 设备
6、USB Interface 驱动层:枚举完成后,USB core 会读取设备的 VID、PID 以及 interface 信息,并根据这些信息匹配对应的 USB 设备驱动,例如 RTL8723BU 对应的 WiFi 驱动 .ko 文件
7、网络设备层:当驱动匹配并初始化成功后,会向 Linux 网络子系统注册网络设备,最终生成 /sys/class/net/wlan0。
目录
1. USB PHY 层
2. OF Platform 层
3. i.MX Glue 层
4. ChipIdea Core 层
5. USB Core / HCD 层
6. USB Interface 驱动层
7. 网络设备层
1. USB PHY 层
设备树中的 usbphy2 节点会被转换成 platform_device,并匹配到:
mxs_phy_probe()
USB PHY 主要负责 USB 的物理信号,例如:
-
D+ / D- 信号收发
-
USB 线状态检测
-
时钟、电源管理
-
连接 USB 控制器和外部 USB 接口
mxs_phy_probe() 主要是先注册 USB PHY。真正的 PHY 初始化一般在 USB 控制器启动时完成
2. OF Platform 层
设备树中的 usbotg2 节点会被内核转换成一个 platform 设备,对应的 sysfs 路径一般是:
/sys/bus/platform/devices/2184200.usb
这一层的作用就是:把设备树里的 USB 控制器节点变成 Linux 设备模型中的设备。
3. i.MX Glue 层
2184200.usb 会根据设备树中的:
compatible = "fsl,imx6ul-usb";
匹配到 i.MX 平台驱动:
ci_hdrc_imx_probe()
这一层主要处理 i.MX SoC 特有的 USB 初始化,例如:
-
获取时钟
-
查找 usbphy2
-
获取 usbmisc
-
初始化 SoC 相关寄存器
-
调用 ci_hdrc_add_device()
然后会创建一个新的 platform 设备:
/sys/bus/platform/devices/ci_hdrc.0
也就是说:
2184200.usb 是设备树生成的设备
ci_hdrc.0 是 glue 层创建出来的 USB 控制器 core 设备
4. ChipIdea Core 层
ci_hdrc.0 会继续匹配通用 ChipIdea USB 控制器驱动:
ci_hdrc.0
-> ci_hdrc_probe()
ci_hdrc_probe() 会初始化 USB 控制器核心,包括寄存器、PHY、中断和 USB 角色。
因为设备树中配置了:
dr_mode = "host";
所以 OTG2 会工作在 Host 模式。
5. USB Core / HCD 层
进入 Host 模式后,会创建 HCD,并注册 USB bus 和虚拟 root hub,之后 USB core 和 hub 驱动会开始扫描端口,枚举外部 USB 设备。sysfs 中可以这样理解:
usb1 虚拟 root hub
1-0:1.0 虚拟 root hub 的 interface
1-1 外部 USB HUB
1-1:1.0 外部 USB HUB 的 interface
1-1.1 RTL8723BU USB WiFi 设备
1-1.1:1.0 RTL8723BU 的 interface 0
1-1.1:1.1 RTL8723BU 的 interface 1
1-1.1:1.2 RTL8723BU 的 interface 2
6. USB Interface 驱动层
USB 设备枚举完成后,USB core 会为每个 interface 创建:
struct usb_interface
然后 USB 功能驱动会根据这些信息进行匹配:
-
VID
-
PID
-
interface class
-
interface subclass
-
interface protocol
RTL8723BU 驱动中包含对应的设备 ID,例如:
VID = 0x0bda
PID = 0xb720
当 USB core 发现设备的 VID/PID 与驱动匹配时,就会调用 RTL8723BU 驱动的 probe 函数。
7. 网络设备层
RTL8723BU 驱动匹配成功后,会初始化 WiFi 芯片,并注册网络设备。最终生成:
/sys/class/net/wlan0
也就是说,wlan0 不是 USB core 直接创建的,而是 RTL8723BU 驱动注册到网络子系统后生成的。


