1. 程式人生 > >usb驅動中的urb結構體

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 */

};

原文地址: