音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

基于VxBus的設(shè)備驅(qū)動開發(fā)

出處:微型機與應(yīng)用 發(fā)布于:2011-09-04 19:00:53

    VxBus是風(fēng)河公司新的設(shè)備驅(qū)動程序架構(gòu),是VxWorks新增的特性,它是在VxWorks6.2及以后版本被增加到VxWorks中的。本文結(jié)合基于PCI2040數(shù)據(jù)采集卡驅(qū)動的開發(fā)過程,分析了VxBus架構(gòu)下驅(qū)動的設(shè)計實現(xiàn)。

   VxBus簡介

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

 

   圖1是VxBus 在整個系統(tǒng)中的位置示意圖。從圖1中可以看到,VxBus起到了輔助總線的作用,提供了對總線控制驅(qū)動的支持。

 

    在VxWorks6.2版本發(fā)布前,設(shè)備驅(qū)動并不能被集成到VxWorks工程配置當(dāng)中,為了添加或移出設(shè)備驅(qū)動,需要有豐富的BSP和驅(qū)動開發(fā)相關(guān)的知識。作為VxWorks系統(tǒng)組件的一部分,VxBus消除了上面遇到的一些難題,各種驅(qū)動和支持組件的添加與刪除完全可以在Workbench工程中進行,不需要BSP和驅(qū)動相關(guān)的知識,也不會在添加或者刪除驅(qū)動時增加管理VxWorks工程的額外工作。

    vxBus下對設(shè)備管理做了更為詳細(xì)的劃分,簡單說來,硬件稱為device,軟件叫做driver。如果一個device出現(xiàn)在硬件列表中,啟動時需要到driver的隊列中去找相應(yīng)的driver,如果找到,二者結(jié)合成一個instance,否則在vxBusShow里可以看到一個orphan。使用vxBusShow可以比較清晰的看到driver列表和device列表以及orphan列表。

    如果需要增加一個設(shè)備,首先要修改的是hcfDeviceList,這是hwconf.c中的一個數(shù)組,這個數(shù)組中列有本系統(tǒng)中所有需要初始化的硬件設(shè)備。例如:

  HCF_DEVICE hcfDeviceList[] = {
  #ifdef DRV_SIO_NS16550
  { "ns16550", 0, VXB_BUSID_PLB, 0, ns1655x1Num, ns1655x1Resources },
  { "ns16550", 1, VXB_BUSID_PLB, 0, ns1655x2Num, ns1655x2Resources },
  #endif

    第二個ns16550是新加的。在參數(shù)中指明了它的名字“ns16550”,初始化的時候根據(jù)這個名字去搜索驅(qū)動。它的unit是1,區(qū)別與前面的0,初始化結(jié)束以后,會在設(shè)備列表中看到這個unit number。ns1655x2Resources是前面定義的一組資源,跟ns1655x1Resources類似,只是regBase和irq按照實際情況做區(qū)分。ns1655x2Num是ns1655x2Resources的長度。
    對于單核CPU,配置到這里就結(jié)束了。如果是多核,還需要修改一下sysDeviceFilter,這個函數(shù)決定一個設(shè)備在哪個核上初始化。如果還有hypervisor,還需要修改wrhvConfig.xml和vxworksX.xml,將特定的終端放開到指定的核。
    硬件介紹

     TI公司推出的PCI2040是一款用于實現(xiàn)PCI局部總線與DSP之間無縫鏈接的專用芯片。在VxWorks實時操作系統(tǒng)環(huán)境下實現(xiàn)主機與DSP的通訊,系統(tǒng)利用PCI2040實現(xiàn)TMS320VC5410與主機的通訊。TMS320VC5410的MCBSP0與TLC2548 連接,實現(xiàn)8路12位A/D數(shù)據(jù)的采集。TMS320VC5410將采集到的數(shù)據(jù)通過PCI2040傳輸?shù)街鳈C上,數(shù)據(jù)在主機上得到進一步的處理。硬件連接框圖如圖2所示。


    驅(qū)動開發(fā)

    設(shè)備驅(qū)動初始化

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


   內(nèi)核預(yù)初始化階段

   在VxWorks內(nèi)核預(yù)初始化早期,BSP的sysHwInit( )函數(shù)被執(zhí)行[4],在這個函數(shù)中,設(shè)備驅(qū)動初始化工作步被執(zhí)行。sysHwInit( )函數(shù)執(zhí)行一些早期的初始化,調(diào)用hardWareInterFaceInit( )函數(shù),執(zhí)行初始化硬件內(nèi)存分配機制,限制為設(shè)備驅(qū)動分配內(nèi)存,這個函數(shù)接著調(diào)用hardWareInterFaceBusInit( ),在hardWareInterFaceBusInit( )函數(shù)中完成所有設(shè)備驅(qū)動和模塊的注冊工作。PCI2040的注冊函數(shù)是vxbPci2040Register()。vxbPci2040Register()通過數(shù)據(jù)結(jié)構(gòu),向系統(tǒng)注冊一些設(shè)備初始化函數(shù)。其中涉及到三個數(shù)據(jù)結(jié)構(gòu):

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

    在這個結(jié)構(gòu)中,包含了初始化階段要調(diào)用的函數(shù)。下面的初始化過程會用到這些函數(shù)。

  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 }
  }

    這個結(jié)構(gòu)提供了應(yīng)用軟件操作硬件的一些函數(shù)及方法。

        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,            /* 總線驅(qū)動函數(shù)*/
  Pci2040Methods,            /* 設(shè)備方法結(jié)構(gòu) */
  Pci2040Probe,                    /* 設(shè)備探測函數(shù) */
  Pci2040ParamDefaults        /* 參數(shù)*/
  },
  NELEMENTS(PciPci204DevIDList),
  PciPci204DevIDList                /*設(shè)備資源列表*/
  };

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

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

    應(yīng)用程序初始化驅(qū)動部分

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

   驅(qū)動程序的配置

   采用VxBus驅(qū)動的一個主要優(yōu)點是:設(shè)備的驅(qū)動程序可以被看成VxWorks 系統(tǒng)的一個組件,通過集成的Workbench開發(fā)環(huán)境來配置設(shè)備驅(qū)動。PCI2040數(shù)據(jù)采集卡需要有以下文件:

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

    應(yīng)用程序與驅(qū)動的通信

    為了使設(shè)備和驅(qū)動能夠在VxWorks系統(tǒng)中使用,讓應(yīng)用程序、中間件、VxWorks內(nèi)核模塊訪問設(shè)備,執(zhí)行一些操作,基本的方法是在VxWorks中采用VxBus方法來實現(xiàn)硬件設(shè)備的訪問。VxBus方法是在驅(qū)動中公開一個入口,使VxBus中API函數(shù)可以調(diào)用這些入口函數(shù)。在PCI2040初始化階段,Pci2040Methods結(jié)構(gòu)中注冊的函數(shù)就是在驅(qū)動中公開的函數(shù),用于對PCI2040的操作。

    例如,通過PCI2040 完成對DSP數(shù)據(jù)寄存器的訪問

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

    vxbDevMethodRun( )函數(shù)夠被用于調(diào)用一個指定的驅(qū)動方法,這個函數(shù)反復(fù)查找所有的實例,并檢查每一個,看是否有指定公開申明的方法,如果實例有指定的方法,vxbDevMethodRun( )調(diào)用方法函數(shù)。

    為了避免重復(fù)遍歷在系統(tǒng)上的所有實例,可以用 vxbDevMethodGet( )函數(shù)找出驅(qū)動函數(shù)相對應(yīng)的驅(qū)動方法 ,然后通過下面代碼完成函數(shù)調(diào)用。

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

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

  void PCI2040Isr()
  { ……
  temp=*(PCI2040. instID.pRegister+0x4); //讀中斷寄存器
  if((tempr&0x1)!=0)               //檢查是否是該實例中斷
  { *(PCI2040. instID.pRegister +0x4)=0x1;
  temp= *(PCI2040. instIDpDspHpicRegister);
  *(PCI2040. instIDpDspHpicRegister)=temp|0x0808;
  //通知DSP,清除HINT中斷
  semGive(semForPci2040Int);
  }
  }

    采用基于VxBus架構(gòu)來開發(fā)PCI2040數(shù)據(jù)采集卡的驅(qū)動,通過擴展文件實現(xiàn)驅(qū)動的配置。與簡單的非VxBus驅(qū)動相比,顯然增加了工作量,然而對于基于多個BSP設(shè)備的復(fù)雜的驅(qū)動,VxBus驅(qū)動是優(yōu)于非VxBus驅(qū)動的。通過實際運用證明,所開發(fā)采集卡的驅(qū)動能夠穩(wěn)定運行,并且能很方便地將該驅(qū)動移植到其他的系統(tǒng)。


  

參考文獻:

[1]. PCI2040 datasheet http://m.58mhw.cn/datasheet/PCI2040_543255.html.
[2]. device datasheet http://m.58mhw.cn/datasheet/device_1397784.html.
[3]. PCI datasheet http://m.58mhw.cn/datasheet/PCI_1201469.html.
[4]. TMS320VC5410 datasheet http://m.58mhw.cn/datasheet/TMS320VC5410_688968.html.


關(guān)鍵詞:驅(qū)動

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!