[RK3399][Android7.1] USB模块中的控制器和PHY

Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83

声明: 这里的内容基本上是从RK提供的文档引用整理过来的。

RK3399平台上有两个Type-C USB3.0和两个USB2.0 Host。

USB控制器和PHY:

rk3399平台控制器和PHY的连接示意图如下:
[RK3399][Android7.1] USB模块中的控制器和PHY_第1张图片

两个Type-C USB3.0控制器都可以⽀持OTG(USB2.0 OTG功能是通过连接到USB2.0 PHY实现),并且向下兼容USB2.0/1.1/1.0。但由于Kernel同一时间只能使用一个OTG,所以RK3399 SDK DTS的默认配置是⽀持Type-C0 USB3.0 OTG功能,Type-C1 USB3.0 Host功能。

Type-C USB3.0可以根据需求,将物理接⼝设计为Type-A USB3.0 Host,Micro USB3.0 OTG,Micro USB2.0 OTG等类型(在我们板子上其中一个就接成了Type-A USB3.0 Host),内核USB 驱动已经兼容这⼏种不同类型的USB接⼝,只需要修改DTS配置,就可以使能相应的USB接⼝。

接下来分解各个模块。


USB2.0 Host Controller:

[RK3399][Android7.1] USB模块中的控制器和PHY_第2张图片

  • 内部有EHCI和OHCI Host Controller,因此可以向下兼容。
  • Port Routing Control: 用于选择用EHCI还是OHCI。
  • 向外接到USB2.0 PHY。

EHCI和OHCI Rockchip采用Linux 内核Generic驱动,一般开发 时只需要对DT作相应配置,即可正常工作。

Driver代码路径:
drivers/usb/host/ehci*
drivers/usb/host/ohci*


USB2.0 PHY

[RK3399][Android7.1] USB模块中的控制器和PHY_第3张图片

  • Host Port用于USB2.0 Host Controller。
  • OTG Port用于USB3.0 OTG Controller对USB2.0 OTG的支持。

USB2.0 PHY使用的是Innosilicon IP。
Innosilicon PHY对应的文档:
Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt

Driver代码路径:
drivers/phy/phy-rockchip-inno-usb2.c


USB2.0 OTG

[RK3399][Android7.1] USB模块中的控制器和PHY_第4张图片

  • ECHI/OHCI实现Host模式功能
  • DWC实现Device模式功能。

RK3399没有独立的USB2.0 OTG控制器,但有独立的USB3.0 OTG控制器,并且可以向下兼容USB2.0 OTG的完整功能。

USB2.0 OTG对应的控制器是DWC2。
USB2.0 OTG使用的是Synopsys 方案,即使用DWC2控制器同时实现Host和Device功能,DWC2控制器通过检测 OTG口上ID脚的电平判断切换为何种模式,ID脚的电平变化触发控制器ID脚中断,然后由软件切换到对应模式。
目前使用两种驱动版本,一个是upstream 版,驱动在dwc2目录下,主要从upstream开源项目更新代码,另一个 是内部版,驱动在dwc_otg_310目录下,由RK内部自行维护,还未upstream。

配置说明:
Documentation/devicetree/bindings/usb/dwc2.txt

Driver代码路径:
upstream 版:drivers/usb/dwc2/* (没编译进去使用)
内部版:drivers/usb/dwc_otg_310/*


USB3.0 OTG Controller

[RK3399][Android7.1] USB模块中的控制器和PHY_第5张图片

  • 接到USB2.0 PHY实现USB2.0 OTG的兼容。
  • 接到TypeC PHY实现USB3.0 OTG。

  • xHCI Host Controller实现Host功能

  • DWC3实现Device模式功能

USB3.0 OTG具有USB3.0 OTG功能,且向下兼容USB2.0 OTG功能,大传输速率为5Gbps。

USB3.0 HOST控制器为XHCI,集成于DWC3 OTG IP中,所以不用单独配置dts,只需要配置DWC3,并且设置 DWC3的dr_mode属性为dr_mode = “otg”或者dr_mode = “host”,即可以enable XHCI控制器。

目前USB3.0 OTG使用Synopsys 方案,即XHCI扩展的DWC3控制器,Host功能在XHCI框架下实现,而Device功能 由DWC3扩展部分实现。

配置说明:
Documentation/devicetree/bindings/usb/dwc3-rockchip.txt

Driver代码路径:
drivers/usb/dwc3/*
drivers/usb/host/xhci*

drivers/usb/dwc3 目录下的文件主要包括厂商引导驱动,Host Device通用DWC3控制器驱动和Device驱动,其中 文件名带厂商名字的为产商引导驱动,RK驱动文件名为dwc3-rockchip.c,core.c是DWC3控制器核心驱动,负责 加载XHCI驱动初始化XHCI控制器、加载Device驱动和初始化DWC3 Device控制器,gadget.c是DWC3 Device驱动 文件,主要实现控制器相关的Device初始化、中断处理和数据传输等功能。


TypeC PHY:

[RK3399][Android7.1] USB模块中的控制器和PHY_第6张图片

由 USB3.0 SuperSpeed PHY和DisplayPort Transmit PHY组成。

  • PIPE_IF接上面提到的USB3.0 OTG。
  • DPTX_IF接DP。

USB3.0 PHY 为Cadence IP。

配置说明路径:
Documentation/devicetree/bindings/phy/phy-rockchip-typec.txt

代码路径:
drivers/phy/rockchip/phy-rockchip-typec.c


参考:

Rockchip-Developer-Guide-linux4.4-USB.pdf
RK3399 USB DTS Configuration Instruction.pdf
Rockchip RK3399TRM V1.3 Part2.pdf

你可能感兴趣的:(RK3399,子类__USB)