|
请教关于:按键中断,创建中断IST时InterruptInitialize函数出错的问题!
[复制链接]
系统:wince4.2 三星2440
最近在接手的系统上增加按键,新增了4个按键,新增的按键总是在创建ist的时候出错!
以下是我修改流程:
1.首先在oalintr.h(inc)里面增加了4个定义
#define SYSINTR_KEYPAD_CAMERA (SYSINTR_FIRMWARE+25)//eint1
#define SYSINTR_KEYPAD_BAT (SYSINTR_FIRMWARE+26)//eint12
#define SYSINTR_KEYPAD_LINE (SYSINTR_FIRMWARE+27)//eint19
#define SYSINTR_KEYPAD_EPHONE (SYSINTR_FIRMWARE+28)//eint20
对下面函数
_inline
DWORD
MapIrq2SysIntr(DWORD _Irq)
{
//if( _Irq<=18 )
if( _Irq<=28 )//这里进行了修改
return ( SYSINTR_FIRMWARE + _Irq );
else
return (0xffffffff);
}
这些是原有的设置,并未改变,但是我网上看到资料说4.2 max最大是32么?
#define SYSINTR_FIRMWARE (SYSINTR_DEVICES+8)
#define SYSINTR_MAX_DEVICES 64
#define SYSINTR_MAXIMUM (SYSINTR_DEVICES+SYSINTR_MAX_DEVICES)
2.然后在cfw.c
OEMInterruptEnable
OEMInterruptDone
OEMInterruptDisable
增加对应的中断设置!
3.在armint.c
OEMInterruptHandler函数内进行了关联
例:
else if (IntPendVal == INTSRC_EINT1) //add Key_Camera=eint1
{
RETAILMSG(1, (TEXT("INT:SYSINTR_KEYPAD_CAMERA INT\r\n")));
s2440INT->rINTMSK |= BIT_EINT1;
s2440INT->rSRCPND = BIT_EINT1;
if (s2440INT->rINTPND & BIT_EINT1) s2440INT->rINTPND = BIT_EINT1;
if(!User_lock)
{
return(SYSINTR_KEYPAD_CAMERA);
}
else{
RETAILMSG(1, (TEXT("INT:SYSINTR_KEYPAD_CAMERA INT ->SYSINTR_NOP\r\n")));
s2440INT->rINTMSK &= ~BIT_EINT1;
return SYSINTR_NOP;
}
}
4.最后在PWRBTN_PCF.c文件中创建事件
// create PWR_IST
if ( (kebevent_camera = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) {
dwErr = GetLastError();
RETAILMSG(1,(TEXT("KEB ERROR: Unable to create IST event camera: %u \r\n"), dwErr));
goto _error_exit;
}
if( !InterruptInitialize(SYSINTR_KEYPAD_CAMERA, kebevent_camera, NULL, 0) ) {
dwErr = GetLastError();
RETAILMSG(1,(TEXT("KEB ERROR: Unable to initialize interrupt CAMERA : %u\r\n"), dwErr));
goto _error_exit;
}
if ( (keythread_camera= CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) keypad_thread_camera, NULL, 0, NULL)) == NULL) {
dwErr = GetLastError();
RETAILMSG(1,(TEXT("KEB ERROR: Unable to create IST camera: %u\r\n"), dwErr));
goto _error_exit;
}
其中keypad_thread_camera是我自己编的函数
keypad_thread_camera(void) //gpf1
{
while (1) {
__try {
WaitForSingleObject(kebevent_camera, INFINITE);
s2440IOP->rGPFCON &= ~(3<<2);
Sleep(110);
if(s2440IOP->rGPFDAT & (1<<1)) //rsing ky up
{
s2440IOP->rGPFCON |= (2<<2);
s2440IOP->rEXTINT0 &= ~(7<<4);
s2440IOP->rEXTINT0 |= (2<<4);
RETAILMSG(1,(TEXT("keypad_thread_camera rsing key up r\r\n")));
}
else //key press
{
s2440IOP->rGPFCON |= (2<<2);
s2440IOP->rEXTINT0 &= ~(7<<4);
s2440IOP->rEXTINT0 |= (4<<4);
RETAILMSG(1,(TEXT("keypad_thread_camera key press r\r\n")));
}
InterruptDone(SYSINTR_KEYPAD_CAMERA);
}
_except(EXCEPTION_EXECUTE_HANDLER)
{
RETAILMSG(1,(TEXT("!!! PWR_IST EXCEPTION: 0x%X !!!\r\n"), GetExceptionCode() ));
}
}
return 1;
}
新设置的按键总是在:
if( !InterruptInitialize(SYSINTR_KEYPAD_CAMERA, kebevent_camera, NULL, 0) ) {
dwErr = GetLastError();
RETAILMSG(1,(TEXT("KEB ERROR: Unable to initialize interrupt CAMERA : %u\r\n"), dwErr));
goto _error_exit;
}
出错,返回值是87,参数错误,但是我实在不明白为什么出错!
请各位老师指导!
以上是我全部修改的地方,是否有没有修改到的地方!?
|
|