stephen80320
驱动小牛
驱动小牛
  • 注册日期2003-07-01
  • 最后登录2003-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1373回复:9

谁能说说这几个例程的执行顺序和主要作用?

楼主#
更多 发布于:2003-08-11 10:32
PCI9054的驱动,中断控制方式(没有采用DMA方式),有如下几个例程,请帮我理一下它们执行的顺序和主要功能?

StartIo
SerialRead
Read
SerialWrite
Write
DpcFor_Irq
Isr_Irq

我现在已经知道  Read-->StartIo-->SerialRead    (1)
                Write-->StartIo-->SerialWrite  (2)
          以及
                 Isr_Irq-->DpcFor_Irq          (3)
但是不知道第(3)和第(1),(2)是怎么联系起来的?
其中具体程序如下:
//------------------------------------------------------
NTSTATUS PCI9054Device::Write(KIrp I)
{
if (I.WriteSize() == 0)
{
I.Information() = 0;
return I.PnpComplete(this, STATUS_SUCCESS);
}

return QueueIrp(I, LinkTo(CancelQueuedIrp));
}


//-------------------------------------------------------
void PCI9054Device::SerialWrite(KIrp I)
{
NTSTATUS status = STATUS_SUCCESS;
ULONG i;

// Declare a memory object
KMemory Mem(I.Mdl());
// Use the memory object to create a pointer to the caller\'s buffer
PUCHAR pBuffer = (PUCHAR) Mem.MapToSystemSpace();

ULONG   dwTotalSize = I.WriteSize(CURRENT);
ULONG   dwBytesSent = 0;
//清空FIFO
m_IoPortRange1.outb(0,0);
//用I/O输出命令往FIFO写数据
for (i=0;i<dwTotalSize;i++) m_IoPortRange1.outb(0x4,*pBuffer++);

I.Information() = dwBytesSent;
I.Status() = status;

PnpNextIrp(I);
}


//--------------------------------------------------------
VOID PCI9054Device::StartIo(KIrp I)
{
if ( !I.TestAndSetCancelRoutine(
LinkTo(CancelQueuedIrp),
NULL,
CurrentIrp()) )
{
return;
}

switch (I.MajorFunction())
{
case IRP_MJ_READ:
SerialRead(I);
break;
case IRP_MJ_WRITE:
SerialWrite(I);
break;
default:
ASSERT(FALSE);
PnpNextIrp(I);
break;
}
}


//-------------------------------------------------------
BOOLEAN PCI9054Device::Isr_Irq(void)
{
ULONG status;

status= m_IoPortRange0.ind(INTCSR);

if ((status & 0x200000)==0)
{
// Return FALSE to indicate that this device did not cause the interrupt.
return FALSE;
}
m_IoPortRange0.outd(DMAMODE0,0x20800);
m_IoPortRange0.outb(DMACSR0,0x10);//Clear Interrupt

// Request deferred procedure call
// The arguments to Request may be any values that you choose
m_DpcFor_Irq.Request(NULL, NULL);
return TRUE;
}



[编辑 -  8/11/03 by  stephen80320]
zzht007
驱动牛犊
驱动牛犊
  • 注册日期2002-08-18
  • 最后登录2005-07-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-12 12:19
我认为它们之间是通过保存在CurrentIrp中的指针所指向的IRP联系起来的。
stephen80320
驱动小牛
驱动小牛
  • 注册日期2003-07-01
  • 最后登录2003-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-12 12:42
能不能说具体一点,细节一点。
太抽象了我还是不明白:(
HONGLIN
驱动牛犊
驱动牛犊
  • 注册日期2002-04-04
  • 最后登录2010-03-17
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望12点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-15 13:08

ReadFile->Read->StartIo->SerialRead->Isr(有可能的话)->Dpc
WriteFile->Write->StartIo->WerialWrite->Isr(有可能的话)->Dpc

第一个Func为Win32 API
不再困惑
stephen80320
驱动小牛
驱动小牛
  • 注册日期2003-07-01
  • 最后登录2003-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-16 21:49
既然如此,那么为什么SerialRead例程中看不出调用了Isr呢?
wangxdbme
驱动牛犊
驱动牛犊
  • 注册日期2003-08-04
  • 最后登录2005-07-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-18 19:03
isr是在硬件中断产生后,由系统的io管理器调用的。至于中断什么时候产生,取决于硬件设计
flying
驱动小牛
驱动小牛
  • 注册日期2002-08-01
  • 最后登录2016-06-19
  • 粉丝0
  • 关注0
  • 积分197分
  • 威望70点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2003-08-19 08:30
楼主有这本书,可以直接看这本书上的内容,里面有讲的。
stephen80320
驱动小牛
驱动小牛
  • 注册日期2003-07-01
  • 最后登录2003-12-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-08-23 23:40
楼主有这本书,可以直接看这本书上的内容,里面有讲的。


是哪本书,叫什么名字?
libin2309
驱动大牛
驱动大牛
  • 注册日期2002-11-20
  • 最后登录2005-12-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-08-24 10:38
如果采用中断方式的话,还是前面一位老兄说的对,ISR什么时候执行是和硬件相关的,当硬件发出中断信号的时候,对应的驱动中的ISR就执行, serialread,怎么和ISR联系起来?我也很想知道这个,这个问题也就是驱动和硬件联系(ISR被执行)与驱动和应用联系(serialread) 怎么握手的问题 。
我是一只小小鸟,永远也飞也飞不高,但我永远在飞!
flying
驱动小牛
驱动小牛
  • 注册日期2002-08-01
  • 最后登录2016-06-19
  • 粉丝0
  • 关注0
  • 积分197分
  • 威望70点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2003-08-24 21:54
[quote]楼主有这本书,可以直接看这本书上的内容,里面有讲的。


是哪本书,叫什么名字? [/quote]

你上面的那段例程出自于哪本书?
我说的就是这本书了
游客

返回顶部