1.LINUX USB架構
USB通訊都是由host端發起的。USB裝置驅動程式分配並初始化一個URB發給USB Core,USB Core改一改,發給USB主機控制器驅動,USB主機控制器驅動把它解析成包,在匯流排上進行傳送。USB Core是由核心實現的,其實也就是把host control driver裡的功能更集中的向上抽象了一層,它是用來對最上層的USB裝置驅動屏蔽掉host control的不同。
2.在核心中的位置
USB驅動程式存在於不同的核心子系統和USB硬體控制器之中。USB核心為USB驅動程式提供了一個用於訪問和控制USB硬體的介面。而不必考慮系統當前存在的各種不同類型的USB硬體控制器。
3.USB裝置的構成,包括配置,介面和端點
描述了linux USB裝置的結構層次。每一個interface代表一個功能,對應有一個驅動程式。
4.USB裝置驅動描述
在linux核心中,使用structusb_driver結構描述一個USB驅動。
struct usb_driver {
const char *name; /* 驅動程式名 */
/* 當USB核心發現了該驅動能夠處理的USB介面時,調用該函數 */
int (*probe) (structusb_interface *intf,
const struct usb_device_id *id);
/* 當相應的USB介面被移除時,調用該函數*/
void (*disconnect)(struct usb_interface *intf);
/* USB驅動能處理的裝置列表 */
const structusb_device_id *id_table;
……
};
USB裝置的枚舉過程和我們通常看到裝置稍有不同,比如I2C裝置,我們需要在板檔案中去註冊I2C裝置的資訊(比如裝置名稱和一些硬體設定資訊),而USB匯流排會自動去枚舉USB裝置,只要能與id_table匹配,就能枚舉成功,然後載入相應的驅動程式。
5.USB裝置描述
Linux核心使用struct usb_device來描述一個USB裝置
struct usb_device {
int devnum; /*USB裝置號*/
char devpath[16]; /* 裝置ID字串 */
enum usb_device_state state; /* 裝置狀態:未串連,已配置*/
enum usb_device_speed speed; /* 高速,全速,低速*/
struct usb_device*parent;
struct usb_bus *bus;
structusb_host_endpoint ep0;
struct device dev;
structusb_device_descriptor descriptor; /* USB裝置描述符,根據USB協議來定義的*/
struct usb_host_config*config;
struct usb_host_config*actconfig;
structusb_host_endpoint *ep_in[16];
structusb_host_endpoint *ep_out[16];
/* static strings fromthe device */
char *product; /* 產品號 */
char *manufacturer; /* 生產商 */
char *serial; /* 裝置串號 */
};
6.USB描述符
在linux 核心中定義一下幾種描述符結構體,都是嚴格按照USB協議來定義:
裝置描述符:關於裝置的通用資訊,如生產商ID,產品ID等;
配置描述符:此配置中的介面數,支援的掛起和恢複能力以及功率要求;
介面描述符:介面類,子類和適用的協議,介面備用配置的數位和端點數目;
端點描述符:端點地址,方向和類型,支援的最大包大小,如果是中斷類型的端點則還包括輪詢頻率。
字串描述符:在其他描述符中會為某些欄位提供字串索引,他們可悲用來檢索描述性字串。
7.URB
USB請求塊(USBrequest block,URB)是USB裝置驅動中用來描述與USB裝置通訊所用的基本載體和核心資料結構,非常類似於網路裝置驅動中的sk_buff結構體。
1. USB裝置驅動程式建立並初始化一個訪問特定USB裝置特定端點的URB,並提交給USB core;
2. USB core提交該URB到USB主控制器驅動程式;
3. USB主控制器驅動程式根據該URB描述的資訊,來訪問USB裝置;
4. 當裝置訪問結束後,USB主控制驅動程式通知USB裝置驅動程式。