USB Hub 驱动概览
初始化和注册
-
初始化 (
usb_hub_init
):- 注册 USB hub 驱动使用
usb_register
。 - 分配一个工作队列来处理 hub 事件。
- 注册 USB hub 驱动使用
-
驱动注册 (
hub_driver
):- 定义 probe、disconnect、suspend、resume 和其他回调函数。
- 定义 ID 表以匹配特定的 hub 设备。
Hub 处理流程
-
Reset 处理 (
hub_pre_reset
和hub_post_reset
):hub_pre_reset
: 在 hub 进入重置之前执行必要的准备动作。- 设置
hub->in_reset
标记。 - 为所有端口设置电源管理屏障。
- 设置
hub_post_reset
: 在 hub 重置后执行恢复动作。- 清除
hub->in_reset
标记。 - 为所有端口设置电源管理屏障。
- 激活 hub。
- 清除
-
Hub 配置 (
hub_configure
):- 分配内存以存储 hub 描述符、状态等信息。
- 读取 hub 描述符。
- 计算延迟。
- 创建端口数组。
-
端口状态处理 (
port_event
):- 解析端口状态和变化。
- 清除状态标志。
- 如果连接状态改变,则重新验证连接或者发起连接过程。
- 处理过流事件通知。
-
设备重置和验证 (
usb_reset_and_verify_device
):- 禁用 USB2 硬件 LPM。
- 禁用 LPM。
- 重新初始化端点0。
- 调用
hub_port_init
来初始化端口。 - 检查设备描述符是否发生改变。
- 恢复设备的先前配置。
- 分配带宽资源。
- 设置配置。
- 设置接口。
-
端口连接状态改变处理 (
hub_port_connect_change
):- 如果连接状态改变并且有已连接的设备,则尝试重新验证连接。
- 如果设备处于挂起状态并且允许持久启用,则触发远程唤醒事件。
- 如果需要进一步处理,则调用
hub_port_connect
函数处理连接。