调用KernelIoControl获取逻辑中断号失败的原因

http://forums.microsoft.com/china/ShowPost.aspx?PostID=3768771&SiteID=15

http://forums.microsoft.com/china/showpost.aspx?postid=2464232&siteid=15

http://topic.csdn.net/u/20071127/10/515e9c1c-c848-4b64-b461-19f956c30f0d.html?seed=2089840496

请教:

  if(!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,&g_Irq,sizeof(UINT32),&g_SysIntr,sizeof(UINT32),NULL))
    {
      RETAILMSG(1,TEXT("ERROR:Failed to request sysintr value for Timer1 inturrupt!/r/n"));
      return;
    }

结果,执行时串口输出:ERROR:Failed to request sysintr value for Timer1 inturrupt!

请问:这里调用KernelIoControl获取Timer1的逻辑中断号失败的原因会是什么呢?还请热心的各位给与多多少少的指点,多谢多谢……

其中:static UINT32 g_Irq=IRQ_TIMER1;static UINT32 g_SysIrq=SYSINTR_UNDEFINED;
    S3C2410x_intr.h中#define IRQ_TIMER1 11

=====================================================================================


这个IOCTL_HAL_REQUEST_SYSINTR控制字是否支持,要看你BSP的具体实现的。如果bsp里面没实现,当然会返回失败。

 

所以要麻烦您自己看看你的bsp代码里面的OEMIoControl函数是怎么写的。

===========================================================================

 

问题比较多,其实申请中断号这个问题,CE不同版本还不太一样。我看你用的是5.0,我就按照回复:

 

1. 逻辑中断号有两种处理办法,第一种:不需要自己定义,是系统自动申请。第二种,可以静态映射,要在调用IOCTL_HAL_REQUEST_SYSINTR的时候传入OAL_INTR_STATIC。但是我们一般采用第一种,反正是逻辑的,具体是几其实无所谓。

 

2. CE5里面,这两个控制字的确对应到了同一个函数上,你可以参考oal_ioctl_tab.h,至于Initialize失败,很有可能是TIMER1已经被别的程序占用了。例如iltiming或touch driver。

 

3. 就是直接用这个定义,没错。

 

4. 绝对需要重新编译内核,重新生成nk.exe。因为这是nk.exe代码的一部分。就是编译一下nk.exe,然后重新make image打包就可以了,不需要重复sysgen。

 

5. 我没找到这个函数。可能bsp来源不一样。

 

6. 这个驱动你试过,能跑么?不一定能正常工作的…………

 

总结一下,其实你的这个问题,完完全全跟bsp的代码相关,如果代码不一样的话,很难解决你的问题。你拿到的smdk2410的bsp是直接在PB里面自带的那个么?还是从第三方那里得到的。看你的描述,似乎跟PB自带的bsp代码并不完全一致。如果是第三方修改过的bsp代码,很有可能是第三方在修改BSP代码的时候存在错误。我就曾经见过国内山寨厂商自己从4.2移植过来的号称支持ce 5.0的smdk2410 bsp。代码质量很差,也完全不符合Production Quality的要求。

==================================================================================

在参数没有传错的情况下,对IOCTL_HAL_REQUEST_SYSINTR进行KernelIoControl调用失败可能的原因有:
1.Irq>IRQ_MAXIMUM;
2.系统没有可得的SYSINTR;
不过这两种情况都不太像。
建议打开OAL中函数OALIoCtlHalRequestSysIntr和OALIntrRequestSysIntr的调试信息,很容易就知道哪里有问题了!

-Daniel.Dong

==================================================================================

1.如果KernelIoControl调用成功,那么返回的逻辑中断号一定在SYSINTR_FIRMWARE到SYSINTR_MAXIMUM之间;
2.看起来你的BSP有点问题,你不是用的Windows CE 5.0中默认的SMDK2410吧,看起来它的和你的差别很大;在Windows CE 5.0的默认BSP中,IOCTL_HAL_TRANSLATE_IRQ和IOCTL_HAL_REQUEST_SYSINTR对应的处理函数是OALIoCtlHalRequestSysIntr,它所在的位置是WINCE500/PLATFORM/COMMON/SRC/COMMON/INTR/COMMON/ioctl.c中;
3.当然可以,但是你的对应处理函数不正确,所以自然得不到正确的逻辑中断号;
4.对于这种修改,重新编译BSP即可;
5.我没有看到你完整的BSP,所以对这段程序也不理解;
6.你确信这个驱动中KernelIoControl调用是成功的吗?如果它可以调用成功,理论上你的调用也应该成功才是;无论如何,你必须先找到IOCTL_HAL_REQUEST_SYSINTR对应的处理函数,在整个Windows CE目录下找找看呢?

-Daniel.Dong


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gooogleman/archive/2008/11/10/3267005.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值