各位
在WINCE50下关于USB的注册表信息如下:
; @CESYSGEN IF CE_MODULES_USBD
IF BSP_NOUSB !
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\OHCI]
"InterfaceType"=dword:0 ; Internal
"Prefix"="HCD"
; "Dll"="ohci2.dll"
"Dll"="pxa270_ohci.dll"
"Index"=dword:1
"Order"=dword:1
"Irq"=dword:3
"SysIntr"=dword:11 ; (SYSINTR_FIRMWARE+1)
"MemBase"=dword:4C000000
"MemLen"=dword:1000
"UseExistingSettings"=dword:0
ENDIF BSP_NOUSB !
; @CESYSGEN ENDIF CE_MODULES_USBD
请问各位:
1、这里设置了一个Irq为3,应该是物理中断号,PXA270的USB物理中断号确实为3
又设置了一个"SysIntr"=dword:11 应该是系统中断号 ,
可是在WINCE50下不是可以动态申请系统中断号的吗?即利用kernelIocontrol
这里这样设置,是不是可以认为是指定了系统中断号???即程序中不需要用kernelIocontrol动态申请系统中断号
只要读出注册表设置的系统中断号就可以?是这样吗??
2、我的BSP是WINCE42升级到WINCE50的,所以kernelIocontrol是肯定不能用了
我的中断号也与WINCE50下的有些区别
其中#define SYSINTR_OHCI_MDD (SYSINTR_FIRMWARE+8) SYSINTR_FIRMWARE=16
那么这个系统中断号应该是24 即16进制18,而不是11
是不是我在注册表中修改成18即可??
3、这个系统中断在低层是通过
case SYSINTR_OHCI_MDD:
//lpWriteDebugStringFunc(TEXT("INT EN SYSINTR_OHCI_MDD\r\n"));
INTC_USBOHCI_INT_EN( v_pICReg->icmr );
break;
跟物理中断号3关联的
那么我也不需要OALIntrStaticTranslate这个函数把系统和物理中断号关联了,是吧??
4、在 public中用到很多KernelLibIoControl这个函数,
还有这个:KernelIoControl(IOCTL_HAL_ENABLE_WAKE, &m_dwSysIntr, sizeof(m_dwSysIntr), NULL, 0, NULL);
KernelIoControl(IOCTL_HAL_DISABLE_WAKE, &m_dwSysIntr, sizeof(m_dwSysIntr), NULL, 0, NULL);
请问这个我需要用什么方法替换掉他们呢??又或者根本不需要替换
1、这里设置了一个Irq为3,应该是物理中断号,PXA270的USB物理中断号确实为3
又设置了一个"SysIntr"=dword:11 应该是系统中断号 ,
可是在WINCE50下不是可以动态申请系统中断号的吗?即利用kernelIocontrol
这里这样设置,是不是可以认为是指定了系统中断号???即程序中不需要用kernelIocontrol动态申请系统中断号
只要读出注册表设置的系统中断号就可以?是这样吗??
物理中断号是固定的,不能修改,系统中断号是可以自己指定的,而且一般注册表里的定义都是给驱动里面使用的,所以到底怎么用这个系统中断号一定要查看代码的
系统中断号最好用动态申请的,如果不方便动态申请,那自己指定的话要注意不能同现有的冲突就OK了
另外什么叫只要读出注册表设置的系统中断号就可以?请LZ好好去了解一下整个中断发生的流程
2、我的BSP是WINCE42升级到WINCE50的,所以kernelIocontrol是肯定不能用了
我的中断号也与WINCE50下的有些区别
其中#define SYSINTR_OHCI_MDD (SYSINTR_FIRMWARE+8) SYSINTR_FIRMWARE=16
那么这个系统中断号应该是24 即16进制18,而不是11
是不是我在注册表中修改成18即可??
这个问题还是要去看代码
其实你可以完全不管注册表中的中断号,直接在集中定义系统中断号的地方定义一个,然后在USB代码里面使用
3、这个系统中断在低层是通过
case SYSINTR_OHCI_MDD:
//lpWriteDebugStringFunc(TEXT("INT EN SYSINTR_OHCI_MDD\r\n"));
INTC_USBOHCI_INT_EN( v_pICReg->icmr );
break;
跟物理中断号3关联的
那么我也不需要OALIntrStaticTranslate这个函数把系统和物理中断号关联了,是吧??
没有记错的话上面这个代码应该是在OEMInterruptEnable里的,这只是在驱动代码里调用InterruptInitialize的时候会调用到,跟物理中断号和系统中断号关联没有什么联系,如果你是动态申请的系统中断号,那OALIntrStaticTranslate这个函数可以不管它,但如果你是手动指定的,你必须调用该函数进行关联
4、在 public中用到很多KernelLibIoControl这个函数,
还有这个:KernelIoControl(IOCTL_HAL_ENABLE_WAKE, &m_dwSysIntr, sizeof(m_dwSysIntr), NULL, 0, NULL);
KernelIoControl(IOCTL_HAL_DISABLE_WAKE, &m_dwSysIntr, sizeof(m_dwSysIntr), NULL, 0, NULL);
请问这个我需要用什么方法替换掉他们呢??又或者根本不需要替换
不清楚这啥问题?
没有问题就不管它呗
给你总结一下:
这么多问题发现你对最基本的CE下面的中断处理流程还不是很清楚,建议随便找个BSP,静下心来好好研究一下,从中断的注册,到中断发生后从中断向量表到ISR,IST的整个流程等等,这对你以后的学习工作都会非常有帮助的
不好意思,本来说第二天给你回贴的,可你的问题太多,回答还是需要一些时间的,所以只能拖到周末了