阅读:3276回复:12
为什么我的NdisMRegisterInterrupt()函数总是返回failure
我用的是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有关?还是和其它的有关? |
|
沙发#
发布于:2003-07-14 09:45
在注册表中要定义中断号SYSINTR_ETHER=?
|
|
板凳#
发布于:2003-07-14 11:23
首先谢谢您的回信!
我在Platform.reg里已经定义了: \"InterruptNumber\"=dword:1A ; (SYSINTR_ETHER = SYSINTR_FIRMWARE + 10) 在小端口初始化过程中提取配置信息InterruptNumber,将InterruptNumber作为NdisMRegisterInterrupt()的一个输入量, 但仍然不对。 不知我的设置对不对? [编辑 - 7/14/03 by huminan] |
|
地板#
发布于:2003-07-14 12:50
加入
\"SYSINTR_ETHER \"=dword:1A [编辑 - 7/16/03 by visi] |
|
地下室#
发布于: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失败。 |
|
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); 不知这样行不行,你能再给点参考吗? 先谢了。 |
|
6楼#
发布于:2003-07-14 17:03
我不知道你的硬件环境是什么?ISA总线还是PCI?
我的是ISA,所以只是简单的返回中断号。如果是PCI就比较麻烦。 DWORD OEMTranslateIrq(DWORD dwIrq) { return dwIrq; } |
|
7楼#
发布于:2003-07-15 09:44
用户被禁言,该主题自动屏蔽! |
|
8楼#
发布于:2003-07-15 09:55
刚好我的也是ISA,关键是该函数是如何被调用的?
我在NdisMRegisterInterrupt函数之前增加了一个KernelIoControl(IOCTL_HAL_TRANSLATE_IRQ,,,,,)函数和一个InterruptInitialize函数,发现都运行正确,但NdisMRegisterInterrupt仍然返回和原来一样的错误,不知如何调用OEMTranslateIrq,我的NdisMRegisterInterrupt才能返回success。 |
|
9楼#
发布于:2003-07-15 16:45
在leo_cyl的帮助下问题已经初步解决,表示衷心的感谢!!!
|
|
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; |
|
11楼#
发布于:2003-07-16 14:47
加入了该段代码之后,新的问题出现了:
读写BYTE和ULONG类型数据时发生数据中断(Data abort) ??? |
|
12楼#
发布于:2003-07-16 17:20
用户被禁言,该主题自动屏蔽! |
|