王宏文,李曉燕,黃金蘭
(河北工業大學 控制科學與工程學院,天津 300130)
?
噴碼機平臺WinCE5.0系統的BSP開發
王宏文,李曉燕,黃金蘭
(河北工業大學 控制科學與工程學院,天津 300130)
基于以S3C2440A處理器為核心的噴碼機硬件開發平臺,研究了嵌入式WinCE5.0操作系統板級支持包BSP的開發。分析了噴碼機平臺的硬件組成和BSP的框架結構,利用源代碼重用的思想,完成了Bootloader、OAL、驅動程序、配置文件的開發工作并在BINFS文件系統的基礎上實現Multi-bin成功將內核分塊。實踐表明該BSP在噴碼機臺上運行穩定,可靠性高,能有效提升系統的開機速度,并使平臺擁有了運行大型噴印軟件的能力。
噴碼機;WinCE5.0;Multi-bin;BSP
本文在實現噴碼機板載系統一體化的目標下,研究了噴碼機軟件系統開發的操作系統板級支持包(Board Support Package,BSP)[1]。
板級支持包BSP是介于硬件和操作系統之間的一層軟件系統,其作用就是抽象操作系統和主板硬件之間的交互接口。基于具體開發板開發BSP,必須對它的結構有一定的了解。一般情況下,WinCE5.0的BSP包含引導程序(BootLoader)、OEM適配層(OEM Adaptation Layer,OAL)、驅動程序、配置文件四部分。
BSP不僅與特定的操作系統有關,而且與不同的開發平臺也是一一對應的。噴碼機系統的硬件平臺主要由圖1所示的幾大部分組成。

圖1 開發板硬件組成
以噴碼機控制系統的CPU為核心,外圍設備主要包括兩片HY57V561620F(L)T(P)芯片、一片K9F2G08U0A和EN29LV160AB芯片,使開發板擁有了64 MB的SDRAM、256 MB的NAND FLASH以及2 MB的 NOR FLASH。網卡采用DM9000,提供互聯網連接等功能,同時包含4.3寸的觸摸屏、XJ128噴頭以及豐富的接口資源。
從零開始研發BSP成本較高、耗時長,所以現實中最常采用的方法是根據需要對現有的相近BSP源碼進行移植。本文就是以相近開發板的BSP為基礎,根據噴碼機硬件平臺的外圍配置,對BSP的源碼做出對應的修改,使之能夠有效支持硬件系統。主要工作介紹如下。
3.1 BootLoader的實現
BootLoader是嵌入式軟件系統最底層的一組代碼,是依賴硬件存在的。微軟公司提供了一套WinCE系統BootLoader的基本框架,由Blcommon庫、Eboot庫、OEM代碼、EDBG驅動以及存儲管理組成[1]。移植時前二者無需改動,后面三部分則需要根據開發板的實際配置進行修改。在實現過程中應盡量使用微軟提供的支持庫,這樣在保證了規范性、高效性的同時還節省了實現時間。
BootLoader需要實現的代碼主要分為兩部分:由匯編語言編寫的啟動代碼以及由C語言編寫的主代碼。匯編代碼startup.s是BootLoader的入口函數,CPU啟動后將立即運行,完成對CPU的初始化、地址映射、及BootLoader代碼的搬運[2]。以下是平臺的部分代碼實現:
ResetHandler
movr0, #0
mcrp15, 0, r0, c8, c7, 0 ; flush both TLB
mcrp15, 0, r0, c7, c5, 0 ; invalidate instruction cache
mcrp15, 0, r0, c7, c6, 0 ; invalidate data cache
ldr r0, = WTCON ; disable watch dog
ldr r1, = 0x0
str r1, [r0]
; set INTMSK, INTSUBMSK, disable all interrupts
ldr r0, = INTMSK
ldr r1, = 0xffffffff ; disable all interrupts
str r1, [r0]
ldr r0, = INTSUBMSK
ldr r1, = 0x7fff;disable all sub interrupt
str r1, [r0]
……
;set INTMOD, Configure MPLL, UPLL
……
;Copy boot loader to memory
……
匯編程序執行完以后,就會跳轉到主程序main函數中,調用BLCOMMON庫blcommon.c中定義的BootLoaderMain函數。由它控制著接下來的整個代碼執行流程,是引導加載程序的主控函數。
① 調用KerneRrelocate()函數(blcommon.c中實現):將BootLoader中的全局變量重新定位到RAM中。
② 調用OEMDebugInit()函數(main.c中實現):初始化調試端口,一般情況下就是異步串行通信口UART,調用OEMInitDebugSerial()函數實現。在噴碼機平臺中選擇串口UART0作為調試端口,查看處理器的芯片手冊,要把通用I/O口的GPH2和GPH3用作功能復用口,設置它們為UART0的發送數據引腳TXD與接收數據引腳RXD,代碼如下:
pIOPortReg->GPHCON &= ~((3 << 4) | (3 << 6));
pIOPortReg->GPHCON |= ((2 << 4) | (2 << 6));
同時,初始化它的傳輸速率、每幀傳輸數據位數、有無奇偶校驗和停止位等,主要是對UART0的各控制寄存器進行設置,如下:
UFCON0 = 0x0; //設置串口FIFO控制寄存器,禁用FIFO
UMCON0 = 0x0; //禁用
ULCON0 = 0x3; //選擇每幀數據位數為8,停止位數為1,無 //奇偶校驗
UCON0 = 0x245;//選擇串口波特率時鐘,發送模式,接收 //模式
UBRDIV0=( (int)(PCLK/(16*115200) -1 );
//設置串口波特率
③ 調用OEMPlatformInit()函數(main.c中實現):調用InitDisplay(),InitUSB(),Isr_Init()等函數完成平臺初始化工作。
④ 調用OEMPreDownload()函數(main.c中實現):當平臺的USB下載不可用時,調用此函數完成以太網下載前其他的一些準備工作。獲得IP地址,初始化TFTP傳輸協議。
⑤ 調用DownloadImage()函數(在blcommon.c中實現):下載操作系統映像到SDRAM中,完成后進行TOC簽名的檢查。
⑥ 調用OEMLaunch()函數(在main.c中實現):啟動操作系統映像。
3.2 OAL移植
OAL(OEM Adaptation Layer)從WinCE5.0以后,引入了OAL的新概念:產品質量級OAL,即PQOAL。它使OAL的目錄結構標準化、代碼分布模塊化,降低了移植的難度[3]。WinCE5.0中OAL的代碼主要分成4部分:板級代碼、SoC芯片級代碼、體系結構級代碼和硬件無關級代碼。
噴碼機平臺相較于學習板主要是在外圍設備方面做了變動,因此這里完成OAL移植的主要工作就是修改板級OAL代碼,位于WINCE500PLATFORM HARDWAER PLATFORM NAMESRC KERNELOAL。在最后的編譯過程中,OAL是被編譯進操作系統內核的,因此OAL的啟動流程實際也就是操作系統內核的啟動流程。圖2是操作系統的初始化啟動流程。

圖2 WinCE5.0內核啟動順序
其中的絕大部分函數由微軟提供,并不需要修改,只有部分涉及到具體硬件的地方需要實現。
① startup函數。這是系統啟動時調用的第一個函數,主要完成CPU和硬件的初始化等工作。本系統的OAL由BootLoader引導,很多硬件設備已經在那里完成初始化,所以此處startup的主要工作就是完成其余部分初始化然后跳轉到OAL的主控函數KernelStart()處開始執行。部分代碼如下:
LEAF_ENTRY StartUp
addr0, pc, #g_oalAddressTable- (.+ 8)
bl KernelStart
ENTRY_END
② 串口調試函數OEMInitDebugSerial()。其由ARMInit()函數調用,主要完成初始化串口的工作,與BootLoader分享相同的代碼。
③ OEMInit()函數。OEMInit()函數也是由ARMInit()調用,主要完成硬件平臺的初始化,包括cache globals、中斷、系統時鐘、KITL等,幾乎完成了所有的硬件初始化工作[4]。如初始化I/O函數ConfigureGPIO()的部分代碼如下:
s2440IOP->GPBDAT=0x60;
s2440IOP->GPBUP=0x7FF;
s2440IOP->GPBCON=0x2A96A8;
……
s2440IOP->GPGCON=0x16A4F3B4;
s2440IOP->GPGUP=0x9BDC;
……
具體操作就是根據噴碼機平臺對端口的要求,查S3C2440A芯片手冊的I/O部分,根據規則設置相關寄存器來初始化它們的實際功用。這些所有的初始化工作都在WINCE500 PLATFORMHARDWAER PLATFORM NAMESRC KERNELOAL init.c中實現。
④ 中斷初始化函數OALIntrInit()。由OEMInit()函數調用,負責初始化外圍硬件的中斷控制器。首先調用OALIntrMapInit()初始化物理中斷Irq和邏輯中斷SysIntr的映射表,然后清除外部中斷和內部中斷,調用BSPIntrInit()對BSP中的GPIO中斷進行初始化工作,這里移植時不作修改。
⑤ 中斷處理函數OEMInterruptHandler()。OAL中對中斷的處理主要是實現ISR部分。當發生硬件中斷時,該函數就會被調用完成ISR部分的中斷處理:讀取系統的中斷標記位、確定中斷源、屏蔽中斷并返回相應的系統中斷號。然后觸發相應的事件,由具體驅動程序的IST完成真正的中斷處理。代碼存放路徑為WINCE500PLATFORM HARDWAER PLATFORM NAMESRC COMMONINTRintr.c,針對開發板實際設置的中斷修改此代碼。同時涉及到中斷處理的函數OALIntrRequestIrqs()、OALIntrEnableIrqs()、OALIntrDisableIrqs() 和OALIntrDoneIrqs()都在intr.c中實現,它們相應地會調用BSPIntrRequestIrqs()、BSPIntrEnableIrq()、BSPIntrDisableIrq()、BSPIntrDoneIrq()來實現同一CPU的不同開發板對中斷所做的一些修改。
⑥ 內核初始化函數KernelInit()。完成初始化系統API函數調用表、系統堆、內存池、內核進程和進程調度等工作,由微軟提供。
⑦ FirstSchedule()。這實際上不是一個函數,而是armtrap.s文件中的一個標簽,使第一個處于就緒態的線程執行[4]。
OAL作為內核與目標硬件之間的接口,主要對硬件的4種部分加以抽象:RTC、Timers、Caches和調試端口,針對實際情況改變了哪里的硬件就修改對應的代碼。具體到噴碼機硬件開發板,移植的重點是硬件初始化部分和中斷處理部分。
3.3 驅動程序的實現
如果增加或刪改了目標板的硬件設備,那么移植BSP時,就必須修改設備驅動程序。WinCE開發平臺提供了多種類型的設備驅動程序,它們的源代碼由兩部分組成:與硬件平臺無關的部分位于WINCE500PUBLICCOMMONOAKDRIVERS目錄下,與硬件平臺有關的部分位于WINCE500PLATFORM下相應BSP目錄的DRIVERS[5]。
我們不需要修改與硬件平臺無關的公共部分,只需要修改與硬件密切相關的源代碼。具體到噴碼機平臺,主要就是XJ128噴頭底層驅動的PMJ_Init(初始化設備)、PMJ_Deinit(卸載設備)、PMJ_Open(打開設備)、PMJ_Close(關閉設備)、PMJ_Write(寫數據到設備)、PMJ_IOControl(設備的I/O控制)等12個流接口驅動函數。
3.4 移植配置文件
PB5使用兩種配置文件來生成操作系統運行時的鏡像,一種是源代碼配置文件,另一種是映像配置文件[6]。配置文件的移植主要集中在Dirs、source、BIB以及REG文件。
根據實驗結果,導入移植好的BSP編譯出的系統鏡像內存太大,燒入噴碼機平臺以后系統開機十分緩慢。因此需要在BINFS基礎上實現Multi-bin技術來將內核分塊,解決開機緩慢的問題。其具體實現主要在配置文件部分:修改config.bib的MEMORY部分如表1所列。

表1 config.bib文件MEMORY部分配置
將內核分為XIPKERNEL和NK兩塊,開機必備的內容存放在XIPKERNEL中,其他部分存放在NK中按需調用。經過實踐,XIPKERNEL應包含如下的幾個模塊(添加在MODULES段):
MODULES
nk.exe $(_FLATRELEASEDIR)kern.exe XIPKERNEL SH coredll.dll $(_FLATRELEASEDIR)coredll.dll XIPKERNEL SH
filesys.exe $(_FLATRELEASEDIR)filesys.exe XIPKERNEL SH
fsdmgr.dll $(_FLATRELEASEDIR)fsdmgr.dll XIPKERNEL SH
mspart.dll $(_FLATRELEASEDIR)mspart.dll XIPKERNEL SH
binfs.dll $(_FLATRELEASEDIR)infs.dll XIPKERNEL SH
ceddk.dll $(_FLATRELEASEDIR)ceddk.dll XIPKERNEL SH regenum.dll $(_FLATRELEASEDIR) egenum.dll XIPKERNEL SHbusenum.dll $(_FLATRELEASEDIR)usenum.dll XIPKERNEL SH
pm.dll $(_FLATRELEASEDIR)pm.dll XIPKERNEL SH smflash.dll $(_FLATRELEASEDIR)smflash.dll XIPKERNEL SHfatfsd.dll $(_FLATRELEASEDIR)fatfsd.dll XIPKERNEL SH
diskcache.dll $(_FLATRELEASEDIR)diskcache.dll XIPKERNEL SH
fatutil.dll $(_FLATRELEASEDIR)fatutil.dll XIPKERNEL SH
除此之外還要在FILES段添加下面兩個模塊:
FILESboot.hv $(_FLATRELEASEDIR)oot.hv XIPKERNEL SH
wince.nls $(_FLATRELEASEDIR)wince.nls XIPKERNEL SH
配合修改platform.bib、common.bin文件完善系統各功能模塊的鏡像歸屬問題,同時在platform.reg中添加BINFS文件的支持。所有工作完成后,導入新的BSP,成功編譯出的系統鏡像如圖3所示。

圖3 編譯生成的系統鏡像
最終將XIP.BIN燒寫到噴碼機平臺,系統啟動時只需將2 MB的XIPKERNEL復制到RAM中,而不是原來將近30 MB的NK。
這樣不僅將開機時間降低至10 s以內,同時增加了29 MB的可用RAM,使系統擁有了運行大型應用軟件的能力。
噴碼機產品的應用領域越來越廣,針對不同的需要設計開發板,在定制系統時就必須有配套的BSP。移植在滿足應用要求的同時可以大大節省開發時間,減少產品的研發成本。

[1] 何劍鋒,李祥,何月順.基于XScale PXA270處理器平臺WindowsCE5.0系統的BSP二次開發[J].化工自動化及儀表,2009,36(4):72-75.
[2] 張飛,白瑞林,陸林.WinCE5.0 Bootloader的設計與實現[J].計算機工程,2009,35(7):232-234.
[3] 趙永志.WinCE5_0在嵌入式平臺ARK1200上的移植與應用[D].哈爾濱:哈爾濱工業大學,2009.
[4] 夏軍,胡景春.基于ARM的Windows CE移植及應用開發[J].計算機技術與發展,2011,21(4):129-132.
[5] 李尚柏,鐘瑞.基于ARM的嵌入式Windows CE系統高級開發技術[M].北京:清華大學出版社,2011:192-198.
[6] 張德華.基于AT91SAM9261平臺的Windows CE的移植[J].工業控制計算機,2009,22(4):62-65.
王宏文(教授),研究領域為現代傳動控制系統與智能化工程設備;李曉燕、黃金蘭(碩士研究生),研究領域為智能化工程裝備、嵌入式技術。
Development of BSP Based on WinCE 5.0 and Inkjet Printer Platform
Wang Hongwen,Li Xiaoyan,Huang Jinlan
(School of Control Science and Engineering, Hebei University of Technology, Tianjin 300130, China)
Based on the inkjet printer hardware platform with its core of S3C2440A CPU, the development of BSP based on Windows CE5.0 is introduced. Compositions of inkjet printer platform and the frame construction of BSP are analyzed, and then transplantations of Bootloader, OAL, device driver,configuration files and the implementation approach that divides the kernel into a few pieces on the basis of BINFS and Multi-bin are stated in detail by using the comcept of code reuse. Practices show that the BSP in the inkjet printer platform is stable with high-reliability, and can effectively improve system boot speed. Meanwhile it also has the opportunity to run large-scale printing software.
inkjet printer;WinCE5.0;Multi-bin;BSP
TP316
A
迪娜
2013-12-07)