USB host软件流程
USB主机侧枚举软件关键流程如下:
下面围绕上面两个图对USB枚举过程进行代码跟踪。
1.usb otg检测
DWC3是一个USB 3.0 Dual-Role-Device(DRD)设备。USB设备分为HOST(主设备)和SLAVE(从设备),只有当一台HOST与一台SLAVE连接时才能实现数据的传输,而OTG设备既能充当HOST,亦能充当SLAVE,也即DRD(Dual-role-devices).我现在只分析当主设备的情况。
在kernel_platform/qcom/proprietary/devicetree/qcom/lahaina-usb.dtsi中
在/drivers/usb/dwc3/core.c中:
dwc3_probe-> dwc3_core_init_mode
dwc3_core_init_mode里面会进行不同模式的初始化,包括otg、host或者peripheral。
只做从设备的情况比较少,只做host或者otg的情况比较多。看一下host的情况:
cat /sys/bus/platform/devices/a600000.ssusb/mode,如果手机是主机会显示host,如果手机连电脑会显示peripheral,如果什么都没连会显示none。
通过向/sys/class/typec/port0/data_role写host或devcie可更改当前手机的data_role,写完后会通过PD通信发对对端。
插入OTG线后会在/sys/devices/platform/soc/a600000.ssusb/a600000.dwc3多出来xhci-hcd.2.auto目录
platform总线下,a600000.dwc3是USB主机控制器
在/drivers/usb/core/usb.c中,在开机初始化时,usb core注册了USB总线,USB文件系统,USB hub以及USB中的唯一设备驱动usb generic driver等。
2.usb主机控制器驱动
Xhci是USB3.0的host规范,同时兼容USB2.0
代码位于/drivers/usb/host/xhci-plat.c
Xhci控制器的ops在/drivers/usb/host/xhci.c
xhci_init_driver( )将控制的xhci_hc_driver赋给xhci_plat_hc_driver,主要内容如下:
而控制器的驱动xhci_hc_driver描述如下:
再讨论usb_xhci_driver->xhci_plat_probe
3.usb root hub加载
接上一节,usb_add_hcd注册分配roothub, 还有初始化usb phy,把usb总线加入到系统: