USB 错误代码

修订:

2004-10-21

这是(希望)所有可能的错误代码(及其解释)的文档,这些错误代码可以从 usbcore 返回。

其中一些由主机控制器驱动程序 (HCD) 返回,设备驱动程序只能通过 usbcore 看到。通常,所有 HCD 的行为都应相同,除了传输速度相关的行为以及某些故障的报告方式。

usb_submit_urb() 返回的错误代码

非 USB 特定的

0

URB 提交顺利

-ENOMEM

没有内存用于分配内部结构

USB 特定的

-EBUSY

URB 已经处于活动状态。

-ENODEV

指定的 USB 设备或总线不存在

-ENOENT

指定的接口或端点不存在或未启用

-ENXIO

主机控制器驱动程序不支持此类型的 urb 排队。(视为主机控制器错误。)

-EINVAL

  1. 指定了无效的传输类型(或不支持)

  2. 无效或不支持的定期传输间隔

  3. ISO:尝试更改传输间隔

  4. ISO:number_of_packets < 0

  5. 各种其他情况

-EXDEV

ISO:未指定 URB_ISO_ASAP,并且 URB 将被调度的所有帧都已过期。

-EFBIG

主机控制器驱动程序无法调度那么多 ISO 帧。

-EPIPE

URB 中指定的管道类型与端点的实际类型不匹配。

-EMSGSIZE

  1. 端点 maxpacket 大小为零;它在当前的接口备用设置中不可用。

  2. ISO 数据包大于端点 maxpacket。

  3. 请求的数据传输长度无效:负数或对于主机控制器来说太大。

-EBADR

控制 URB 的设置数据包中的 wLength 值与 URB 的 transfer_buffer_length 不匹配。

-ENOSPC

此请求将过度提交为定期传输(中断、同步)保留的 usb 带宽。

-ESHUTDOWN

由于某些无法解决的问题,设备或主机控制器已被禁用。

-EPERM

提交失败,因为设置了 urb->reject

-EHOSTUNREACH

由于设备已挂起,URB 被拒绝。

-ENOEXEC

控制 URB 不包含设置数据包。

in urb->statusiso_frame_desc[n].status (对于 ISO) 返回的错误代码

USB 设备驱动程序只能在完成处理程序中测试 urb 状态值。 这是因为否则将在一个 CPU 上更新这些值的 HCD 与在另一个 CPU 上测试它们的设备驱动程序之间存在竞争。

即使报告了错误,传输的 actual_length 也可能是正数。 这是因为传输通常涉及多个数据包,因此一个或多个数据包可能会在错误停止进一步的端点 I/O 之前完成。

对于同步 URB,仅当 URB 未链接、设备被移除、主机控制器被禁用或总传输长度小于请求长度并且设置了 URB_SHORT_NOT_OK 标志时,urb 状态值才为非零。 同步 URB 的完成处理程序应仅看到 urb->status 设置为零、-ENOENT-ECONNRESET-ESHUTDOWN-EREMOTEIO。 单个帧描述符状态字段可能会报告更多状态代码。

0

传输成功完成

-ENOENT

URB 已由 usb_unlink_urb() 同步取消链接

-EINPROGRESS

URB 仍在挂起,尚未有结果(也就是说,如果驱动程序看到此错误,则这是一个错误。)

-EPROTO [1], [2]

  1. bitstuff 错误

  2. 在规定的总线转换时间内未收到响应数据包

  3. 未知的 USB 错误

-EILSEQ [1], [2]

  1. CRC 不匹配

  2. 在规定的总线转换时间内未收到响应数据包

  3. 未知的 USB 错误

请注意,通常控制器硬件无法区分 a)、b) 和 c) 情况,因此驱动程序无法判断是否存在协议错误、未响应(通常由设备断开连接引起)或某些其他故障。

-ETIME [2]

在规定的总线转换时间内未收到响应数据包。 此错误可能会报告为 -EPROTO-EILSEQ

-ETIMEDOUT

同步 USB 消息功能使用此代码来指示超时在传输完成之前已过期,并且 HC 未报告其他错误。

-EPIPE [2]

端点停止。 对于非控制端点,使用 usb_clear_halt() 重置此状态。

-ECOMM

在 IN 传输期间,主机控制器接收来自端点的数据的速度快于将其写入系统内存的速度

-ENOSR

在 OUT 传输期间,主机控制器无法足够快地从系统内存中检索数据以跟上 USB 数据速率

-EOVERFLOW [1]

端点返回的数据量大于端点的最大数据包大小或剩余缓冲区大小。“Babble”。

-EREMOTEIO

从端点读取的数据未填充指定的缓冲区,并且在 urb->transfer_flags 中设置了 URB_SHORT_NOT_OK

-ENODEV

设备已移除。 通常以其他错误的突发开始,因为集线器驱动程序不会立即检测到设备移除事件。

-EXDEV

ISO 传输仅部分完成(仅在 iso_frame_desc[n].status 中设置,而不是在 urb->status 中)

-EINVAL

ISO 疯狂,如果发生这种情况:注销并回家

-ECONNRESET

URB 已由 usb_unlink_urb() 异步取消链接

-ESHUTDOWN

由于某些无法解决的问题,设备或主机控制器已被禁用,例如物理断开连接。

由 usbcore 函数返回的错误代码

注意

还期望其他提交和传输状态代码

usb_register():

-EINVAL

注册新驱动程序时出错

usb_get_*/usb_set_*(), usb_control_msg(), usb_bulk_msg()

-ETIMEDOUT

超时在传输完成之前已过期。