File path:include/linux/usb.h
struct urb {/* private: 仅usb核心和主机控制器访问的字段 */struct kref kref;/* reference count of the URB */void*hcpriv;/* private data for host controller */
atomic_t use_count;/* concurrent submissions counter */
atomic_t reject;/* submissions will fail */int unlinked;/* unlink error code *//* public: 驱动可以使用的字段 */struct list_head urb_list;/* list head for use by the urb's
* current owner */struct list_head anchor_list;/* the URB may be anchored */struct usb_anchor *anchor;struct usb_device *dev;/* (in) pointer to associated device */struct usb_host_endpoint *ep;/* (internal) pointer to endpoint */unsignedint pipe;/* (in) pipe information */unsignedint stream_id;/* (in) stream ID */int status;/* (return) non-ISO status */unsignedint transfer_flags;/* (in) URB_SHORT_NOT_OK | ...*/void*transfer_buffer;/* (in) associated data buffer */
dma_addr_t transfer_dma;/* (in) dma addr for transfer_buffer */struct scatterlist *sg;/* (in) scatter gather buffer list */int num_mapped_sgs;/* (internal) mapped sg entries */int num_sgs;/* (in) number of entries in the sg list */
u32 transfer_buffer_length;/* (in) data buffer length */
u32 actual_length;/* (return) actual transfer length */unsignedchar*setup_packet;/* (in) setup packet (control only) */
dma_addr_t setup_dma;/* (in) dma addr for setup_packet */int start_frame;/* (modify) start frame (ISO) */int number_of_packets;/* (in) number of ISO packets */int interval;/* (modify) transfer interval
* (INT/ISO) */int error_count;/* (return) number of ISO errors */void*context;/* (in) context for completion */
usb_complete_t complete;/* (in) completion routine */struct usb_iso_packet_descriptor iso_frame_desc[0];/* (in) ISO ONLY */};
NOTE:下面3种情况,urb将结束。
a) urb 被成功发送给设备,并且设备返回正确的确认。
b) 发送数据到设备或从设备接收数据时发生了错误(urb->status 将记录错误值)。
c) 设备驱动通过usb_unlink_urb()或usb_kill_urb()将urb从USB核心“去除连接”。
NOTE:当urb生命结束时,可以通过urb结构体的status成员可以获知其原因:
a) urb->status = 0,表示传输成功;
b) urb->status = -ENOENT或-ECONNRESET,分别表示被usb_kill_urb()杀死、被usb_unlink_urb()杀死;
c) urb->status = -ENODEV或-EXDEV,分别表示USB设备已被移除、等时传输仅完成了一部分等。
d) urb->status = -EPROTO,表示传输中发生了bitstuff错误或者硬件未能及时收到响应数据包。