硬件原理:
1. type C 接口:
1.1 HUSB311芯片, CC1和CC2 逻辑接到HUSB311 上面, 接I2C0组和USBCC_INT_L
USBCC_INT_L 接到GPIO0_A6 做为CC的逻辑中断
1.2 TYPEC_DP/TYPEC_DM
接到ARM 端的USB3.0 OTG上面
1.2 TYPEC_RX1P/TYPEC_RX1N 和 TYPEC_TX1P/TYPEC_TX1N
接到ARM端的这里来
上面为这个typeC 接口的硬件原理:
软件dts部分参考如下的来:
参考rk文档docs\cn\Common\USB\Rockchip_RK356x_Developer_Guide_USB_CN.pdf
Linux-5.10 RK3566 Type-C USB 2.0 + FUSB302 DTS 配置
/* 配置 FUSB302 芯片硬件信息*/
&i2c0 { /* 根据 FUSB302 I2C 实际硬件设计进行修改 *///usbc0: fusb302@22 {usbc0: husb311@4e {//compatible = "fcs,fusb302";//reg = <0x22>;compatible = "hynetek,husb311";reg = <0x4e>;//interrupt-parent = <&gpix>; /* 根据 FUSB302 INT 实际连接的 GPIO 进行修改 */interrupt-parent = <&gpio0>;//interrupts = <RK_PXX IRQ_TYPE_LEVEL_LOW>;interrupts = <RK_PA6 IRQ_TYPE_LEVEL_LOW>;pinctrl-names = "default";pinctrl-0 = <&usbc0_int>;//vbus-supply = <&vbus_typec>;status = "okay";ports {#address-cells = <1>;#size-cells = <0>;/* 用于关联 USB 控制器,实现 USB 角色切换的功能 */port@0 {reg = <0>;usbc0_role_sw: endpoint@0 {remote-endpoint = <&dwc3_role_switch>;};};};usb_con: connector { /* 用于描述 PD 协议相关信息 */compatible = "usb-c-connector";label = "USB-C";data-role = "dual";power-role = "dual";try-power-role = "sink";op-sink-microwatt = <1000000>;sink-pdos =<PDO_FIXED(5000, 2500, PDO_FIXED_USB_COMM)>;source-pdos =<PDO_FIXED(5000, 1500, PDO_FIXED_USB_COMM)>;};};
};
另外一部分的dts, 注意实际硬件是没有Vbus的硬件逻辑控制的,所以软件上面我们并没有做相应的逻辑配置.
/* 使能 Type-C0 USB2.0 PHY */
//&u2phy0 {
// status = "okay";
//};//&u2phy0_otg {
// rockchip,dis-u2-susphy; /* 可选项,用于关闭 PHY 动态进入 suspend 的功能,提高USB 热拔插稳定性 */
// status = "okay";
//};/* 使能 USB3 控制器父节点 */
&usbdrd30 {status = "okay";
};/* 使能 USB3 控制器子节点 */
&usbdrd_dwc3 {status = "okay";usb-role-switch; /* 用于使能 DWC3 驱动注册 USB Role Switch 回调函数 */port {#address-cells = <1>;#size-cells = <0>;dwc3_role_switch: endpoint@0 {reg = <0>;remote-endpoint = <&usbc0_role_sw>; /* 关联 FUSB302,实现USB 角色切换的功能 */};};
};&pinctrl {usb-typec {usbc0_int: usbc0-int { /* 配置 FUSB302 驱动的中断 gpio pinctrl *///rockchip,pins = <X RK_PXX RK_FUNC_GPIO &pcfg_pull_up>;rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>;};//vcc5v0_typec0_en: vcc5v0-typec0-en { /* 配置 FUSB302 驱动的 VBUS gpio pinctrl */// rockchip,pins = <X RK_PXX RK_FUNC_GPIO &pcfg_pull_none>;//};};
};
增加dts代码完毕,可以直接查看编译后的文件,看看修改前后的对比即可发生是否有更新到.
kernel/arch/arm64/boot/dts/rockchip$ vim -d .rk3562-idd1.dtb.dts.tmp .rk3562-idd1.dtb.dts.tmp.bak1
补充扩展Vbus的USB VBUS 配置:
Rockchip 平台的 USB VBUS 控制电路,主要有三种方案 [3] :
1. 使用 GPIO 控制电源稳压芯片输出 Vbus 5V 供电电压;
2. 使用 PMIC (如 RK809/RK817/RK818 )输出 Vbus 5V 供电电压;
3. 开机后,硬件直接输出 Vbus 5V 供电电压,不需要软件控制,一般用于 USB Host 接口;
RK356x SDK 主要使用的是第 1 种方案,以 RK3568 EVB 的 OTG 口和 HOST 口的 VBUS 配置为例
vcc5v0_host: vcc5v0-host-regulator {compatible = "regulator-fixed";enable-active-high;gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;pinctrl-names = "default";pinctrl-0 = <&vcc5v0_host_en>;regulator-name = "vcc5v0_host";regulator-always-on; /* Host Vbus 为常供电,所以配置属性为 regulator-always-on */
};
vcc5v0_otg: vcc5v0-otg-regulator {compatible = "regulator-fixed";enable-active-high;gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;pinctrl-names = "default";pinctrl-0 = <&vcc5v0_otg_en>;regulator-name = "vcc5v0_otg";
};
&pinctrl {usb {vcc5v0_host_en: vcc5v0-host-en {rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>;};vcc5v0_otg_en: vcc5v0-otg-en {rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>;};};
};/* 注意: host 控制 vbus 的属性是 phy-supply */
&u2phy0_host {phy-supply = <&vcc5v0_host>;status = "okay";
};/* 注意: otg 控制 vbus 的属性是 vbus-supply */
&u2phy0_otg {vbus-supply = <&vcc5v0_otg>;status = "okay";
};&u2phy1_host {phy-supply = <&vcc5v0_host>;status = "okay";
};
&u2phy1_otg {phy-supply = <&vcc5v0_host>;status = "okay";
};