Jackal
驱动牛犊
驱动牛犊
  • 注册日期2001-09-20
  • 最后登录2001-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1801回复:8

难道在VxD中共享IRQ这个问题真的这么难吗?

楼主#
更多 发布于:2001-11-26 11:57
为什么没有人回答这个问题?版主,难道您也不知道吗?
Jackal
Jackal
驱动牛犊
驱动牛犊
  • 注册日期2001-09-20
  • 最后登录2001-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-11-26 18:45
我有一个想法,PCI共享中断的功能应该是每一个PCI设备的驱动程序都提供的,也就是说所有的做过PCI设备驱动程序的人都应该对此有所了解,但是我问了这个问题却没有人回答。那么只有两种可能:一、上这个网站的所有做PCI设备驱动程序的人所做的driver中都没有添加这个功能,所有的这些驱动程序都有bug;二、所谓的高手们就指着这点知识充高手呢,告诉了别人岂不是砸了自己的饭碗。

总之,要么是这里的人水平有限,要么是这里的人情味太差,看来我只能去国外的网站去问了,不管他们的答案对是不对,至少还会有人和我讨论我的问题。
Jackal
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-11-27 09:41
首先,声明我不是高手。
其次,你在短短的7个小时之内连发2个贴子,以为别人一定会看见吗?这里有谁是随时挂在这个bbs上,随时准备给别人回答问题的呢?
另外,这个问题不要点名问我。我没有做过driver里的中断,vxd的也没有,所以没有什么可说的。
最后,如果你到鬼子那里问到了答案,是否可以在这里贴出来呢?既然这里都是愚人,本着中国人互相帮助的精神,您老人家是否可以给大家一点指点呢?
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-11-27 11:38
本来很简单的问题给你弄得这么复杂:
1。定义一个struct
typedef struct _INTERRUPT_CONTEXT{
   DWORD ServiceRoutine;
   DWORD ServiceContext;
   BYTE SharedVector;
}INTERRUPT_CONTEXT, *PINTERRUPT_CONTEXT;

在你的程序里作如下处理:
IRQHANDLE MyIRQHandle;
VPICD_IRQ_Descriptor Vid;

INTERRUPT_CONTEXT context;

context.ServiceRoutine = yourServiceRoutine;
context.ServiceContext = yourServiceContext;
context.SharedVector = shared;

memset(&Vid, 0, sizeof(VPICD_IRQ_Descriptor));

Vid.VID_IRQ_Number = Vector;
Vid.VID_Options = VPICD_OPT_REF_DATA | (ShareVector ? VPICD_OPT_CAN_SHARE : 0);
Vid.VID_Hw_Int_Proc = ULONG(__isr_Routine);

Vid.VID_Hw_Int_Ref = &context;

MyIRQHandle = VPICD_Virtualize_IRQ(&Vid);

VPICD_Physically_Unmask(MyIRQHandle);


写一个__isr_Routine
NAKED VOID __isr_Routine()
{
   _asm{
        push edx;//保存context
        mov  al, [edx.SharedVector];
        test al, al;
        jnz   shared;
        mov eax, MyIRQHandle;
        VxdCall(VPICD_Phys_EOI);
      
        shared:

        mov ebx, [edx.ServiceRoutine];//取得你的中断例程
        push [edx.ServiceContext];//压ServiceContext入栈
        
        call ebx; //调用你自己的例程
        
        test eax,eax//你的中断程序返回false,表示中断不是你的
        jnz next;
        stc;
        ret;
        
       next: pop edx;
      
       mov al, [edx.SharedVector];
       test al,al;
       jnz nextcode;
       clc;//中断已经成功处理
       ret;
       nextcode:
      
       mov eax, MyIRQHandle;//共享中断
       VxDCall(VPICD_Phys_EOI);
       clc;
       ret;
        
        
       }
}

共享中断,那么应该是电平触发(level trigger)

如果你懂得写驱动,后面的不用我再写了(你求人帮忙,语气应该客气点)。

代码为伪代码,临时写成(以前的早就给忘了),可能有误!
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-11-28 09:19
多谢dazzy给大家上了一课(虽然我不懂)。 :D
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
Jackal
驱动牛犊
驱动牛犊
  • 注册日期2001-09-20
  • 最后登录2001-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-11-28 12:42
对不起,dazzy,您所写的代码我也知道,而且我也是这样实现的。DDK的例程和很多书里都有类似的代码。但是我的问题是这样也是不能完全share(和USB设备会有冲突)。据Numega的人说,好像需要hook几个函数,但是具体是哪几个呢?

其实我写那些话也是实在有些着急,因为我认为Share IRQ确实应该是一个比较普遍的问题,确实应该有很多人知道。而且我的这个问题也不是只在7个小时内问的,我确实已经贴了好几天了(在另外一个帖子中)。
Jackal
Jackal
驱动牛犊
驱动牛犊
  • 注册日期2001-09-20
  • 最后登录2001-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-11-28 12:56
对了,给大家提个建议:在测试自己的driver的时候,把BIOS里的\'Assign IRQ to USB\'选项打开(好像是这个名字),然后再把PCI可用的中断只开一个,这样如果你的driver不支持Share IRQ的话,就肯定会死机。
Jackal
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-11-29 15:29
多谢你的热心提醒。我有空的时候也试一试。
对于不用到中断的设备,应该就没有影响了吧?
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
Jackal
驱动牛犊
驱动牛犊
  • 注册日期2001-09-20
  • 最后登录2001-12-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2001-11-29 18:12
不用到中断的设备当然不用考虑这些,之所以导致死机是因为中断被错误的中断服务例程所处理了。
Jackal
游客

返回顶部