usb驅動開發1之學習準備
出處:http://www.cnblogs.com/myblesh/p/3634702.html
此係列是http://blog.csdn.net/fudan_abc/博文的整理,同時加入了自己的理解。很敬佩fudan_abc的文章,仔細學習和分析受益很多。注:fundan_abc所分析linux核心程式碼所用的版本是2.6.22.6。
Q:學習linux下的usb通訊要怎樣進行?
熟悉linux驅動開發,同時需要了解usb協議規範,對照linux下的usb驅動程式碼慢慢分析和學習
Q:為什麼要開發usb?
在usb出現以前,裝置介面多樣化(有串列埠、並口等),而usb可以實現這些介面的統一和標準化,USB是為了解決速度、擴充套件能力、易用性應景而生的
Q:usb規範的發展經歷了哪些?
Usb的發展經歷了1.0、1.1、2.0(在2009年之前)三個階段。控制器OHCI和UHCI雖然支援的都是1.1的控制器,但是支援的硬體範圍不一樣。每個USB2.0 控制器帶有3個晶片,根據裝置的識別方式將訊號傳送到正確的控制晶片。我們可以將1.1裝置連線到2.0的控制器上使用,不過它只能達到1.1的速度。同時也可以將2.0的裝置連線到1.1的控制器上,不過不能指望它能以2.0的速度執行。ehci-hcd模組支援的是USB2.0控制器的高速模式.(參考Linux對USB1.1和2.0都是支援的,通過看drivers/usb/host目錄下的Kconfig檔案,我們可以知道核心裡支援的控制器。)
Q:usb匯流排拓撲什麼結構?
樹形結構
Q:usb資料怎樣傳輸?
USB大樹要想茁長成長也離不開USB協議。USB匯流排是一個單主方式的實現,是一種輪詢方式的匯流排。協議規定所有的資料傳輸都必須由主機發起,host controller初始化所有的資料傳輸,各種裝置緊緊圍繞在主機周圍。
USB通訊最基本的形式是通過USB裝置裡一個叫endpoint的端點(可以理解為硬體暫存器或者buff),而主機和endpoint之間的資料傳輸是通過pipe,pipe通訊有兩種,一種是stream,另一種是message,協議中規定:message管道要求從它那兒過的資料必須具有一定的格式,message管道必須對應兩個相同號碼的端點,一個用來in,一個用來out,我們們的預設管道就是message管道,當然,與預設管道對應的端點0就必須是兩個具有同樣端點號0的端點。
Q:usb資料傳輸有哪些型別?
USB endpoint有四種型別,分別對應了四種不同的資料傳輸方式。它們是控制傳輸(Control Transfers),中斷傳輸(Interrupt Data Transfers),批量傳輸(Bulk Data Transfers),等時傳輸(Isochronous Data Transfers)。從usb裝置端來看,也可以把端點分為四種型別為控制端點、中斷端點、批量端點、等時端點。
控制傳輸用來控制對USB裝置不同部分的訪問,通常用於配置裝置,獲取裝置資訊,傳送命令到裝置,或者獲取裝置的狀態報告。總之就是用來傳送控制資訊的,每個USB裝置都會有一個endpoint 0的控制端點,核心裡的USB core使用它在裝置插入時進行裝置的配置,它會一種等待著USB core傳送控制命令。
中斷傳輸用來以一個固定的速率傳送少量的資料,USB鍵盤和USB滑鼠使用的就是這種方式,USB的觸控式螢幕也是,傳輸的資料包含了座標資訊。
批量傳輸用來傳輸大量的資料,確保沒有資料丟失,並不保證在特定的時間內完成。U盤使用的就是批量傳輸,我們們用它備份資料時需要確保資料不能丟,而且也不能指望它能在一個固定的比較快的時間內拷貝完。
等時傳輸同樣用來傳輸大量的資料,但並不保證資料是否到達,以穩定的速率傳送和接收實時的資訊,對傳送延遲非常敏感。顯然是用於音訊和視訊一類的裝置,這類裝置期望能夠有個比較穩定的資料流,比如你在網上QQ視訊聊天,肯定希望每分鐘傳輸的影象/聲音速率是比較穩定的,不能說這一分鐘對方看到你在向她向你深情表白,可是下一分鐘卻看見畫面停滯在那裡,只能看到你那傻樣一動不動,你說這不浪費感情嘛。
Q:usb系統是怎樣的一個層次?
一個完整usb系統應該實現上圖各個部分。圖裡主要顯示了四個層次,USB物理裝置(USB Physical Device)、客戶軟體(Client SW)、USB系統軟體(USB System SW)以及USB Host Controller。Host Controller看似在最低層,卻掌控著整個USB的通訊,你的USB裝置要想發揮作用,首先得獲得它的批准;系統軟體,只表示了系統裡支援USB的部分,也就是系統相關裝置無關的部分,相對於我們們的linux來說,就是usb core,並不包括所謂的各種裝置驅動;客戶軟體則指裝置相關,也就是對應於特定裝置的部分,你的USB鍵盤驅動、觸控式螢幕驅動什麼的都在這兒(專業來看,不能將客戶軟體簡單理解為上層應用,這裡和我們平時使用的客戶端應用軟體不同)。
有人會問?為什麼要分為這樣的三層?真的有三層嗎?
其實,從linux核心程式碼看,Host部分確實機分這三層,至於裝置分這三個層次完全是為了配合host(前面說過USB匯流排是一個單主方式的實現,所以裝置層次不得不配合host)。因此,站在不同的高度看到不同的風景,Host Controller看到的是一個個hub還有hub上的USB device,而在系統軟體的眼裡,看到的是邏輯裝置(站在不同的高度理解),客戶軟體看到的是裝置提供的功能。
Q:主機和裝置連線是什麼樣子?
在USB的世界裡,不僅僅有compound device,還有composite device,compound device是那些將hub和連在hub上的裝置封裝在一起所組成的裝置,而composite device是包含彼此獨立的多個介面的裝置。從主機的角度看,一個compound device和單獨的一個hub然後連線了多個USB裝置是一樣的,它裡面包含的hub和各個裝置都會有自己獨立的地址,而一個composite device裡不管具有多少介面,它都只有一個地址。上述是站在host controller的層次。
而對於系統軟體來說,沒有這麼複雜,所有的hub和裝置都是一個個的邏輯裝置。站的越高,看的越遠,往往如此簡單。
一個USB邏輯裝置就是一系列端點(endpoint)的集合,它與主機之間的通訊發生在主機上的一個緩衝區和裝置上的一個端點之間,通過管道來傳輸資料。意思就是管道的一端是主機上的一個緩衝區,一端是裝置上的端點。
最後,從協議規範中貼上一個更加詳細的圖
出處:http://blog.chinaunix.net/uid-28769229-id-4069430.html
相關文章
- HarmonyOS USB DDK助你輕鬆實現USB驅動開發
- 【linux】驅動-1-環境準備Linux
- linux usb 驅動開發 抓包工具Linux
- 行為驅動開發學習心得(一)
- USB驅動程式之滑鼠用做鍵盤
- 驅動學習之驅動和應用的介面
- 《HTML5之開發準備》HTML
- Linux下的硬體驅動——USB裝置(下)(驅動開發部分)(轉)Linux
- garmin USB: linux USB host驅動Linux
- C#移動跨平臺開發(1)環境準備C#
- 領域模型驅動開發(1)模型
- 鴻蒙系統應用開發之開發準備鴻蒙
- Flutter學習系列之Flutter上手環境準備Flutter
- Django之“學習筆記”網站開發1Django筆記網站
- 乾坤合一:Linux裝置驅動之USB主機和裝置驅動Linux
- gRPC學習之二:GO的gRPC開發環境準備RPCGo開發環境
- usb驅動程式初步編寫
- python標準庫00學習準備Python
- APP 開發從 0 到 1(一)需求與準備APP
- Laravel 開發前準備Laravel
- 【metabase • 一】開發準備
- Linux裝置驅動程式學習----1.裝置驅動程式簡介Linux
- python基礎學習要做什麼準備?Python開發學會得多久Python
- extcon驅動及其在USB驅動中的應用
- 驅動開發之基本資料結構資料結構
- 寫作驅動學習
- 深度學習開發必備開源框架深度學習框架
- Python 快速教程(標準庫):學習準備Python
- 抱怨驅動開發
- 深度學習利器之自動微分(1)深度學習
- Unity開發 資源準備Unity
- win10系統使用usb驅動器備份檔案提示該驅動器不是有效備份位置怎麼解決Win10
- 大資料學習環境準備[1] - 建立虛擬機器大資料虛擬機
- 面試準備(1)面試
- 驅動開發:配置Visual Studio驅動開發環境開發環境
- 安卓USB開發教程 USB Accessory安卓
- 安卓USB開發教程 USB Host安卓
- "零"學習成本:使用 Web 標準開發動態化 Flutter 應用WebFlutter