3337|3

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教关于:按键中断,创建中断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,参数错误,但是我实在不明白为什么出错!
请各位老师指导!

以上是我全部修改的地方,是否有没有修改到的地方!?

最新回复

昨天又仔细查了一下,问题好像出现在: #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 这里,网上有提及自定义中断最多只能24+8=32个,原来已经有了24个,我只能从25开始定义! 我尝试了在这里,仅仅将自己的新增自定义直接和原来定义交换位置,新增的可以工作了。 但是不排除其他可能..... 谢谢前面仁兄的回答,eint1 12 19 20原来是悬空口,并未作为中断! 的确是中断没有加上,不知道你说的系统中断加了么是什么意思? PS:鉴于这种自定义中断满了情况,有没有其他方法可以解决!  详情 回复 发表于 2008-8-21 09:43
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你原来的bsp里有定义 EINT1,12,19,20 吗?如果有的话,应该不用改这么多吧.

查看src\inc\s3c2440_intr.h(文件名不一定是s3c2440_intr.h,呵呵),如果有定义的话,那BSP里OEM应该是有对应的中断处理了.

你在驱动里,只要
KernelIOControl(IOCTL_HAL_REQUEST_SYSINTR,&physicalIntr,,&logicIntr,,);
InterruptInitialize(logicIntr,event,);
然后在ist里
WaitForSingleObject(event,);
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
好象还有中断没加到,系统中断加了吗
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

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

这里,网上有提及自定义中断最多只能24+8=32个,原来已经有了24个,我只能从25开始定义!
我尝试了在这里,仅仅将自己的新增自定义直接和原来定义交换位置,新增的可以工作了。
但是不排除其他可能.....

谢谢前面仁兄的回答,eint1 12 19 20原来是悬空口,并未作为中断!

的确是中断没有加上,不知道你说的系统中断加了么是什么意思?

PS:鉴于这种自定义中断满了情况,有没有其他方法可以解决!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表