USB驅動程式分析

2021-07-04 19:55:27 字數 3277 閱讀 8107

1.對於每個pc來說,都有乙個或者多個稱為主機(host)控制器的裝置,該主機控制器和乙個根集線器(hub)作為乙個整體。

2.每個host控制器其實就是乙個pci裝置,掛載在pci匯流排上。驅動開發人員應該給host控制器提供驅動程式,用usb_hcd結構體表示。

3.usb host控制器都會自帶乙個集線器,稱為根集線器,其又可接子集線器。

4.usb裝置是插在usb匯流排上工作的裝置,廣義上講hub也算是usb裝置。

5.usb驅動有usb主機控制器驅動和usb裝置驅動組成,前者驅動晶元上的主機控制器,後者驅動具體的usb裝置。

6.通常計算機的cpu不是直接和usb裝置通訊,而是和主機控制器通訊。cpu先傳送指令給主機控制器,後者指揮usb裝置完成相應的任務。

7.usb主機控制器驅動用hc_driver表示,其在/drivers/usb/core/hcd.h中定義。

8.usb核心層(usb core)負責對usb裝置的整體控制,包括實現usb主機控制器到usb裝置之間的資料通訊。

9.usb裝置驅動用usb_device 表示,主要用來將usb裝置掛接到usb核心中,並啟動usb裝置。對裝置的具體讀寫操作放在usb_driver中的usb_class_drivers成員來實現,該成員定義了乙個file_operations結構體,用來對裝置進行讀寫操作。

10.usb裝置和usb驅動之間進行通訊需要usb裝置韌體和usb協議二者。韌體指的是「固化的軟體」,固化在積體電路內部的程式,負責控制和協調積體電路,並且在裝置和匯流排之間收發資料。驅動則有二個(已提及)。

11.大部分驅動程式都在drivers目錄下,usb目錄包含了所有usb裝置的驅動。在usb目錄下有乙個重要的storage目錄,存放了usb裝置驅動的**。

12.linux核心原始碼中幾乎每個目錄下都有乙個makefile檔案和kconfig檔案。makefile定義哪些檔案需要編譯,哪些不需要編譯;kconfig檔案用來組織需要編譯入核心的模組和功能,其給使用者提供乙個選擇配置核心的機會。

13.linux裝置驅動模型中概念:匯流排(bus)、裝置(device)、驅動(driver)。這三個資料結構在linux核心原始碼中分別對應struct bus_type,struct device,struct device_driver.

14.linux系統中匯流排的概念和時間物理主機中匯流排概念不同。實際物理匯流排入資料匯流排和位址匯流排等。linux中匯流排是與物理匯流排相對應的資料結構。如usb匯流排、scsi匯流排、pci匯流排,分別對應usb_bus_type,scsi_bus_type,pci_bus_type變數,他們的型別都是bus_type

15.linux將usb匯流排和兩個鍊錶聯絡起來,乙個是drivers_kset,另乙個是devices_kset.前者表示連線到該匯流排上的所有驅動程式,後者表示連線到匯流排上的所有裝置。當有新裝置新增入系統時,系統為裝置分配乙個struct device資料結構,並將其掛接到devices_kset鍊錶中。而每當驅動註冊時會將自己在匯流排上註冊,並連線到匯流排的驅動鏈表中。這時驅動會遍歷匯流排的裝置鍊錶,尋找自己合適的裝置。

16.usb裝置驅動使用usb_driver結構體表示。這個結構體成員:name欄位是指向驅動程式名字的指標。probe函式指向usb驅動程式的探測函式。當有usb裝置插入時,usb核心層會呼叫該函式進行裝置的初始化工作。disconnect函式指向usb驅動的斷開函式,當驅動程式從核心中解除安裝時,會呼叫它做一些解除安裝工作。ioctl函式用來對裝置進行控制的函式。id_table表包含了驅動支援的裝置列表。

17.如何知道驅動支援哪些裝置呢?通過usb_driver結構體中的id_table成員完成這個功能。它描述了所有支援的usb裝置列表,它指向乙個usb_device_id陣列。usb_device_id結構體包含了usb裝置的相關資訊。

18.定義完usb_driver結構體變數後呼叫usb_register函式向usb核心層註冊usb裝置驅動,它將usb驅動掛接到usb匯流排上,並開始遍歷usb匯流排上的所有裝置。

19.通過呼叫usb_deregister函式對裝置驅動進行登出。

20.usb_driver結構體中的probe函式原型:int (*probe) (struct usb_inte***ce *intf,const struct usb_device_id *id);第乙個引數usb_inte***ce是驅動中最重要的乙個結構體,代表裝置的一種功能,在usb驅動中只有乙個。

21.usb協議規定,usb裝置的邏輯結構包含裝置、配置、介面、端點。每一項只是軟體上劃分而已,分別用usb_device,usb_host_config,usb_inte***ce,usb_host_endpoint表示。乙個usb裝置(包括復合裝置)用usb_device結構體表示,而且只有乙個。乙個配置是一組不同功能的組合,多個配置之間相互切換。介面代表乙個基本的功能。usb核心層在裝置插入時會讀取usb裝置介面的資訊,並建立乙個usb_inte***ce的結構體,接著核心層在匯流排上找到合適的驅動後,呼叫probe函式並傳入。

22.端點(usb_host_endpoint)。主機只能通過端點和usb裝置通訊,只能單向傳輸。u盤有輸出端點、輸入端點和控制端點。控制端點為端點0,控制初始化工作,必不可少。usb_host_endpoint結構體定義中的成員:struct usb_endpoint_descriptor desc;//端點描述符,必不可少 struct list_head urb_list;//端點要處理的urb佇列,urb(usb request block)包含了傳輸的所有資訊

23.usb_endpoint_descriptor為端點描述符。

24.端點的四種通訊方式:控制傳輸、中斷傳輸、批量傳輸、等時傳輸。

端點定義為:

struct usb_endpoint_descriptor

__attribute__ ((packed));//__attribute__ ((packed))是乙個編譯選項,告訴編譯器,這個結構的元素都是一位元組對齊的,不需要填充位。

25.介面描述符:

struct usb_inte***ce_descriptor

__attribute__ ((packed)); 

//__attribute__,意思就是告訴編譯器,這個結構的元素都是1位元組對齊的,不要再新增填充位了。

26.urb傳輸過程

驅動程式要進行資料傳輸時,需要分配並初始化乙個urb結構體,將其提交給usb核心層。usb核心層對urb進行解析,將控制資訊提交給主機控制器,由主機控制器負責資料到裝置的傳輸,當資料回傳到主機控制器後,會**給usb核心,喚醒等待的驅動程式,由驅動程式完成剩下的工作。

分配urb函式usb_alloc_urb()

銷毀urb函式usb_free_urb()

提交urb函式usb_submit_urb()

USB裝置驅動程式

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

USB驅動程式的匹配分析

2012 09 19 01 30 39 分類 舉報 字型大小訂閱 static struct usb device id usb mouse id table define usb inte ce info cl,sc,pr match flags usb device id match int i...

USB裝置驅動程式導讀

隨著 usb裝置的不斷增加,我們這些開發人員也就多了對 usb裝置進行驅動程式開發的工作。但是對於很多初學者來說,存在以下三個困難 一是對wince 的驅動程式結構了解得太少,沒辦法得心應手的專注於驅動程式的開發工作 二是對wince 自帶的usb 驅動程式的例子沒有弄懂,看到一大堆資料夾結構和源程...