大話USB驅動之匯流排驅動程式

2021-09-08 04:41:01 字數 2116 閱讀 7877

匯流排驅動是不用改的。核心都幫我們做好了。為了了解整個usb驅動的體系,我們來分析一下匯流排驅動程式。

一.匯流排框圖

匯流排的圖畫的已經很清楚了,這篇部落格我們分析的是左邊的程式,在下篇我們想通過usb鍵盤這一實際樣例來解說。

二.程式實現

1. 因為**太多且關係複雜這裡僅僅列出呼叫的函式(沒有寫引數)。從插入usb裝置,到呼叫usb裝置驅動程式,這一過程。

hub_irq()                //當我們接上usb的時候,因為硬體上會產生乙個高電平,所以主機控制器會產生中斷

kick_khubd() //喚醒執行緒

hub_thread() //執行緒

hub_events() //事件

hub_port_connect_change() //埠連線發生變化

udev = usb_alloc_dev(hdev, hdev->bus, port1); // 分配乙個udev結構體

dev->dev.bus = &usb_bus_type; //usb匯流排

choose_address(udev); // 給新裝置分配編號(位址)

hub_port_init() //埠初始化

hub_set_address // 把編號(位址)告訴usb裝置

usb_get_device_descriptor(udev, 8); // 獲取裝置描寫敘述符

retval = usb_get_device_descriptor(udev, usb_dt_device_size);//再次獲得一次

usb_new_device(udev) //新建usb裝置

err = usb_get_configuration(udev); //獲得配置。把全部描寫敘述符都讀出來並解析

usb_parse_configuration() //解析

device_add() // 把device放入usb_bus_type的dev鍊錶,

// 從usb_bus_type的driver煉表裡取出usb_driver,

// 把usb_inte***ce和usb_driver的id_table比較

// 假設能匹配,呼叫usb_driver的.probe

2.匯流排驅動程式都做了什麼

a. 識別usb裝置

1. 分配位址

choose_address(udev); // 給新裝置分配編號(位址)
2. 並告訴usb裝置(set address)

hub_set_address  // 把編號(位址)告訴usb裝置
3. 發出命令獲取描寫敘述符(描寫敘述符的資訊能夠在include\linux\usb\ch9.h看到)

retval = usb_get_device_descriptor(udev, usb_dt_device_size);
b. 查詢並安裝相應的裝置驅動程式

device_add()。
c. 提供usb讀寫函式

雖然usb本身所屬裝置驅動的結構與不掛在usb匯流排上時全然同樣,可是在訪問方式上卻發生了非常大的變化。比如。對於字元裝置驅動而言。雖然仍然是write(), read(), ioctl()這些函式,可是在這些函式中,與usb裝置通訊時不再是i/o記憶體和i/oport的訪問,而貫穿始終的是稱為urb的usb請求塊,這些請求塊通過usb匯流排驅動提供的讀寫等介面進行操作。

USB學習之二 USB匯流排驅動程式

usb匯流排驅動程式的作用 1.識別usb裝置 1.1 分配位址 1.2 並告訴usb裝置 set address 1.3 發出命令獲取描述符 描述符的資訊可以在include linux usb ch9.h看到 2.查詢並安裝對應的裝置驅動程式 3.提供usb讀寫函式 將乙個usb裝置接到開發板上...

USB裝置驅動程式

一.usb載入式流介面驅動要點分析 為了支援不同型別的外圍裝置,wince平台提供了具有定製介面的流介面驅動程式模型。因為大部分usb外圍裝置由於功能性更適合流介面驅動的結構,所以一般都採用載入式流介面驅動程式模型來開發usb裝置驅動程式。1 usb系統結構分析 wince下usb系統軟體由兩層組成...

USB驅動程式分析

1.對於每個pc來說,都有乙個或者多個稱為主機 host 控制器的裝置,該主機控制器和乙個根集線器 hub 作為乙個整體。2.每個host控制器其實就是乙個pci裝置,掛載在pci匯流排上。驅動開發人員應該給host控制器提供驅動程式,用usb hcd結構體表示。3.usb host控制器都會自帶乙...