WinDriver教程Word下载.docx

上传人:b****6 文档编号:20166874 上传时间:2023-01-17 格式:DOCX 页数:10 大小:25.57KB
下载 相关 举报
WinDriver教程Word下载.docx_第1页
第1页 / 共10页
WinDriver教程Word下载.docx_第2页
第2页 / 共10页
WinDriver教程Word下载.docx_第3页
第3页 / 共10页
WinDriver教程Word下载.docx_第4页
第4页 / 共10页
WinDriver教程Word下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

WinDriver教程Word下载.docx

《WinDriver教程Word下载.docx》由会员分享,可在线阅读,更多相关《WinDriver教程Word下载.docx(10页珍藏版)》请在冰豆网上搜索。

WinDriver教程Word下载.docx

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

40

Captbiljti«

sPoint«

r

Cbc

Beserred

112

Lat1Grant|IntPlxl

JutLin«

OxTuOSISOl

PMD1FWCSKBSE|WICS

HotSrap

0<

c06

PCIVTDAddr|Pointer

1ID

3

PCIVM)n<

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的总体认识,相信大家能很快上手,朝正确的方向努力。

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

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1