首先我们先区分一下USB几种控制器类型协议 OHCI UHCI EHCI xHCI。
OHCI、UHCI都是USB1.1的接口标准,而EHCI是对应USB2.0的接口标准,最新的xHCI是USB3.0的接口标准。
1. OHCI(Open Host Controller Interface)是支持USB1.1的标准,但它不仅仅是针对USB,还支持其他的一些接口,比如它还支持Apple的火线(Firewire,IEEE 1394)接口。与UHCI相比,OHCI的硬件复杂,硬件做的事情更多,所以实现对应的软件驱动的任务,就相对较简单。主要用于非x86的USB,如扩展卡、嵌入式开发板的USB主控。
2. UHCI(Universal Host Controller Interface),是Intel主导的对USB1.0、1.1的接口标准,与OHCI不兼容。UHCI的软件驱动的任务重,需要做得比较复杂,但可以使用较便宜、较简单的硬件的USB控制器。Intel和VIA使用UHCI,而其余的硬件提供商使用OHCI。
3. EHCI(Enhanced Host Controller Interface),是Intel主导的USB2.0的接口标准。EHCI仅提供USB2.0的高速功能,而依靠UHCI或OHCI来提供对全速(full-speed)或低速(low-speed)设备的支持。
4. xHCI(eXtensible Host Controller Interface),是最新最火的USB3.0的接口标准,它在速度、节能、虚拟化等方面都比前面3中有了较大的提高。xHCI 支持所有种类速度的USB设备(USB 3.0 SuperSpeed, USB 2.0 Low-, Full-, and High-speed, USB 1.1 Low- and Full-speed)。xHCI的目的是为了替换前面3中(UHCI/OHCI/EHCI)。
1. RK356x USB 控制器和 PHY 简介
RK356x 总共支持 4 个 USB 外设接口,包括 1 个OTG 接口,1 个 USB 3.0 Host 接口,以及 2 个 USB
2.0 Host 接口。USB接口名称与接口类型对应关系如下:

RK356x USB 控制器和 PHY 的连接示意图,如下图所示:

注意:
1. 每个USB2.0 PHY 中包含两个 Port,每一个 Port 分别给一个 USB2.0 控制器使用。
2. “EHCI/OHCI” 表示该 USB 控制器集成了 EHCI 控制器和 OHCI 控制器;“DWC3/xHCI” 表示该 USB
控制器集成了 DWC3 控制器和 xHCI 控制器。
3. RK3568的OTG口支持 USB 3.0,RK3566的OTG口只支持USB2.0,不支持USB3.0。
我目前板子上使用的是HOST3设备树配置如下

&u2phy1_host {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
&usb2phy1 {
status = "okay";
};
&usb_host1_ehci {
status = "okay";
};
&usb_host1_ohci {
status = "okay";
};
需要打卡以下配置,否则不支持各种版本协议
#
# USB Host Controller Drivers
#
CONFIG_USB_C67X00_HCD=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_DBGCAP=y
CONFIG_USB_XHCI_PCI=y
CONFIG_USB_XHCI_PLATFORM=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_USB_EHCI_PCI=y
CONFIG_USB_EHCI_HCD_PLATFORM=y
CONFIG_USB_OXU210HP_HCD=y
CONFIG_USB_ISP116X_HCD=y
CONFIG_USB_FOTG210_HCD=y
CONFIG_USB_MAX3421_HCD=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PCI=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
CONFIG_USB_UHCI_HCD=y
CONFIG_USB_SL811_HCD=y
CONFIG_USB_R8A66597_HCD=y
CONFIG_USB_HCD_TEST_MODE=y
从这里驱动部分结束
1. GL857L
GL857L是一款经常用于读卡器的主芯片,也就是hub功能。目前linux内核是支持USB转hub的,所以驱动逻辑不用我们自己写,配置设备树和Kconfig就行。 GL857L支持USB2.0 时钟最高可达480M 所以是一款全速设备
接上去出现错误log
usb 1-1: new low speed USB device ohci-platform and address 2
usb 1-1: device descriptor read/64, error -62
usb 1-1: device descriptor read/64, error -62
usb 1-1: new low speed USB device using ohci-platform andaddress 3
usb 1-1: device descriptor read/64, error -62
usb 1-1: device descriptor read/64, error -62
usb 1-1: new low speed USB device using ohci-platform andaddress 4
usb 1-1: device not accepting address 4, error -62
usb 1-1: new low speed USB device using ohci-platform andaddress 5
usb 1-1: device not accepting address 5, error -62
hub 1-0:1.0: unable to enumerate USB device on port 1
从上面看出GL857L被识别低速设备,外接设备被识别高速低速取决于模块DP+的上拉电阻,DP+接上拉是高速,DP-接上拉是低速,所以我检查一下电路,发现SOC的USB2_HOST1_DP脚实际上是接到GL857的DM0脚,也就是DP+和DP-接反了

最后跳了一下线,最后识别成功。
01-13 09:15:46.761 0 0 I usb 2-1.2: new high-speed USB device number 12 using ehci-platform
01-13 09:15:46.860 0 0 I usb 2-1.2: New USB device found, idVendor=05e3, idProduct=0618, bcdDevice=87.53
01-13 09:15:46.860 0 0 I usb 2-1.2: New USB device strings: Mfr=0, Product=1, SerialNumber=0
01-13 09:15:46.860 0 0 I usb 2-1.2: Product: USB2.0 Hub
01-13 09:15:46.864 0 0 I hub 2-1.2: 1.0: USB hub found
01-13 09:15:46.865 0 0 I hub 2-1.2: 1.0: 4 ports detected
01-13 09:15:47.144 0 0 I usb 2-1.2.1: new high-speed USB device number 13 using ehci-platform
01-13 09:15:47.249 0 0 I usb 2-1.2.1: New USB device found, idVendor=05e3, idProduct=0752, bcdDevice= 2.33
01-13 09:15:47.249 0 0 I usb 2-1.2.1: New USB device strings: Mfr=3, Product=4, SerialNumber=0
01-13 09:15:47.249 0 0 I usb 2-1.2.1: Product: USB Storage
01-13 09:15:47.249 0 0 I usb 2-1.2.1: Manufacturer: Generic
01-13 09:15:47.252 0 0 I usb-storage 2-1.2.1: 1.0: USB Mass Storage device detected
01-13 09:15:47.260 0 0 I scsi host1: usb-storage 2-1.2.1:1.0
如果出现log ignoring external hub
请尝试关闭CONFIG_USB_OTG_BLACKLIST_HUB
之所以硬件电路上设计出现错误,是从海思旧版子设计照搬过来的,海思貌似支持DP+DP-反接,之前驱动不是我负责的所以我也没深入理解
参考:Rockchip_RK356X_User_Guide_USB_CN.pdf
http://blog.chinaunix.net/uid-25873032-id-5146807.html
https://blog.csdn.net/kris_fei/article/details/84072293?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-84072293-blog-6125882.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-84072293-blog-6125882.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=5
本博客纯属个人总结,