本文介紹了在VxWorks實時操作系統環境下開發基于x86CPU目標機的支持PCI2040的板級支持包(BSP)和應用程序,并解決Tornado在調試過程中不支持常用網卡rtl81x9的問題。
VxWorks操作系統是美國風河(Wind River System)公司開發的高性能實時操作系統(RTOS)。VxWorks以其良好的可靠性、卓越的實時性和方便的可裁減性被廣泛地應用在通訊、軍事、航空等高端科技以及實時性要求很高地領域中。Tornado是風河公司為VxWorks操作系統推出的開發調試環境,是交叉開發環境中運行在主機上的部分。BSP的開發工作主要是在Tornado開發調試環境下進行的。
TI公司推出的PCI2040是一款用于實現PCI局部總線與DSP之間無縫鏈接的專用芯片。在VxWorks實時操作系統環境下實現PC與DSP的通訊,就需要開發針對目標機x86的板級支持包BSP(Board Support Package)。
1 BSP基本概念
BSP是介于主板硬件和操作系統之間的軟件支持包,是屬于操作系統的一部分。其主要功能是屏蔽硬件,提供操作系統的驅動和硬件驅動;主要目的是為了支持操作系統,使之能夠更好的運行于硬件主板。針對不同的目標機的CPU,VxWorks具有不同的BSP。即使對于同一CPU,由于外設的不同(如外部擴展DRAM的大小、類型不同),BSP相應的地方也不一樣。BSP在VxWorks操作系統中的地位如圖1所示。

圖1 BSP在VxWorks中的位置
BSP和PC上的BIOS有很大的區別,BIOS主要是負責在電腦開啟時檢測、初始化系統設備(設置棧指針,中斷分配,內存初始化等)、裝入操作系統并調度操作.
系統向硬件發出的指令,把操作系統由硬盤加載到內存,并傳遞一些硬件接口設置給系統。在操作系統正常運行后,BIOS的作用基本上也就完成了。PC機BIOS的作用更象嵌入式系統中的Bootloader(最底層的引導軟件,初始化主板的基本設置,為接收外部程序做硬件上的準備)。與Bootloader不同的是BIOS在裝載操作系統的同時,還傳遞一些參數設置(中斷端口定義等),而Bootloader只是簡單的裝載系統。BSP是和操作系統綁在一起運行在主板上的,BSP的開始部分和BIOS所做的工作類似,但是BSP還包含和系統有關的基本驅動(串口,網口等),此外程序員還可以編程修改BSP,在BSP中任意添加一些和系統無關的驅動或程序,甚至可以把上層開發的統統放到BSP中。
2 VxWorks 映象(Image)和啟動過程
2.1 VxWorks映象
VxWorks映象是在Tornado開發環境下編譯生

圖2 VxWorks BSP啟動順序

圖3 PCI2040配置空間頭區域
成的引導程序和VxWorks操作系統。VxWorks映象可大致分為兩類:可引導映象(Bootable Image)和可下載映象(Loadable Image)。可引導映象又分成不駐留ROM的映象(Rom-based Image)和駐留ROM的映象(Rom-resident Image)。不駐留Rom的映象再分成壓縮和不壓縮兩種。
對于x86目標機來說一般采用可下載映象,它通過VxWorks引導映象(VxWorks BootRom Image) 加載到目標機的RAM 中運行。本文采用軟盤來啟動VxWork系統,BootRom一般選擇bootrom_uncmp格式。在主機上插入空白軟盤,拷貝 BSP目錄下編譯好的bootrom_uncmp.bin文件到host\x86-win32\bin目錄下,并在DOS環境中,在此目錄下用"mkboot a:bootrom_uncmp"命令生成引導盤。將目標機設置成從軟盤啟動,此引導盤將通過事先設定好的某種耦合方式(串口或者網絡)將主機上的VxWorks映象下載到目標機上運行。下載時需要對Tornado2.2上面的Target Server進行配置,并且打開FTP Server。做成獨立系統的時候需將硬盤格式化成FAT16以下格式。并制作一個DOS啟動盤,上面包括運行"mkboot c:"命令時所需文件和boot.hex文件。在DOS環境下,在目標機上運行"mkboot c:",這樣就可以通過硬盤來啟動VxWorks Boot了。修改BSP包中的config.h將其中的啟動方式改成硬盤啟動(ata(0,0)),并將#undef include_ATA改成#define include_ATA。重新編譯后啟動目標機,VxWorks映象被下載到硬盤,這樣就做成了硬盤的獨立系統。
BootRom Image和VxWorks Image都對硬件進行初始化,但是內容不盡相同。BootRom映象的主要目的是通過網絡或者串口下載VxWorks系統,所以它只是初始化很少的硬件系統如網絡接口、串口來滿足下載VxWorks系統的要求。一旦VxWorks系統下載完畢,這些初始化過的硬件的作用也就完成了。而VxWorks啟動的時候會重新對幾乎所有的硬件設備進行完全的初始化,來滿足VxWorks操作系統運行的需要。
2.2 VxWorks啟動流程
VxWorks Image的運行方式分為在ROM中和在RAM中兩種。兩者啟動順序的區別是在RAM中運行的VxWorks 要調用sysInit()函數;而在ROM中運行不需要。如圖2 所示,sysInit()主要是初始化RAM用的,采取RAM運行方式系統將直接跳到RAM的首地址運行VxWorks。如果VxWorks在ROM中運行,生成的映像是Rom-resident Image。其優點是節約RAM空間,缺點是運行速度慢。如果VxWorks在RAM中運行,生成的映像Rom-based Image或Loadable Image。目標機為x86時,VxWorks運行在內存中。
3 PCI2040芯片簡介
3.1 PCI2040芯片特點
PCI2040符合PCI局部總線2.2規范,能夠實現PCI 局部總線與TMS320C54X(或TMS320C6X)的HPI(Host Port Interface)接口的無縫鏈接。一片PCI2040可以同時與4片DSP的HPI接口相連。PCI2040還提供了一個16位的通用總線(General-Purpose Bus)接口(提供JATG的無縫接口),可以兼容3.3V和5V信號環境。
3.2 PCI2040與TMS320VC5409連接
系統利用PCI2040實現TMS320VC5409與PC機的通訊。由于PCI2040是TI的配套專用芯片,硬件級的連接比較簡單,將對應的引腳連接即可。需要注意的是,未用的輸入信號線需要通過上拉電阻上拉至有效邏輯電平。TMS320VC5409將得到的數據經過處理后,通過PCI2040傳輸到PC機的PCI局部總線,數據在PC機上得到進一步的處理,并顯示在屏幕上。
3.3 PCI2040配置空間
定義一個PCI總線配置空間的目的在于提供一套適當的配置措施,使之實現完全的設備再定位;無需用戶干預安裝、配置和引導;并由與設備無關的軟件進行系統地址映射。在系統上電時,操作系統將PCI配置空間映射到PC的內存中,操作系統通過對內存相應位置的讀寫來實現對PCI配置空間的訪問。PCI總線的一個物理設備可能包含一個或多個PCI功能設備,也稱邏輯設備。每個PCI功能設備都有64個配置雙字用于實現配置寄存器。PCI協議定義了開頭16個雙字的格式和用途,稱為設備的配置頭區域,其他48個雙字的用途與設備有關。圖3是PCI2040配置空間頭區域結構。其中在基地址寄存器中HPI CSR memory base address表示將PCI2040中的HPI CSR寄存器映射到存儲器空間的基地址,Control space base address表示將PCI2040中的32K字節的控制空間映射到存儲器空間的基地址。數據的傳輸是在后者區域內進行的。
4 基于PCI2040的BSP開發
BSP一定要按照某種CPU的BSP定義形式來編寫,大多數情況下是在某一個成型的BSP模板上進行修改。本文所使用的開發編譯環境是Tornado2.2/VxWorks5.5,目標機CPU是x86系統中的Pentium3。在Tornado2.2中,其對應的BSP位于Tornado2.2\target\config\pcPentium3文件夾下。
4.1 realtek81x9網卡驅動在BSP中的配置
本系統采用網絡接口的方法從主機上下載VxWorks系統到目標機上。Tornado2.2本身對網卡類型的支持并不包括常用的realtek(瑞昱)網卡,需要在相應的BSP包中增加對realtek81x9網卡驅動的支持,使得VxWorks系統能夠被目標機上的realtek81x9網卡下載。Realtek公司提供面向Tornado2.2的realtek81x9網卡驅動,其中包括6個文件。將其中的sysNet.c、sysRtl91x9End.c、config.h、configNet.h四個文件拷貝到Torna-do2.2\target\config\pcPentium3目錄下,替換原來的同名文件和增加文件;將rtl81x9.c文件拷貝到Tornado2.2\target\src\drv\end\unsupported目錄下;將rtl81x9.h文件拷貝到Tornado2.0\ta-rget\h\drv\end\unsupported目錄下。創建一個downloadable工程文件,選擇pcPentium3參數,將拷貝到unsupported目錄下的rtl81x9.c文件加入到工程中,并設置編譯參數,這樣編譯產生的BootRom映象便可以支持realtek81x9網卡從主機上把VxWorks系統下載到目標機上運行。
4.2 BSP中增加對PCI2040的驅動支持
在Tornado2.0\target\configpcPentium3BSP目錄下編寫pci2040Drv.c和sysPci2040.c兩個文件。前者負責尋找和初始化PCI設備,后者按照PCI配置空間中的基址寄存器的值在VxWorks操作系統中映射和分配空間。
在pci2040Drv.c文件中首先定義一個結構體用來記錄尋找到的PCI2040信息。可以如下定義:
typedef struct pci2040Dev { DEV_HDR devHdr; int BusNo;
int DeviceNo; int FuncNo;
ULONG membase0;ULONG membase1;unsigned char irq;int irqvec;
} PCI2040_DEV;
接下來使用pciFindDevice()函數根據給定的PCI2040的Vendor ID(0x104C)和Device ID(0xAC60)來尋找設備。接下來可以用 pciConfig-InLong()函數來查看PCI2040的配置空間,并且最好使用pciHeaderShow()函數打印出所查看到的值來確認設備是否被找到。然后調用iosDrvInstall()函數將各種I/O服務與我們編寫的驅動服務例程掛接起來,并將驅動賦值后加到驅動列表中。接下來編寫pci2040DevCreate()服務例程來創建PCI2040驅動,這里可以對PCI2040的各個寄存器定位和初始化。例如,以下語句就是對DSP上的HPID寄存器的定位:
pDspHpiDatawaRegister=pci2040Dev[0].membase1 + 0x800;
在這個文件里可以編寫讀、寫服務例程和中斷服務例程,也可以將這三者放到應用程序里面編寫。
在sysPci2040.c函數中應用sysMmuMapAdd()函數來進行地址映射,將VxWorks操作系統能夠管理的內存與PCI2040和DSP上面的寄存器相互對應起來,并定義一個PCI橋結構記錄PCI2040的信息,以提供給系統辨識。
除了這兩個函數的編寫以外,還需要對BSP中的一些文件設置進行修改。如在文件config.h中加入語句 #define INCLUDE_PCI (添加PCI模塊),在文件sysLib.c中加入語句# include "sysBrdg.c"(支持PCI橋設備)等。
4.2 編寫應用程序和編譯操作系統
在建立的downloadable工程文件中編寫usrAppInit.c應用程序。其主要是調用BSP中編寫的函數來完成數據的傳輸、處理和對中斷的響應。例如,中斷服務例程如下:
void pci2040Isr()
{ 。。。
tempChar=*(pRegister+0x4);
if((tempChar&0x1)!=0)
{ *(pRegister+0x4)=0x1;
tempV= *(pDspRegister);
*(pDspRegister)=tempV|0x0808;
Printf("Interrupt happened !!!\n");
semGive(semForInt);
}
}
其中if((tempChar&0x1)!=0)語句用來判斷HPI CSR寄存器中的中斷位是否被置1。如果被置1的話表示有中斷發生,用*(pRegister+
0x4)=0x1語句清除中斷,并用*(pDspRe-gister)=tempV|0x0808語句清除HPIC中DSP對PC的置位,并設置旗語semForInt,以便調用中斷來進行數據傳輸和處理。
在Tornado環境下對工程進行編譯,完畢后在BSP目錄下將生成VxWorks文件(沒有后綴名),這個文件也就是要下載到目標機上運行的VxWorks映象。
5 總結
VxWorks實時操作系統采用開放標準,使開發者在進行系統優化的時候具有更高的效率;并且引入了基于MMU的內存保護技術,使系統可靠性顯著提高。PCI局部總線是目前PC和工控機上的總線標準,其帶寬可以滿足高速數據傳輸的需要。開發VxWorks系統下的PCI驅動程序,可以滿足各個系統中對數據傳輸速度增長的需求。對本文相應地方進行修改便能開發針對不同PCI橋接芯片的BSP包。