xilinx PCIE的Linux驱动程序源代码Word格式.docx
- 文档编号:6498596
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:30
- 大小:21KB
xilinx PCIE的Linux驱动程序源代码Word格式.docx
《xilinx PCIE的Linux驱动程序源代码Word格式.docx》由会员分享,可在线阅读,更多相关《xilinx PCIE的Linux驱动程序源代码Word格式.docx(30页珍藏版)》请在冰点文库上搜索。
RDRDMATLPA,
RDRDMATLPS,
RDRDMATLPC,
RDWDMAPERF,
RDRDMAPERF,
RDRDMASTAT,
RDNRDCOMP,
RDRCOMPDSIZE,
RDDLWSTAT,
RDDLTRSSTAT,
RDDMISCCONT,
RDDMISCONT,
RDDLNKC,
DFCCTL,
DFCPINFO,
DFCNPINFO,
DFCINFO,
RDCFGREG,
WRCFGREG,
RDBMDREG,
WRBMDREG,
WRDDMACR,
WRWDMATLPS,
WRWDMATLPC,
WRWDMATLPP,
WRRDMATLPS,
WRRDMATLPC,
WRRDMATLPP,
WRDMISCCONT,
WRDDLNKC,
NUMCOMMANDS
};
xbmd.c
XBMDdevicedriver.
#include<
linux/init.h>
linux/module.h>
linux/pci.h>
linux/interrupt.h>
linux/fs.h>
//#include<
linux/pci-aspm.h>
linux/pci_regs.h>
asm/uaccess.h>
/*copy_to_user*/
#include"
xbmd.h"
//semaphores
SEM_READ,
SEM_WRITE,
SEM_WRITEREG,
SEM_READREG,
SEM_WAITFOR,
SEM_DMA,
NUM_SEMS
};
//semaphores
structsemaphoregSem[NUM_SEMS];
MODULE_LICENSE("
DualBSD/GPL"
);
//DefinestheVendorID.MustbechangedifcoregenerateddidnotsettheVendorIDtothesamevalue
#definePCI_VENDOR_ID_XILINX0x10ee
//DefinestheDeviceID.MustbechangedifcoregenerateddidnotsettheDeviceIDtothesamevalue
#definePCI_DEVICE_ID_XILINX_PCIE0x0007
//Defining
#defineXBMD_REGISTER_SIZE(4*8)//Thereareeightregisters,andeachis4byteswide.
#defineHAVE_REGION0x01//I/OMemoryregion
#defineHAVE_IRQ0x02//Interupt
//StatusFlags:
//1=Resoucesuccessfullyacquired
//0=Resourcenotacquired.
#defineHAVE_KREG0x04//Kernelregistration
intgDrvrMajor=241;
//Majornumbernotdynamic.
unsignedintgStatFlags=0x00;
//Statusflagsusedforcleanup.
unsignedlonggBaseHdwr;
//Baseregisteraddress(Hardwareaddress)
unsignedlonggBaseLen;
//BaseregisteraddressLength
void*gBaseVirt=NULL;
//Baseregisteraddress(Virtualaddress,forI/O).
chargDrvrName[]="
xbmd"
;
//Nameofdriverinproc.
structpci_dev*gDev=NULL;
//PCIdevicestructure.
intgIrq;
//IRQassignedbyPCIsystem.
char*gBufferUnaligned=NULL;
//PointertoUnalignedDMAbuffer.
char*gReadBuffer=NULL;
//PointertodwordalignedDMAbuffer.
char*gWriteBuffer=NULL;
dma_addr_tgReadHWAddr;
dma_addr_tgWriteHWAddr;
unsignedlongSA_SHIRQ=0;
unsignedlongSA_SAMPLE_RANDOM=0;
intpos;
//StructUsedforWritingCFGRegister.Holdsvalueandregistertobewritten
typedefstructcfgwrite{
intreg;
intvalue;
}cfgwr;
//StructUsedforWritingBMDRegister.Holdsvalueandregistertobewritten
typedefstructbmdwrite{
}bmdwr;
//-----------------------------------------------------------------------------
//Prototypes
voidXPCIe_IRQHandler(intirq,void*dev_id,structpt_regs*regs);
u32XPCIe_ReadReg(u32dw_offset);
voidXPCIe_WriteReg(u32dw_offset,u32val);
voidXPCIe_InitCard(void);
voidXPCIe_InitiatorReset(void);
u32XPCIe_ReadCfgReg(u32byte);
u32XPCIe_WriteCfgReg(u32byte,u32value);
//---------------------------------------------------------------------------
//Name:
XPCIe_Open
//
//Description:
Bookkeepingroutineinvokedeachtimethedeviceisopened.
//Arguments:
inode:
//filp:
//Returns:
0onsuccess,errorcodeonfailure.
//Modificationlog:
//DateWhoDescription
intXPCIe_Open(structinode*inode,structfile*filp)
{
printk(KERN_INFO"
%s:
Open:
moduleopened\n"
gDrvrName);
returnSUCCESS;
}
XPCIe_Release
Bookkeepingroutineinvokedeachtimethedeviceisclosed.
intXPCIe_Release(structinode*inode,structfile*filp)
Release:
modulereleased\n"
return(SUCCESS);
XPCIe_Write
Thisroutineisinvokedfromuserspacetowritedatato
//thePCIedevice.
filp:
filepointertoopeneddevice.
//buf:
pointertolocationinusersspace,wheredataisto
//beacquired.
//count:
Amountofdatainbytesuserwishestosend.
SUCCESS=Success
//CRIT_ERR=Criticalfailure
ssize_tXPCIe_Write(structfile*filp,constchar*buf,size_tcount,
loff_t*f_pos)
intret=SUCCESS;
memcpy((char*)gWriteBuffer,buf,count);
XPCIe_Write:
%dbyteshavebeenwritten...\n"
gDrvrName,count);
memcpy((char*)gReadBuffer,buf,count);
return(ret);
XPCIe_Read
Thisroutineisinvokedfromuserspacetoreaddatafrom
//thePCIedevice.***NOTE:
Thisroutinereturnstheentire
//buffer,(BUF_SIZE),countisignored!
.TheuserAppmust
//doanyneededprocessingonthebuffer.
//beplaced.
Amountofdatainbytesuserwishestoread.
//----------------------------------------------------------------------------
ssize_tXPCIe_Read(structfile*filp,char*buf,size_tcount,loff_t*f_pos)
memcpy(buf,(char*)gWriteBuffer,count);
XPCIe_Read:
%dbyteshavebeenread...\n"
return(0);
XPCIe_Ioctl
Thisroutineisinvokedfromuserspacetoconfigurethe
//runningdriver.
Filepointertoopeneddevice.
//cmd:
Ioctlcommandtoexecute.
//arg:
ArgumenttoIoctlcommand.
intXPCIe_Ioctl(structinode*inode,
structfile*filp,
unsignedintcmd,
unsignedlongarg)
u32regx;
switch(cmd){
caseINITCARD:
//InitailizesXBMDapplication
XPCIe_InitCard();
break;
caseINITRST:
//ResetsXBMDapplications
XPCIe_InitiatorReset();
caseDISPREGS:
caseRDDCSR:
//Read:
DeviceControlStatusRegister
regx=XPCIe_ReadReg(0);
*((u32*)arg)=regx;
caseRDDDMACR:
DMAControlStatusRegister
regx=XPCIe_ReadReg
(1);
caseRDWDMATLPA:
WriteDMATLPAddressRegister
regx=XPCIe_ReadReg
(2);
caseRDWDMATLPS:
WriteDMATLPSizeRegister
regx=XPCIe_ReadReg(3);
caseRDWDMATLPC:
WriteDMATLPCountRegister
regx=XPCIe_ReadReg(4);
caseRDWDMATLPP:
WriteDMATLPPatternRegister
regx=XPCIe_ReadReg(5);
caseRDRDMATLPP:
ReadDMATLPPatternRegister
regx=XPCIe_ReadReg(6);
caseRDRDMATLPA:
ReadDMATLPAddressRegister
regx=XPCIe_ReadReg(7);
caseRDRDMATLPS:
ReadDMATLPSizeRegister
regx=XPCIe_ReadReg(8);
caseRDRDMATLPC:
ReadDMATLPCountRegister
regx=XPCIe_ReadReg(9);
caseRDWDMAPERF:
WriteDMAPerformanceRegister
regx=XPCIe_ReadReg(10);
caseRDRDMAPERF:
ReadDMAPerformanceRegister
regx=XPCIe_ReadReg(11);
caseRDRDMASTAT:
ReadDMAStatusRegister
regx=XPCIe_ReadReg(12);
caseRDNRDCOMP:
NumberofReadCompletionw/DataRegister
regx=XPCIe_ReadReg(13);
caseRDRCOMPDSIZE:
ReadCompletionSizeRegister
regx=XPCIe_ReadReg(14);
caseR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- xilinx PCIE的Linux驱动程序源代码 PCIE Linux 驱动程序 源代码