4053|14

90

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

touch panel驱动 奇怪问题! [复制链接]

本人把wince6.0下的DeviceEmulator改到我的2440的开发板上运行,因为DeviceEmulator是基于2410的,现在改到2440下改动也不是太大, 目前wince6.0的桌面已经可以显示出来了,但是触摸屏却一直动不了,后来跟踪发现触摸屏驱动已经加载,而且第一次点击触摸屏还可以产生中断,但是与该中断关联的事件却触发不了,导致IST线程一直在“WaitForSingleObject( hTouchPanelEvent, gdwTouchIstTimeout );”这个位置等待,查了很久,InterruptInitialize也成功了,但为何hTouchPanelEvent事件就是触发不了呢??不知有谁碰到过这样的问题,请指教!   

本人在触摸屏驱动的几个关键函数中都加了串口调试信息,如TouchPanelEnable函数中的串口信息都可以显示,但是TouchPanelpISR中的信息却打印不出来,这说明没有执行到,如下。另外本人在OEMInterruptHandler函数中也加了串口打印的动作,以跟踪哪个中断发生,当触摸屏第一次点击时是有信息打印输出的,这说明触摸屏中断可以产生。

    while  ( !bTerminate )
    {
        WaitForSingleObject( hTouchPanelEvent, gdwTouchIstTimeout );
        RETAILMSG(1, (TEXT("TouchPanelpISR\r\n")));



最新回复

1.请注意你的ADC的VDD和clock是否有给。 2.用手按触摸屏的时候,用示波器量一下信号,看是否有触发?  详情 回复 发表于 2009-10-10 17:41
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
是不是第一次中断后,没有释放中断(InterruptDone函数没有调用)
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
中断没有释放,或者定时器中断没有打开
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
追查Interuptdone(貌似是这个名字)函数,看是否重新使能中断
你现在一次中断都没有产生吗?
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢各位,Interuptdone函数是没有调用,但是触摸屏执行的路径应该是:中断->TouchPanelpISR->WaitForSingleObject->DdsiTouchPanelGetPoint->Interuptdone,但关键是WaitForSingleObject()函数都过不了怎么能执行Interuptdone呢!
以下是触摸屏IST线程TouchPanelpISR的代码,见中文注释部分。


static ULONG
TouchPanelpISR(
    PVOID   Reserved  //@parm Reserved, not used.
    )
{
    TOUCH_PANEL_SAMPLE_FLAGS    SampleFlags = 0;
    INT32                       RawX, CalX;
    INT32                       RawY, CalY;
    UINT32                      MaxX =  DisplayWidth * X_SCALE_FACTOR;
    UINT32                      MaxY =  DisplayHeight * Y_SCALE_FACTOR;
    UINT32                      CurrentDown = 0;
    static LONG CX;
    static LONG CY;
    static LONG XBase;
    static LONG YBase;
    static int  CalibrationSampleCount;
    static BOOL     fSetBase;
    static DWORD    BaseTime;
    static BOOL     fGotSample;

    PFN_TOUCH_PANEL_CALLBACK pfnCallback;

    // Need to be all kmode so that we can write to shared memory.
    //
    RETAILMSG(1, (TEXT("TouchPanelpISR\n")));
    while  ( !bTerminate )
    {
        WaitForSingleObject( hTouchPanelEvent, gdwTouchIstTimeout );//死在这里
         RETAILMSG(1, (TEXT("TouchPanelpISR\r\n")));//串口没有打印这句话,说明没有执行到这
        EnterCriticalSection( &csMutex );
        DEBUGMSG(ZONE_THREAD, (TEXT("TCH_INTR\r\n")) );

        // Give the pdd the down state of the previous sample
        if ( CurrentDown )
            SampleFlags |= TouchSamplePreviousDownFlag;
        else
            SampleFlags &= ~TouchSamplePreviousDownFlag;

        DdsiTouchPanelGetPoint( &SampleFlags, &RawX, &RawY );//这个函数里面才会调用Interuptdone函数。
        if ( SampleFlags & TouchSampleIgnore )
        {
            // do nothing, not a valid sample
            LeaveCriticalSection( &csMutex );
            continue;
        }
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 
gooogleman:“追查Interuptdone(貌似是这个名字)函数,看是否重新使能中断
你现在一次中断都没有产生吗?”

to gooogleman:
能产生第一次中断,但是IST线程一直在WaitForSingleObject的位置没往下执行,所以也不可能有第二次中断,但为何中断发生了,IST线程却不能被唤醒呢??
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
各位对此问题有何建议啊?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
不知道你的bTerminate 变量是什么值?第一次中断后又是什么值?如果bTerminate =true。这个while(!bTerminate )是不是进不来了?愚见!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
你可以看下你的逻辑中断号拿到的事多少,同时拟也可以在哪个OEMInterruptHandler这个函数里面的逻辑中断号是多少。中断有,但是么有触发事件。。我觉得可能就是你的事件和物理中断号,逻辑中断号的关系没有搞对,或者在OEMInterruptHandler这个函数里面出现了异常比如说很早就直接返回了。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(高级)

10
 
bTerminate 变量是Ture,这个我查过的。

OEMInterruptHandler中似乎也没有出现异常,以下是我的OEMInterruptHandler函数的最后面的代码,我设置了串口打印信息,第一次点击触摸屏是可以打印输出的,是“31:20”,也就是物理中断为ADC的中断对应于逻辑中断号20。

        // First find if IRQ is claimed by chain
        sysIntr = NKCallIntChain((UCHAR)irq);
        if (sysIntr == SYSINTR_CHAIN || !NKIsSysIntrValid(sysIntr)) {
            // IRQ wasn't claimed, use static mapping
            sysIntr = OALIntrTranslateIrq(irq);
            RETAILMSG(1,(TEXT("\r%d:"),irq));
            RETAILMSG(1,(TEXT("%d\r"),sysIntr));

        }
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

11
 
bTerminate 变量是Ture的话,你while  ( !bTerminate )这个循环根本就进不去呀,打印信息就更不可能有了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
哦,搞错了,是false,因为在WaitForSingleObject之前我也输出过打印信息,有打印的。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

13
 
关注,期待LZ早日找出原因。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

14
 
中断 和 事件,关联错误。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

15
 
1.请注意你的ADC的VDD和clock是否有给。
2.用手按触摸屏的时候,用示波器量一下信号,看是否有触发?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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