阅读:1526回复:5
过来看看,这两个例程你怎么弄出来的?
武安河的书里面PCI9054例子,最后的两个例程,我用向导生成不了,难道是自己添加的?不象啊,里面的注释感觉就是生成的。武大哥不会用英文注释又用中文注释的吧。帖下面,那位高手、老手,看过这书的指点指点,在此谢过!
VOID PCI9054Device::StartDMA(ULONG PAddress,ULONG NBytes) { //下面几条语句设置DMA通道0寄存器,启动块传输方式,从FIFO读数据 //Channel0 interrupt to the PCI Bus interrupt,Done Interrupt Enable,FIFO m_IoPortRange0.outd(DMAMODE0,0x20C00); //DMA Channel0 PCI Address m_IoPortRange0.outd(DMAPADR0,PAddress); //DMA Channel0 Local Address,自己设计的FIFO地址 m_IoPortRange0.outd(DMALADR0,0x8); //DMA Channel0 Transfer Size(Bytes) m_IoPortRange0.outd(DMASIZ0,NBytes); //from the Local Bus to the PCI Bus m_IoPortRange0.outd(DMADPR0,0x8); //Channel0 Enable,Start m_IoPortRange0.outb(DMACSR0,0x3); } VOID PCI9054Device::OnDmaReady(KDmaTransfer* pXfer, KIrp I) { // All KDmaTransfer callbacks must first check to see if there are any bytes // left to transfer. if (pXfer->BytesRemaining() == 0) { //第四步,DMA结束,完成IRP // If there are no bytes left to transfer, the callback must call // Terminate(). Then it completes the IRP with STATUS_SUCCESS. pXfer->Terminate(); I.Information() = I.ReadSize(CURRENT); I.Status() = STATUS_SUCCESS; PnpNextIrp(I); m_CurrentTransfer = NULL; delete pXfer; return; } // We must get the descriptor for the physical memory location for // the DMA transfer. //下面是第二步,获取要传输的物理内存的地址和字节数,调用StartDMA例程 PTRANSFER_DESCRIPTOR ptd; while (pXfer->SequenceTransferDescriptors(&ptd)) { // program the h/w using ppTD t << " Physical address 0x" << ptd->td_PhysAddr.LowPart << ". Length is 0x" << ptd->td_Length << "." << EOL; } // If this is the first time through, then start the DMA going. // We only want to do this ONCE for a given Read transfer. That // way, our data will be collected smoothly, without interruptions // or dropouts. if ((ULONG) pXfer->BytesRemaining() == I.ReadSize()) StartDMA(ptd->td_PhysAddr.LowPart,ptd->td_Length); } |
|
沙发#
发布于:2007-10-11 17:28
版主和各位大侠,快来帮帮忙啊:(
|
|
板凳#
发布于:2007-10-14 20:08
是向导生的
实在生不出来,您自己生一个嘛 呵呵 有问题再问 |
|
|
地板#
发布于:2007-10-19 16:37
引用第2楼xp4105于2007-10-14 20:08发表的 : 版主大哥,真的生不出来啊,难道软件有问题。向导生成Isr_Irq和DpcFor_Irq这两个例程都可以在向导的可以在添加IRQ资源的对话框打上勾就生成了。而StartDMA和OnDmaReady两个例程不见哪个对话框有相关的设置。添加DMA资源的时候,也只有BUS MASTER DMA选项,根本就没有CREATE ×××的选项来创建例程。唯一跟书里面不一样的就是Share options,DMA,书上是可选择的,我用向导的时候是不能选的。 我想看看生成的时候源代码是怎么样的,如果是自己添加成员函数的方式添加,不紧要改好几个地方,而且根本就不知道那两个例程的框架有什么源代码。难道大家都没有碰到我这种情况??邪门 了,如果要在向导时设置什么地方,劳烦大家不吝赐教!小弟在此谢过了。 |
|
地下室#
发布于:2007-10-19 16:38
引用第2楼xp4105于2007-10-14 20:08发表的 : 版主大哥,真的生不出来啊,难道软件有问题。向导生成Isr_Irq和DpcFor_Irq这两个例程都可以在向导的可以在添加IRQ资源的对话框打上勾就生成了。而StartDMA和OnDmaReady两个例程不见哪个对话框有相关的设置。添加DMA资源的时候,也只有BUS MASTER DMA选项,根本就没有CREATE ×××的选项来创建例程。唯一跟书里面不一样的就是Share options,DMA,书上是可选择的,我用向导的时候是不能选的。 我想看看生成的时候源代码是怎么样的,如果是自己添加成员函数的方式添加,不紧要改好几个地方,而且根本就不知道那两个例程的框架有什么源代码。难道大家都没有碰到我这种情况??邪门 了,如果要在向导时设置什么地方,劳烦大家不吝赐教!小弟在此谢过了。 |
|
5楼#
发布于:2007-10-22 19:33
哦,我看看,是自己手工添加的。
自己仿着加上就是了。 |
|
|