Linux USB架構
可以看出一個USB體系需要4個驅動:USB設備驅動(主要編寫這部分),USB主控制器驅動,Gadget驅動,UDC驅動。
USB主要有4個功能:
MassStorage:大容量存儲,如硬盤,U盤。
USB-HID:人體接口設備,鼠標,鍵盤。
RNDIS:網卡。
CDC-ACM:u轉串口。
USB描述符:
USB驅動程序位於不同的內核子系統和USB主控制器之間,USB核心為USB驅動提供了用於訪問和控制USB硬件的軟件接口,使得USB設備驅動程序不必考慮USB硬件控制器。
從上圖看,一個USB驅動是對應一個接口的,所以一個設備可能有多個驅動。
USB總線驅動與設備
驅動結構體
一個USB驅動使用struct usb_driver來描述(每種總線都有driver這種結構):
而上圖中設備列表中的usb_device_id如下:
填充上面的ip_table需要定義通過USB_DEVICE來定義一種USB設備的USB_DEVICE(vend,prod)
上面是定義一種,下面的宏是定義一類
注冊驅動:
設備結構體
配置描述符:
配置結構體:
Linux內核使用Struct usb_host_config來描述一個USB配置:
配置描述符結構體:
接口描述符:
接口結構體:
Linux kernel使用struct usb_interface來描述usb接口:
接口設置結構體
設置和配置是有區別的:
一個配置包含一個或多個接口
一個接口包含一個或多個設置
下面是一個例子:
Linux kernel使用struct usb_host_interface來描述USB接口設置:
接口描述符結構體
端點描述符:
端點結構體
Linux kernel使用struct usb_host_endpoint來描述USB端點:
端點描述符結構體
Linux內核使用struct usb_endpoint_decriptor來對USB描述符中的端點描述符進行描述
URB:
USB請求塊是USB設備驅動中用來描述與USB設備通信所用的基本載體和核心數據結構,非常類似於網絡設備驅動中的sk_buff結構體,是USB主機與設備通信的“電波”。
URB處理的流程如下:
1. USB設備驅動程序創建並且初始化一個訪問特定USB設備特定端點的urb,並提交給USB core;
2. USB core提交該urb到USB主控制器驅動程序;
3. USB主控制器驅動程序根據該urb描述的信息,來訪問USB設備。
4. 當設備訪問結束后,USB主控制器驅動程序通知USB設備驅動程序。
流程一
創建urb:
初始化URB:
流程二
流程三,流程四: