usb驅動中的urb結構體
//USB Request Block: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 urb_list; /* list head for use by the urb's
* current owner */
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) 完成函式 */
//用於提供同步傳輸緩衝區陣列,並且蒐集每個緩衝區的傳輸狀態
struct usb_iso_packet_descriptor iso_frame_desc[0];
/* (in) ISO ONLY */
};
原文地址: