TMS320C64XX串口PCI.docx
- 文档编号:27517941
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:16
- 大小:19.81KB
TMS320C64XX串口PCI.docx
《TMS320C64XX串口PCI.docx》由会员分享,可在线阅读,更多相关《TMS320C64XX串口PCI.docx(16页珍藏版)》请在冰豆网上搜索。
TMS320C64XX串口PCI
TMS320C64XX串口PCI(C)代码程序
/*
* Copyright2003byTexasInstrumentsIncorporated.
* Allrightsreserved.PropertyofTexasInstrumentsIncorporated.
* Restrictedrightstouse,duplicateordisclosethiscodeare
* grantedthroughcontract.
*
*/
/*"@(#)DDK1.11.00.0011-04-03(ddk-b13)"*/
/*
* ========c64xx_pci.c========
*
* DSP/BIOSPCIIOMmini-driverforthec64xxDSPs
* Usesthe BIOSPCIChipSupportLibrary(CSL).
*/
#include
#include
#include
#include
#include
#include
#include
/*PCIInterruptmappedtoHWIVector4*/
#defineISR_VECTOR_ID 4
#defineGET_BYTE_COUNT(count)\
(((count)<<16)&C64XX_PCI_MASK_PCIMC_CNT)
#defineCALLBACK(chan,packet,result){(packet)->status=(result);\
((chan)->callback)((Ptr)(chan)->callbackArg,(packet));}
/*Channelvariables*/
typedefstructChanObj{
QUE_Handle queue;/*priorityqueue*/
Uns writeCount;/*countfornumberofIOM_WRITEIOPs*/
IOM_Packet *flushAbortIop;/*holdIOM_FLUSH/IOM_ABORTIOP*/
/*callbackusedtonotifyclientwhenI/Ocomplete*/
IOM_TiomCallback callback;
Ptr callbackArg;
}ChanObj,*ChanHandle;
/*Deviceobject*/
typedefstructPCIDeviceObj
{
IOM_Packet *curPacket;/*currentpacketinprocess*/
QUE_Obj highPrioQue;
QUE_Obj lowPrioQue;
C64XX_PCI_TerrCallback errCallback;/*asyncerrorcallback*/
Uns evtMask;/*registeredeventsoredtogether*/
C64XX_PCI_ErrInfo *errInfo;/*detailedinfoforasyncerror*/
Int openCount;/*countnumberofopenchannels*/
}PCIDeviceObj,PCIDeviceHandle;
/*staticdeviceobject*/
staticPCIDeviceObjdevice;
staticVoiddoTransfer(C64XX_PCI_Request*request);
staticVoidisr();
#ifdefPCI_ERROR_ISR_IMPL
staticVoidpciErrorIsr();
#endif
staticVoidprocessQueue();
staticVoidremovePackets(Ptrchanp,Intcmd);
staticVoidresetChannel(Ptrchanp);
staticVoidresetDevice();
/*
*Forwarddeclarationofminidriverinterfacefunctions.Theyareonly
*exposedviatheIOM_Fxnsfunctiontabletoavoidnamespacepollution.
*/
staticInt mdBindDev(Ptr*devp,Intdevid,PtrdevParams);
staticInt mdControlChan(Ptrchanp,Unscommand,Ptrarg);
staticInt mdCreateChan(Ptr*chanp,Ptrdevp,Stringname,Intmode,
PtrchanParams,IOM_TiomCallbackcbFxn,PtrcbArg);
staticInt mdDeleteChan(Ptrchanp);
staticInt mdSubmitChan(Ptrchanp,IOM_Packet*pPacket);
staticInt mdUnBindDev(Ptrdevp);
/*
*Publicminidriverinterfacetable.
*/
IOM_FxnsC64XX_PCI_FXNS={
&mdBindDev,
&mdUnBindDev,
&mdControlChan,
&mdCreateChan,
&mdDeleteChan,
&mdSubmitChan
};
/*
* ========mdBindDev========
* Thisfunctionwillinitthequeues,setupinterrupt.
* itdoesnotallocatememory,soreturnNULL.
*/
staticIntmdBindDev(Ptr*devp,Intdevid,PtrdevParams)
{
IntintrId;
C64XX_PCI_DevParams*pciDevParams=(C64XX_PCI_DevParams*)devParams;
HWI_AttrshwiAttrs;
QUE_new(&device.highPrioQue);
QUE_new(&device.lowPrioQue);
device.curPacket=NULL;
device.openCount=0;
if(pciDevParams!
=NULL){
/*Checktheversionnumber*/
if(pciDevParams->versionId!
=C64XX_PCI_VERSION_1){
/*Unsupportedversion*/
return(IOM_EBADARGS);
}
if(pciDevParams->pciIntrId>0){
intrId=pciDevParams->pciIntrId;
}
else{
intrId=ISR_VECTOR_ID;
}
hwiAttrs.intrMask=pciDevParams->intrMask;
if(pciDevParams->errCallback!
=NULL){
device.errCallback=pciDevParams->errCallback->errFxn;
device.evtMask=pciDevParams->errCallback->evtMask;
device.errInfo=pciDevParams->errCallback->errInfo;
}
else{
device.errCallback=NULL;
}
#ifdefPCI_ERROR_ISR_IMPL
/*
* pciErrIntrIdplugindependonboardhardwaredesign.
* ERR_ISR_VECTOR_ID:
TBD.
*/
IntpciErrIntrId;
if(pciDevParams->pciErrIntrId>0){
pciErrIntrId=pciDevParams->pciErrIntrId;
}
else{
pciErrIntrId=ERR_ISR_VECTOR_ID;
}
#endif
}
else{
intrId=ISR_VECTOR_ID;
hwiAttrs.intrMask=C64XX_PCI_INTR_MASK_DEFAULT;
device.errCallback=NULL;
}
hwiAttrs.ccMask=IRQ_CCMASK_NONE;/*thedefaultvalue*/
hwiAttrs.arg=NULL;
/*pluginnormalpciisrroutine*/
IRQ_map(IRQ_EVT_DSPINT,intrId);
/*dmachanparametersetto-1since6416hasEDMAinsteadofDMA*/
HWI_dispatchPlug(intrId,(Fxn)isr,-1,&hwiAttrs);
#ifdefPCI_ERROR_ISR_IMPL
/*pluginerrorpciisrroutineifregistered.IRQ_EVT_XXX:
TBD.
*needtoenabletwobitsinPCICommandRegister:
TBD
* bit6-parityerrorreportingenablebit
* bit8-systemerrorreportingebablebit
*/
IRQ_map(IRQ_EVT_XXX,pciErrIntrId);
HWI_dispatchPlug(pciErrIntrId,(Fxn)pciErrIsr,-1,NULL);
IRQ_enable(IRQ_EVT_XXX);
#endif
return(IOM_COMPLETED);
}
/*
* ========mdControlChan========
* Thisfunctioncouldbeimplementedbyusingfunctiontable,avoidcomplier
* linkeachfunctionandalsoavoidusing"switch"call.
* returnstatus
*/
staticIntmdControlChan(Ptrchanp,Unscommand,Ptrarg)
{
C64XX_PCI_EEPROMData*promData=(C64XX_PCI_EEPROMData*)arg;
Uns result;
Uns imask;
#ifdefTEST_ERROR_HANDLER
Boolreport;
C64XX_PCI_Request*req;
IOM_Packet*packet;
Unserror;
Unsevent;
#endif
switch(command){
/*EEPROMcall.*/
caseC64XX_PCI_EEPROM_ERASE:
promData->eeData=PCI_eepromErase((Uns)promData->eeAddr);
return(IOM_COMPLETED);
caseC64XX_PCI_EEPROM_ERASE_ALL:
promData->eeData=PCI_eepromEraseAll();
return(IOM_COMPLETED);
caseC64XX_PCI_EEPROM_IS_AUTO_CFG:
promData->eeData=PCI_eepromIsAutoCfg();
return(IOM_COMPLETED);
caseC64XX_PCI_EEPROM_READ:
promData->eeData=PCI_eepromRead((Uns)promData->eeAddr);
return(IOM_COMPLETED);
caseC64XX_PCI_EEPROM_SIZE:
promData->eeData=PCI_eepromSize();
return(IOM_COMPLETED);
caseC64XX_PCI_EEPROM_TEST:
promData->eeData=PCI_eepromTest();
return(IOM_COMPLETED);
caseC64XX_PCI_EEPROM_WRITE:
result=PCI_eepromWrite((Uns)promData->eeAddr,promData->eeData);
promData->eeData=result;
return(IOM_COMPLETED);
caseC64XX_PCI_EEPROM_WRITE_ALL:
result=PCI_eepromWriteAll(promData->eeData);
promData->eeData=result;
return(IOM_COMPLETED);
/*Hostinterruptcall*/
caseC64XX_PCI_DSP_INT_REQ_SET:
PCI_dspIntReqSet();
return(IOM_COMPLETED);
caseC64XX_PCI_DSP_INT_REQ_CLEAR:
PCI_dspIntReqClear();
return(IOM_COMPLETED);
/*resetcalls*/
caseC64XX_PCI_RESET_CHANNEL:
resetChannel(chanp);
return(IOM_COMPLETED);
caseC64XX_PCI_RESET_ALL_CHANNELS:
resetDevice();
return(IOM_COMPLETED);
#ifdefTEST_ERROR_HANDLER
caseC64XX_PCI_TEST_ERROR_HANDLER:
error=0;
report=FALSE;
event=*((Uns*)arg);
imask=HWI_disable();
if(device.errCallback==NULL){
HWI_restore(imask);
return(IOM_COMPLETED);
}
if((event==C64XX_PCI_EVT_PARITY_ERR)&&
(device.evtMask&C64XX_PCI_EVT_PARITY_ERR)){
error=error|C64XX_PCI_EVT_PARITY_ERR;
report=TRUE;
}
elseif((event==C64XX_PCI_EVT_SYSTEM_ERR)&&
(device.evtMask&C64XX_PCI_EVT_SYSTEM_ERR)){
error=error|C64XX_PCI_EVT_SYSTEM_ERR;
report=TRUE;
}
if(!
report){
HWI_restore(imask);
return(IOM_COMPLETED);
}
if(device.curPacket!
=NULL){
packet=device.curPacket;
req=(C64XX_PCI_Request*)packet->addr;
device.errInfo->inprogressDstAddr=req->dstAddr;
device.errInfo->inprogressSrcAddr=req->srcAddr;
/*device.errInfo->statusReg=PCI_STATUS_REGISTER;*/
}
else{
device.errInfo->inprogressDstAddr=NULL;
device.errInfo->inprogressSrcAddr=NULL;
/*device.errInfo->statusReg=PCI_STATUS_REGISTER;*/
}
(device.errCallback)(error,(Ptr)device.errInfo);
HWI_restore(imask);
return(IOM_COMPLETED);
#endif
default:
break;
}
return(IOM_ENOTIMPL);
}
/*
* ========mdCreateChan========
* Thisfunctionallocatesmemoryforchannelobjectandinitializesit.
* returnIOM_COMPLETEDifsuccessreturnIOM_EALLOCiffails
*/
staticIntmdCreateChan(Ptr*chanp,Ptrdevp,Stringname,Intmode,
PtrchanParams,IOM_TiomCallbackcbFxn,PtrcbArg)
{
ChanHandle chan;
C64XX_PCI_Attrs *pciAttrs=(C64XX_PCI_Attrs*)chanParams;
Uns imask;
chan=MEM_alloc(0,sizeof(ChanObj),0);
if(chan==MEM_ILLEGAL){
return(IOM_EALLOC);
}
if(mode!
=IOM_INOUT){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TMS320C64XX 串口 PCI