当 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 通信正在运行。
使用“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 通信正在运行。