<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于VxBus設備驅動(dòng)程序架構的設備驅動(dòng)開(kāi)發(fā)

基于VxBus設備驅動(dòng)程序架構的設備驅動(dòng)開(kāi)發(fā)

作者: 時(shí)間:2010-11-17 來(lái)源:網(wǎng)絡(luò ) 收藏

  是風(fēng)河公司新的程序架構,是新增的特性,它是在6.2及以后版本被增加到中的。在以前的版本中,驅動(dòng)程序并沒(méi)有和工程配置集成到一起,如果要配置,就要通過(guò)修改目錄下的config.h和syslib.c文件來(lái)完成。而基于架構模型的好處是允許驅動(dòng)的集成和配置在Workbench工程中完成。這就意味著(zhù)在Workbench環(huán)境下,每個(gè)驅動(dòng)程序都能通過(guò)可視化環(huán)境進(jìn)行配置,都能夠按要求添加或刪除設備。本文結合基于數據采集卡驅動(dòng)的開(kāi)發(fā)過(guò)程[1],分析了架構下驅動(dòng)的設計實(shí)現。

1 VxBus簡(jiǎn)介

 VxBus是指在VxWorks中用于支持的特有的架構,這種架構包含對minimal 的支持。它包括以下功能:①允許設備驅動(dòng)匹配對應設備;②提供驅動(dòng)程序訪(fǎng)問(wèn)硬件的機制;③軟件其他部分訪(fǎng)問(wèn)設備功能;④在VxWorks系統中,實(shí)現設備驅動(dòng)的模塊化。VxBus在總線(xiàn)控制器驅動(dòng)程序服務(wù)的支持下,能在總線(xiàn)上發(fā)現設備,并執行一些初始化工作,使驅動(dòng)與硬件設備之間正常的通訊。

 圖1是VxBus 在整個(gè)系統中的位置示意圖。從圖1中可以看到,VxBus起到了輔助總線(xiàn)的作用,提供了對總線(xiàn)控制驅動(dòng)的支持。

在VxWorks6.2版本發(fā)布前,設備驅動(dòng)并不能被集成到VxWorks工程配置當中,為了添加或移出設備驅動(dòng),需要有豐富的和驅動(dòng)開(kāi)發(fā)相關(guān)的知識[2]。并且在驅動(dòng)被添加或移出時(shí)要去做一些管理VxWorks 工程的額外的工作。作為VxWorks系統組件的一部分,VxBus消除了上面遇到的一些難題,各種驅動(dòng)和支持組件的添加與刪除完全可以在Workbench工程中進(jìn)行,而不需要BSP和驅動(dòng)相關(guān)的知識,也不會(huì )在添加、刪除驅動(dòng)時(shí)增加管理VxWorks工程的額外工作。因此大大方便了BSP的開(kāi)發(fā)。

2 硬件介紹

TI公司推出的是一款用于實(shí)現PCI局部總線(xiàn)與DSP之間無(wú)縫鏈接的專(zhuān)用芯片。在VxWorks實(shí)時(shí)操作系統環(huán)境下實(shí)現主機與DSP的通訊,系統利用實(shí)現TMS320VC5410與主機的通訊。由于PCI2040是TI的配套專(zhuān)用芯片,硬件級的連接比較簡(jiǎn)單,將對應的引腳連接即可。需要注意的是,未用的輸入信號線(xiàn)需要通過(guò)上拉電阻上拉至有效邏輯電平。TMS320VC5410的MCBSP0與TLC2548 連接,實(shí)現8路12位A/D數據的采集。TMS320VC5410將采集到的數據通過(guò)PCI2040傳輸到主機上,數據在主機上得到進(jìn)一步的處理。硬件連接框圖如圖2所示。


3 驅動(dòng)開(kāi)發(fā)

基于VxBus架構下PCI2040設備驅動(dòng)的開(kāi)發(fā)主要包括設備的初始化、設備控制以及設備驅動(dòng)如何以組件形式添加到Workbench配置界面中。下面分步介紹它的實(shí)現。

3.1設備驅動(dòng)初始化

設備的初始化,包含在BSP的初始化過(guò)程中[3],主要分三個(gè)階段,如圖3所示。


3.1.1內核預初始化階段

 系統上電啟動(dòng),CPU在上電時(shí)跳轉到一個(gè)指定的地址 ,開(kāi)始執行指令,初始化內存和CPU,然后是VxWorks 的初始化處理。

 在VxWorks內核預初始化早期,BSP的sysHwInit( )函數被執行[4],在這個(gè)函數中,設備驅動(dòng)初始化工作第一步被執行。sysHwInit( )函數執行一些早期的初始化,調用hardWareInterFaceInit( )函數,執行初始化硬件內存分配機制,這步允許在系統內存池初始化之前,限制為設備驅動(dòng)分配內存,這個(gè)函數接著(zhù)調用hardWareInterFaceBusInit( ),在hardWareInterFaceBusInit( )函數中完成所有設備驅動(dòng)和模塊的注冊工作。PCI2040的注冊函數是vxbPci2040Register()。vxbPci2040Register()通過(guò)數據結構,向系統注冊一些設備初始化函數。其中涉及到三個(gè)數據結構:

LOCAL struct drvBusFuncs PciFuncs =
{
Pci2040InstInit, /* devInstanceInit */
Pci2040InstInit2, /* devInstanceInit2 */
Pci204InstConnect /* devConnect */
}

在這個(gè)結構中,包含了初始化階段要調用的函數。下面的初始化過(guò)程會(huì )用到這些函數。

LOCAL struct vxbDeviceMethod Pci2040Methods[] =
{
DEVMETHOD(ReadHPID, PCI2040ReadHPID),
DEVMETHOD(WriteHPID, PCI2040WriteHPID),
DEVMETHOD(ReadHPIA, PCI2040ReadHPIA),
DEVMETHOD(WriteHPIA, PCI2040WriteHPIA),
DEVMETHOD(ReadHPIC, PCI2040ReadHPIC),
DEVMETHOD(WriteHPIC, PCI2040WriteHPIC),
DEVMETHOD(ReadCSR, PCI2040ReadCSR),
DEVMETHOD(WriteCSR, PCI2040WriteCSR),
{ 0, 0 }
}

這個(gè)結構提供了應用軟件操作硬件的一些函數及方法。

LOCAL struct vxbPciRegister Pci2040DevPciRegistration =
{
{
NULL, /* pNext */
VXB_DEVID_DEVICE, /* devID */
VXB_BUSID_PCI, /* busID = PCI */
VXB_VER_4_0_0, /* vxbVersion */
LNPCI_NAME, /* drvName */
Pci2040Funcs, /* 總線(xiàn)驅動(dòng)函數*/
Pci2040Methods, /* 設備方法結構 */
Pci2040Probe, /* 設備探測函數 */
Pci2040ParamDefaults /* 參數*/
},
NELEMENTS(PciPci204DevIDList),
PciPci204DevIDList /*設備資源列表*/
   };

  最后這個(gè)結構在vxbPci2040Registe()中被使用。這個(gè)結構包括幾個(gè)驅動(dòng)的初始化入口,其中Pci2040Probe()是PCI2040采集卡的硬件探測函數,該函數在VxBus初始化過(guò)程中檢測采集卡的數量,當檢測到采集卡時(shí),將采集卡與驅動(dòng)結合,形成設備的一個(gè)實(shí)例,以便應用程序使用。Pci204InstanceInit( )函數在VxBus初始化的第一階段被調用, Pci204InstanceInit( )函數只是簡(jiǎn)單地確保設備的中斷被禁止。

當所有驅動(dòng)在VxWorks注冊之后,hardWareInterFaceBusInit( )和hardWareInterFaceInit( ) 函數返回,sysHwInit( ) 完成非VxBus 驅動(dòng)的初始化并返回。sysHwInit( ) 函數返回后,VxWorks內核被初始化。

3.1.2 內核自檢

在這個(gè)階段,內核在sysHwInit2( )中執行,BSP調用Pci2040InstanceInit2( )函數[5]。在這個(gè)函數中,建立系統內存到設備空間的映射。關(guān)鍵部分代碼如下:

LOCAL void Pci204InstInit2(VXB_DEVICE_ID pDev)
  {……
   for (i = 0; i VXB_MAXBARS; i++)
   {
   if (pDev->regBaseFlags[i] == VXB_REG_IO)
   break;
   }
   if (i == VXB_MAXBARS)
   return;
pDrvCtrl->Pci2040Bar = pDev->pRegBase[i];
   vxbRegMap (pDev, i, pDrvCtrl->Pci2040Handle);
//設備I/O映射到系統內存
   ……
   }

此時(shí),完成內核服務(wù)初始化,并可以被驅動(dòng)訪(fǎng)問(wèn)。但是,中間層的服務(wù)仍然無(wú)效。

3.1.3 應用程序初始化驅動(dòng)部分

  在devInstanceInit2( )函數最后,創(chuàng )建用戶(hù)的運行任務(wù),并完成設備驅動(dòng)的初始化。在這個(gè)階段,Pci2040InstanceConnect( )函數被調用,完成最后的初始化工作,在這個(gè)函數中,主要是建立中斷與中斷服務(wù)程序的連接。

 至此,設備驅動(dòng)的初始化完成。

3.2驅動(dòng)程序的配置

 采用VxBus驅動(dòng)的一個(gè)主要優(yōu)點(diǎn)是:設備的驅動(dòng)程序可以被看成VxWorks 系統的一個(gè)組件,通過(guò)集成的Workbench開(kāi)發(fā)環(huán)境來(lái)配置設備驅動(dòng)。為了實(shí)現這一功能,開(kāi)發(fā)的驅動(dòng)需要增加一些額外的擴展文件。標準VxWorks設備驅動(dòng)有一個(gè)最小的文件集,對于大多數VxWorks設備驅動(dòng),最小的設備驅動(dòng)集要求有6個(gè)單獨的文件[6]。PCI2040數據采集卡需要有以下文件:

· 一個(gè)驅動(dòng)源文件PCI2040.c,執行驅動(dòng)運行邏輯,包括PCI2040驅動(dòng)的實(shí)現代碼。
· 一個(gè)組件描述文件PCI2040.cdf,允許集成驅動(dòng)到VxWorks開(kāi)發(fā)工具Workbench當中。
· 一個(gè)PCI2040.dc文件,提供驅動(dòng)注冊函數原型。
· 一個(gè)PCI2040.dr文件,提供一個(gè)調用注冊函數的C語(yǔ)言代碼段。
· 一個(gè)readme文件 ,提供版本信息。
· 一個(gè)makefile 文件,提供建立驅動(dòng)的編譯規則。

當上述文件在workbench環(huán)境下進(jìn)行相應的配置后,PCI2040的設備驅動(dòng)就會(huì )以組件的形式出現在開(kāi)發(fā)工程的Kernel Configuration選項中,可以方便地進(jìn)行PCI2040驅動(dòng)配置。

4 應用程序與驅動(dòng)的通信

為了使設備和驅動(dòng)能夠在VxWorks系統中使用,讓?xiě)贸绦?、中間件、VxWorks內核模塊訪(fǎng)問(wèn)設備,執行一些操作,最基本的方法是在VxWorks中采用VxBus方法來(lái)實(shí)現硬件設備的訪(fǎng)問(wèn)。VxBus方法是在驅動(dòng)中公開(kāi)一個(gè)入口,使VxBus中API函數可以調用這些入口函數。在PCI2040初始化階段,Pci2040Methods結構中注冊的函數就是在驅動(dòng)中公開(kāi)的函數,用于對PCI2040的操作。

例如,通過(guò)PCI2040 完成對DSP數據寄存器的訪(fǎng)問(wèn)

struct vxbDriverControl ctrl;
vxbDevMethodRun(DEVMETHOD_CALL(ReadHPID),ctrl);

vxbDevMethodRun( )函數夠被用于調用一個(gè)指定的驅動(dòng)方法,這個(gè)函數反復查找所有的實(shí)例,并檢查每一個(gè),看是否有指定公開(kāi)申明的方法,如果實(shí)例有指定的方法,vxbDevMethodRun( )調用方法函數。

為了避免重復遍歷在系統上的所有實(shí)例,可以用 vxbDevMethodGet( )函數找出驅動(dòng)函數相對應的驅動(dòng)方法 ,然后通過(guò)下面代碼完成函數調用。

STATUS (*methodFunc)(VXB_DEVICE_ID devID, void * pArg);
methodFunc = bDevMethodGet(devID,DEVMETHOD_CALL(ReadHPID));
if(methodFunc != NULL )
(*methodFunc)(devID, pArg);

在PCI2040的數據采集卡中,通常是DSP在采集完數據后,通過(guò)中斷通知主機,去讀取數據。下面是中斷服務(wù)相關(guān)代碼。

void PCI2040Isr()
{ ……
temp=*(PCI2040. instID.pRegister+0x4); //讀中斷寄存器
if((tempr0x1)!=0) //檢查是否是該實(shí)例中斷
{ *(PCI2040. instID.pRegister +0x4)=0x1;
temp= *(PCI2040. instIDpDspHpicRegister);
*(PCI2040. instIDpDspHpicRegister)=temp|0x0808;
//通知DSP,清除HINT中斷
semGive(semForPci2040Int);
}
}
采用基于VxBus架構來(lái)開(kāi)發(fā)PCI2040數據采集卡的驅動(dòng),通過(guò)擴展文件實(shí)現驅動(dòng)的配置。與簡(jiǎn)單的非VxBus驅動(dòng)相比,顯然增加了工作量,然而對于基于多個(gè)BSP設備的復雜的驅動(dòng),VxBus驅動(dòng)是優(yōu)于非VxBus驅動(dòng)的。通過(guò)實(shí)際運用證明,所開(kāi)發(fā)采集卡的驅動(dòng)能夠穩定運行,并且能很方便地將該驅動(dòng)移植到其他的系統。

c語(yǔ)言相關(guān)文章:c語(yǔ)言教程




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>