当 usb 设备用于 gadgetfs 时系统挂起并出现错误 110

System hang and got error 110 when usb device use for gadgetfs

使用“http://www.linux-usb.org/gadget/usb.c”程序尝试在 Jetson TX2 上设置 gadgetfs。

为 Nvidia 更新 VID PID: #define DRIVER_VENDOR_NUM 0x0955 #define DRIVER_PRODUCT_NUM 0x7020

同时为 Nvidia 更新自动配置功能:

*/* Nvidia processors, high/full speed */
else if (stat (DEVNAME = "tegra-xudc", &statb) == 0) {
    HIGHSPEED = 1;
    device_desc.bcdDevice = __constant_cpu_to_le16 (0x0001);
    fs_source_desc.bEndpointAddress
    = hs_source_desc.bEndpointAddress
    = USB_DIR_IN | 1;
    EP_IN_NAME = "ep1in-bulk";
    fs_sink_desc.bEndpointAddress
    = hs_sink_desc.bEndpointAddress
    = USB_DIR_OUT | 2;
    EP_OUT_NAME = "ep2out-bulk";
    source_sink_intf.bNumEndpoints = 3;
    fs_status_desc.bEndpointAddress
    = hs_status_desc.bEndpointAddress
    = USB_DIR_IN | 3;
    EP_STATUS_NAME = "ep3in-int";
}*

运行 程序在 Jetson TX2 终端获得输出后:

*/dev/gadget/musb_hdrc ep0 configured
serial="1.3"
** Thu Jan 1 05:19:27
CONNECT high speed
DISCONNECT
CONNECT high speed
SETUP 80.06 v0300 i0000 255*

Linux 主机 PC 的输出日志是:

*usb 3-2: new high-speed USB device number 48 using xhci_hcd
usb 3-2: string descriptor 0 read error: -110
usb 3-2: New USB device found, idVendor=0955, idProduct=7020
usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 3-2: can't set config #2, error -110*

调试usb.c一步步发现程序卡在了函数"handle_control"中。获取 USB_REQ_GET_DESCRIPTOR 的事件然后调用 USB_DT_STRING 但在 "status = write (fd, buf, tmp);" Jetson TX2 卡住并重新启动之后。

Jetson TX2 卡住并在主机 PC 上收到错误 -110 响应的原因是什么?

搜索与错误-110相关的内容后,我们得到了两个不同的errno.h。

一个表示 110 为: #define ESHUTDOWN 110 /* 套接字关闭后无法发送 */

第二个文件将 110 表示为: #define ETIMEDOUT 110 /* 连接超时 */

在这两种情况下都有一个共同的结果,即主机和设备之间的通信由于某种原因而中断。那么这个连接断开会出现什么问题呢?

在与gadgetfs 相关的内核源文件中存在错误。使用下面的补丁修复该错误后,设备和主机之间具有批量传输类型的 gadgetfs 的 usb 通信正在运行。

https://www.systutorials.com/linux-kernels/88555/usb-gadgetfs-fix-crash-caused-by-inadequate-synchronization-linux-4-4-92/

https://www.systutorials.com/linux-kernels/88554/usb-gadget-inode-c-fix-unbalanced-spin_lock-in-ep0_write-linux-4-4-92/