vxWorks下设备驱动模板.docx

上传人:b****8 文档编号:9674449 上传时间:2023-05-20 格式:DOCX 页数:10 大小:16.51KB
下载 相关 举报
vxWorks下设备驱动模板.docx_第1页
第1页 / 共10页
vxWorks下设备驱动模板.docx_第2页
第2页 / 共10页
vxWorks下设备驱动模板.docx_第3页
第3页 / 共10页
vxWorks下设备驱动模板.docx_第4页
第4页 / 共10页
vxWorks下设备驱动模板.docx_第5页
第5页 / 共10页
vxWorks下设备驱动模板.docx_第6页
第6页 / 共10页
vxWorks下设备驱动模板.docx_第7页
第7页 / 共10页
vxWorks下设备驱动模板.docx_第8页
第8页 / 共10页
vxWorks下设备驱动模板.docx_第9页
第9页 / 共10页
vxWorks下设备驱动模板.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

vxWorks下设备驱动模板.docx

《vxWorks下设备驱动模板.docx》由会员分享,可在线阅读,更多相关《vxWorks下设备驱动模板.docx(10页珍藏版)》请在冰点文库上搜索。

vxWorks下设备驱动模板.docx

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

....

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2