RK3562 Linux-5.10 内核HUSB311 Type-C 控制器芯片调试记录

发布于:2025-05-28 ⋅ 阅读:(60) ⋅ 点赞:(0)

  硬件原理:

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";
};


网站公告

今日签到

点亮在社区的每一天
去签到