vxWorks下设备驱动模板文档格式.docx
《vxWorks下设备驱动模板文档格式.docx》由会员分享,可在线阅读,更多相关《vxWorks下设备驱动模板文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
#defineDEVICE_XBAR_DESC{DEVICE_INT_PIN,DEVICE_INT_CORE_PIN}
#defineDEVICE_ROUTE_DESC{DEVICE_INT_PIN,DEVICE_INT_CORE_NUM}
#defineDEVICE_UNIT0_DEVICE_ID0
/*假如有多个同型号设备begin*/
#defineDEVICE_UNIT1_DEVICE_ID1
.....
/*假如有多个同型号设备end*/
/*其他设备宏*/
#endif/*DEVICE_h*/
代码文件
#include<
vxWorks.h>
/*addedforvxBus*/
vxBusLib.h>
hwif/vxbus/vxBus.h>
hwif/vxbus/vxbPlbLib.h>
hwif/vxbus/hwConf.h>
#include"
DEVICE.h"
/*其他必要的INCLUDE*/
/*设备数据结构*/
typedefstruct
{
VXB_DEVICE_IDpDev;
intnVxUnit;
/*其他需要的成员变量*/
}DEVICE_STRUCT;
/*总线加载函数*/
LOCALvoidDEVICEInstInit(structvxbDev*pDev);
LOCALvoidDEVICEInstInit2(structvxbDev*pDev);
LOCALvoidDEVICEInstConnect(structvxbDev*pDev);
/*方法函数(假如有的话)*/
/*探寻函数*/
LOCALBOOLDEVICEProbe(structvxbDev*pDev);
/*中断响应函数*/
LOCALvoidDEVICEInt(DEVICE_STRUCT*pDrvCtrl);
/*vxBus注册总线加载函数*/
LOCALstructdrvBusFuncsDEVICEFuncs=
DEVICEInstInit,/*devInstanceInit*/
DEVICEInstInit2,/*devInstanceInit2*/
DEVICEInstConnect/*devConnect*/
};
/*vxBus设备方法函数*/
LOCALdevice_method_tDEVICEMethods[]=
{0,0}
/*PCI设备需要填写*/
LOCALstructvxbPciIDDEVICEDevIDList[]=
{DEVICE_DEVID,DEVICE_VENDORID}
/*vxBus设备注册入口*/
/*pci设备start*/
LOCALstructvxbPciRegisterDEVICERegistration=
{
NULL,/*pNext*/
VXB_DEVID_DEVICE,/*devID*/
VXB_BUSID_PCI,/*busID=PCI*/
VXBUS_VERSION_4,
DEVICE_CARD_VXBNAME,/*设备名称*/
&
DEVICEFuncs,
DEVICEMethods,
DEVICEProbe
},
NELEMENTS(DEVICEDevIDList),
DEVICEDevIDList
/*pci设备end*/
/*plb设备start*/
LOCALstructvxbPlbRegisterDEVICERegistration=
NULL,/*pNext,一般都用NULL*/
VXB_DEVID_DEVICE,/*devID,固定,表示这是一个设备*/
VXB_BUSID_PLB,/*busID=PLB,表示这个设备挂接在PLB上*/
VXBUS_VERSION_4,/*版本号,6.7为版本4*/
DEVICE_CARD_VXBNAME,/*设备名称,必须和hwconfig.c中统一*/
DEVICEFuncs,/*pDrvBusFuncs,设备总线函数组在后面定义*/
DEVICEMethods,/*pMethods,设备方法组,在后面定义*/
DEVICEProbe/*devProbe,设备探测*/
}
/*plb设备end*/
/**************************************总入口***********************************/
voidDEVICERegister(void)
vxbDevRegister((structvxbDevRegInfo*)&
(DEVICERegistration));
return;
}
/*************************************总线接口************************************/
LOCALvoidDEVICEInstInit(structvxbDev*pDev)
vxbNextUnitGet(pDev);
/*设备初始化*/
LOCALvoidDEVICEInstInit2(structvxbDev*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;
/*下面添加硬件要求的代码*/
/*设备探寻*/
LOCALBOOLDEVICEProbe(structvxbDev*pDev)
/*PLB标准写法start*/
BOOLretVal=TRUE;
if(pDev->
busID==VXB_BUSID_PLB)
retVal=TRUE;
else
retVal=FALSE;
return(retVal);
/*PLB标准写法end*/
/*PCI写法start*/
UINT16venId;
UINT16devId;
/*子设备ID及硬件版本,假如有的话*/
/*UINT16subDevId;
UINT32hwRev;
*/
inti;
pDrvCtrl=pCev->
pDrvCtrl;
VXB_PCI_BUS_CFG_READ(pDev,PCI_CFG_VENDOR_ID,2,&
venId);
VXB_PCI_BUS_CFG_READ(pDev,PCI_CFG_DEVICE_ID,2,&
devId);
/*查询Bar,并填写到结构里面*/
for(i=0;
i<
VXB_MAXBARS;
i++)
/*根据需要填写*/
if(填写过程中有错误)return(FALSE);
if((devId!
=DEVICE_DEVID)&
&
(venId!
=DEVICE_VENDORID))
{
printf("
cannotfindtheDEVICEdevice\r\n"
);
return(FALSE);
}
return(TRUE);
/*PCI写法end*/
/*挂接中断*/
LOCALvoidDEVICEInstConnect(structvxbDev*pDev)
/*禁用中断*/
DEVICEIntDisable(pDev->
pDrvCtrl);
/*清中断*/
DEVICEIntClear(pDev->
if(vxbIntConnect(pDev,0,DEVICEInt,(void*)(pDev->
pDrvCtrl))!
=OK)
DEVICE:
vxbIntConnectFail\n"
else
vxbIntConnectOK\n"
if(vxbIntEnable(pDev,0,DEVICEInt,(void*)(pDev->
vxbIntEnableFail\n"
vxbIntEnableOK\n"
/*使能中断*/
DEVICEIntEnable(pDev->
LOCALvoidDEVICEInt(DEVICE_STRUCT*pDrvCtrl)
intn;
intlockId;
n=pDrvCtrl->
nVxUnit;
lockId=intCpuLock();
/*探寻本设备中断源*/
/*处理中断*/
/*清除本设备中断源*/
DEVICEIntClear(pDrvCtrl);
intCpuUnlock(lockId);
/*中断控制函数*/
LOCALvoidDeviceIntEnableDEVICE_STRUCT*pDrvCtrl)
LOCALvoidDeviceIntDisable(DEVICE_STRUCT*pDrvCtrl)
LOCALvoidDeviceIntClear(DEVICE_STRUCT*pDrvCtrl)
Hwconfig.c
conststructhcfResourceDEVICEResources[]={
{"
deviceId"
HCF_RES_INT,{(void*)(DEVICE_UNIT0_DEVICE_ID)}},
/*下面写需要的资源*/
#defineDeviceNumNELEMENTS(DEVICEResources)
....
/*设置中断路由,放到合适的位置上*/
DEVICE_INT_DESC,
DEVICE_XBAR_DESC,
DEVICE_ROUTE_DESC,
inconststructhcfDevicehcfDeviceList[]={
....
{DEVICE_CARD_VXBNAME,DEVICE_UNIT0_DEVICE_ID,VXB_BUSID_PLB/*PCI*/,0,DEVICENum,DEVICEResources},
}