基于USB的便攜式設(shè)備固件升級(jí)程序的設(shè)計(jì)
1 引言
固件是系統(tǒng)最底層的工作軟件。便攜式設(shè)備功能與固件密切相關(guān)。固件能夠充分發(fā)揮硬件資源,彌補(bǔ)硬件缺陷與不足。因此。固件在便攜式設(shè)備中具有極大重要性。固件升級(jí)能夠進(jìn)一步完善固件程序,增強(qiáng)便攜式設(shè)備功能。
在系統(tǒng)開(kāi)發(fā)和用戶使用時(shí).一旦系統(tǒng)提供設(shè)備固件更高版本。就要求設(shè)備通過(guò)固件升級(jí)程序?qū)υ泄碳M(jìn)行升級(jí)。因此,基于USB的即插即用、傳輸速率高的特點(diǎn),設(shè)計(jì)一種通過(guò)USB接口升級(jí)設(shè)備固件的應(yīng)用程序。該設(shè)計(jì)應(yīng)用程序是基于便攜式設(shè)備的USB驅(qū)動(dòng)程序.包括固件文件結(jié)構(gòu)定義、USB設(shè)備驅(qū)動(dòng)程序與上層應(yīng)用軟件的I,0操作、USB Bulk0nly傳輸模式、USB通信命令規(guī)范、NAND Flash壞塊信息表構(gòu)建等問(wèn)題。
2 系統(tǒng)結(jié)構(gòu)
該系統(tǒng)利用PC機(jī)通過(guò)USB總線與便攜式設(shè)備進(jìn)行通信,并在此通信基礎(chǔ)上完成固件升級(jí)的各種操作,其基本結(jié)構(gòu)如圖l所示。系統(tǒng)開(kāi)發(fā)人員或終端用戶在獲取最新版本固件后,利用固件升級(jí)程序?qū)崿F(xiàn)PC機(jī)與便攜式設(shè)備的通信,并實(shí)現(xiàn)固件生成、讀取設(shè)備信息、USB-Boot二級(jí)代碼下載、固件升級(jí)等功能。
3 固件升級(jí)程序的設(shè)計(jì)
固件升級(jí)程序面向系統(tǒng)開(kāi)發(fā)人員或終端用戶。由于用戶知識(shí)體系架構(gòu)的差異,程序界面力求友好、簡(jiǎn)潔。功能要求:按預(yù)先定義的固件結(jié)構(gòu)生成固件文件:自動(dòng)檢測(cè)設(shè)備是否連接,一旦設(shè)備連接,自動(dòng)下載二級(jí)Boot loader并讀取設(shè)備Flash信息、固件版本信息;將固件文件下載至NAND Flash,從而完成固件升級(jí)操作。
3.1 固件頭的填充
固件文件的固件頭具有標(biāo)識(shí),索引功能。固件頭結(jié)構(gòu)決定后續(xù)固件升級(jí)工具擴(kuò)展的難易。該設(shè)計(jì)的固件頭主要包括固件的版本、生成日期、廠商信息、模塊信息和資源文件在固件中的偏移、長(zhǎng)度等信息。這些信息采用結(jié)構(gòu)體將其組織,以便讀取固件文件。同時(shí)在頭尾部預(yù)留若干字節(jié)的保留區(qū),以備后續(xù)升級(jí)擴(kuò)展。
固件頭的填充需要嚴(yán)格按照結(jié)構(gòu)體所定義的成員進(jìn)行。函數(shù)GenerateHeader完成固件頭的生成,其函數(shù)原型為:
3.2 生成固件文件
固件文件主要由固件頭,啟動(dòng)代碼,系統(tǒng)代碼,F(xiàn)ONTl2,F(xiàn)ONTl6,GBK字體和字庫(kù)資源文件,菜單資源文件,圖片資源文件等8個(gè)模塊組成。其中系統(tǒng)代碼、菜單資源文件、圖片資源文件的路徑由用戶指定,其余文件存儲(chǔ)于工程目錄下。圖2為固件生成流程。
固件生成操作是由函數(shù)GenerateRfw完成。其原型為:
執(zhí)行該函數(shù)需獲得文件當(dāng)前工程下的路徑.以及文件大小,因此需調(diào)用FileFulJLlName函數(shù)。FileFullName函數(shù)原型為:INT FileFullName(CString FileName,CString &FilePath—Name);其中FileName為存儲(chǔ)在工程目錄下的文件名,F(xiàn)ilePathName為文件路徑的引用。該函數(shù)返回值為文件大小。
4 獲取USB設(shè)備路徑
便攜式設(shè)備在進(jìn)入固件升級(jí)模式時(shí).向PC機(jī)枚舉該設(shè)備的各類描述符,在成功應(yīng)答最初的不完整的設(shè)備描述符請(qǐng)求后,PC機(jī)向設(shè)備分配一個(gè)新地址.該地址就是固件升級(jí)程序中需獲取的設(shè)備路徑。接著,PC機(jī)在得到完整的設(shè)備描述符、配置描述符、字符描述符后加載設(shè)備驅(qū)動(dòng)程序。該過(guò)程完成后,通過(guò)驅(qū)動(dòng)程序與設(shè)備通信。在開(kāi)發(fā)應(yīng)用軟件中,通過(guò)API函數(shù)調(diào)用獲取設(shè)備路徑,該獲取過(guò)程分為以下步驟:
(1)調(diào)用Windows設(shè)備管理函數(shù)SetupDiGetClassDevs()獲取設(shè)備信息集。函數(shù)SetupDiGetC1assDevs()是設(shè)備信息集的處理程序,包含所有與指定參數(shù)匹配的已安裝設(shè)備。
(2)利用函數(shù)SetupDiEnumDeviceInterfaces()返回設(shè)備信息集的一個(gè)設(shè)備接口元素的環(huán)境結(jié)構(gòu),每次調(diào)用該函數(shù)便返回一個(gè)設(shè)備接口信息,重復(fù)調(diào)用,直到獲取設(shè)備信息集所有接口信息。函數(shù)SetupDiEnumDeviceInterfaces()調(diào)用成功返回“TRUE”且devicelnfoData指定一個(gè)與查找參數(shù)相符的接口。
(3)調(diào)用函數(shù)SetupDiGetDeviceInterfaceDetail()獲得該接口詳細(xì)信息。用其獲得接口詳細(xì)信息,必須先得到所請(qǐng)求的緩沖區(qū)大小,再分配適當(dāng)?shù)木彌_區(qū),并再次調(diào)用該函數(shù)以得到接口詳細(xì)信息。此時(shí)返回的接口信息包含設(shè)備接口名稱.用戶可調(diào)用函數(shù)CreateFile()獲取所要打開(kāi)設(shè)備的句柄。
5 USB二級(jí)BOOt loader的下載
該設(shè)計(jì)便攜式設(shè)備在固件升級(jí)時(shí).首先由第1級(jí)Bootloader引導(dǎo)進(jìn)入U(xiǎn)SB Boot模式.并向PC枚舉該設(shè)備。PC識(shí)別該USB設(shè)備,并加載相應(yīng)驅(qū)動(dòng)程序后。固件升級(jí)過(guò)程便獲取設(shè)備系統(tǒng)路徑。因?yàn)槊恳粋€(gè)USB設(shè)備有一個(gè)PID和VID,應(yīng)用程序通過(guò)PID和VID定位到固件升級(jí)的USB設(shè)備。獲取設(shè)備路徑和句柄后,利用USB總線讀取設(shè)備數(shù)據(jù),從而為完成應(yīng)用程序與USB設(shè)備通信做好準(zhǔn)備。
由于器件MASK ROM的空間限制,諸如USB命令解析、Flash設(shè)備驅(qū)動(dòng)等應(yīng)用代碼,也就是USB模式下的二級(jí)Bootloader代碼,需要通過(guò)PC機(jī)下載至器件IRAM。
USB二級(jí)代碼的下載過(guò)程創(chuàng)建子線程用于檢測(cè)設(shè)備,只有確認(rèn)設(shè)備已連接,才能下載二級(jí)代碼,總的下載流程如圖3所示,圖中實(shí)線為主線程,虛線為子線程。
在獲取到設(shè)備路徑后,系統(tǒng)便調(diào)用函數(shù)CreateFile()獲取設(shè)備句柄。利用該設(shè)備句柄和獲取的二級(jí)代碼文件路徑,便能夠通過(guò)調(diào)用函數(shù)Boot_VendorRequest()將二級(jí)代碼下載到設(shè)備IRAM中。
Boot_VendorRequest函數(shù)原型為:B00L Boot_VendorRe-quest(HANDLE hDevice,DWORD requestCode,LPCTSTR str-FileName);其中hDevice是設(shè)備句柄,requestCode是請(qǐng)求控制碼,strFileName是二級(jí)代碼文件路徑,返回值為“TRUE”,說(shuō)明下載成功,否則下載失敗。該函數(shù)主要調(diào)用系統(tǒng)函數(shù)DeviceIoControl(),將二級(jí)代碼文件進(jìn)行CRC校驗(yàn)后,傳入設(shè)備IRAM。
6 固件升級(jí)
在完成設(shè)備路徑獲取,并將二級(jí)引導(dǎo)代碼下載至設(shè)備IRAM后,設(shè)備控制權(quán)交給這段應(yīng)用代碼。代碼主要負(fù)責(zé)Nand Flash的驅(qū)動(dòng)和USB命令解析。至此,固件升級(jí)前的所有工作已準(zhǔn)備就緒。固件升級(jí)的核心任務(wù)是將固件文件無(wú)差錯(cuò)寫(xiě)入NAND Flash。由于NAND Flash存在壞塊,故必須先對(duì)其進(jìn)行壞塊檢測(cè),然后形成壞塊信息表。根據(jù)需要寫(xiě)入的固件各部分文件大小,結(jié)合壞塊信息表,則生成固件各文件在Flash中的存放位置,進(jìn)而將固件下載至Flash。最后填充ID Block,這樣就完成了固件升級(jí)。圖4為固件升級(jí)流程。
7 系統(tǒng)測(cè)試
系統(tǒng)測(cè)試采用自行開(kāi)發(fā)的便攜式的網(wǎng)絡(luò)通信平臺(tái)。固件升級(jí)前需的準(zhǔn)備:(1)保證設(shè)備電池充足,防止升級(jí)過(guò)程因電池不足而中斷;(2)備份設(shè)備原有固件;(3)確保設(shè)備有足夠存儲(chǔ)容量;(4)檢查IJSB接口可靠性。圖5是固件生成及其下載演示。從圖5中看出,升級(jí)過(guò)程向設(shè)備寫(xiě)入的菜單、圖像等資源顯示成功。
8 結(jié)束語(yǔ)
隨著嵌入式技術(shù)的發(fā)展,便攜式設(shè)備已普及日常生活中。隨著用戶不斷提出新功能要求,廠商通過(guò)更新固件使其產(chǎn)品增值。因此,該設(shè)計(jì)固件升級(jí)工具的設(shè)計(jì)方法可廣泛應(yīng)用于MP3、電子詞典等便攜式設(shè)備。測(cè)試結(jié)果表明,升級(jí)程序界面簡(jiǎn)潔友好,只需幾個(gè)簡(jiǎn)單操作就能完成系統(tǒng)固件升級(jí)。