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 状态值。这是因为否则 HCD 在一个 CPU 上更新这些值和设备驱动程序在另一个 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. 位填充错误

  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]

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

-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

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