基於Linux的USB子系統學習,linuxusb子系統
一、參考資料
1.《USB基礎知識概論》
http://www.crifan.com/files/doc/docbook/usb_basic/release/html/usb_basic.html
2.《USB in a NutShell》
http://www.beyondlogic.org/usbnutshell/usb1.shtml
3.《USB開發大全(第四版)》
http://download.csdn.net/download/qqqq419276485/7839403
二、USB基礎知識
2.1 USB硬體知識
從物理上的邏輯結構來說,USB裝置包含了主機Host端和裝置Device端。其中,主機Host端,有對應的硬體的USB的主機控制器Host Controller;而裝置端,串連的是對應的USB裝置。USB的主機控制器有四種類型,分別是OHCI和UHCI,EHCI,和xHCI,它們之間的區別和聯絡如下表所示。
USB2.0的標準介面引腳定義如下,包含一根電源線,一根地線,兩根訊號線。USB3.0的介面引腳較多,在此不再展開,可參考文章《USB 2.0 A型、B型、Mini和Micro介面定義及封裝》 和《USB 3.0連接器引腳、介面定義及封裝尺寸》。值得一提的是,目前多數手機廠商已宣布統一使用Micro USB介面作為手機充電器標準介面。
2.2 USB軟體知識
要使USB裝置正常工作,除了硬體之外,還需要軟體的支援。對於USB裝置端來說,內部是需要有對應的裝置端驅動,稱其為韌體Firmware,它實現了裝置端USB所要做的事情,主要是相應一些標準的請求,完成對應的資料讀取和寫入等。對應的,在主機Host端,也需要對應的驅動,此部分驅動,不論是Linux下,還是Windows下,都已經實現了常見的驅動了,所以一般來說,很少需要驅動開發人員再去寫相關的驅動。
在裝置驅動開發階段或者USB出現問題,需要調試的時候,往往就需要一些USB調試工具了。一般來說,都包含了對應的USB硬體測試載入器,加上對應的軟體工具,去捕獲對應USB匯流排上的資料,即所謂的USB抓包,然後再去分析抓取出來的資料,是否是期望的,是否符合USB協議的規範定義。另外,當然也有一些USB開發相關的工具,具體工具可在網上查詢。
三、USB協議概覽
關於USB 2.0和USB 3.0等USB的協議規範,可以去官網下載:
http://www.usb.org/developers/docs/
USB協議的文檔頁數很多,沒必要看完整個USB標準。此處,就來簡單以USB 2.0規範為例,分析一下,具體其都主要包含哪些內容。你會發現,其實和USB協議本身相關的內容,相對則不會那麼多,大概只有97頁左右的內容,是我們所要關心的。
附錄1:USB 2.0標準協議規範筆記
第4章 架構概述
本章顯示了通用序列匯流排(Universal Serial Bus, USB)架構和重要概念的概述。USB是一種有線匯流排,支援主機電腦和大範圍同時可訪問的外設之間資料互動。附屬的外設通過一種主機調度和基於令牌的協議共用USB頻寬。匯流排允許外設在主機和其它外設在操作時依附,配置,使用和分離。
4.1 USB系統描述
USB系統被描述為三種定義域:
> USB互連
> USB裝置
> USB主機
USB互連是USB裝置和主機之間串連與通訊的方式。包括下列部分:
> 匯流排拓撲:USB裝置與主機之間的串連模型。
> 內層聯絡:In terms of a capability stack, the USB tasks that are performed at each layer in the system.
> 資料流模型:系統中資料通過USB在產生者與消費者之間移動的方式。
> USB調度:USB提供了共用的內部串連。訪問內部串連是被調度的,為的是支援同步資料轉送並消除仲裁開銷。
4.1.1 匯流排拓撲
USB物理層內部串連是一種分層的星狀拓撲。USB hub位於每個星的中心。圖4-1闡述了USB的拓撲。
由於對於hub和線纜傳播時間的所允許時間的約束,所允許
最大的層次數是七層(包括root層)。由於七層的約束,主機和任何裝置之間的一條通訊線路中最多支援5個非root hub。4-1中的組合裝置,佔據了兩層,因此如果依附在第七層,它不能被使能。在第七層,只有功能(即圖中所表示的Func)可以被使能。
第5章 USB資料流模型
5.1 實現者視角
圖5-2顯示了一個較深的USB視圖,特別的,有四個重點實現地區:
> USB物理裝置:USB線尾端的一小塊硬體,執行一些有用的終端使用者功能。
> 用戶端軟體:在主機端執行的軟體,響應USB裝置。這個用戶端軟體典型地由作業系統提供或伴隨USB裝置提供。
> USB系統軟體:在特定作業系統中支援USB的軟體。USB系統軟體典型地由作業系統提供,獨立於特定的USB裝置或用戶端軟體。
> USB主機控制器(主機端匯流排介面):使得USB裝置可以被串連到主機的硬體和軟體。
5-2所示,主機到裝置的簡單串連需要許多層與實體之間的互動。USB匯流排介面層提供主機與裝置間的物理/訊號/資料包的串連性。USB裝置層是USB系統軟體具有的視角,為的是與裝置間執行通常的USB操作。功能層通過一個恰當匹配的用戶端軟體層,向主機提供附加的能力。從層內視角來看,USB裝置層和功能層都有一個邏輯上的通訊,而實際上使用的是USB匯流排介面層來完成資料轉送。
物理視角的USB通訊如章節6、7和8中所描述,與章節9和10所講述的邏輯視角通訊有關聯。本章講述這些影響USB實現者的關鍵概念,應該被所有人閱讀。
為了描述和管理USB通訊,下列概念是重要的:
> 匯流排拓撲:5.2講述了USB主要的物理和邏輯組件,以及它們如何相互關連。
> 通訊流模型:5.3到5.8講述了主機與裝置間通過USB是如何通訊的,定義了四種USB傳輸類型。
> 匯流排訪問管理:5.11講述了主機內的匯流排訪問是如何被管理的,以支援USB裝置大範圍的通訊流。
> 等時傳輸的特殊考慮:5.12講述了USB對於需要等時資料轉送裝置的特殊性。對於非等時傳輸的裝置實現著不需要閱讀5.12。
5.2 匯流排拓撲
USB拓撲有四個主要部分:
> 主機與裝置:USB系統的主要組件
> 物理拓撲:USB單元如何串連
> 邏輯拓撲:多種USB單元的角色和職責,從主機和裝置視角來看USB如何呈現
> 用戶端軟體到功能的關聯:用戶端軟體同與它相關的USB裝置上的功能介面之間的如何看待彼此
5.2.1 USB主機
USB邏輯組成5-3所示,包含下列部分:
> USB主機控制器
> 整合的USB系統軟體(USB驅動,主機控制器驅動和主機軟體)
> 用戶端
USB主機作為USB的協調實體佔據了一個獨特的位置。除了它特殊的物理層位置,主機對於USB以及他所附屬的裝置具有專門職責。主機控制所有對USB的訪問。USB裝置僅當被主句准許訪問時才能獲得對匯流排的訪問。主機也負責監視USB的拓撲。主機以及職責的完整討論,參考章節10。
5.2.2 USB裝置
USB物理裝置的邏輯構成5-4所示,包含下列部分:
> USB匯流排介面
> USB邏輯裝置
> 功能
USB物理裝置對主機提供附加功能。USB裝置提供的功能類型非常廣泛。然而,所有的USB邏輯裝置對主機呈現了相同的基本介面。這允許主機以相同的方式管理不同USB裝置的USB相關方面。
為協助主機識別和配置USB裝置,每個裝置攜帶並報告配置相關資訊。所報告資訊的一部分對於所有邏輯裝置是相同的。其它資訊與裝置提供的功能相關。這種資訊的詳細格式非常多,取決於裝置的裝置類。USB裝置的完整討論參考章節9。
5.2.3 物理匯流排拓撲
USB上的裝置物理上通過一個分層的星狀拓撲串連,5-5中所闡述。USB依附點由一種被稱為集線器(hub)的特殊USB裝置類所提供。集線器提供的附加依附點被稱為連接埠(port)。主機中嵌入的集線器被稱為根集線器(root hub)。主機通過根集線器提供一個或多個依附點。提供給主機附加功能的USB裝置被稱為功能(function)。為了防止迴圈依附,分層的順序被施加在USB的星形拓撲。
5.2.4 邏輯匯流排拓撲
當裝置物理上依附到分層、星狀拓撲的USB,主機與每個邏輯裝置通訊有如它是被直接連接到根連接埠的,5-7所示,對應於圖5-5中所示的物理拓撲。集線器也是邏輯裝置,但為了簡化圖沒有在圖5-7中顯示。儘管絕大多數主機/邏輯裝置活動使用這一邏輯視圖,主機維護一個物理拓撲來支援移除集線器時的處理。當一個集線器被移除,所有依附於該集線器的裝置必須從主機視角的邏輯拓撲中被移除。
5.2.5 用戶端軟體到功能的關聯
儘管USB的物理和邏輯拓撲反映了匯流排的共用本性,但是用戶端軟體(CSw)操作USB功能介面被呈現為它只處理它感興趣的介面。圖5-8闡述了裝置設計者視角的用戶端軟體與USB功能之間的關係。
5.3 USB通訊流
USB提供了主機上軟體與它的USB功能之間的通訊服務。功能可以有針對不同的用戶端到功能互動的不同的通訊流需求。USB提供了更好的總體匯流排利用率,通過允許不同的通訊流到USB功能的分隔。每個通訊流利用一些訪問的匯流排來完成用戶端與功能之間的通訊。每個通訊流在裝置上的一個端點被終止。裝置端點被用於識別通訊流。
圖5-9顯示了圖5-2的一個更為詳細的視圖。圖5-2所支援的邏輯裝置和功能層通訊流的實際通訊流的完整定義。這些實際通訊流跨越幾個介面邊界。兩個主機端的軟體介面如下:
> 主機控制器驅動(Host Controller Driver, HCD):USB主機控制器與USB系統軟體之間的軟體介面。這個介面允許一定範圍內的主機控制器實現,而不需要所有的主機軟體依賴於任何特定實現。一個USB驅動可以支援不同的主機控制器,而不需要主機控制器實現的特定知識。主機控制器是實現者提供一個HCD實現來支援主機控制器。
> USB驅動(USB Driver, USBD):USB系統軟體與用戶端軟體之間的介面。這個介面提供給用戶端方便的函數來操作USB裝置。
USB邏輯裝置對於USB系統來講是端點的集合。端點分組成端點集來實現一個介面。介面被視為功能。USB系統軟體使用預設控制管道來管理裝置。用戶端軟體使用管道束(與一個端點集相關聯)操作一個介面。用戶端軟體請求資料通過USB在主機上的緩衝和USB裝置上的端點之間移動。主機控制器(或者是USB裝置,取決於傳輸方向)打包資料通過USB移動資料。
圖5-10闡述了端點與主機端記憶體緩衝之間如何通過管道傳遞通訊流的。
主機上的軟體通過一個通訊流集合與邏輯裝置進行通訊。通訊流的集合被裝置軟體/硬體設計者選擇來高效匹配裝置的通訊需求。
linux USB驅動資料
《LINUX裝置驅動程式》
USB骨架程式(usb-skeleton),是USB驅動程式的基礎,通過對它源碼的學習和理解,可以使我們迅速地瞭解USB驅動架構,迅速地開發我們自己的USB硬體的驅動。
前言
在上篇《Linux下的硬體驅動--USB裝置(上)(驅動配製部分)》中,我們知道了在Linux下如何去使用一些最常見的USB裝置。但對於做系統設計的程式員來說,這是遠遠不夠的,我們還需要具有驅動程式的閱讀、修改和開發能力。在此下篇中,就是要通過簡單的USB驅動的例子,隨您一起進入 USB驅動開發的世界。
USB驅動開發
在掌握了USB裝置的配置後,對於程式員,我們就可以嘗試進行一些簡單的USB驅動的修改和開發了。這一段落,我們會講解一個最基礎USB架構的基礎上,做兩個小的USB驅動的例子。
USB骨架
在Linux kernel源碼目錄中driver/usb/usb-skeleton.c為我們提供了一個最基礎的USB驅動程式。我們稱為USB骨架。通過它我們僅需要修改極少的部分,就可以完成一個USB裝置的驅動。我們的USB驅動開發也是從她開始的。
那些linux下不支援的USB裝置幾乎都是生產廠商特定的產品。如果生產廠商在他們的產品中使用自己定義的協議,他們就需要為此裝置建立特定的驅動程式。當然我們知道,有些生產廠商公開他們的USB協議,並協助Linux驅動程式的開發,然而有些生產廠商卻根本不公開他們的USB協議。因為每一個不同的協議都會產生一個新的驅動程式,所以就有了這個通用的USB驅動骨架程式, 它是以pci 骨架為模板的。
如果你準備寫一個linux驅動程式,首先要熟悉USB協議規範。USB首頁上有它的協助。一些比較典型的驅動可以在上面發現,同時還介紹了USB urbs的概念,而這個是usb驅動程式中最基本的。
Linux USB 驅動程式需要做的第一件事情就是在Linux USB 子系統裡註冊,並提供一些相關資訊,例如這個驅動程式支援那種裝置,當被支援的裝置從系統插入或拔出時,會有哪些動作。所有這些資訊都傳送到USB 子系統中,在usb骨架驅動程式中是這樣來表示的:
static struct usb_driver skel_driver = {
name: "skeleton",
probe: skel_probe,
disconnect: skel_disconnect,
fops: &skel_fops,
minor: USB_SKEL_MINOR_BASE,
id_table: skel_table,
};
變數name是一個字串,它對驅動程式進行描述。probe 和disconnect 是函數指標,當裝置與在id_table 中變數資訊匹配時,此函數被調用。
fops和minor變數是可選的。大多usb驅動程式鉤住另外一個驅動系統,例如SCSI,網路或者tty子系統。這些驅動程式在其他驅動系統中註冊,同時任何使用者空間的互動操作通過那些介面提供,比如我們把SCSI裝置驅動作為我們USB驅動所鉤住的另外一個驅動系統,那麼我們此USB裝置的 read、write等操作,就相應按SCSI裝置的read、write函數進行訪問。但是對於掃描器等驅動程式來說,並沒有一個匹配的驅動系統可以使用,那我們就要自己處理與使用者空間的read、write等互動函數。Usb子系統提供一種方法去註冊一個次裝置號和file_operations函數指標,這樣就可以與使用者空間實現方便......餘下全文>>
怎學習 linux下usb開發
你說的是USB的驅動開發嗎?如果是的話,可以推薦一本《Linux裝置驅動開發》。這裡面從最簡單的字元裝置一直到網路裝置,也包括USB開發,都介紹的很詳細,值得學習哦。