vxWorks下設(shè)備驅(qū)動(dòng)模板_第1頁
vxWorks下設(shè)備驅(qū)動(dòng)模板_第2頁
vxWorks下設(shè)備驅(qū)動(dòng)模板_第3頁
vxWorks下設(shè)備驅(qū)動(dòng)模板_第4頁
vxWorks下設(shè)備驅(qū)動(dòng)模板_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、基于vxBus的設(shè)備驅(qū)動(dòng)模板vxWorks6.x 設(shè)備驅(qū)動(dòng)采用了新型的vxBus構(gòu)架,該構(gòu)架和原來的設(shè)備驅(qū)動(dòng)有很大不同,初上手會(huì)有很多不方便。下面提供的模板有助于快速形成一個(gè)vxBus 設(shè)備驅(qū)動(dòng)設(shè)備驅(qū)動(dòng)在3個(gè)地方體現(xiàn): 頭文件,代碼文件,hwconfig.c,根據(jù)下面模板,把所有DEVICE換成自己的設(shè)備,并做相應(yīng)操作即可,免去很多重復(fù)代碼的苦惱,開發(fā)者僅需要關(guān)注功能即可。這個(gè)模板處理了中斷,但沒有提供處理基本IO的方法,模板不是用來學(xué)習(xí)的,怎樣完整地寫一個(gè)vxbus的驅(qū)動(dòng),還是需要學(xué)習(xí)的。頭文件#ifndef DEVICE_h#define DEVICE_h#define DEVICE_CA

2、RD_NAME "設(shè)備名"#define DEVICE_CARD_DESC "設(shè)備描述"#define DEVICE_CARD_VXBNAME "設(shè)備vxBus名"#define DEVICE_CARD_INT_PIN 中斷管腳#define DEVICE_CARD_INT_CORE_PIN 核中斷管腳#define DEVICE_CARD_INT_CORE_NUM 中斷處理核#define DEVICE_INT_DESC DEVICE_INT_PIN,DEVICE_CARD_VXBNAME,0,0#define DEVICE_XBA

3、R_DESC DEVICE_INT_PIN,DEVICE_INT_CORE_PIN #define DEVICE_ROUTE_DESC DEVICE_INT_PIN,DEVICE_INT_CORE_NUM#define DEVICE_UNIT0_DEVICE_ID 0/*假如有多個(gè)同型號設(shè)備begin*/#define DEVICE_UNIT1_DEVICE_ID 1./*假如有多個(gè)同型號設(shè)備end*/*其他設(shè)備宏*/#endif/*DEVICE_h*/代碼文件#include <vxWorks.h>/*added for vxBus*/#include <vxBusLib.

4、h>#include <hwif/vxbus/vxBus.h>#include <hwif/vxbus/vxbPlbLib.h>#include <hwif/vxbus/hwConf.h>#include "DEVICE.h"/*其他必要的INCLUDE*/*設(shè)備數(shù)據(jù)結(jié)構(gòu)*/typedef structVXB_DEVICE_ID pDev;int nVxUnit;/*其他需要的成員變量*/ DEVICE_STRUCT;/*總線加載函數(shù)*/LOCAL void DEVICEInstInit (struct vxbDev * pDev)

5、;LOCAL void DEVICEInstInit2(struct vxbDev * pDev);LOCAL void DEVICEInstConnect(struct vxbDev * pDev);/*方法函數(shù)(假如有的話)*/*探尋函數(shù)*/LOCAL BOOL DEVICEProbe(struct vxbDev * pDev);/*中斷響應(yīng)函數(shù)*/LOCAL void DEVICEInt(DEVICE_STRUCT * pDrvCtrl);/*vxBus 注冊總線加載函數(shù)*/LOCAL struct drvBusFuncs DEVICEFuncs =DEVICEInstInit, /*

6、devInstanceInit */DEVICEInstInit2, /* devInstanceInit2 */DEVICEInstConnect /* devConnect */;/*vxBus 設(shè)備方法函數(shù)*/LOCAL device_method_t DEVICEMethods =/*方法函數(shù)(假如有的話)*/0, 0;/*PCI 設(shè)備需要填寫*/LOCAL struct vxbPciID DEVICEDevIDList = DEVICE_DEVID, DEVICE_VENDORID ;/*vxBus 設(shè)備注冊入口*/*pci 設(shè)備start*/LOCAL struct vxbPciR

7、egister DEVICERegistration = NULL, /* pNext */ VXB_DEVID_DEVICE, /* devID */ VXB_BUSID_PCI, /* busID = PCI */ VXBUS_VERSION_4, DEVICE_CARD_VXBNAME, /*設(shè)備名稱 */ &DEVICEFuncs, DEVICEMethods, DEVICEProbe , NELEMENTS(DEVICEDevIDList), DEVICEDevIDList;/*pci 設(shè)備end*/*plb 設(shè)備start*/LOCAL struct vxbPlbRegis

8、ter DEVICERegistration = NULL, /* pNext,一般都用NULL */ VXB_DEVID_DEVICE, /* devID,固定,表示這是一個(gè)設(shè)備 */ VXB_BUSID_PLB, /* busID = PLB ,表示這個(gè)設(shè)備掛接在PLB上*/ VXBUS_VERSION_4, /* 版本號,6.7為版本4 */ DEVICE_CARD_VXBNAME, /*設(shè)備名稱,必須和hwconfig.c中統(tǒng)一*/ &DEVICEFuncs, /* pDrvBusFuncs,設(shè)備總線函數(shù)組在后面定義 */ DEVICEMethods, /* pMethods

9、,設(shè)備方法組,在后面定義*/ DEVICEProbe /* devProbe ,設(shè)備探測*/ ;/*plb 設(shè)備end*/*總?cè)肟?/void DEVICERegister(void)vxbDevRegister(struct vxbDevRegInfo *)&(DEVICERegistration); return;/*總線接口*/LOCAL void DEVICEInstInit (struct vxbDev * pDev) vxbNextUnitGet(pDev); return;/*設(shè)備初始化*/LOCAL void DEVICEInstInit2(struct vxbDev

10、* pDev) DEVICE_STRUCT *pDrvCtrl; pDrvCtrl = malloc(sizeof(DEVICE_STRUCT); if (pDrvCtrl = NULL) return; bzero (char *)pDrvCtrl, sizeof(DEVICE_STRUCT); pDev->pDrvCtrl = pDrvCtrl; pDrvCtrl->pDev = pDev;/*下面添加硬件要求的代碼*/ return;/*設(shè)備探尋*/LOCAL BOOL DEVICEProbe(struct vxbDev * pDev)/*PLB 標(biāo)準(zhǔn)寫法start*/ BO

11、OL retVal = TRUE; if (pDev->busID = VXB_BUSID_PLB) retVal = TRUE; else retVal = FALSE; return(retVal);/*PLB 標(biāo)準(zhǔn)寫法end*/*PCI 寫法start*/ UINT16 venId; UINT16 devId;/*子設(shè)備ID及硬件版本,假如有的話*/ /* UINT16 subDevId; UINT32 hwRev;*/ int i; DEVICE_STRUCT *pDrvCtrl; pDrvCtrl = pCev->pDrvCtrl; VXB_PCI_BUS_CFG_REA

12、D (pDev, PCI_CFG_VENDOR_ID, 2, &venId); VXB_PCI_BUS_CFG_READ (pDev, PCI_CFG_DEVICE_ID, 2, &devId);/*查詢Bar,并填寫到結(jié)構(gòu)里面*/ for (i = 0; i < VXB_MAXBARS; i+) /*根據(jù)需要填寫*/ if (填寫過程中有錯(cuò)誤) return (FALSE); if (devId != DEVICE_DEVID) &&(venId !=DEVICE_VENDORID) printf("cannot find the DEVICE

13、 devicern"); return (FALSE); return (TRUE);/*PCI 寫法end*/*掛接中斷*/LOCAL void DEVICEInstConnect(struct vxbDev * pDev)/*禁用中斷*/ DEVICEIntDisable(pDev->pDrvCtrl);/*清中斷*/ DEVICEIntClear(pDev->pDrvCtrl);/*掛接中斷*/ if(vxbIntConnect(pDev,0,DEVICEInt,(void *)(pDev->pDrvCtrl) != OK) printf("DEVI

14、CE: vxbIntConnect Failn"); else printf("DEVICE: vxbIntConnect OKn"); if(vxbIntEnable(pDev,0,DEVICEInt,(void *)(pDev->pDrvCtrl) != OK) printf("DEVICE: vxbIntEnable Failn"); else printf("DEVICE: vxbIntEnable OKn"); /*使能中斷*/ DEVICEIntEnable(pDev->pDrvCtrl);/*中斷響

15、應(yīng)函數(shù)*/LOCAL void DEVICEInt(DEVICE_STRUCT * pDrvCtrl)int n;int lockId;n = pDrvCtrl->nVxUnit;lockId=intCpuLock();/*探尋本設(shè)備中斷源*/*處理中斷*/*清除本設(shè)備中斷源*/DEVICEIntClear(pDrvCtrl);intCpuUnlock(lockId);/*中斷控制函數(shù)*/LOCAL void DeviceIntEnable DEVICE_STRUCT * pDrvCtrl)LOCAL void DeviceIntDisable(DEVICE_STRUCT * pDrvCtrl)LOCAL void DeviceIntClear(DEVICE_STRUCT * pDrvCtrl)Hwconfig.c#include "DEVICE.h".const struct hcfResource DEVICEResources = "deviceId", HCF_RES_INT, (void *)(DEVICE_UNIT0_DEVICE_ID) ,/*下面寫需要的資源*/;#d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論