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

为什么我的NdisMRegisterInterrupt()函数总是返回failure

楼主#
更多 发布于:2003-07-11 10:53
我用的是CE 4.1,PXA250,在MiniportInitialize过程中调用了NdisMRegisterInterrupt()函数,但老是返回failure,调试信息如下:
43c860ee TID:43c8df36 ***NDIS*** (a, 474)
4294772663 PID:43c860ee TID:43c8df36 ==>NdisMRegisterInterrupt: Miniport 00042798 Vector 26
4294772665 PID:43c860ee TID:43c8df36 0x83c8d860: NDIS: ERROR - InterruptInitialize(26, 63c4c402) failed
4294772665 PID:43c860ee TID:43c8df36 **************+OEMInterruptDisable: SYSINTR_ETHER.
4294772666 PID:43c860ee TID:43c8df36     NdisMRegisterInterrupt: IoConnectInterrupt failed on Interrupt Level:0, Vector: 1a
4294772667 PID:43c860ee TID:43c8df36 ***NDIS*** (a, 645)
4294772667 PID:43c860ee TID:43c8df36 <==NdisMRegisterInterrupt: Miniport 00042798, Status c0000001
请问主要和什么有关,是内核里的InterruptEnable,InterruptDisable有关?还是和其它的有关?
visi
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2009-06-30
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-14 09:45
在注册表中要定义中断号SYSINTR_ETHER=?
huminan
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-14 11:23
首先谢谢您的回信!
我在Platform.reg里已经定义了:
\"InterruptNumber\"=dword:1A ;  (SYSINTR_ETHER = SYSINTR_FIRMWARE + 10)
在小端口初始化过程中提取配置信息InterruptNumber,将InterruptNumber作为NdisMRegisterInterrupt()的一个输入量,
但仍然不对。
不知我的设置对不对?

[编辑 -  7/14/03 by  huminan]
visi
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2009-06-30
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-14 12:50
加入
\"SYSINTR_ETHER \"=dword:1A

[编辑 -  7/16/03 by  visi]
leo_cyl
驱动牛犊
驱动牛犊
  • 注册日期2001-08-20
  • 最后登录2009-11-02
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-14 12:55
我想你的问题90%是因为没有完成IOCTL_HAL_TRANSLATE_IRQ和IOCTL_HAL_REQUEST_SYSINTR。
请在KERNEL\\HAL\\OEMIOCTL.C 中完成这两个例程。它的作用是把物理中断转换为逻辑中断。

你可以在DEGBUG MODE 下查看调试信息,应该可以看到NDIS调用IOCTL_HAL_TRANSLATE_IRQ失败。
huminan
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-14 15:49
先给10分,我正在进行修改,还不知行不行。
我本来想找一个IOCTL_HAL_REQUEST_SYSINTR的相关例程来参考,但没找到。
我直接在MiniportInitialize()里加入如下操作:
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwSysIntr_ETHER,sizeof(dwSysIntr_ETHER), pSysIntr, sizeof(*pSysIntr), NULL);
不知这样行不行,你能再给点参考吗?
先谢了。
leo_cyl
驱动牛犊
驱动牛犊
  • 注册日期2001-08-20
  • 最后登录2009-11-02
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-14 17:03
我不知道你的硬件环境是什么?ISA总线还是PCI?
我的是ISA,所以只是简单的返回中断号。如果是PCI就比较麻烦。
DWORD OEMTranslateIrq(DWORD dwIrq)
{
    return dwIrq;
}
angeon
禁止发言
禁止发言
  • 注册日期2003-01-09
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1416分
  • 威望7080点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-15 09:44
用户被禁言,该主题自动屏蔽!
huminan
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-07-15 09:55
刚好我的也是ISA,关键是该函数是如何被调用的?
我在NdisMRegisterInterrupt函数之前增加了一个KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ,,,,,)函数和一个InterruptInitialize函数,发现都运行正确,但NdisMRegisterInterrupt仍然返回和原来一样的错误,不知如何调用OEMTranslateIrq,我的NdisMRegisterInterrupt才能返回success。
huminan
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-07-15 16:45
在leo_cyl的帮助下问题已经初步解决,表示衷心的感谢!!!
leo_cyl
驱动牛犊
驱动牛犊
  • 注册日期2001-08-20
  • 最后登录2009-11-02
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望13点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-07-15 17:02
sorry,可能我没说清楚。你不需要调用KernelIoControl,在NdisMRegisterInterrupt里系统自己调用它。在OEMIoControl中加入以下代码:
case IOCTL_HAL_TRANSLATE_IRQ:
case IOCTL_HAL_REQUEST_SYSINTR:
// Translate a logical interrupt number to a SYSINTR value.
//
if (nInBufSize>=sizeof(PULONG) && nOutBufSize>=sizeof(PULONG) &&
lpOutBuf && lpInBuf) {
            *(PULONG)lpOutBuf = OEMTranslateIrq(*(PULONG)lpInBuf);
            if (lpBytesReturned)
                *lpBytesReturned = sizeof(ULONG);
            retval = TRUE;
}
else {
SetLastError(ERROR_INVALID_PARAMETER);
retval=FALSE;
}
break;


huminan
驱动牛犊
驱动牛犊
  • 注册日期2003-01-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-07-16 14:47
加入了该段代码之后,新的问题出现了:
读写BYTE和ULONG类型数据时发生数据中断(Data abort)
???
angeon
禁止发言
禁止发言
  • 注册日期2003-01-09
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1416分
  • 威望7080点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-07-16 17:20
用户被禁言,该主题自动屏蔽!
游客

返回顶部