匯流排驅動是不用改的。核心都幫我們做好了。為了了解整個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控制器都會自帶乙...