FUSB301 driver adaptation issue on Jetson Thor

DRIVE OS Version: BSP Version: 38.4.0

Issue Description: We are using a Jetson AGX T5000 module on a custom carrier board. During FUSB301 driver adaptation, automatic role switching between host and device does not work. We would like to confirm whether our device tree configuration is correct. Additionally, the kernel seems to have parsing issues with the device tree as shown below.

pinmux:



kernel devicetree:



log:

The command below successfully switches the Type-C port between host and device modes when executed manually.
sudo sh -c ‘echo none > /sys/class/usb_role/usb2-0-role-switch/role’
sudo sh -c ‘echo host > /sys/class/usb_role/usb2-0-role-switch/role’

These might be relevant.

grep -r usb_role /opt/nvidia/l4t-usb-device-mode/
/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-start.sh:        echo device > "${usb_role_switch}" 2>/dev/null
/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-start.sh:udevadm trigger -v --action=change --property-match=SUBSYSTEM=usb_role
/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-state-change.sh:if [ -f /sys/class/usb_role/usb2-0-role-switch/role ]; then

sudo grep -r "nv-l4t-usb-device-mode" /etc
/etc/udev/rules.d/99-nv-l4t-usb-device-mode.rules:KERNEL=="android0" SUBSYSTEM=="android_usb" RUN+="/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-state-change.sh"
/etc/udev/rules.d/99-nv-l4t-usb-device-mode.rules:SUBSYSTEM=="usb_role" RUN+="/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-state-change.sh"

Hotplug events do not trigger any interrupt counter increments in practice.

nvidia@upai-pro03:~$ cat /proc/interrupts | grep 0025
263: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 810c300000.gpio 47 Level 7-0025
nvidia@upai-pro03:~$
nvidia@upai-pro03:~$ grep -r usb_role /opt/nvidia/l4t-usb-device-mode/
/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-state-change.sh:if [ -f /sys/class/usb_role/usb2-0-role-switch/role ]; then
/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-state-change.sh: role=“$(cat /sys/class/usb_role/usb2-0-role-switch/role)”
/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-start.sh:udevadm trigger -v --action=change --property-match=SUBSYSTEM=usb_role
nvidia@upai-pro03:~$
nvidia@upai-pro03:~$ sudo grep -r “nv-l4t-usb-device-mode” /etc
/etc/systemd/nv-oobe-post.sh: /bin/systemctl restart nv-l4t-usb-device-mode.service
/etc/udev/rules.d/99-nv-l4t-usb-device-mode.rules:KERNEL==“android0” SUBSYSTEM==“android_usb” RUN+=“/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-state-change.sh”
/etc/udev/rules.d/99-nv-l4t-usb-device-mode.rules:SUBSYSTEM==“usb_role” RUN+=“/opt/nvidia/l4t-usb-device-mode/nv-l4t-usb-device-mode-state-change.sh”
nvidia@upai-pro03:~$
nvidia@upai-pro03:~$ cat /sys/class/usb_role/usb2-0-role-switch/role
host
nvidia@upai-pro03:~$

Do you need role-switch-default-mode = "peripheral";

Linux_for_Tegra/source/hardware/nvidia/t264/nv-public$ grep -irC4 "role-switch" nv-platform/tegra264-p4071-0000.dtsi

			ports {
				usb2-0 {
					mode = "otg";
                                        usb-role-switch;
                                        role-switch-default-mode = "peripheral";
                                        status = "okay";
				};



https://www.kernel.org/doc/Documentation/devicetree/bindings/usb/generic.txt
Generic USB Properties

Optional properties:
 - maximum-speed: tells USB controllers we want to work up to a certain
			speed. Valid arguments are "super-speed-plus",
			"super-speed", "high-speed", "full-speed" and
			"low-speed". In case this isn't passed via DT, USB
			controllers should default to their maximum HW
			capability.
 - dr_mode: tells Dual-Role USB controllers that we want to work on a
			particular mode. Valid arguments are "host",
			"peripheral" and "otg". In case this attribute isn't
			passed via DT, USB DRD controllers should default to
			OTG.
 - phy_type: tells USB controllers that we want to configure the core to support
			a UTMI+ PHY with an 8- or 16-bit interface if UTMI+ is
			selected. Valid arguments are "utmi" and "utmi_wide".
			In case this isn't passed via DT, USB controllers should
			default to HW capability.
 - otg-rev: tells usb driver the release number of the OTG and EH supplement
			with which the device and its descriptors are compliant,
			in binary-coded decimal (i.e. 2.0 is 0200H). This
			property is used if any real OTG features(HNP/SRP/ADP)
			is enabled, if ADP is required, otg-rev should be
			0x0200 or above.
 - companion: phandle of a companion
 - hnp-disable: tells OTG controllers we want to disable OTG HNP, normally HNP
			is the basic function of real OTG except you want it
			to be a srp-capable only B device.
 - srp-disable: tells OTG controllers we want to disable OTG SRP, SRP is
			optional for OTG device.
 - adp-disable: tells OTG controllers we want to disable OTG ADP, ADP is
			optional for OTG device.
 - usb-role-switch: boolean, indicates that the device is capable of assigning
			the USB data role (USB host or USB device) for a given
			USB connector, such as Type-C, Type-B(micro).
			see connector/usb-connector.yaml.
 - role-switch-default-mode: indicating if usb-role-switch is enabled, the
			device default operation mode of controller while usb
			role is USB_ROLE_NONE. Valid arguments are "host" and
			"peripheral". Defaults to "peripheral" if not
			specified.


This is an attribute to a USB controller such as:

dwc3@4a030000 {
	compatible = "synopsys,dwc3";
	reg = <0x4a030000 0xcfff>;
	interrupts = <0 92 4>
	usb-phy = <&usb2_phy>, <&usb3,phy>;
	maximum-speed = "super-speed";
	dr_mode = "otg";
	phy_type = "utmi_wide";
	otg-rev = <0x0200>;
	adp-disable;
};

Please check with fusb301 vendor to confirm your device tree is correct or not first.

Thanks for the response. Since no interrupt is triggering, we’ll start by checking the hardware.

Resolved. It was indeed a hardware issue.

Hello, regarding the use of FUSB301 on Jetson Thor, have you tested it with USB 3.2 Gen 2 flash drives? We are using the same solution, and we’ve found that USB 3.2 Gen 2 flash drives are occasionally recognized as USB 2.0, while USB 3.2 Gen 1 flash drives work normally.Our engineers have tested and found that it is not a hardware signal issue, but rather seems to be a compatibility issue between the Thor platform USB and the FUSB301