vxWorks下设备驱动模板.docx
- 文档编号:25585565
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:10
- 大小:16.51KB
vxWorks下设备驱动模板.docx
《vxWorks下设备驱动模板.docx》由会员分享,可在线阅读,更多相关《vxWorks下设备驱动模板.docx(10页珍藏版)》请在冰豆网上搜索。
vxWorks下设备驱动模板
基于vxBus的设备驱动模板
vxWorks6.x设备驱动采用了新型的vxBus构架,该构架和原来的设备驱动有很大不同,初上手会有很多不方便。
下面提供的模板有助于快速形成一个vxBus设备驱动
设备驱动在3个地方体现:
头文件,代码文件,hwconfig.c,根据下面模板,把所有DEVICE换成自己的设备,并做相应操作即可,免去很多重复代码的苦恼,开发者仅需要关注功能即可。
这个模板处理了中断,但没有提供处理基本IO的方法,模板不是用来学习的,怎样完整地写一个vxbus的驱动,还是需要学习的。
头文件
#ifndefDEVICE_h
#defineDEVICE_h
#defineDEVICE_CARD_NAME"设备名"
#defineDEVICE_CARD_DESC"设备描述"
#defineDEVICE_CARD_VXBNAME"设备vxBus名"
#defineDEVICE_CARD_INT_PIN[中断管脚]
#defineDEVICE_CARD_INT_CORE_PIN[核中断管脚]
#defineDEVICE_CARD_INT_CORE_NUM[中断处理核]
#defineDEVICE_INT_DESC{DEVICE_INT_PIN,DEVICE_CARD_VXBNAME,0,0}
#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
/*addedforvxBus*/
#include
#include
#include
#include
#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);
return;
}
/*设备初始化*/
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;
/*下面添加硬件要求的代码*/
return;
}
/*设备探寻*/
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;
DEVICE_STRUCT*pDrvCtrl;
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 { /*根据需要填写*/ } 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->pDrvCtrl); /*挂接中断*/ if(vxbIntConnect(pDev,0,DEVICEInt,(void*)(pDev->pDrvCtrl))! =OK) { printf("DEVICE: vxbIntConnectFail\n"); } else { printf("DEVICE: vxbIntConnectOK\n"); } if(vxbIntEnable(pDev,0,DEVICEInt,(void*)(pDev->pDrvCtrl))! =OK) { printf("DEVICE: vxbIntEnableFail\n"); } else { printf("DEVICE: vxbIntEnableOK\n"); } /*使能中断*/ DEVICEIntEnable(pDev->pDrvCtrl); } /*中断响应函数*/ 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 #include"DEVICE.h" ..... 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}, .... }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vxWorks 设备 驱动 模板