WinDriver教程Word下载.docx
- 文档编号:20166874
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:10
- 大小:25.57KB
WinDriver教程Word下载.docx
《WinDriver教程Word下载.docx》由会员分享,可在线阅读,更多相关《WinDriver教程Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
if(ver.dwVer<
ftT)_VER)
str=^^WindriverOverdue"
;
WD_PCI_SCAN_CARDSpciScan:
WD_PCI_SLOTpciSlot:
BZERO(pciScan);
//以PEX8311为例
pciScan.searchld.dwVendorld=0xl0b5:
pciScan.searchld.dwDeviceld=0x86el:
ftT)_PciScanCards(m_hPex,&
pciScan);
if(pciScan.dwCards>
0)
pciSlot=pciScan.cardSlotCO]:
W_PCI_CARD_INFOpciCardInfo:
W_CARDCard:
BZERO(pciCardInfo);
pciCardInfo.pciSlot=pciSlot:
W_PciGetCardInfo(m_hPex,&
pciCardInfo);
if(pciCardInfo.Card.dwItems!
=0)
Card=pciCardInfo.Card:
stir="
Pcicard=O"
WD_CARD_REGISTERcardReg:
//Card.Item[O]PC机基本端口操作
//Card.ItemEl]中断信息
BZERO(cardReg);
cardReg.Card=Card:
cardReg.fCheckLockOnly=FALSE:
ftT)_CardRegister(m_hPex,&
cardReg);
if(cardReg.hCard==0)
cardReg=0"
str=^opensuccessfully"
〃取得当前设备信息并显示
Interrupt=Card.ItemEl].1.Int.dwinterrupt);
Bus=pciScan.cardSlot[0].dwBus:
Slot=pciScan.cardSlot[0],dwSlot:
Fun=pciScan.cardSlot[0].dwFunction:
//CS0-CS3的地址映射信息
BaseAddrCSO=Card.Item[2].1.Mem.dwPhysicalAddr:
RangeAddrCSO=Card.Item[2].1.Mem.dwBytes:
BaseAddrCSl=Card.Item[3].1.10.dwAddr:
RangeAddrCSl=Card.Item[3].1.Mem.dwBytes:
BaseAddrCS2=Card.Item[4].1.Mem.dwPhysicalAddr:
RangeAddrCS2=Card.Item[4].1.Mem.dwBytes:
BaseAddrCS3=Card.Item[5].1.Mem.dwPhysicalAddr:
RangeAddrCS3=Card.Item[5]・I.Mem.dwBytes:
else
str=^OpenFailed"
W_Close(m_hPex);
AfxMessageBox(str);
注:
Card.Item[0-5]就是DEVICE/IO/MEM映射的地方,这里得到的值和windrivewizard里看到的是一样的。
二、设备的读写操作
1•写操作
WDJTRANSFERtrans:
BZERO(trans);
trans.cmdTrans=WP_BYTE;
//(WORD,/DWORD)
trans.dwPort=BaseAddrCSO:
//可为其它的映射基地址
trans.Data.Byte=0x00;
//需要写的数据
W_Transfer(m_hPex,&
trans);
2,读操错
trans.cmdTrans=RP_BYTE:
//(WORDz^DWORD)
trans.dwPort=BaseAddrCSl:
//可为其它的映射基地址
ftT)_Transfer(m_hPex,&
returntrans.Data.Bytes:
三、其它
有关windriver对寄存器的操作要用到WDC_***函数,还有DMA操作在
(二)中阐述。
三.寄存器的读写
寄存器的读写用到一个非常好用的函数W_PciConfigDuinp();
具体的参数定义参照WD的API手册。
W_PCI_CONFIG_DUMPpciConfig:
DWORDdwStatus:
WORDarBuffer[2]:
BZERO(pciConfig);
pciConfig.pciSlot.dwBus=Bus:
pciConfig.pciSlot.dwSlot=Slot:
pciConfig.pciSlot.dwFunction=Fun:
pciConfig.pBuffer=arBuffer:
pciConfig.dwBytes=sizeof(arBuffer):
pciConfig.fIsRead=TRUE:
pciConfig.dwOffset=每次累加4
W_PciConfigDump(m_hPex,&
pciConfig);
5h&
MAHReqUst
0xS&
«
110lS
DtvictID1VendorID
Oxno
7
5t«
.tuE1Con«
w3
Ox680
da
BaseClass|SiibClass
1RevIB
如
04003
H扣Typ・1L<
tTimer|
Cxh・Sir*
OwfdcffflOO
PCIButAddr^cc0
OdcOl
PCIBaseAddress1
Oxfdcc
PCIByAddress2
Oxfdca
PCI6as«
Addr•力3
Ox
PCIBasieAdalress4
PCIfiaseKddr«
ss5
Cydba,CISPointor
0x83111.015
SubsystenDevice/VendorIS
EkpensignJeOHSaseAildress
0«
40
Captbiljti«
sPoint«
r
Cbc
Beserred
112
Lat1Grant|IntPlxl
JutLin«
OxTuOSISOl
PMD1FWCSKBSE|WICS
HotSrap
0<
c06
PCIVTDAddr|Pointer
1ID
3
PCIVM)n<
t«
Hv
n
1厂®
……1
DWORDdataBuffer[8192]:
trans.Data.pBuffer=dataBuffer:
利用TO_Transfer0函数来完成数据的块操作。
五、DMA控制
WinDriver为提供了一组API函数,但是其提供的DMA函数不是基于突发方式
的,并且是以查询方式来检测DMA是否结束,比较适用于一次DMA读写。
因此需要
对其提供的DMAAPI函数及中断相关的函数进行改写,即在DMAOpen()函数中,需
对DMAMODE寄存器的本地突发使能位(BIT8)与BTERM输入使能位(BIT7)置位,否
则,DMA操作只能完成一个双字的突发传输,只有将此二位置1后,才能完成指定
长度的DMA传输。
因为传输量超过4KB,所以要置为分散/聚拢(scatter/gather)
模式(BIT9),同时使能DMA中断完成位(BIT10)*jDMA通道0中断选择位(BIT17)c
巫写DMA启动函数DMAStart(),设置每次DMA传输所需的PCI地址(主机物
理内存地址)、本地地址、传输大小、传输方向等,并置DMA启动位。
这样每次数据捕获满中断到来,启动DMA传输时,只需调用DMAStart()函数即可。
如果采用
Windriver提供的D\iAWriteRead函数,每进行一次DMA传输都要重新打开一个
DMA,分配空间,设置各种相应的寄存器等,增加了DMA传输的CPU开销。
经过测
试,当进行数据全速捕获时,如果采用Windriver提供的DmaWriteRead函数及
DMA完成查询方式,CPU的负荷最高可达80%,严重影响了系统其他程序的执行。
当采用修改后的DmaStart0函数及DMA中断方式后,全速进行数据捕获时,CPU
的负荷只有25%左右,大幅降低了CPU的负荷,保证了整个系统软件的正常执行。
在DMAStart0函数中,需要注意的是PCI地址寄存器的设置,因为传输数据
量大于一页(4KB),所以采用了分散/聚集方式,即以分散的物理内存块映射连续分配的用户地址空间。
与内存块分配方式不同,这时不是设置DMA的PCI地址与本地地址寄存器,而是设置DMA通道的描述符寄存器
(DMADPR)C通过函数WD_DMALock()在物理内存中锁定所需大小的存储空间,取
得每贝的物理地址,大小以及相应的本地地址放入地址描述块链表中,
在DMADPA寄存器中设置初时的描述块地址。
1)Scatter/GatherDMA
BOOLDMARoutine(WC_DEVICE_HANDLEhDev,DWORDdwBufSize,UINT32u32LocalAddr,DWORDdwOptions,BOOLfPolling,BOOLfToDev){
PVOIDpBuf:
WD_DMA*pDma=NULL:
BOOLfRet=FALSE:
/*Allocateauser-modebufferforScatter/GatherDMA*/pBuf=malloc(dwBufSize);
if(IpBuf)
returnFALSE:
/*LocktheDMAbufferandprogramtheDMAcontroller*/if(!
DMAOpen(hDev,pBuf,u32LocalAddr,dwBufSize,fToDev,&
pDma))gotoExit;
/*
EnableDMAinterrupts(ifnotpolling)*/
if
(IMyDMAInterruptEnable(hDev,MyDmalntHandler,pDma))gotoExit;
/*FailedenablingDMAinterrupts*/
/*FlushtheCPUcaches(seedocumentationofWDC_DMASyncCpu())*/
WDC_DMASyncCpu(pDma);
/*StartDMA-writetothedevicetoinitiatetheDMAtransfer*/
MyDMAStart(hDev,pDma);
/*WaitfortheDMAtransfertocomplete*/
MyDMAWaitForCompletion(hDev,pDma,fPolling);
/*FlushtheI/Ocaches(seedocumentationofftT)C_DMASyncIo())*/
WC_DMASyncIo(pDma);
fRet=TRUE:
Exit:
DMAClose(pDma,fPolling);
free(pBuf);
returnfRet:
2)ContiguousBufferDMA
BOOLDMARoutine(ftBC_DEVICE_HANDLEhDev,DWORDdwDMABufSize>
UINT32u32LocalAddr,DWORDdwOptions,BOOLfPolling,BOOLfToDev){
PVOIDpBuf=NULL:
/*AllocateaDMAbufferandopenDMAfortheselectedchannel*/if
(!
DMAOpen(hDev,&
pBuf,u32LocalAddr,dwDMABufSize,fToDev,&
pDma))goto
Exit:
/*EnableDMAinterrupts(ifnotpolling)*/
if(IfPolling)
if(IMyDMAInterruptEnable(hDev,MyDmaIntHand1er,pDma))gotoExit;
/*FlushtheI/Ocaches(seedocumentationofftDC_DMASyncIo())*/
TOC_DMASyncIo(pDma);
六、windriverAPI的深入分析
windriver作为Jungo公司出品的一个高效易用的驱动开发软件,方便用户基
于此开发自己设备的驱动程序,而不需要对windowsDDK作更深入的
研究(当然,要想称为驱动的高手,DDK是一定要钻研的)。
windriver相比dirverstudio使用起来更为方便,同时,它支持windows>
linux、Vxworks>
winCE>
Solaris等OS,对当前流行的硬件设备,如端口、
ISA、PCI(-X,-E).PCMCIA、USB等都有很好的支持。
作为驱动开发的入门工
具,windriver是个很好的选择。
当前windriver可以在网上得到的破解版是ver&
01,已经可以很好的支持大
家的要求(如果有银子的话,要获得好的稳定的产品和更多的技术支持,
还是买正版哦)。
Drivet:
Wisard.Debu?
Monitor
很快大家都会熟悉上面的这两个图标,这就是windriver安装后的两个重要的快捷方式©
windriver的正常工作,需要辅助安装windows
DDK(95/98/2000/XP/2003o。
。
和VisualC,,等才能正确编译。
当然,这也
需要你正确的设置应有的环境变量。
大家也不需要到网上找什么教程
在&
01版中,windriver支持了更多的编译器平台,如下图所示:
*-A♦•
tfTXC
lJ
u
Oebjo
J
rtWe
lJlb
uJ
Marvel
a
ij
pu
5kte
al
vb
vb-net
■Ad
Sri
♦
安装windriver后的U录如下所示:
其中docs中就是windriver的各种手册,
吧,看这个绝对受益菲找,而且也是正道。
includeU录里就是最通用的包含文件了;
libU录则是重要的api函数库文件了;
redistU录下是windriver的缺省驱动程序和DLL;
对PLX芯片使用而言,最重要的就是PLXU录和wizardU录了,wizard就是
建立的驱动工程,正确编译后会找到驱动程序sysoplxU录则是windriver为
PLX系里芯片进行的二次封装函数库,当前我还是建议打击使用原始的WD和WDC
函数,但是,其中的调用思路就可以在这里寻找。
有了对windriver的总体认识,相信大家能很快上手,朝正确的方向努力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WinDriver 教程