[特殊字符] 为什么插 OTG 转接头就能读 U 盘?Linux 内核从 ID 引脚到 /dev/sda 全流程解析

张开发
2026/4/10 4:35:03 15 分钟阅读

分享文章

[特殊字符] 为什么插 OTG 转接头就能读 U 盘?Linux 内核从 ID 引脚到 /dev/sda 全流程解析
为什么插 OTG 转接头就能读 U 盘Linux 内核从 ID 引脚到 /dev/sda 全流程解析一、一个经典问题很多人都有疑问 为什么手机/开发板插一个 OTG 转接头就能直接读取 U 盘这背后其实涉及硬件ID 引脚内核USB Host驱动usb-storage二、OTG 的本质一个引脚决定世界ID 引脚规则ID 0 → HostID 1 → DeviceOTG 转接头做了什么 只做了一件事把 ID 引脚接地三、Linux 内核如何“感知”这个变化1. PHY 检测ID变化 → PHY检测2. extcon 上报extcon_set_state_sync(EXTCON_USB_HOST,1);3. Role 切换usb_role_switch_set_role(...,USB_ROLE_HOST);四、进入 Host 模式发生了什么dwc2_set_role(HOST) → 启动 HCD → 打开 VBUS⚠️ 关键VBUS 供电 U 盘必须要 5V 电源五、U 盘识别完整流程10 步1. ID拉低 2. 切Host 3. 打开VBUS 4. USB reset 5. 获取descriptor 6. 分配地址 7. 加载usb-storage 8. SCSI识别 9. 创建/dev/sda 10. mount六、驱动链路核心dwc2 → usb core → usb-storage → scsi → sd → block七、dmesg 关键日志usb 1-1: new high-speed USB device usb-storage 1-1:1.0 sd 0:0:0:0: [sda]八、为什么 U 盘有时不识别1. 没供电最常见 VBUS 没开2. 角色没切换 ID / extcon 问题3. 驱动没加载modprobe usb-storage九、工程本质总结OTG 识别 U 盘 角色 供电 枚举 下一篇预告 下一篇我们将深入 Linux USB 子系统讲清 Host / Gadget / PHY 是如何协同工作的

更多文章