Colibri imx6ull USBC OTG not working

Hello,

Problem


I’m finding it difficult to get proper operation of USBC OTG. I believe it’s a configuration issue. Probably improper device-tree.

Hardware setup


SOM: Colibri iMX6ULL 512MB WB V1.1A
Development/Carrier Board: Colibri Evaluation Board

I’m using the Colibri Evaluation Board and Colibri Carrier Board Design Guide as a reference for a custom carrier board design.

Firmware setup


Based on Toradex release matrix, this is my firware setup. I’m using buildroot for board
bring-up and debugging kernel/drivers.

BSP: 6.4.0 (not using the rootfs; at this point I have a minimal rootfs generated with buildroot)
Kernel: mainline Linux Kernel (source v6.1.55 from kernel.org)
U-Boot: mainline based 2022.07 (binary from Toradex Tezi image)
Buildroot: Use for board bring-up and debugging drivers as I customize Kernel/Driver Configuration

Qustions


  1. I’m using Mainline linux kernel v6.1.55 from Kernel.org. Is the device-tree in these sources correct for proper USBC OTG operation? I suspect not. What is the proper device-tree to support USBC OTG operation?

  2. Without providing custom board schematic to follow PIN_137/USBC_CABLEDET logic,
    this is what I observe when connecting a host computer and thumb drive to our board via USBC connector.

Host Plugged In:

USBC cable detect pin 137, 3.3V (device mode)
USB Load Switch, disabled
VBUS, 5.0V (from connected host)

Nothing Plugged In;

USBC cable detect pin 137, 0.0V (host mode)
USB Load Switch, disabled
VBUS, 0.0V

Device Plugged In;

USBC cable detect pin 137, 0.0V
USB Load Switch, enabled
VBUS, 5.0V (from carrier board)

I believe these results are consistent with Colibri Carrier Board Design Guide page 18. Can you confirm this is the proper behavior.

Also, another clue that hardware is properly designed is that when I Load Toradex Easy Installer, the USBC OTG port functions properly.

- Recovery mode is properly enumerated and Easy Installer gets loaded to imx6ull
- Insert/Remove thumb drive shows sda1 enumerating/disappearing
- Connecting to host enumerates NDIS ethernet over USB and works.
  1. Given this, can you provide the device-tree used for Easy Installer for my reference?

Thanks. Looking forward to a response.

MVE Biological Solutions
Robert Susnik
email: robert.susnik@mvebio.com
cell: 919-8896428

Please note that the Colibri iMX6ULL does not support true USB OTG, which allows two devices to negotiate and exchange roles—host and peripheral—using the Host Negotiation Protocol. However, the USBC port can be used as a dual-role port (either as host or client). Unfortunately, we cannot share the source code of the Toradex Easy Installer, including the device tree. But USBC dual role is definitely supported by the 2.8 BSP, and its device tree can be found here. For more information, please also check this article.

Hello,

Thanks for your response, I’ve resolved my issue.

My investigation into the matter led me to a solution. I required an additional patch to mainline linux kernel 6.1.55, which disables power management functions. It seems the USBC OTG controller stops working once it goes into low power mode. It works as either host or client after boot, but after re-plugging a device into the USBC OTG port it stops working. I think the driver doesn’t really support power management properly with the non-conventional way of implementing USBC dual-role port (either as host or client). Once the USB OTG controller goes into low-power it can never be awoken. Here is what was required to make it work.

Additional Device Tree Nodes in “imx6ull-colibri-eval-v3.dtsi”,

/ {

extcon_usbc_det: usbc_det {

compatible = “linux,extcon-usb-gpio”;

debounce = <25>;

id-gpio = <&gpio5 2 GPIO_ACTIVE_HIGH>;

pinctrl-names = “default”;

pinctrl-0 = <&pinctrl_snvs_usbc_det>;

};

};