USB接口目前主要有四个接口类型:
1,USB Type-A,这种接口类型是我们最常见的USB接口,主要用在电脑,充电器,鼠标,键盘,U盘等设备上。
2,USB Type-B,这种接口类型主要用在打印机等设备上,没有type-A接口常见。
3,Micro-B,这种接口我们都见过,就是
手机充电器的接口。
4,USB Type-C,USB Type-C最明显的特点就是支持正反面盲插,是以后USB接口的发展趋势
RK3399 SoC内部4个USB控制器与USB PHY的连接如下图所示。
其中,DP是指Display Port控制器,DP与USB 3.0共用Type-C PHY。如图1-2所示,一个完整的Type-C功能,是由
Type-C USB 3.0 PHY & DP PHY和USB 2.0 OTG PHY两部分组成的,这两部分PHY在芯片内部的硬件模块是独立的,
供电也是独立的。
RK3399支持两个Type-C USB 3.0(Type-C PHY is a combina
tion of USB 3.0 SuperSpeed PHY and DisplayPort Transmit PHY)和两个USB 2.0 Host。其中,两个Type-C USB 3.0控制器硬件都可以支持OTG(USB Peripheral和USB Host),并且向下兼容USB2.0/1.1/1.0。
此外,Type-C USB 3.0可以根据实际的应用需求,将物理接口简化设计为Type-A USB 3.0/2.0,Micro USB 3.0/2.0等多种接口类型,内核USB驱动已经兼容这几种不同类型的USB接口,只需要根据实际的硬件设计修改对应的板级DTS配置,就可以使能相应的USB接口。
RK3399 SDK DTS的默认配置,支持Type-C0 USB 3.0 OTG功能,Type-C1 USB 3.0 Host功能。DTS的配置主要包括DWC3控制器、Type-C USB 3.0 PHY以及USB 2.0 PHY。
Type-C0/1 USB控制器硬件都支持USB 3.0 OTG(USB Peripheral和USB Host)功能,并且向下兼容USB
2.0/1.1/1.0。但由于当前内核的USB框架只支持一个USB口作为Peripheral功能,所以SDK默认配置Type-C0支持OTG mode,而Type-C1仅支持Host mode。
3399 有两个功能相同的 typec 口:
typec0 口包括 u*** 控制器(&u***drd3_0); u***3phy(&tcphy0)和 u***2phy (&u2phy0);
typec1 口包括 u*** 控制器(&u***drd3_1);u***3phy(&tcphy1)和 u***2phy (&u2phy1);
对应节点的意义:
USB控制器父节点:u***drd3
USB控制器子节点:u***drd_dwc3
PHY的节点:tcphy和u2phy
USB2 PHY节点:u2phy
Type-C0 /1 USB PHY DTS配置:
Type-C0/1 USB PHY的硬件由USB 3.0 PHY(只支持Super-speed)和USB 2.0 PHY(支持High-speed/Full-
speed/Low-speed)两部分组成。所以,对应的USB PHY DTS也包括USB 3.0 PHY和USB 2.0 PHY两部分。
以RK3399 Sapphire Excavator Board Type-C0 /1 USB 3.0 PHY DTS配置为例,
arch/arm64/boot/dts/rockchip/rk3399.dtsi文件中的
tcphy0: phy@ff7c0000和tcphy1: phy@ff800000的配置。
Type-C0/1 USB 2.0 PHY DTS配置:
RK3399 有两个 USB 2.0 combphy(一个PHY支持两个port,一个port连接OTG,另一个port连接Host),本文档称
之为USB 2.0 PHY0和PHY1(参考图1-2)。其中,PHY0的port0作为Type-C0 USB的USB 2.0 PHY,PHY1的port0作
为Type-C1 USB的USB 2.0 PHY。
以RK3399 Sapphire Excavator Board Type-C0 /1 USB2.0 PHY DTS配置为例:
arch/arm64/boot/dts/rockchip/rk3399.dtsi的
grf: syscon@ff770000的配置
arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi的
&u2phy0的配置
&u2phy1的配置
由于当前的内核USB框架只能支持一个USB 口作为Peripheral功能,所以RK3399 SDK默认配置Type-C0作为OTG mode支持USB Peripheral功能,而Type-C1只支持Host mode。实际产品中,可以根据应用需求,配置Type-C1为OTG mode,支持USB Peripheral功能。
Type-A USB3.0 Host DTS配置的注意点如下:
对应的fu***节点不要配置,因为Type-A USB3.0不需要fu***302芯片
对应的USB控制器父节点(u***drd3)和PHY的节点(tcphy和u2phy)都要删除extcon属性
对应的USB控制器子节点(u***drd_dwc3)的dr_mode属性要配置为"host"
Micro USB3.0 OTG DTS配置的注意点如下:
对应的fu***节点不要配置,因为Micro USB3.0不需要fu***302芯片
对应的USB PHY节点(tcphy和u2phy)都要删除extcon属性
对应的USB控制器父节点(u***drd3)中,extcon属性引用为u2phy的节点
对应的USB控制器子节点(u***drd_dwc3)的dr_mode属性要配置为"otg"
对应的USB2 PHY节点(u2phy)中,配置Vbus regulator
Micro USB 3.0 OTG 是根据ID脚的电平变化(与Micro USB 2.0 OTG相同)来切换Peripheral mode和Host mode
如果用Type-A接口,系统启动后,需要应用层通过内核提供的OTG mode切换节点,配置USB控制器工作Peripheral mode或者Host mode。
下面来说下我的项目情况:
rk3399有两个功能相同的Typec口,都支持dp输出,目前硬件的接法是 Typec0接到USB Type-A做USB host或者USB otg功能,而Typec1接到DP显示接口,目前SDK已经添加DP驱动和USB驱动,只需要DTS文件配置一下即可。
1、硬件原理连接方面:
2、dts配置方面
文件:arch/arm64/boot/dts/rockchip/rk3399-box-rev2-hdmi.dts
/* DP hot plug detect */
vpd0: virtual-pd0 {
compatible = "linux,extcon-pd-virtual";
dp-det-gpios = <&gpio4 25 GPIO_ACTIVE_LOW>;
/* 0: positive, 1: negative*/
vpd,init-flip = <0>;
/* 0: u2, 1: u3*/
vpd,init-ss = <0>;
/* 0: dfp, 1: ufp, 2: dp 3: dp/ufp */
vpd,init-mode = <3>;
};
&pinctrl {
vpd {
vpd0_int: vpd0-int {
rockchip,pins =
<4 25 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
}
/* Enable USB 3.0 PHY0 */
&tcphy0 { //[hw]use typec0 => USB3.0
// extcon = <&fu***0>; // no using [fu***302]
status = "okay";
};
/* Enable USB 3.0 PHY1 */
&tcphy1 { //[hw]use typec1 => DP port
status = "okay";
extcon = <&vpd0>;
};
/* Config DP port, use DP port as DP port */
&cdn_dp {
status = "okay";
phys = <&tcphy1_dp>; //DP use typec phy1
extcon = <&vpd0>;
dp_vop_sel = <1>;
};
/* Enable Type-C0 USB 2.0 PHY */
&u2phy0 {
status = "okay";
// extcon = <&fu***0>; // no using [fu***302]
u2phy0_otg: otg-port {
status = "okay";
};
u2phy0_host: host-port {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
};
/* Configurate and Enable Type-C0 USB 3.0 Controller */
&u***drd3_0 {
extcon = <&u2phy0>;
// extcon = <&fu***0>; // no using [fu***302]
status = "okay";
};
&u***drd_dwc3_0 {
// dr_mode = "otg"; // cant run otg in 4-pin-hw : [USB-A].
dr_mode = "host";
phys = <&u2phy0_otg>, <&tcphy0_u***3>;
phy-names = "u***2-phy", "u***3-phy";
maximum-speed = "high-speed";
status = "okay";
};
原作者:平仄散人