收藏 分享(赏)

WinDriver教程.doc

上传人:tangtianxu1 文档编号:3037073 上传时间:2018-10-02 格式:DOC 页数:11 大小:134KB
下载 相关 举报
WinDriver教程.doc_第1页
第1页 / 共11页
WinDriver教程.doc_第2页
第2页 / 共11页
WinDriver教程.doc_第3页
第3页 / 共11页
WinDriver教程.doc_第4页
第4页 / 共11页
WinDriver教程.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、一、如何用 windrive 打开、关闭设备以及查看设备的信息1.所有有关的 WD_API 在安装后的相关目录下可以找到,建议打印出来,仔细看下。2.打开、关闭设备与查看相应信息:HANDLE m_hPex;DWORD Bus,Slot,Fun,Interrupt;DWORD BaseAddrCS0,BaseAddrCS1,BaseAddrCS2,BaseAddrCS3;DWORD RangeAddrCS0,RangeAddrCS1,RangeAddrCS2,RangeAddrCS3;/打开设备:WD_LICENSE lic;m_hPex=WD_Open();if (m_hPex=INVALI

2、D_HANDLE_VALUE)str=“INVALID_HANDLE_VALUE“;else/重新注册 wd,去除过期限制strcpy(lic.cLicense, “你的注册号 “);WD_License(m_hPex, /检查 WD 版本WD_VERSION ver;BZERO(ver);WD_Version(m_hPex, if (ver.dwVer0)pciSlot = pciScan.cardSlot0;WD_PCI_CARD_INFO pciCardInfo; WD_CARD Card;BZERO(pciCardInfo);pciCardInfo.pciSlot = pciSlot;

3、WD_PciGetCardInfo (m_hPex, if (pciCardInfo.Card.dwItems!=0)Card = pciCardInfo.Card;elsestr=“Pcicard=0“;WD_CARD_REGISTER cardReg;/Card.Item0PC 机基本端口操作/Card.Item1中断信息BZERO(cardReg); cardReg.Card = Card;cardReg.fCheckLockOnly = FALSE;WD_CardRegister(m_hPex,if (cardReg.hCard = 0)str=“cardReg=0“;str=“ope

4、n successfully“;/取得当前设备信息并显示Interrupt=Card.Item1.I.Int.dwInterrupt);Bus=pciScan.cardSlot0.dwBus;Slot=pciScan.cardSlot0.dwSlot;Fun=pciScan.cardSlot0.dwFunction;/CS0-CS3 的地址映射信息BaseAddrCS0=Card.Item2.I.Mem.dwPhysicalAddr;RangeAddrCS0=Card.Item2.I.Mem.dwBytes;BaseAddrCS1=Card.Item3.I.IO.dwAddr;RangeAdd

5、rCS1=Card.Item3.I.Mem.dwBytes;BaseAddrCS2=Card.Item4.I.Mem.dwPhysicalAddr;RangeAddrCS2=Card.Item4.I.Mem.dwBytes;BaseAddrCS3=Card.Item5.I.Mem.dwPhysicalAddr;RangeAddrCS3=Card.Item5.I.Mem.dwBytes;elsestr=“Open Failed“;WD_Close(m_hPex);AfxMessageBox(str);注:Card.Item0-5就是 DEVICE/IO/MEM 映射的地方,这里得到的值和 win

6、drive wizard 里看到的是一样的。二、设备的读写操作1.写操作WD_TRANSFER trans;BZERO(trans);trans.cmdTrans = WP_BYTE; /(WORD/DWORD)trans.dwPort = BaseAddrCS0;/可为其它的映射基地址trans.Data.Byte = 0x00; /需要写的数据WD_Transfer (m_hPex, 2.读操错WD_TRANSFER trans;BZERO(trans);trans.cmdTrans = RP_BYTE; /(WORD/DWORD)trans.dwPort = BaseAddrCS1;/可

7、为其它的映射基地址WD_Transfer (m_hPex, return trans.Data.Bytes;三、其它有关 windriver 对寄存器的操作要用到 WDC_*函数,还有 DMA 操作在(二)中阐述。三、寄存器的读写寄存器的读写用到一个非常好用的函数 WD_PciConfigDump();具体的参数定义参照 WD 的 API 手册。WD_PCI_CONFIG_DUMP pciConfig;DWORD dwStatus;WORD arBuffer2;BZERO(pciConfig);pciConfig.pciSlot.dwBus = Bus;pciConfig.pciSlot.dw

8、Slot = Slot;pciConfig.pciSlot.dwFunction = Fun;pciConfig.pBuffer = arBuffer;pciConfig.dwBytes = sizeof(arBuffer);pciConfig.fIsRead = TRUE;pciConfig.dwOffset = 每次累加 4WD_PciConfigDump(m_hPex, 四、数据的块操作DWORD dataBuffer8192;WD_TRANSFER trans;*trans.Data.pBuffer=dataBuffer;利用 WD_Transfer()函数来完成数据的块操作。五、DM

9、A 控制WinDriver 为提供了一组 API 函数,但是其提供的 DMA 函数不是基于突发方式的,并且是以查询方式来检测 DMA 是否结束,比较适用于一次DMA 读写。因此需要对其提供的 DMA API 函数及中断相关的函数进行改写,即在 DMAOpen()函数中,需对 DMAMODE 寄存器的本地突发使能位(BIT8)与BTERM 输入使能位(BIT7)置位,否则,DMA 操作只能完成一个双字的突发传输,只有将此二位置 1 后,才能完成指定长度的 DMA 传输。因为传输量超过 4 KB,所以要置为分散 /聚拢( scatter/gather)模式 (BIT9),同时使能 DMA 中断完成

10、位(BIT10)与 DMA 通道 0 中断选择位(BIT17)。重写 DMA 启动函数 DMAStart(),设置每次 DMA 传输所需的 PCI 地址(主机物理内存地址)、本地地址、传输大小、传输方向等,并置 DMA 启动位。这样每次数据捕获满中断到来,启动 DMA 传输时,只需调用 DMAStart()函数即可。如果采用 Windriver 提供的 DMAWriteRead 函数,每进行一次DMA 传输都要重新打开一个 DMA,分配空间,设置各种相应的寄存器等,增加了 DMA 传输的 CPU 开销。经过测试,当进行数据全速捕获时,如果采用Windriver 提供的 DmaWriteRead

11、 函数及 DMA 完成查询方式,CPU 的负荷最高可达 80%,严重影响了系统其他程序的执行。当采用修改后的 DmaStart()函数及 DMA 中断方式后,全速进行数据捕获时, CPU 的负荷只有 25%左右,大幅降低了 CPU 的负荷,保证了整个系统软件的正常执行。在 DMAStart()函数中,需要注意的是 PCI 地址寄存器的设置,因为传输数据量大于一页( 4KB),所以采用了分散/聚集方式,即以分散的物理内存块映射连续分配的用户地址空间。与内存块分配方式不同,这时不是设置 DMA 的 PCI 地址与本地地址寄存器,而是设置 DMA 通道的描述符寄存器(DMADPR)。通过函数 WD_

12、DMALock()在物理内存中锁定所需大小的存储空间,取得每页的物理地址,大小以及相应的本地地址放入地址描述块链表中,在 DMADPA 寄存器中设置初时的描述块地址。1) Scatter/Gather DMABOOL DMARoutine(WDC_DEVICE_HANDLE hDev, DWORD dwBufSize,UINT32 u32LocalAddr, DWORD dwOptions, BOOL fPolling, BOOL fToDev)PVOID pBuf;WD_DMA *pDma = NULL;BOOL fRet = FALSE;/* Allocate a user-mode bu

13、ffer for Scatter/Gather DMA */pBuf = malloc(dwBufSize);if (!pBuf)return FALSE;/* Lock the DMA buffer and program the DMA controller */if (!DMAOpen(hDev, pBuf, u32LocalAddr, dwBufSize, fToDev, /* Enable DMA interrupts (if not polling) */if (!fPolling)if (!MyDMAInterruptEnable(hDev, MyDmaIntHandler, p

14、Dma)goto Exit; /* Failed enabling DMA interrupts */* Flush the CPU caches (see documentation of WDC_DMASyncCpu() */WDC_DMASyncCpu(pDma);/* Start DMA - write to the device to initiate the DMA transfer */MyDMAStart(hDev, pDma);/* Wait for the DMA transfer to complete */MyDMAWaitForCompletion(hDev, pDm

15、a, fPolling);/* Flush the I/O caches (see documentation of WDC_DMASyncIo() */WDC_DMASyncIo(pDma);fRet = TRUE;Exit:DMAClose(pDma, fPolling);free(pBuf);return fRet;2) Contiguous Buffer DMABOOL DMARoutine(WDC_DEVICE_HANDLE hDev, DWORD dwDMABufSize,UINT32 u32LocalAddr, DWORD dwOptions, BOOL fPolling, BO

16、OL fToDev)PVOID pBuf = NULL;WD_DMA *pDma = NULL;BOOL fRet = FALSE;/* Allocate a DMA buffer and open DMA for the selected channel */if (!DMAOpen(hDev, /* Enable DMA interrupts (if not polling) */if (!fPolling)if (!MyDMAInterruptEnable(hDev, MyDmaIntHandler, pDma)goto Exit; /* Failed enabling DMA inte

17、rrupts */* Flush the CPU caches (see documentation of WDC_DMASyncCpu() */WDC_DMASyncCpu(pDma);/* Start DMA - write to the device to initiate the DMA transfer */MyDMAStart(hDev, pDma);/* Wait for the DMA transfer to complete */MyDMAWaitForCompletion(hDev, pDma, fPolling);/* Flush the I/O caches (see

18、documentation of WDC_DMASyncIo() */WDC_DMASyncIo(pDma);fRet = TRUE;Exit:DMAClose(pDma, fPolling);return fRet;六、windriver API 的深入分析windriver 作为 Jungo 公司出品的一个高效易用的驱动开发软件,方便用户基于此开发自己设备的驱动程序,而不需要对 windows DDK 作更深入的研究(当然,要想称为驱动的高手,DDK 是一定要钻研的)。windriver 相比 dirverstudio 使用起来更为方便,同时,它支持 windows、linux、Vxwor

19、ks、winCE、solaris 等 OS,对当前流行的硬件设备,如端口、ISA、PCI (-X,-E)、 PCMCIA、USB 等都有很好的支持。作为驱动开发的入门工具,windriver 是个很好的选择。当前 windriver 可以在网上得到的破解版是 ver8.01,已经可以很好的支持大家的要求(如果有银子的话,要获得好的稳定的产品和更多的技术支持,还是买正版哦)。很快大家都会熟悉上面的这两个图标,这就是 windriver 安装后的两个重要的快捷方式。windriver 的正常工作,需要辅助安装 windows DDK( 95/98/2000/XP/2003。) ,和 Visual

20、C等才能正确编译。当然,这也需要你正确的设置应有的环境变量。在 8.01 版中,windriver 支持了更多的编译器平台,如下图所示:安装 windriver 后的目录如下所示:其中 docs 中就是 windriver 的各种手册,大家也不需要到网上找什么教程吧,看这个绝对受益菲浅,而且也是正道。include 目录里就是最通用的包含文件了;lib 目录则是重要的 api 函数库文件了;redist 目录下是 windriver 的缺省驱动程序和 DLL;对 PLX 芯片使用而言,最重要的就是 PLX 目录和 wizard 目录了,wizard 就是建立的驱动工程,正确编译后会找到驱动程序 *.sys。plx 目录则是windriver 为 PLX 系里芯片进行的二次封装函数库,当前我还是建议打击使用原始的 WD 和 WDC 函数,但是,其中的调用思路就可以在这里寻找。有了对 windriver 的总体认识,相信大家能很快上手,朝正确的方向努力。整理中(待续)。

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

当前位置:首页 > 高等教育 > 专业基础教材

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报