USB驅動模型網絡
1.USB host controller driver(主控器驅動):爲USB主控制器提供驅動程序數據結構
2.USB core(USB核心):鏈接USB主控制器驅動和USB設備驅動函數
3.USB client driver:爲USB外部設備提供驅動程序設計
USB設備模型指針
device(設備)->config(配置)->interface(接口)->endpoint(端點),構成了USB設備的四個層次。一個usb driver(驅動)對應的是一個interface(接口)。一個接口對應一個基本功能。接口
在Linux內核中,使用struct usb_driver結構描述一個usb驅動。遊戲
struct usb_driver{ip
const char *name; //驅動設備名內存
int (*)probe(struct usb_interface *intf, const struct usb_device_id *id); //當USB核心發現了該驅動可以處理USB接口時,調用該函數it
void (*disconnect)(struct usb_interface *intf); //當相應的USB接口被移除時,調用該函數
const struct usb_device_id *id_table; //USB驅動可以處理的設備列表
};
URB通信模式
主機向設備發出請求,而後設備響應請求。發起請求的源是usb client driver,而後提供給usb core,接着傳給usb host controller driver,最後經過主控制器發給usb設備。主控器收到響應後按原路返回,交給usb client driver。USB請求是經過內核中的URB來描述的。
USB請求塊(USB request block-URB)是USB設備驅動中用來與USB設備通訊所用的基本載體和核心數據結構,很是相似於網絡設備驅動中的sk_buff結構體,是USB主機與設備通訊的電波。
URB使用方法
1.USB設備驅動程序建立並初始化一個訪問特定端口的urb,並提交給USB core
2.USB core提交該urb到USB主控制器驅動程序。
3.USB主控器驅動程序根據該urb描述信息,來訪問USB設備。
4.當設備訪問結束後,USB主控制器驅動程序按原來返回,經過usb core來通知USB設備驅動程序。
1.建立URB
struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags)
參數:
iso_packets:urb所包含的等時數據包個數
mem_flags:內存分配標識(如GFP_KERNEL),參考kmalloc
2.初始化URB
對於中斷urb,使用usb_fill_int_urb函數來初始化
對於批量urb,使用usb_fill_bulk_urb函數來初始化
對於控制urb,使用usb_fill_control_urb函數來初始化
對於等時urb,只能手動初始化urb
static inline void usb_fill_int_urb(
struct urb *urb, //待初始化的urb
struct usb_device *dev, //urb所要訪問的設備
unsigned int pipe, //要訪問的端點所對應的管道
void *transfer_buffer, //保存傳輸數據的buffer
int buffer_length, //buffer長度
usb_complete_t complete_fn, //urb完成時調用的函數
void *context, //賦值到urb->context的數據
int interval //urb被調度的時間間隔
)
3.提交URB
在完成urb的建立和初始化後,USB驅動須要將urb提交給USB核心。
int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
參數:
urb:要提交的urb指針
mem_flags:內存分配標識(如GFP_KERNERL),參考kmalloc
URB被提交到USB核心後,USB核心指定usb主控制器驅動程序來處理該urb。處理完成以後,urb完成函數將被調用。
HID協議
HID(Human Interface Device)是屬於人機交互的設備。如USB鼠標,USB鍵盤,USB遊戲操縱桿等。這類設備必須遵循HID設計規範。
HID設備如何把數據報給主機
設備經過4個字符的報告描述符把數據回傳給主機