已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、如何用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=INVALID_HANDLE_VALUE) str=INVALID_HANDLE_VALUE;else/重新注册wd,去除过期限制strcpy(lic.cLicense, 你的注册号);WD_License(m_hPex, &lic);/检查WD版本WD_VERSION ver;BZERO(ver);WD_Version(m_hPex, &ver);if (ver.dwVer0) pciSlot = pciScan.cardSlot0; WD_PCI_CARD_INFO pciCardInfo; WD_CARD Card; BZERO(pciCardInfo); pciCardInfo.pciSlot = pciSlot; WD_PciGetCardInfo (m_hPex, &pciCardInfo); if (pciCardInfo.Card.dwItems!=0) Card = pciCardInfo.Card; else str=Pcicard=0; WD_CARD_REGISTER cardReg; /Card.Item0PC机基本端口操作 /Card.Item1中断信息 BZERO(cardReg); cardReg.Card = Card; cardReg.fCheckLockOnly = FALSE; WD_CardRegister(m_hPex,&cardReg); if (cardReg.hCard = 0) str=cardReg=0; str=open 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; RangeAddrCS1=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;else str=Open Failed; WD_Close(m_hPex);AfxMessageBox(str); 注:Card.Item0-5就是DEVICE/IO/MEM映射的地方,这里得到的值和windrive wizard里看到的是一样的。二、设备的读写操作1.写操作 WD_TRANSFER trans; BZERO(trans); trans.cmdTrans = WP_BYTE; /(WORD/DWORD) trans.dwPort = BaseAddrCS0;/可为其它的映射基地址 trans.Data.Byte = 0x00; /需要写的数据 WD_Transfer (m_hPex, &trans);2.读操错 WD_TRANSFER trans; BZERO(trans); trans.cmdTrans = RP_BYTE; /(WORD/DWORD) trans.dwPort = BaseAddrCS1;/可为其它的映射基地址 WD_Transfer (m_hPex, &trans); 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.dwSlot = Slot;pciConfig.pciSlot.dwFunction = Fun;pciConfig.pBuffer = arBuffer;pciConfig.dwBytes = sizeof(arBuffer);pciConfig.fIsRead = TRUE;pciConfig.dwOffset = 每次累加4WD_PciConfigDump(m_hPex, &pciConfig);四、数据的块操作 DWORD dataBuffer8192; WD_TRANSFER trans; * trans.Data.pBuffer=dataBuffer; 利用WD_Transfer()函数来完成数据的块操作。五、DMA控制WinDriver为提供了一组API函数,但是其提供的DMA 函数不是基于突发方式的,并且是以查询方式来检测DMA是否结束,比较适用于一次DMA读写。因此需要对其提供的DMA API函数及中断相关的函数进行改写,即在DMAOpen()函数中,需对DMAMODE寄存器的本地突发使能位(BIT8)与BTERM输入使能位(BIT7)置位,否则,DMA操作只能完成一个双字的突发传输,只有将此二位置1 后,才能完成指定长度的DMA传输。因为传输量超过4 KB,所以要置为分散/聚拢(scatter/gather)模式(BIT9),同时使能DMA 中断完成位(BIT10)与DMA通道0 中断选择位(BIT17)。 重写DMA 启动函数DMAStart(),设置每次DMA 传输所需的PCI 地址(主机物理内存地址)、本地地址、传输大小、传输方向等,并置DMA 启动位。这样每次数据捕获满中断到来,启动DMA 传输时,只需调用DMAStart()函数即可。如果采用Windriver 提供的DMAWriteRead 函数,每进行一次DMA 传输都要重新打开一个DMA,分配空间,设置各种相应的寄存器等,增加了DMA 传输的CPU 开销。经过测试,当进行数据全速捕获时,如果采用Windriver 提供的DmaWriteRead 函数及DMA 完成查询方式,CPU 的负荷最高可达80%,严重影响了系统其他程序的执行。当采用修改后的DmaStart()函数及DMA 中断方式后,全速进行数据捕获时,CPU 的负荷只有25%左右,大幅降低了CPU 的负荷,保证了整个系统软件的正常执行。 在DMAStart()函数中,需要注意的是PCI 地址寄存器的设置,因为传输数据量大于一页(4KB),所以采用了分散/聚集方式,即以分散的物理内存块映射连续分配的用户地址空间。与内存块分配方式不同,这时不是设置DMA的PCI地址与本地地址寄存器,而是设置DMA通道的描述符寄存器(DMADPR)。通过函数WD_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 buffer 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, &pDma)goto Exit;/* Enable DMA interrupts (if not polling) */if (!fPolling)if (!MyDMAInterruptEnable(hDev, MyDmaIntHandler, pDma)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, pDma, 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, BOOL 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, &pBuf, u32LocalAddr, dwDMABufSize, fToDev, &pDma)goto Exit;/* Enable DMA interrupts (if not polling) */if (!fPolling)if (!MyDMAInterruptEnable(hDev, MyDmaIntHandler, pDma)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, pDma, fPolling);/* Flush the I/O caches (see 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、Vxworks、winCE、solaris等OS,对当前流行的硬件设备,如端口、ISA、PCI(-X,-E)、PCMCIA、USB等都有很好的支持。作为驱动开发的入门工
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广泰锦苑停电通知书
- 广西船舶过闸通知书
- 店上乡工厂复工通知书
- 康乐县疫情封控通知书
- 廊坊城区禁行通知书
- 建陵中学开学报到通知书
- 开州小区封控通知书
- 弋江区恢复停课通知书
- 张家港大风降温通知书
- 弥勒第一小学开学通知书
- 集体备课培训材料课件
- 实验室危险源、风险点重点排查项目表
- 供应链可持续发展与企业社会责任管理
- 卫生部修订病历书写基本规范(全文)
- 体育中国2023章节测试答案-体育中国超星尔雅答案
- 设备销售人员提成方案
- GB/T 8642-2002热喷涂抗拉结合强度的测定
- 辽宁盘锦浩业化工“1.15”泄漏爆炸着火事故警示教育
- 式叉摩那尼戒本
- 安徽师范大学2023年616马克思主义基本原理考研真题(回忆版)
- 《企业民主管理规定》课件
评论
0/150
提交评论