如何重新枚举接入的USB device或者reset USB controller

Hi NV team,

我在Orin平台的开发板上,接入了一个UAC(USB speaker)。
遇到如下问题:
当,Orin上电前就已经插入UAC,则Orin启动后无法识别UAC设备;重新插拔一下UAC设备,就被正常识别到了。
当,Orin启动后,插入UAC,则UAC可以被正常识别。

请问,如何在Orin上电前就插入UAC,且在无需插拔UAC的前提下,使UAC被正常识别呢?
如何重新枚举接入的USB device或者reset USB controller来达到这一目的呢?

JP5.1.1 Orin USB Type-A

非常感谢!

Hi,

If you are designing a custom base board, then it means some adaptation configurations are needed.
Otherwise, your board may not work fine.

For Orin AGX series, you could refer to below document
https://docs.nvidia.com/jetson/archives/r36.3/DeveloperGuide/HR/JetsonModuleAdaptationAndBringUp/JetsonAgxOrinSeries.html?highlight=universal%20serial%20bus#jetson-agx-orin-platform-adaptation-and-bring-up
(please be aware that above link is for rel-36.3/jetpack6.0)

This document includes below configuration

  1. pinmux change & GPIO configuration
  2. EEPROM change as most custom boards do not have an EEPROM on it.
  3. Kernel porting
  4. PCIe configuration
  5. USB configuration
  6. MGBE configuration
  7. RGMII configuration

Thanks!

你這是NV devkit還是custom board?

Hi WayneWWW,

是custom board,用手动reset port的方法可以临时规避这个问题,但是我想从根本原因上解决此问题。

感谢!

Hi WayneWWW,

补充:
“”当,Orin上电前就已经插入UAC,则Orin启动后无法识别UAC设备;重新插拔一下UAC设备,就被正常识别到了。“
此现象是概率性的,复现概率80%。
也就是说20%情况下,UAC设备会被正常识别(Settings->Sound->Output->Output Device)

Hi WayneWWW,

再次补充更加棘手的现象:

dmesg:

[   10.102205] usb 1-2: new full-speed USB device number 3 using tegra-xusb
[  10.266689] usb 1-2: New USB device found, idVendor=10d6, idProduct=dd02, bcdDevice= 0.00
[   10.276009] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[   10.284229] usb 1-2: Product: BT-BT
[   10.288646] usb 1-2: Manufacturer: Actions
[   10.293689] usb 1-2: SerialNumber: ACTIONS-DEV-SN0
[   10.303067] input: Actions BT-BT as /devices/platform/3610000.xhci/usb1/1-2/1-2:1.0/0003:10D6:DD02.0003/input/input6
[   10.374905] input: Actions BT-BT Consumer Control as /devices/platform/3610000.xhci/usb1/1-2/1-2:1.0/0003:10D6:DD02.0003/input/input7
[   10.389226] hid-generic 0003:10D6:DD02.0003: input,hiddev97,hidraw2: USB HID v1.10 Device [Actions BT-BT] on usb-3610000.xhci-2/input0

执行 lsusb -t:

$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=tegra-xusb/4p, 10000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=tegra-xusb/4p, 480M
    |__ Port 1: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 1: Dev 5, If 1, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 4: Dev 4, If 0, Class=Vendor Specific Class, Driver=usb_ch9344, 480M

USB Host Controller没有正确把UAC设备挂载到端口上,这样reset port的办法也无法解决问题了。
有建议的其他解决办法吗?

感谢!

你們的device tree有配合板子的設計重新寫嗎? 這才是從根本解決問題

Hi WayneWW,

目前对比测试来看,不是USB host的问题,我们对比测试了其他UAC设备,是没有此问题的。
应该是我们选的这个UAC会议宝比较特殊。

有没有办法给USB 口断下电?

Hi WayneWWW,

类似于此topic中的demo,

這得看你們的USB port如何設計… 你不給這些資訊我們也不會知道怎麼回答你的問題.
比方說上面的demo是給usb hub使用的.

Hi WayneWWW,

内部讨论,先不在custom board上调试了。
直接使用NV devloper Kit,P3730调试,BSP版本R36.3.0。

请帮忙评估是否有类似demo

厄… 我是建議你想清楚你自己到底要做什麼

基本上我們看這個問題跟你想的方向完全不一樣

  1. 如果你的問題在NV devkit能複製到, 我們是傾向是研究為什麼會有這個問題(裝置偵測不到)/是不是個我們這邊的bug. 我們不會先去搞如何reset usb controller這件事.

  2. 你在NV devkit選擇測試的port也會有影響. 看你是要接在type C port還是要接在type A hub上… 比方說如果你選擇接在type A hub上, 那前面那個realtek tool就可以用了.

  3. 在NV devkit上有用的方法在你的custom board不一定會有用.

所以麻煩你先想清楚你最終的目標到底要做什麼… 比方說你可能在NV devkit上花了很多心力但最後對你的custom board結果完全沒幫助… 這樣就只是浪費時間.
這些也請你們內部討論一下.

Hi WayneWWW,

非常感谢这么详细的说明!

  1. 如果你的問題在NV devkit能複製到, 我們是傾向是研究為什麼會有這個問題(裝置偵測不到)/是不是個我們這邊的bug. 我們不會先去搞如何reset usb controller這件事.

“為什麼會有這個問題(裝置偵測不到)/是不是個我們這邊的bug”
其实详细描述现象是:
1),UAC可以被USB port挂载上
2),Settings设置里也可以选择这个UAC设备
3),目前的问题是,在基于1、2正常的情况下,喇叭依旧无声,猜测是UAC设备问题,而不是我们平台USB问题

  1. 你在NV devkit選擇測試的port也會有影響. 看你是要接在type C port還是要接在type A hub上… 比方說如果你選擇接在type A hub上, 那前面那個realtek tool就可以用了.

“比方說如果你選擇接在type A hub上, 那前面那個realtek tool就可以用了”
我测试了链接中的demo,结果如下:
$ sudo ./power_cycle
[sudo] password for nvidia:
[error]:open device 0bda:5411 fail.

  1. 在NV devkit上有用的方法在你的custom board不一定會有用.

目前我们还未产品化,也只是在做个demo,预算有限,所以我们暂时先不考虑custom board上实现了,感谢提醒!

综上,
还请看一下demo程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <libusb-1.0/libusb.h>

unsigned                vid = 0x0bda;
unsigned                pid = 0x5411;


int power_cycle(libusb_device_handle *hub_devh)
{
        int ret = -1;

        /*ep0 vendor command enable*/
        ret = libusb_control_transfer(hub_devh, 0x40, 0x02, 0x01, ((0x0B<<8)|(0xDA)), 0, 0, 100000);
        if (ret < 0) {
                printf("[error]:ep0 vendor command enable fail.\n");
                return ret;
        }

        /*ep0 vendor command disable*/
        libusb_control_transfer(hub_devh, 0x40, 0x1, 0x08, 0, NULL, 0, 100);
        libusb_control_transfer(hub_devh, 0x40, 0x3, 0x08, 0, NULL, 0, 100);
        libusb_control_transfer(hub_devh, 0x40, 0x02, 0x00, ((0x0B<<8)|(0xDA)), 0, 0, 100000);

        return ret;
}

int main(int argc, char *argv[])
{
    int ret=0;
    libusb_device_handle        *hub_devh;
    libusb_context              *context;

    ret = libusb_init(&context);
    if (ret != 0){
        printf("[error]:libusb init fail.\n");
        return ret;
    }

    hub_devh = libusb_open_device_with_vid_pid(context, vid, pid);
    if (!hub_devh) {
        printf("[error]:open device %04x:%04x fail.\n", vid, pid);
                return -1;
        }
    ret = power_cycle(hub_devh);
    return ret;
}

Hi WayneWWW,

demo程序中,我修改了vid和pid来reset :0bda:5420 Realtek Semiconductor Corp. 4-Port USB 2.0 Hub,是成功的,也能达到我们的预期。

请问能实现power cycle devkit上的任一 type-C口的目的吗?

請試試在以下路徑做unbind/bind.

/sys/bus/usb/drivers/usb