專利名稱:一種嵌入式系統(tǒng)下usb存儲器的驅(qū)動開發(fā)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種USB存儲器的驅(qū)動開發(fā)方法,尤其是一種嵌入式系統(tǒng)下的USB存儲器的驅(qū)動開發(fā)方法。
背景技術(shù):
目前,USB(Universal Serial Bus通用串行總線)存儲器已經(jīng)廣泛應(yīng)用到了個人計算機(jī)領(lǐng)域,充分體現(xiàn)出了其攜帶方便、操作簡單的優(yōu)點。但是USB存儲器在嵌入式系統(tǒng)中的應(yīng)用還很少。目前在嵌入式系統(tǒng)中,存儲設(shè)備大多還局限在固定的FLASH或筆記本硬盤上,使用起來極不方便,容量上非常固定,一旦系統(tǒng)設(shè)計完成之后,容量就很難變動,這樣就可能出現(xiàn)不能滿足使用或出現(xiàn)浪費的情況。另外因為缺乏移動性,也不方便信息的交互、保存。造成嵌入式系統(tǒng)下USB存儲器很少應(yīng)用的主要原因是嵌入式系統(tǒng)下USB存儲器的驅(qū)動開發(fā)難度較大,成本較高。因此,在嵌入式系統(tǒng)下如何快速,簡便地進(jìn)行USB存儲器的驅(qū)動開發(fā)成為亟待解決的問題。
發(fā)明內(nèi)容
本發(fā)明的目的在于在嵌入式系統(tǒng)下,提供一種快速,簡便的USB存儲器的驅(qū)動開發(fā)方法。
本發(fā)明的目的是這樣實現(xiàn)的1.1利用現(xiàn)有的IO系統(tǒng)(輸入輸出系統(tǒng))和文件系統(tǒng)確定整個驅(qū)動的系統(tǒng)結(jié)構(gòu);1.2實現(xiàn)對HC模塊(主控制器模塊)的初始化(針對不同的HC硬件模塊實現(xiàn)不同的HC初始化),完成HCI接口(主控制器接口);1.3實現(xiàn)對USB存儲器的識別和配置,包括設(shè)備加電后通過復(fù)位可進(jìn)入默認(rèn)狀態(tài),通過控制端點對設(shè)備進(jìn)行地址設(shè)置;將配置值寫入設(shè)備;1.4在USB傳輸通道已經(jīng)正確建立的基礎(chǔ)上,通過標(biāo)準(zhǔn)命令完成對USB存儲器的容量獲取、塊讀寫模塊接口;其中,完成對USB存儲器塊讀寫模塊接口,包括命令傳輸階段、數(shù)據(jù)傳輸階段、狀態(tài)傳輸階段三個階段;1.5銜接USB底層驅(qū)動和上層塊驅(qū)動以及文件系統(tǒng),實現(xiàn)對塊設(shè)備的創(chuàng)建和文件系統(tǒng)的加載;1.6向用戶提供文件創(chuàng)建、打開、刪除、讀寫等接口。
本發(fā)明所確定的整個驅(qū)動的系統(tǒng)結(jié)構(gòu)依次為上層應(yīng)用、IO系統(tǒng)和文件系統(tǒng)、USB驅(qū)動層和主控制器驅(qū)動層、硬件部分;其中USB驅(qū)動層包括USB存儲器識別與配置模塊、USB存儲器容量獲取模塊、USB存儲器數(shù)據(jù)塊讀模塊、USB存儲器數(shù)據(jù)塊寫模塊、USB存儲器復(fù)位模塊;使用塊驅(qū)動作為文件系統(tǒng)和USB存儲器驅(qū)動之間的接口;上層應(yīng)用直接調(diào)用IO系統(tǒng)和文件系統(tǒng)提供的接口;IO系統(tǒng)在文件系統(tǒng)之上提供各種文件操作接口;文件系統(tǒng)在塊驅(qū)動接口之上掛接文件系統(tǒng);塊驅(qū)動接口連接底層各種驅(qū)動入口和嵌入式系統(tǒng)提供的文件系統(tǒng)庫;USB驅(qū)動層在HC驅(qū)動層之上完成相關(guān)的USB協(xié)議,并提供塊驅(qū)動所需的接口;主控制器驅(qū)動層實現(xiàn)主控制器硬件的初始化,并完成主控制器接口;硬件部分包括主機(jī)端的主控制器模塊以及USB存儲器。
利用本發(fā)明,可以在嵌入式系統(tǒng)下快速、簡便地完成USB存儲器的驅(qū)動開發(fā)。從而在嵌入式系統(tǒng)中實現(xiàn)對USB存儲器的支持,使得嵌入式系統(tǒng)中的各種信息可以通過USB存儲器來進(jìn)行傳遞,充分利用了USB存儲器良好的通用性、可靠性、移植性。
圖1是本發(fā)明的流程圖;圖2是本發(fā)明的驅(qū)動開發(fā)對象層次架構(gòu)示意圖;圖3是本發(fā)明中USB存儲器識別和配置步驟流程圖;圖4是本發(fā)明中USB存儲器塊讀操作步驟流程圖;圖5是本發(fā)明的USB存儲器塊寫操作步驟流程圖。
具體實施例方式
本發(fā)明利用嵌入式系統(tǒng)中現(xiàn)有的文件系統(tǒng)和ATA硬盤驅(qū)動,挖掘出ATA硬盤驅(qū)動和USB存儲器本質(zhì)上的相似之處,那就是它們都是塊設(shè)備,從用戶的角度來看它們都能夠進(jìn)行文件的讀寫等操作。通過采用嵌入式系統(tǒng)中現(xiàn)有的塊設(shè)備上層接口以及文件系統(tǒng),針對塊設(shè)備驅(qū)動所需要提供的底層接口,推導(dǎo)出在嵌入式系統(tǒng)中實現(xiàn)USB存儲器正常操作所需要的最少功能接口,主要包括USB存儲器的初始化接口、獲取存儲器容量接口、數(shù)據(jù)塊讀接口、數(shù)據(jù)塊寫接口、設(shè)備復(fù)位接口。在底層的這些接口中實現(xiàn)對USB相關(guān)協(xié)議的支持,并支持標(biāo)準(zhǔn)的USB閃存盤、USB硬盤等USB存儲設(shè)備。
從系統(tǒng)的角度來說,要在嵌入式系統(tǒng)中實現(xiàn)對USB存儲器的支持,需要兩個必不可少的部分硬件部分、軟件驅(qū)動。
硬件部分包括HC(Host Controller,主控制器)模塊和USB存儲器。HC模塊連接在嵌入式系統(tǒng)中,許多專用的芯片包含有USB HC模塊,可以支持一到幾個USB端口。USB存儲器是連在USB端口上的存儲設(shè)備,可以是USB閃存盤,也可以是帶USB接口的筆記本硬盤。
而整個軟件驅(qū)動的組成包括7個部分A模塊塊設(shè)備封裝以及IO系統(tǒng);B模塊USB存儲器識別與配置模塊;C模塊USB存儲器容量獲取模塊;D模塊USB存儲器數(shù)據(jù)塊讀模塊;
E模塊USB存儲器數(shù)據(jù)塊寫模塊;F模塊USB存儲器復(fù)位模塊;G模塊HC初始化模塊;其中,A模塊用來提供USB存儲器上層的IO操作,包括對文件系統(tǒng)的初始化、完成文件讀寫操作等。
G模塊完成HC的初始化,這一部分需要根據(jù)硬件的變化作相應(yīng)的設(shè)置,包括PCI配置、中斷的掛接、HC各種寄存器的初始化,根據(jù)硬件的具體設(shè)計以及硬件相關(guān)手冊來完成。
B、C、D、E、F五個模塊建立在G模塊的上層,需要利用G模塊提供的相關(guān)接口,實現(xiàn)USB和主存類相關(guān)協(xié)議,并對上層(A模塊)提供必不可少的功能接口。
具體地說,B模塊主要對USB存儲器進(jìn)行識別和配置。模塊對HC進(jìn)行操作,構(gòu)建標(biāo)準(zhǔn)的USB請求,通過HCI接口(Host Controller Interface)向USB端口所連的設(shè)備發(fā)出標(biāo)準(zhǔn)請求,以獲得USB設(shè)備的各種信息,USB設(shè)備的各種信息是通過設(shè)備響應(yīng)USB標(biāo)準(zhǔn)請求返回的描述符來描述的。主要有設(shè)備描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端點描述符(Endpoint Descriptor)。其中,可以通過設(shè)備描述符獲得設(shè)備的類型,通過配置描述符獲得配置信息以及接口的個數(shù),通過接口描述符獲得一個配置中的一個特定接口信息,并獲得本接口所包含的端點數(shù)目,而端點描述符則反映了端點的類型、數(shù)據(jù)傳輸方向以及傳輸包的最大大小。通過對這些描述的比較,我們可以知道所連接的USB設(shè)備是否被本驅(qū)動模塊支持,還可以根據(jù)所獲得的配置信息對設(shè)備進(jìn)行特定的配置,配置完成之后,就可以對設(shè)備進(jìn)行下一步的塊數(shù)據(jù)訪問了。總的說來,B模塊所要完成的是,在上層接口與USB存儲器之間構(gòu)建一個符合USB協(xié)議標(biāo)準(zhǔn)的傳輸通道,以便于后面進(jìn)行特定的命令、數(shù)據(jù)傳輸。
C模塊要實現(xiàn)的是獲得USB存儲器的容量。這個模塊的調(diào)用是在正確運(yùn)行B模塊之后。通過B模塊已經(jīng)建立好的USB傳輸通道,向USB存儲器傳送容量獲取命令,USB存儲器以塊數(shù)和塊大小的格式返回容量數(shù)據(jù),二者的乘積就是USB存儲器的物理容量(以字節(jié)為單位),這個數(shù)據(jù)被上層的接口使用,為塊讀寫操作提供大小和邊界的依據(jù)。
D模塊實現(xiàn)指定塊數(shù)據(jù)的讀取。通過B模塊已經(jīng)建立好的USB傳輸通道,向USB存儲器發(fā)送讀塊命令,并指定需要讀取的初始塊地址以及塊數(shù),USB存儲器將這些塊的數(shù)據(jù)返回。
E模塊實現(xiàn)向指定的塊寫入數(shù)據(jù)。通過B模塊已經(jīng)建立好的USB傳輸通道,向USB存儲器發(fā)送讀寫命令,并指定需要寫入的初始塊地址以及塊數(shù),USB存儲器將通過USB傳輸通道獲取的數(shù)據(jù)寫入存儲器相應(yīng)的塊中。
F模塊主要完成對USB端口進(jìn)行復(fù)位。在對USB端口或USB存儲器進(jìn)行操作遇到問題需要復(fù)位時,可以調(diào)用此功能接口。這個接口也是完成上層塊驅(qū)動必不可少的。
本發(fā)明驅(qū)動開發(fā)方法流程如圖1所示
第一步,利用現(xiàn)有的IO系統(tǒng)(輸入輸出系統(tǒng))和文件系統(tǒng)確定整個驅(qū)動的系統(tǒng)結(jié)構(gòu)。具體的層次結(jié)構(gòu)如圖2。確定使用塊驅(qū)動作為文件系統(tǒng)和USB存儲器驅(qū)動之間的接口是本發(fā)明中很重要的一點。通過實踐,我們采用圖2的層次結(jié)構(gòu)作為整個USB存儲器驅(qū)動的架構(gòu)。整個層次清晰而簡練。上層應(yīng)用直接調(diào)用IO系統(tǒng)和文件系統(tǒng)提供的接口,他們不必關(guān)心底層的操作細(xì)節(jié)。IO系統(tǒng)在文件系統(tǒng)之上提供各種文件操作接口。文件系統(tǒng)在塊驅(qū)動接口之上掛接文件系統(tǒng)。塊驅(qū)動接口作為USB驅(qū)動和文件系統(tǒng)之間的橋梁,連接底層各種驅(qū)動入口和嵌入式系統(tǒng)提供的文件系統(tǒng)庫。USB驅(qū)動層在HC驅(qū)動層之上完成相關(guān)的USB協(xié)議,并提供塊驅(qū)動所需的接口。HC驅(qū)動層針對特定的USB HC硬件,實現(xiàn)硬件的初始化等操作,并完成HCI(主控制器接口)。硬件部分包括主機(jī)端的HC模塊以及外接的USB存儲器。
第二步,針對不同的HC硬件模塊實現(xiàn)不同的HC初始化,完成HCI接口。驅(qū)動的主體框架確定以后,進(jìn)入實際的驅(qū)動開發(fā),首先遇到的就是要對最底層的硬件HC模塊進(jìn)行初始化,并完成HCI接口。市場上主要有兩大類USB主控制器,一類支持通用主控制器接口(Universal Host Controller Interface,簡稱UHCI),一類支持開放主控制器接口(Open Host Controller Interface,簡稱OHCI)。對主控制器的初始化也主要是針對這兩種接口規(guī)范。
第三步,實現(xiàn)對USB存儲器的識別和配置。這一步對開發(fā)出來的USB存儲器驅(qū)動的兼容性非常重要。圖3描述了USB存儲器識別和配置過程中的狀態(tài)轉(zhuǎn)換和相關(guān)操作。設(shè)備加電后通過復(fù)位可進(jìn)入默認(rèn)狀態(tài),進(jìn)入默認(rèn)狀態(tài)后,可以通過控制端點(端點0)對設(shè)備進(jìn)行地址設(shè)置,一個USB接口最多可連127個設(shè)備,要與不同的設(shè)備通信,必須首先對設(shè)備進(jìn)行編址,編址之后就可以使用設(shè)定的地址訪問設(shè)備了,此時的設(shè)備轉(zhuǎn)入已編址狀態(tài)。之后的操作是獲取設(shè)備的各種描述符信息,從設(shè)備和接口的類、子類、協(xié)議可以判斷此設(shè)備是否被支持。我們所支持的USB存儲器屬于USB協(xié)議中提到的MASS STORAGE類(海量存儲設(shè)備類),并且支持SCSI(Small Computer SystemInterface)子類,使用的傳輸協(xié)議是BULK-ONLY傳輸(塊傳輸)。如果USB端口上連接的設(shè)備是驅(qū)動支持的類型,就進(jìn)入配置過程。配置過程將配置值寫入設(shè)備,設(shè)備進(jìn)入已配置狀態(tài)。至此,USB傳輸通道已經(jīng)建立,可以對設(shè)備進(jìn)行后續(xù)的讀寫等操作了。
第四步,在USB傳輸通道已經(jīng)正確建立的基礎(chǔ)上,通過標(biāo)準(zhǔn)命令完成對USB存儲器的容量獲取、塊讀寫模塊接口。塊讀寫的過程如圖4和圖5。都是分為三個階段命令傳輸階段、數(shù)據(jù)傳輸階段、狀態(tài)傳輸階段。要注意的是,數(shù)據(jù)傳輸是以整塊位單位的。
第五步,銜接USB底層驅(qū)動和上層塊驅(qū)動以及文件系統(tǒng),實現(xiàn)對塊設(shè)備的創(chuàng)建和文件系統(tǒng)的加載。
第六步,向用戶提供文件創(chuàng)建、打開、刪除、讀寫等接口。
本發(fā)明結(jié)合USB從上層的文件系統(tǒng)、塊驅(qū)動推導(dǎo)出USB存儲器驅(qū)動系統(tǒng)的整體結(jié)構(gòu),再依據(jù)最底層的USB主控制器硬件和USB存儲器,從下往上完成相關(guān)的底層接口,最后綜合調(diào)試。構(gòu)成了嵌入式系統(tǒng)下開發(fā)USB閃存盤驅(qū)動的整個過程。
下面針對一個更為具體實例做詳細(xì)描述結(jié)合圖2驅(qū)動的整體層次結(jié)構(gòu)來進(jìn)行說明。整個系統(tǒng)按照硬件和軟件兩個大的部分。
硬件部分的USB存儲器采用USB閃存盤。主控制器部分采用Intel公司的南橋芯片82371EB,這塊芯片內(nèi)部帶有一個支持UHCI的USB主控制器,并帶有兩個USB端口。
軟件部分的操作系統(tǒng)采用通信領(lǐng)域廣泛應(yīng)用的VxWorks實時操作系統(tǒng),VxWorks提供了上層IO系統(tǒng)、文件系統(tǒng)以及相關(guān)的塊驅(qū)動層。我們借助VxWorks的塊驅(qū)動推導(dǎo)出需要實現(xiàn)的USB閃存盤底層相關(guān)接口,主要包括UsbDevInit(USB閃存盤的識別和配置)、UsbGetCapacity(USB閃存盤容量獲取)、UsbBlockRead(USB閃存盤塊讀)、UsbBlockWrite(USB閃存盤塊寫)、UsbDevReset(USB閃存盤復(fù)位)。
軟件部分的詳細(xì)處理步驟是這樣的首先必須完成82371EB芯片USB主控制器的初始化工作,包括對USB主控制器模塊的PCI配置,相關(guān)寄存器的設(shè)置,以及實現(xiàn)UHCI接口。這些可以參照芯片手冊完成。
對于以后的操作我們針對USB閃存盤設(shè)計了一個設(shè)備結(jié)構(gòu)。用來存儲設(shè)備的連接狀況、當(dāng)前所處的狀態(tài)、設(shè)備的各種屬性(包括描述符、容量、讀寫支持等)、支持的操作等。以后的各種操作都需要參考這個結(jié)構(gòu)的狀態(tài)。
在完成USB主控制器和USB閃存盤設(shè)備結(jié)構(gòu)的初始化后,只要有設(shè)備連到USB端口,就會產(chǎn)生Resume中斷(這個中斷表明USB端口有設(shè)備連上或拔出),此時即會調(diào)用USB設(shè)備識別和配置例程。這個過程按照圖3所描述的過程進(jìn)行。在正確的識別和配置USB閃存盤后,就表明USB設(shè)備的初始化過程成功了(也就是通常所說的USB枚舉過程)。
之后的塊讀寫和容量獲取等操作都是通過USB傳輸管道(pipe),采用USB閃存盤所支持的SCSI命令來實現(xiàn)的。按照執(zhí)行SCSI命令的三個階段,完成READ(讀塊),WRITE(寫塊),READCAPACITY(讀容量)三個命令,也就實現(xiàn)了相關(guān)的三個功能接口。這些功能接口作為塊驅(qū)動的底層驅(qū)動入口被調(diào)用。
結(jié)合USB從VxWorks上層的文件系統(tǒng)、塊驅(qū)動推導(dǎo)出USB閃存盤驅(qū)動系統(tǒng)的整體結(jié)構(gòu),再依據(jù)最底層的USB主控制器硬件和USB閃存盤,從下往上完成相關(guān)的底層接口,最后綜合調(diào)試。構(gòu)成了VxWorks實時操作系統(tǒng)下開發(fā)USB閃存盤驅(qū)動的整個過程。
權(quán)利要求
1.一種嵌入式系統(tǒng)下USB存儲器的驅(qū)動開發(fā)方法,包括以下步驟1.1利用現(xiàn)有的輸入輸出系統(tǒng)和文件系統(tǒng)確定整個驅(qū)動的系統(tǒng)結(jié)構(gòu);1.2實現(xiàn)對主控制器模塊的初始化,完成主控制器接口;1.3實現(xiàn)對USB存儲器的識別和配置;1.4通過標(biāo)準(zhǔn)命令完成對USB存儲器的容量獲取、塊讀寫模塊接口;1.5銜接USB底層驅(qū)動和上層塊驅(qū)動以及文件系統(tǒng),實現(xiàn)對塊設(shè)備的創(chuàng)建和文件系統(tǒng)的加載;1.6向用戶提供文件創(chuàng)建、打開、刪除、讀寫等接口。
2.權(quán)利要求1所述的嵌入式系統(tǒng)下USB存儲器的驅(qū)動開發(fā)方法,其特征在于,所確定的整個驅(qū)動的系統(tǒng)結(jié)構(gòu)依次為上層應(yīng)用、IO系統(tǒng)和文件系統(tǒng)、USB驅(qū)動層和主控制器驅(qū)動層、硬件部分,使用塊驅(qū)動作為文件系統(tǒng)和USB存儲器驅(qū)動之間的接口;上層應(yīng)用直接調(diào)用IO系統(tǒng)和文件系統(tǒng)提供的接口;IO系統(tǒng)在文件系統(tǒng)之上提供各種文件操作接口;文件系統(tǒng)在塊驅(qū)動接口之上掛接文件系統(tǒng);塊驅(qū)動接口連接底層各種驅(qū)動入口和嵌入式系統(tǒng)提供的文件系統(tǒng)庫;USB驅(qū)動層在HC驅(qū)動層之上完成相關(guān)的USB協(xié)議,并提供塊驅(qū)動所需的接口;主控制器驅(qū)動層實現(xiàn)主控制器硬件的初始化,并完成主控制器接口;硬件部分包括主機(jī)端的主控制器模塊以及USB存儲器。
3.權(quán)利要求2所述的嵌入式系統(tǒng)下USB存儲器的驅(qū)動開發(fā)方法,其特征在于,所述USB驅(qū)動層包括USB存儲器識別與配置模塊;USB存儲器容量獲取模塊;USB存儲器數(shù)據(jù)塊讀模塊;USB存儲器數(shù)據(jù)塊寫模塊;USB存儲器復(fù)位模塊。
4.權(quán)利要求1所述的嵌入式系統(tǒng)下USB存儲器的驅(qū)動開發(fā)方法,其特征在于,所述的實現(xiàn)對USB存儲器的識別和配置過程包括設(shè)備加電后通過復(fù)位進(jìn)入默認(rèn)狀態(tài),通過控制端點對設(shè)備進(jìn)行地址設(shè)置;將配置值寫入設(shè)備。
5.權(quán)利要求1所述的嵌入式系統(tǒng)下USB存儲器的驅(qū)動開發(fā)方法,其特征在于,所述通過標(biāo)準(zhǔn)命令完成對USB存儲器塊讀寫模塊接口,包括命令傳輸階段、數(shù)據(jù)傳輸階段、狀態(tài)傳輸階段三個階段。
全文摘要
一種嵌入式系統(tǒng)下USB存儲器的驅(qū)動開發(fā)方法,包括利用現(xiàn)有的IO系統(tǒng)和文件系統(tǒng)確定整個驅(qū)動的系統(tǒng)結(jié)構(gòu);實現(xiàn)對HC模塊的初始化,完成HCI接口;實現(xiàn)對USB存儲器的識別和配置;在USB傳輸通道已經(jīng)正確建立的基礎(chǔ)上,通過標(biāo)準(zhǔn)命令完成對USB存儲器的容量獲取、塊讀寫模塊接口;銜接USB底層驅(qū)動和上層塊驅(qū)動以及文件系統(tǒng),實現(xiàn)對塊設(shè)備的創(chuàng)建和文件系統(tǒng)的加載;向用戶提供文件創(chuàng)建、打開、刪除、讀寫等接口。利用本發(fā)明,可以在嵌入式系統(tǒng)下快速、簡便地完成USB存儲器的驅(qū)動開發(fā)。從而在嵌入式系統(tǒng)中實現(xiàn)對USB存儲器的支持,使得嵌入式系統(tǒng)中的各種信息可以通過USB存儲器來進(jìn)行傳遞,充分利用了USB存儲器良好的通用性、可靠性、移植性。
文檔編號G06F3/06GK1529227SQ03134998
公開日2004年9月15日 申請日期2003年9月29日 優(yōu)先權(quán)日2003年9月29日
發(fā)明者符冬陽, 張景濤, 謝銳 申請人:中興通訊股份有限公司