生活随笔 
收集整理的這篇文章主要介紹了
                                
linux usb 驱动详解 
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            linux usb 驅動詳解  
USB 設備驅動代碼通過urb和所有的 USB 設備通訊。urb用 struct urb 結構描述(include/linux/usb.h )。
struct urb 
struct urb {
/* public: documented fields in the urb that can be used by drivers */
struct usb_iso_packet_descriptor {
typedef void (*usb_complete_t)(struct urb *);
 
 
 
上述結構體中unsigned int pipe;的生成函數(define):
static inline unsigned int __create_pipe(struct usb_device *dev,
/* Create various pipes... */
 
 
 
上述結構體中unsigned int transfer_flags;的值域: 
/*
時啟動的話,必須能夠正確恢復 */
#define URB_DIR_IN0x0200/* Transfer from device to host */
 
 
 
上述結構體中int status;的常用值(in include/asm-generic/errno.h and errno_base.h) :
// 0 表示 urb 傳送成功*/
//以下各個定義在使用時為負值
 
 
 
創建和注銷 urb 
struct urb 結構不能靜態創建,必須使用 usb_alloc_urb 函數創建. 函數原型:
struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags);
//返回值: 如果成功分配足夠內存給 urb , 返回值為指向 urb 的指針. 如果返回值是 NULL, 則在 USB 核心中發生了錯誤, 且驅動需要進行適當清理
 
 
 
如果驅動已經對 urb 使用完畢, 必須調用 usb_free_urb 函數,釋放urb。函數原型:
void usb_free_urb(struct urb *urb);
 
 
 
根據內核源碼,可以通過自己kmalloc一個空間來創建urb,然后必須使用
void usb_init_urb(struct urb *urb);
 
 
 
進行初始化后才可以繼續使用。 
其實usb_alloc_urb函數就是這樣實現的,所以我當然不推薦這種自找麻煩的做法。  
初始化 urb 
static inline void usb_fill_int_urb(struct urb *urb,
static inline void usb_fill_bulk_urb(struct urb *urb,
static inline void usb_fill_control_urb(struct urb *urb,
//struct urb *urb :指向要被初始化的 urb 的指針
/*等時 urb 沒有初始化函數,必須手動初始化,以下為一個例子*/
 
 
 
其實那三個初始化函數只是簡單的包裝,是inline函數。所以其實和等時的urb手動初始化沒什么大的區別。 
提交urb 
一旦 urb 被正確地創建并初始化, 它就可以提交給 USB 核心以發送出到 USB 設備. 這通過調用函數 usb_submit_urb 實現:
int usb_submit_urb(struct urb *urb, gfp_t mem_flags);
/*因為函數 usb_submit_urb 可被在任何時候被調用(包括從一個中斷上下文), mem_flags 變量必須正確設置. 根據 usb_submit_urb 被調用的時間,只有 3 個有效值可用:
GFP_NOIO 
GFP_KERNEL 
 
 
 
在 urb 被成功提交給 USB 核心之后, 直到結束處理例程函數被調用前,都不能訪問 urb 結構的任何成員.    
urb結束處理例程 
如
取消 urb 
使用以下函數停止一個已經提交給 USB 核心的 urb:
void usb_kill_urb(struct urb *urb)
 
 
 
如果調用usb_kill_urb函數,則 urb 的生命周期將被終止. 這通常在設備從系統移除時,在斷開回調函數(disconnect callback)中調用.
                            總結 
                            
                                以上是生活随笔 為你收集整理的linux usb 驱动详解 的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。