利用嵌入式USB主控進(jìn)行設(shè)計(jì)
USB(通用串行總線)于1995年面世,目前已發(fā)展成為一種解決個(gè)人計(jì)算機(jī)與外設(shè)連接問題的事實(shí)標(biāo)準(zhǔn)。由于USB的應(yīng)用極為廣泛,因此對嵌入式系統(tǒng)的總線外部擴(kuò)展與連接應(yīng)用來說,它也有著巨大的吸引力。
如今,集成USB主控后,嵌入式產(chǎn)品(如測試設(shè)備等)就可以和各種價(jià)格低廉、獲取方便的外設(shè)實(shí)現(xiàn)連接,如鍵盤、鼠標(biāo)和打印機(jī)。對同時(shí)扮演USB主端、外設(shè)(從端)雙重角色的USB主控裝置的需求,在移動裝置迅速流行的推動下也在不斷增長。具有雙重身份的這些裝置,可以讓PDA、打印機(jī)等傳統(tǒng)USB外設(shè)在無PC的情況下直接實(shí)現(xiàn)相互通信。
USB之所以廣受歡迎,其原因主要在于使用的方便性。消費(fèi)者不論何時(shí)、把何種USB裝置插入PC中,它都可以實(shí)現(xiàn)無縫工作。這種即插即用能力的實(shí)現(xiàn),離不開各式各樣的USB主端裝置以及Microsoft Windows中驅(qū)動軟件的有力支持,但在嵌入式應(yīng)用環(huán)境中卻還找不到這樣的支持。
我們從不同層次上對USB通信流進(jìn)行考察,就會發(fā)現(xiàn)完整的USB主控系統(tǒng)要包含如下三種基本要素:
傳統(tǒng)的USB主控設(shè)計(jì)將整個(gè)主控系統(tǒng)劃分為主端控制器(host controller)和控制器之外的整套USB軟件。圖1示出了USB主控系統(tǒng)組成單元與傳統(tǒng)的主機(jī)體系結(jié)構(gòu)間的映射關(guān)系。
主端控制器一般制作成單獨(dú)的一塊芯片,其中包括了物理和數(shù)據(jù)鏈路層硬件(如USB收發(fā)器)、SIE(串行接口引擎)等,以及一個(gè)可以附加到系統(tǒng)處理器上的總線接口。USB固件(主控棧和裝置驅(qū)動)駐留在帶有USB主端控制器的系統(tǒng)處理器中。
USB硬件和固件的分離反映了一個(gè)現(xiàn)實(shí):USB從根本上來說是一種PC總線的外部擴(kuò)展機(jī)制。從USB固件的角度來看,PC提供了無窮無盡的系統(tǒng)資源。此外,PC行業(yè)已經(jīng)實(shí)現(xiàn)標(biāo)準(zhǔn)化,統(tǒng)一于一個(gè)OS平臺——Microsoft Windows,而這一操作系統(tǒng)天生就具備支持USB主控棧和裝置驅(qū)動的能力。由于擁有極為豐富的系統(tǒng)資源和軟件支持,所以傳統(tǒng)的USB主控體系結(jié)構(gòu)是PC應(yīng)用的一種理想的解決方案。
相形之下,嵌入式系統(tǒng)的設(shè)計(jì)者們?nèi)粢褌鹘y(tǒng)的USB主控移植到嵌入式裝置中,卻需要理清多方面的問題。嵌入式設(shè)計(jì)的挑戰(zhàn),根源在于把USB固件與嵌入式應(yīng)用及其基礎(chǔ)計(jì)算平臺集成為一體時(shí)所需解決的復(fù)雜問題。
首先,嵌入式裝置一般帶有的系統(tǒng)資源(系統(tǒng)處理器和存儲器)容量有限。在系統(tǒng)處理器上運(yùn)行USB主控固件,不僅會占用目標(biāo)應(yīng)用的資源,而且還會造成對應(yīng)用固件的大量反復(fù)寫入和優(yōu)化。
其次,嵌入式應(yīng)用一般要對實(shí)時(shí)事件作出明確的響應(yīng)。把USB固件添加到系統(tǒng)中,就會增加復(fù)雜性,導(dǎo)致在實(shí)時(shí)應(yīng)用的設(shè)計(jì)和調(diào)試中出現(xiàn)更多中斷和實(shí)時(shí)事件。
最后,嵌入式市場具有種類繁多的處理器和實(shí)時(shí)操作系統(tǒng)。將USB固件開發(fā)和移植到任何特定處理器/實(shí)時(shí)操作系統(tǒng)平臺的努力都將花費(fèi)大量時(shí)間,而且需要工作人員在USB技術(shù)上具有很高的專業(yè)技能。由于USB規(guī)范的內(nèi)容繁多,因此,對于一個(gè)設(shè)計(jì)周期為6~12個(gè)月的典型嵌入式項(xiàng)目來說,學(xué)習(xí)過程實(shí)在過長,也過于艱深。
克服嵌入式裝置中USB主控設(shè)計(jì)的復(fù)雜性問題,方法之一就是把與USB即插即用能力相關(guān)的智能揉入U(xiǎn)SB主端控制器本身之中。要做到這一點(diǎn),所采取的辦法是:
該設(shè)計(jì)方法,可以為我們帶來一個(gè)無需系統(tǒng)處理器干預(yù)就能處理USB主控活動的USB主端控制器。它不僅讓系統(tǒng)資源的消耗降至最低,而且也將通過系統(tǒng)總線的USB數(shù)據(jù)流減至最小。
這種設(shè)計(jì)方法的另一個(gè)好處則是簡化了所生成的API。API的設(shè)計(jì)將簡單易行,并且獨(dú)立于處理器和實(shí)時(shí)操作系統(tǒng),從而有效地降低了API集移植和集成的難度。
相應(yīng)的,任何一種專用USB裝置驅(qū)動都可以由這一不大的API集開發(fā)而成。為了進(jìn)一步降低USB主控實(shí)現(xiàn)的復(fù)雜程度,USB裝置的驅(qū)動也應(yīng)該以獨(dú)立于處理器/實(shí)時(shí)操作系統(tǒng)的API形式建立,并呈現(xiàn)給系統(tǒng)設(shè)計(jì)者。裝置驅(qū)動API可讓已有的和新出現(xiàn)的嵌入式應(yīng)用很快集成USB主控功能。
Atmel公司的AT43USB370 USB主控/功能處理器的設(shè)計(jì),采用了上文提到的設(shè)計(jì)方法,其目標(biāo)就是將復(fù)雜的USB問題屏蔽掉。下面的實(shí)例將向讀者表明,利用AT43USB370 海量存儲裝置驅(qū)動API,開發(fā)一個(gè)海量存儲器應(yīng)用只需少數(shù)幾個(gè)步驟即可。設(shè)計(jì)目標(biāo)是從相連的USB儲存裝置的根目錄下讀取一個(gè)文件。
file://step1: 等待裝置完成盤點(diǎn)
connectStatus = MS_Get_Final_Stat();
DeviceAddr = connectStatus.Dev_Addr; file://裝置地址
DriveNum = connectStatus.Part_Num;//分區(qū)數(shù)
// Step2:獲取根目錄的內(nèi)容 (ID 0x00)
cmdResponse = Get_Dir(DeviceAddr,DriveNum,0x00);
CommandId = cmdResponse.CmdId;
getDirStatus = MS_Get_Final_Stat(); file://等待目錄信息
if (getDirStatus.Get_Cmd_Id == CommandId)
{
file://目錄信息采取getDirStatus.pDir_Buff結(jié)構(gòu)
}
// Step 3:為文件內(nèi)容安排緩沖
int* pMSC_File =(int*)malloc(0x00008023*(sizeof (unsigned char)));
// Step 4:將文件內(nèi)容讀到緩沖器內(nèi)
// ID據(jù)報(bào)為 0x0000F17C,大小= 0x8023
cmdResponse = Read_File(DeviceAddr,DriveNum ,
0x0000F17C,pMSC_File, 0x00008023);
CommandId = sreadIntCmdResponse.CmdId;
readStatus = MS_Get_Final_Stat();
if (readStatus.Get_Cmd_Id == CommandId)
{
file://文件已被拷貝到pMSC_File緩沖中
}
總而言之,USB的即插即用功能需要充分的固件支持。嵌入式環(huán)境中USB主控和裝置驅(qū)動固件的缺乏會導(dǎo)致產(chǎn)品開發(fā)周期的延長。因此,在選擇嵌入式USB主控時(shí),固件的體系結(jié)構(gòu)和可用性應(yīng)該作為重點(diǎn)來考慮。設(shè)計(jì)完善的嵌入式主控應(yīng)該將消耗的系統(tǒng)資源降至最低,讓傳輸?shù)较到y(tǒng)處理器的USB往來數(shù)據(jù)流量、中斷等減至最少,讓所呈現(xiàn)的API集簡單化,并將復(fù)雜的USB協(xié)議問題隱藏起來。
評論