欢迎光临
我们一直在努力

IMX6ULL的 USB驱动(RTL8732)

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 驱动注册到网络子系统后生成的。

赞(0)
未经允许不得转载:171主机测评 » IMX6ULL的 USB驱动(RTL8732)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址