计算机 Linux内核术语
说明usb请求块urb(usb request block,urb)是usb设备驱动中用来描述与usb设备通信所用的基本载体和核心数据结构。
是usb主机和设备通信的"电波"。
结构体struct urb
{
/* private: usb core and host controller only fields in the urb */
struct kref kref; /* urb引用计数 */
void *hcpriv; /* 主控制器的私有数据 */
atomic_t use_count; /* 并发的提交计数 */
atomic_t reject; /* 提交将失败*/
int unlinked; /* unlink的错误码 */
/* public: documented fields in the urb that can be used by drivers */
struct list_head anchor_list; /* urb链表 */
struct usb_anchor *anchor;
struct usb_device *dev; /* 指向usb设备 */
struct usb_host_endpoint *ep; /* 指向端点的数据结构,最终将取代pipe */
unsigned int pipe; /* 持有端点的信息,如:端点号、方向、类型等等 */
unsigned int stream_id; /* 对bluk流有效,指端点的流ID */
int status; /* 状态 */
unsigned int transfer_flags; /* 各种flags用来指示urb如何被提交、ublink以及操作*/
/* 传输缓冲区,对输入端口来说,该缓冲区存储输入的数据对于输出端口来说,数据从缓冲区输出*/
void *transfer_buffer; //当transfer_flags 使用URB_NO_TRANSFER_DMA_MAP,优先使用transfer_dma,而不是transfer_buffer
dma_addr_t transfer_dma;
struct scatterlist *sg; /* 分散/搜集buffer链表 */
int num_mapped_sgs; /* (internal) 映射的sg的入口 */
int num_sgs; /* (in) sg链表中入口的数量 */
u32 transfer_buffer_length; /* (in) buffer的长度 */
u32 actual_length; /* (return) 实际传输的长度 */
unsigned char *setup_packet; /* (in)仅用于控制传输,指向8 byte,就是usb协议里面分析的那8个控制字节*/
dma_addr_t setup_dma; /* (in) dma addr for setup_packet */
int start_frame; /* (modify)返回同步传输的首帧 */
int number_of_packets; /* (in) 同步传输的包的数量 */
int interval; /* (modify) 指定中断初始或者同步传输的查询周期(INT/ISO) */
int error_count; /* (return) 同步传输的错误数 */
void *context; /* (in) context for completion */
usb_complete_t complete; /* (in) 完成函数 */