詳解嵌入式Linux的USB驅(qū)動設(shè)計
嵌入式Linux是一款源代碼完全免費的新興操作系統(tǒng),用戶可以用戶可以通過網(wǎng)絡(luò)等其他途徑免費獲得,并可以任意修改其源代碼,這是其他的操作系統(tǒng)做不到的。正是由于這一點,Linux得到了廣泛的應(yīng)用。
1 Linux中USB設(shè)備驅(qū)動程序框架及數(shù)據(jù)結(jié)構(gòu)
1.1 USB的體系結(jié)構(gòu)
USB接口標準支持外部設(shè)備和主機之間進行數(shù)據(jù)傳送。在USB結(jié)構(gòu)中主機頂設(shè)各種類型外設(shè)使用的總線寬度。當外設(shè)和主機在運行時,USB總線允許使用,設(shè)置,添加和拆除外設(shè)。
在USB體系結(jié)構(gòu)中一個USB系統(tǒng)可以分成USB設(shè)備、USB主機和USB互聯(lián)3個部分。USB互聯(lián)是USB設(shè)備和USB主機之間進行連接通信的操作,主要包括:
1)總線拓撲結(jié)構(gòu):UsB主機和USB設(shè)備之間的連接方式;
2)數(shù)據(jù)流模式:描述USB通信系統(tǒng)數(shù)據(jù)如何從產(chǎn)生方傳遞到使用方;
3)USB調(diào)度:USB總線是一個共享連接,對可以使用的連按進行調(diào)度以支持同步數(shù)據(jù)傳輸,并避免優(yōu)先級判斷的開銷。
USB的物理連接是有層次的星型結(jié)構(gòu),如圖1所示。
圖1 USB體系拓撲結(jié)構(gòu)圖
從圖中可以看出USB集線器在一個節(jié)點上連接多個設(shè)備,每條線段都是點點連接,每個USB集線器在星形的中心。從主機到設(shè)備或者USB集線器,或USB集線器到設(shè)備都是點點連接。
1.2 USB驅(qū)動程序的結(jié)構(gòu)
USN總線在技術(shù)層面上是非常簡單的,它是一個單主方式實現(xiàn)的,主機輪詢各種不同的外圍設(shè)備,USB另外一個重要的特性是它只擔當設(shè)備和主控制器之間通訊通道的角色,對所發(fā)送的數(shù)據(jù)沒有任何特殊的內(nèi)容和結(jié)構(gòu)上的要求。
Linux支持兩種類型的USB驅(qū)動,宿主系統(tǒng)上的驅(qū)動程序和設(shè)備上的驅(qū)動程序。宿主USB驅(qū)動程序控制插入其中的USB設(shè)備,而USB設(shè)備的驅(qū)動程序控制設(shè)備如何作為一個USB設(shè)備和主機通訊。這里主要討論設(shè)備驅(qū)動。
USB的基本通信的形式基本通過端點的東西。USB端點只能往一個方向傳輸數(shù)據(jù),從主機到設(shè)備或從設(shè)備到主機。USB端點分別具有不同的傳輸數(shù)據(jù)的方式,他們有4種類型,分別是:1)控制端點用來控制對USB設(shè)備不同部分的訪問。他們用于配置設(shè)備,獲取設(shè)備信息,獲取設(shè)備的狀態(tài)報告,發(fā)送命令到設(shè)備。它是一種非周期性的可靠的傳輸。2)中斷端點就是設(shè)備傳輸數(shù)據(jù)時以一個固定的速率來傳輸少量的數(shù)據(jù)。這些端點是鼠標和USB鍵盤所使用的主要傳輸方式。它通常用于發(fā)送數(shù)據(jù)到USB設(shè)備以控制設(shè)備,一般不用來傳輸大量數(shù)據(jù)。USB協(xié)議保證這些傳輸有足夠的保留帶寬來傳輸數(shù)據(jù)。3)等時端點同樣可以傳輸大批量的數(shù)據(jù),但數(shù)據(jù)是否到達沒有保障,這些端點用于可以應(yīng)付數(shù)據(jù)丟失的情況,這類設(shè)備更注重于保持一定的恒定的數(shù)據(jù)流,實時的數(shù)據(jù)收集都使用這類端點。4)批量端點傳輸大量的數(shù)據(jù)。這些端點通常比中斷端點大的多他們常用于需要確保沒有數(shù)據(jù)丟失的傳輸設(shè)備。USB協(xié)議不保證這些傳輸始終可以在特定的時間內(nèi)完成。如果總線上的空間不足以發(fā)送整個批量包。它將被分割為多個包進行傳輸。
當一個USB設(shè)備連接到主機時,主機會給這個設(shè)備分配一個1~127之間的唯一的設(shè)備號同時讀取該設(shè)備的描述符,該設(shè)備描述符是描述設(shè)備信息及其屬性的數(shù)據(jù)結(jié)構(gòu),USB以一種層次化的結(jié)構(gòu)定義設(shè)備的描述符,設(shè)備描述符給出了USB設(shè)備的一般信息,包括對設(shè)備及所有設(shè)備配置起全程作用的信息,一個USB設(shè)備只能有一個設(shè)備描述符,配置描述符中的信息與設(shè)備特定的配置相關(guān),一個USB設(shè)備可以有一個或多個配置描述符,每一個配置描述符又由一個或多個接口描述符組成,接口描述符的信息是與設(shè)備驅(qū)動程序的開發(fā)密切相關(guān),可以一個接口對應(yīng)一個設(shè)備驅(qū)動程序也可以多個接口對應(yīng)一個設(shè)備驅(qū)動程序,接口描述符由零個或多個端點描述符組成,端點描述符定義了在一個給定的設(shè)備里實現(xiàn)的實際寄存器,這些描述符定義了每個寄存器的功能和特定的信息如端點要求的傳輸類型、傳輸方向、帶寬要求、查詢間隔等。另外,還有一個可選的宇符串描述符,它以UNCOND碼的格式給出了一些可讀的信息,這些信息通常是有關(guān)設(shè)備生產(chǎn)廠商、設(shè)備名設(shè)備序列號等,通過這些不同層次的描述符,主機設(shè)備驅(qū)動程序就可以知道具體設(shè)備的相關(guān)信息,從而對設(shè)備進行相應(yīng)控制。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論