fedlt
驱动牛犊
驱动牛犊
  • 注册日期2007-09-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
阅读:1526回复:5

过来看看,这两个例程你怎么弄出来的?

楼主#
更多 发布于:2007-10-10 21:07
武安河的书里面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);
}
fedlt
驱动牛犊
驱动牛犊
  • 注册日期2007-09-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-10-11 17:28
版主和各位大侠,快来帮帮忙啊:(
xp4105
论坛版主
论坛版主
  • 注册日期2006-04-02
  • 最后登录2014-03-29
  • 粉丝1
  • 关注0
  • 积分905分
  • 威望570点
  • 贡献值1点
  • 好评度162点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-10-14 20:08
是向导生的

实在生不出来,您自己生一个嘛

呵呵

有问题再问
时光如流水 抓紧时间实现自我价值
fedlt
驱动牛犊
驱动牛犊
  • 注册日期2007-09-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地板#
发布于: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,书上是可选择的,我用向导的时候是不能选的。
    我想看看生成的时候源代码是怎么样的,如果是自己添加成员函数的方式添加,不紧要改好几个地方,而且根本就不知道那两个例程的框架有什么源代码。难道大家都没有碰到我这种情况??邪门 了,如果要在向导时设置什么地方,劳烦大家不吝赐教!小弟在此谢过了。
fedlt
驱动牛犊
驱动牛犊
  • 注册日期2007-09-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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,书上是可选择的,我用向导的时候是不能选的。
    我想看看生成的时候源代码是怎么样的,如果是自己添加成员函数的方式添加,不紧要改好几个地方,而且根本就不知道那两个例程的框架有什么源代码。难道大家都没有碰到我这种情况??邪门 了,如果要在向导时设置什么地方,劳烦大家不吝赐教!小弟在此谢过了。
xp4105
论坛版主
论坛版主
  • 注册日期2006-04-02
  • 最后登录2014-03-29
  • 粉丝1
  • 关注0
  • 积分905分
  • 威望570点
  • 贡献值1点
  • 好评度162点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2007-10-22 19:33
哦,我看看,是自己手工添加的。

自己仿着加上就是了。
时光如流水 抓紧时间实现自我价值
游客

返回顶部