基于USB接口設(shè)備的固件程序設(shè)計(jì)
硬件層:這是固件中最低的層,它完成向PDIUSBD12的硬件通道.當(dāng)固件轉(zhuǎn)向其他的CPU 平臺(tái),這部分需要修改或增加內(nèi)容。
PDIUSBD12命令接口:為進(jìn)一步簡(jiǎn)化用PDIUSBD12編程,固件定義了一系列命令接口,它們壓縮了使用PDIUSBD12的所有功能。
中斷服務(wù)程序:這部分代碼處理由PDIUSBD12產(chǎn)生的中斷。它接收從PDIUSBD12內(nèi)部的FIFO區(qū)到CPU存儲(chǔ)器的數(shù)據(jù),并且建立合適的標(biāo)志以通知主程序處理。
主程序:主程序檢查事件的標(biāo)志,轉(zhuǎn)移到合適的子程序做進(jìn)一步的處理。它也包含人機(jī)接口代碼,例如,發(fā)光二極管和鍵盤(pán)掃描。
協(xié)議層:協(xié)議層處理標(biāo)準(zhǔn)USB設(shè)備請(qǐng)求,也處理具體的用戶(hù)請(qǐng)求諸如DMA和TWAIN。
2) 固件任務(wù)
在編寫(xiě)固件程序的過(guò)程中,PDIUSBD12 作為接口芯片硬件為我們做了大量的工作,其中包括:
a.檢測(cè)新的進(jìn)入事務(wù);翻譯從USB 總線上獲得的信息;b. 檢測(cè)事務(wù)的目的地址,以決定是否響應(yīng);e. 確定事務(wù)的類(lèi)型;d. 從USB 總線上接收數(shù)據(jù)到FIFO;e. 從FIFO 中發(fā)送數(shù)據(jù)到USB 總線上;f. 計(jì)算校驗(yàn)位,檢測(cè)并報(bào)告結(jié)果。
但還有相當(dāng)一部分的工作由固件程序來(lái)完成。這部分任務(wù)包括:
a.初始化PDIUSBD12并處理PDIUSBD12的中斷;b.響應(yīng)各種請(qǐng)求,至少要響應(yīng)標(biāo)準(zhǔn)的11種請(qǐng)求;c.選擇適當(dāng)?shù)臄?shù)據(jù)寫(xiě)入PDIUSBD12的FIFO;d.從PDIUSBD12的FIFO中讀取數(shù)據(jù);
3) PDIUSBD12 的初始化
與一般的接口芯片一樣,PDIUSBD12必須先初始化以后再使用,初始化的步驟如下:
a.用Set Address/Enable命令使能芯片功能,地址應(yīng)設(shè)為0;b.用Set Endpoint Enable命令使能芯片上除端點(diǎn)0、1外的所有端點(diǎn);c.用Set Mode 命令斷開(kāi)連接,延時(shí)1-2s;用Set Mode 命令連接;d. 用命令Read Interrupt Register清空中斷寄存器;
初始化完后,D12就可以接收USB 總線上的信息了。之后,主機(jī)通過(guò)端點(diǎn)0、1來(lái)讀取設(shè)備信息,配置設(shè)備、設(shè)置設(shè)備地址,完成設(shè)備列舉。
4) USB 設(shè)備的列舉
當(dāng)有一個(gè)USB 設(shè)備連接到主機(jī)上時(shí),主機(jī)的USB總線驅(qū)動(dòng)、根集線器驅(qū)動(dòng)獲得設(shè)備連接的通知,開(kāi)始列舉設(shè)備。在主機(jī)一端,列舉設(shè)備的過(guò)程是向設(shè)備發(fā)出一系列的標(biāo)準(zhǔn)請(qǐng)求。在設(shè)備一端,則需要響應(yīng)主機(jī)發(fā)出的請(qǐng)求。其順序如下:
a響應(yīng)獲取設(shè)備描述符的請(qǐng)求。務(wù)必保證設(shè)備描述符的正確發(fā)送;b.響應(yīng)設(shè)置地址的請(qǐng)求,設(shè)備進(jìn)入編址態(tài);c.連續(xù)三次響應(yīng)獲取設(shè)備描述符請(qǐng)求;d.響應(yīng)獲取配置描述符的的請(qǐng)求,務(wù)必保證配置描述符的正確發(fā)送;e.發(fā)送全部的配置描述符,同時(shí)發(fā)送所有的接口描述符、端點(diǎn)描述符;
如果以上步驟都正確,則主機(jī)會(huì)提示找到新設(shè)備,安裝驅(qū)動(dòng)程序。否則,提示找到未知設(shè)備,設(shè)備不可用。
5) USB 設(shè)備固件框架的實(shí)現(xiàn)
從上面的討論發(fā)現(xiàn)編寫(xiě)USB設(shè)備的固件實(shí)質(zhì)上是處理各種主機(jī)提出的請(qǐng)求。其中,標(biāo)準(zhǔn)的11個(gè)請(qǐng)求是必須實(shí)現(xiàn)的,如果要求設(shè)備有其它的功能還必須加入自定義的請(qǐng)求。按照USB 2.0 中的定義,稱(chēng)這些固件程序?yàn)閁SB設(shè)備的框架。下面介紹USB設(shè)備框架的實(shí)現(xiàn)。
3. 主程序的結(jié)構(gòu)
一旦加電,MCU就要初始化所有的端口,存儲(chǔ)器,定時(shí)器和中斷服務(wù)子程序。之后,MCU需要重新連接USB。這個(gè)程序很重要因?yàn)樗WC了在MCU未準(zhǔn)備好服務(wù)D12之前,D12不會(huì)動(dòng)作。
在主循環(huán)程序里面,MCU會(huì)詢(xún)問(wèn)鍵盤(pán)上的任何動(dòng)作。如果任何一個(gè)具體的鍵被按下,處理鍵的命令就會(huì)執(zhí)行處理程序,之后返回主程序。這個(gè)程序僅是用來(lái)調(diào)試用。1ms定時(shí)是用來(lái)啟動(dòng)檢查被按下鍵的子程序。
當(dāng)詢(xún)問(wèn)到達(dá)檢查Setup包時(shí),它需要先確定setup標(biāo)志是否建立。如果setup標(biāo)志已經(jīng)確立,它將發(fā)送設(shè)備請(qǐng)求到協(xié)議層進(jìn)行處理。下面的流程圖顯示了主程序在前臺(tái)執(zhí)行的情況。
4. 中斷服務(wù)程序的實(shí)現(xiàn)
PDIUSBD12固件是完全中斷驅(qū)動(dòng)的,因此中斷服務(wù)程序是整個(gè)固件編寫(xiě)過(guò)程中非常重要的一環(huán)。在進(jìn)入中斷服務(wù)程序后首先要發(fā)用命令Read Interrupt Register(控制字為F4H)讀取中斷寄存器,根據(jù)中斷寄存器的內(nèi)容判斷中斷源,然后跳轉(zhuǎn)到不同的服務(wù)程序中去處理中斷。
中斷服務(wù)程序(ISR)與主程序通信是通過(guò)事件標(biāo)志“EPPFLAG”和數(shù)據(jù)緩沖區(qū)“CONTROL-XFER”。
評(píng)論