中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于VxBus設備驅動程序架構的設備驅動開發(fā)

        基于VxBus設備驅動程序架構的設備驅動開發(fā)

        作者: 時間:2010-11-17 來源:網絡 收藏

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

        1 VxBus簡介

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

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

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

        2 硬件介紹

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


        3 驅動開發(fā)

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

        3.1設備驅動初始化

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


        3.1.1內核預初始化階段

         系統(tǒng)上電啟動,CPU在上電時跳轉到一個指定的地址 ,開始執(zhí)行指令,初始化內存和CPU,然后是VxWorks 的初始化處理。

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

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

        在這個結構中,包含了初始化階段要調用的函數。下面的初始化過程會用到這些函數。

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

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

        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, /* 總線驅動函數*/
        Pci2040Methods, /* 設備方法結構 */
        Pci2040Probe, /* 設備探測函數 */
        Pci2040ParamDefaults /* 參數*/
        },
        NELEMENTS(PciPci204DevIDList),
        PciPci204DevIDList /*設備資源列表*/
           };

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

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

        3.1.2 內核自檢

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

        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映射到系統(tǒng)內存
           ……
           }

        此時,完成內核服務初始化,并可以被驅動訪問。但是,中間層的服務仍然無效。

        3.1.3 應用程序初始化驅動部分

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

         至此,設備驅動的初始化完成。

        3.2驅動程序的配置

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

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

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

        4 應用程序與驅動的通信

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

        例如,通過PCI2040 完成對DSP數據寄存器的訪問

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

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

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

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

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

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

        c語言相關文章:c語言教程




        評論


        相關推薦

        技術專區(qū)

        關閉