3168|6

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

为什么我的2410在wince下触摸屏只能中断一次呢? [复制链接]

如题,附上相关源码,请大家帮我看看是什么问题.
==============================================================================
D:\WINCE600\PLATFORM\SMDK2410\SRC\DRIVERS\TOUCH\s3c2410x_touch_2410.cpp
==============================================================================
TSP_PowerOn(VOID)
{
        RETAILMSG(1,(TEXT("::: TSP_PowerOn()\r\n")));

        /* Use TSXM, TSXP, TSYM, TSYP                        */
        v_pIOPregs->GPGCON |=  ((0x3 << 30) | (0x3 << 28) | (0x3 << 26) | (0x3 << 24));
       
        // Disable full up function
        v_pIOPregs->GPGUP  |=  ((0x1 << 15) | (0x1 << 14) | (0x1 << 13) | (0x1 << 12));

        v_pADCregs->ADCDLY = 50000;

        v_pADCregs->ADCCON =    (1      << 14) |    /* A/D Converter Enable                                        */
                (ADCPRS <<  6) |    /* Prescaler Setting                                        */
                (7      <<  3) |    /* Analog Input Channel : 0                                */ //czx 0 -->7
                (0      <<  2) |    /* Normal Operation Mode                                */
                (0      <<  1) |    /* Disable Read Start                                        */
                (0      <<  0);     /* No Operation                                                        */

        v_pADCregs->ADCTSC =    (0      <<  8) |    /* UD_Sen                                                                */
                (1      <<  7) |    /* YMON  1 (YM = GND)                                        */
                (1      <<  6) |    /* nYPON 1 (YP Connected AIN[n])                */
                (0      <<  5) |    /* XMON  0 (XM = Z)                                                */
                (1      <<  4) |    /* nXPON 1 (XP = AIN[7])                                */
                (0      <<  3) |    /* Pull Up Disable                                                */
                (0      <<  2) |    /* Normal ADC Conversion Mode                        */
                (3      <<  0);     /* Waiting Interrupt                                        */


        v_pINTregs->INTSUBMSK  &= ~(1<
        v_pPWMregs->TCFG1  &= ~(0xf << 12);     /* Timer3's Divider Value                                */
        v_pPWMregs->TCFG1  |=  (0   << 12);     /* 1/2                                                                        */
        v_pPWMregs->TCNTB3  = g_timer3_sampleticks;       /* Interrupt Frequency                                        */
}

DdsiTouchPanelGetPoint(TOUCH_PANEL_SAMPLE_FLAGS * pTipStateFlags,
                                           INT  * pUncalX,
                                           INT  * pUncalY)
{
        static INT x, y;

        RETAILMSG(1, (TEXT("::: DdsiTouchPanelGetPoint()\r\n")));

        if (v_pINTregs->SUBSRCPND & (1<         {
                *pTipStateFlags = TouchSampleValidFlag;

                if ( (v_pADCregs->ADCDAT0 & (1 << 15)) |
                        (v_pADCregs->ADCDAT1 & (1 << 15)) )
                {
                        bTSP_DownFlag = FALSE;

                        DEBUGMSG(ZONE_TIPSTATE, (TEXT("up\r\n")));
                        //RETAILMSG(1, (TEXT("up\r\n")));
                        v_pADCregs->ADCTSC &= 0xff;

                        *pUncalX = x;
                        *pUncalY = y;

                        TSP_SampleStop();

                        /* At this point SYSINTR_TOUCH_CHANGED (timer3) interrupt could also be pending (and masked).
                        Since we do not care about the timer3 interrupt after calling TSP_SampleStop, signal it Done.
                        If we do not signal done and it was indeed pending and masked, IRQ_TIMER3 will not be unmasked
                        and won't fire again unless unmasked */
                        if (v_pINTregs->SRCPND & (1<                                 InterruptDone(gIntrTouchChanged);
                }
                else
                {
                        bTSP_DownFlag = TRUE;

                        if (!TSP_GetXY(&x, &y))
                                *pTipStateFlags = TouchSampleIgnore;

                        TSP_TransXY(&x, &y);

                        *pUncalX = x;
                        *pUncalY = y;

                        *pTipStateFlags |= TouchSampleDownFlag;

                        DEBUGMSG(ZONE_TIPSTATE, (TEXT("down %x %x\r\n"), x, y));
                        //RETAILMSG(1, (TEXT("down %x %x\r\n"), x, y));

                        TSP_SampleStart();
                }

                v_pINTregs->SUBSRCPND  =  (1<                 v_pINTregs->INTSUBMSK &= ~(1<
                InterruptDone(gIntrTouch);
        }
        else        /* SYSINTR_TOUCH_CHANGED Interrupt Case                */
        {
                //                TSP_SampleStart();

                if (bTSP_DownFlag)
                {
                        INT  tx, ty;
                        INT  dx, dy;

                        if (!TSP_GetXY(&tx, &ty))
                                *pTipStateFlags = TouchSampleIgnore;
                        else
                        {
                                TSP_TransXY(&tx, &ty);
                                // insert by mostek@dstcorp.com
#define X_ERRV        0x3bf
#define Y_ERRV        0x4ff

                                // Subsequent info: If the ADC provides a bad reading, this catches it and
                                // skips over it. Instead, it should be fixed at the source
                                // so as not to provide a bad reading.

                                if ((tx == X_ERRV) || (ty == Y_ERRV))
                                {
                                        tx = x;
                                        ty = y;
                                }
                                // =================== mostek
                                dx = (tx > x) ? (tx - x) : (x - tx);
                                dy = (ty > y) ? (ty - y) : (y - ty);

                                if (dx > TSP_CHANGE || dy > TSP_CHANGE)
                                {
                                        *pUncalX = x = tx;
                                        *pUncalY = y = ty;

                                        DEBUGMSG(ZONE_TIPSTATE, (TEXT("down-c-v %x %x\r\n"), x, y));

                                        *pTipStateFlags = TouchSampleValidFlag | TouchSampleDownFlag;
                                }
                                else
                                {
                                        *pUncalX = x;
                                        *pUncalY = y;

                                        DEBUGMSG(ZONE_TIPSTATE, (TEXT("down-c %x %x\r\n"), x, y));

                                        *pTipStateFlags = TouchSampleIgnore;
                                }
                        }
                }
                else
                {
                        *pTipStateFlags = TouchSampleIgnore;

                        TSP_SampleStop();
                }

                InterruptDone(gIntrTouchChanged);
        }
}
此帖出自WindowsCE论坛

最新回复

触摸屏被点下之后gIntrTouch这个中断产生,接着gIntrTouchChanged中断产生(触摸屏仍被点下时),主要是用来定时采样的,以确定触摸的轨迹,gIntrTouchChanged这个中断可以正常工作。当松开触摸屏后InterruptDone执行,但再次点下触摸屏后,并没有产生gIntrTouch中断。  详情 回复 发表于 2009-9-9 09:57
点赞 关注
 

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
=====================================================
D:\WINCE600\PLATFORM\SMDK2410\SRC\COMMON\INTR\intr.c
=====================================================
//
//  Function:  OALIntrDoneIrqs
//
VOID OALIntrDoneIrqs(UINT32 count, const UINT32 *pIrqs)
{
    UINT32 i, mask, irq;

    OALMSG(OAL_INTR&&OAL_VERBOSE, (
        L"+OALIntrDoneIrqs(%d, 0x%08x)\r\n", count, pIrqs
    ));

    for (i = 0; i < count; i++) {
#ifndef OAL_BSP_CALLBACKS
        irq = pIrqs;
#else
        // Give BSP chance to finish irq on subordinate interrupt controller
        irq = BSPIntrDoneIrq(pIrqs);
#endif   
        // Depending on IRQ number use internal or external mask register
        if (irq <= IRQ_ADC) {
            // Use interrupt mask register
            mask = 1 << irq;
            //RETAILMSG(1,(TEXT("before---OALIntrDoneIrqs:mask = 0x%x ,INTMSK = 0x%x,SRCPND = 0x%x\n\r\n"),mask,g_pIntrRegs->INTMSK,g_pIntrRegs->SRCPND));
            OUTREG32(&g_pIntrRegs->SRCPND, mask);
            CLRREG32(&g_pIntrRegs->INTMSK, mask);
            //RETAILMSG(1,(TEXT("after---OALIntrDoneIrqs:mask = 0x%x ,INTMSK = 0x%x,SRCPND = 0x%x\n\r\n"),mask,g_pIntrRegs->INTMSK,g_pIntrRegs->SRCPND));
        } else if (irq <= IRQ_EINT23) {
            // Use external mask register
            mask = 1 << (irq - IRQ_EINT4 + 4);
            OUTREG32(&g_pPortRegs->EINTPEND, mask);//--nonya
            CLRREG32(&g_pPortRegs->EINTMASK, mask);
        }   
    }

    OALMSG(OAL_INTR&&OAL_VERBOSE, (L"-OALIntrDoneIrqs\r\n"));
}
此帖出自WindowsCE论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的定时器中断gIntrTouchChanged工作正常吗

触摸屏第一次响应是你pendown那次产生的屏中断gIntrTouch

后面的响应都是定时器中断
此帖出自WindowsCE论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
楼上说的有道理,看看按下后启动的那个定时器是否正常
此帖出自WindowsCE论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
InterruptDone(); 函数调用了什么,你去看看,也许是你BSP有些问题,这个是重启中断的。
此帖出自WindowsCE论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
对的,检查InterruptDone函数,问题很可能在这里。
此帖出自WindowsCE论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
触摸屏被点下之后gIntrTouch这个中断产生,接着gIntrTouchChanged中断产生(触摸屏仍被点下时),主要是用来定时采样的,以确定触摸的轨迹,gIntrTouchChanged这个中断可以正常工作。当松开触摸屏后InterruptDone执行,但再次点下触摸屏后,并没有产生gIntrTouch中断。
此帖出自WindowsCE论坛
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表