⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s3c6410_touch.cpp

📁 6410BSP3
💻 CPP
📖 第 1 页 / 共 2 页
字号:


BOOL
DdsiTouchPanelEnable(VOID)
{
    UINT32 Irq[3];

    TSPMSG((_T("[TSP] ++DdsiTouchPanelEnable()\r\n")));

    if (!g_bTSP_Initialized)    // Map Virtual address and Interrupt at First time Only
    {
        if (!TSP_VirtualAlloc())
        {
            RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] DdsiTouchPanelEnable() : TSP_VirtualAlloc() Failed\r\n")));
            return FALSE;
        }

        // Initialize Critical Section
        InitializeCriticalSection(&g_csTouchADC);

        // Obtain SysIntr values from the OAL for the touch and touch timer interrupts.
        Irq[0] = -1;
        Irq[1] = OAL_INTR_FORCE_STATIC;
        Irq[2] = IRQ_PENDN;
        if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(Irq), &gIntrTouch, sizeof(UINT32), NULL))
        {
            RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] DdsiTouchPanelEnable() : IOCTL_HAL_REQUEST_SYSINTR Failed\r\n")));
            gIntrTouch = SYSINTR_UNDEFINED;
            return FALSE;
        }

        Irq[0] = -1;
        Irq[1] = OAL_INTR_FORCE_STATIC;
        Irq[2] = IRQ_TIMER3;
        if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(Irq), &gIntrTouchChanged, sizeof(UINT32), NULL))
        {
            RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] DdsiTouchPanelEnable() : IOCTL_HAL_REQUEST_SYSINTR Failed\r\n")));
            gIntrTouchChanged = SYSINTR_UNDEFINED;
            return FALSE ;
        }

        TSPINF((_T("[TSP:INF] DdsiTouchPanelEnable() : gIntrTouch = %d\r\n"), gIntrTouch));
        TSPINF((_T("[TSP:INF] DdsiTouchPanelEnable() : gIntrTouchChanged = %d\r\n"), gIntrTouchChanged));

        g_bTSP_Initialized = TRUE;
    }

    TSP_PowerOn();

    TSPMSG((_T("[TSP] --DdsiTouchPanelEnable()\r\n")));

    return TRUE;
}

VOID
DdsiTouchPanelDisable(VOID)
{
    TSPMSG((_T("[TSP] ++DdsiTouchPanelDisable()\r\n")));

    if (g_bTSP_Initialized)
    {
        TSP_PowerOff();
        //TSP_VirtualFree();    // Do not release Virtual Address... Touch will be use all the time...
        //g_bTSP_Initialized = FALSE;
    }

    TSPMSG((_T("[TSP] --DdsiTouchPanelDisable()\r\n")));
}

BOOL
DdsiTouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput)
{
    if ( lpOutput == NULL )
    {
        RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] DdsiTouchPanelGetDeviceCaps() : ERROR_INVALID_PARAMETER\r\n")));
        SetLastError(ERROR_INVALID_PARAMETER);
        ASSERT(0);
        return FALSE;
    }

    switch(iIndex)
    {
    case TPDC_SAMPLE_RATE_ID:
        {
            TPDC_SAMPLE_RATE *pTSR = (TPDC_SAMPLE_RATE*)lpOutput;

            TSPMSG((_T("[TSP] DdsiTouchPanelGetDeviceCaps() : TPDC_SAMPLE_RATE_ID\r\n")));

            pTSR->SamplesPerSecondLow = TSP_SAMPLE_RATE_LOW;
            pTSR->SamplesPerSecondHigh = TSP_SAMPLE_RATE_HIGH;
            pTSR->CurrentSampleRateSetting = g_TSP_CurRate;
        }
        break;
    case TPDC_CALIBRATION_POINT_COUNT_ID:
        {
            TPDC_CALIBRATION_POINT_COUNT *pTCPC = (TPDC_CALIBRATION_POINT_COUNT*)lpOutput;

            TSPMSG((_T("[TSP] DdsiTouchPanelGetDeviceCaps() : TPDC_CALIBRATION_POINT_COUNT_ID\r\n")));

            pTCPC->flags = 0;
            pTCPC->cCalibrationPoints = 5;      // calibrate touch point using 5points
        }
        break;
    case TPDC_CALIBRATION_POINT_ID:
        return(TSP_CalibrationPointGet((TPDC_CALIBRATION_POINT*)lpOutput));
    default:
        RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] DdsiTouchPanelGetDeviceCaps() : ERROR_INVALID_PARAMETER\r\n")));
        SetLastError(ERROR_INVALID_PARAMETER);
        ASSERT(0);
        return FALSE;
    }

    return TRUE;
}

BOOL
DdsiTouchPanelSetMode(INT iIndex, LPVOID  lpInput)
{
    BOOL  bRet = FALSE;

    TSPMSG((_T("[TSP] ++DdsiTouchPanelSetMode(%d)\r\n"), iIndex));

    switch ( iIndex )
    {
    case TPSM_SAMPLERATE_LOW_ID:
        g_TSP_CurRate = 0;
        g_pPWMReg->TCNTB3  = g_SampleTick_Low;
        SetLastError( ERROR_SUCCESS );
        bRet = TRUE;
        break;
    case TPSM_SAMPLERATE_HIGH_ID:
        g_TSP_CurRate = 1;
        g_pPWMReg->TCNTB3  = g_SampleTick_High;
        SetLastError( ERROR_SUCCESS );
        bRet = TRUE;
        break;
    default:
        RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] DdsiTouchPanelSetMode() : ERROR_INVALID_PARAMETER\r\n")));
        SetLastError( ERROR_INVALID_PARAMETER );
        break;
    }

    TSPMSG((_T("[TSP] --DdsiTouchPanelSetMode() = %d\r\n"), bRet));

    return bRet;
}

VOID
DdsiTouchPanelGetPoint(TOUCH_PANEL_SAMPLE_FLAGS *pTipState, INT *pUncalX, INT *pUncalY)
{
    static int PrevX=0;
    static int PrevY=0;
    int TmpX = 0;
    int TmpY = 0;

    TSPMSG((_T("[TSP] ++DdsiTouchPanelGetPoint()\r\n")));

    if (g_pVIC1Reg->VICRAWINTR & (1<<(PHYIRQ_PENDN-VIC1_BIT_OFFSET)))        // gIntrTouch Interrupt Case
    {
        TSPMSG((_T("[TSP] gIntrTouch(PHYIRQ_PENDN) Case\r\n")));

        *pTipState = TouchSampleValidFlag;

        if ((g_pADCReg->ADCDAT0 & D_UPDOWN_UP)
            || (g_pADCReg->ADCDAT1 & D_UPDOWN_UP))
        {
            TSPMSG((_T("[TSP] Pen Up\r\n")));

            g_bTSP_DownFlag = FALSE;

            g_pADCReg->ADCTSC = ADCTSC_WAIT_PENDOWN;

            *pUncalX = PrevX;
            *pUncalY = PrevY;

            TSP_SampleStop();
        }
        else
        {
            TSPMSG((_T("[TSP] Pen Down\r\n")));

            g_bTSP_DownFlag = TRUE;

            g_pADCReg->ADCTSC = ADCTSC_WAIT_PENUP;

            *pTipState |= TouchSampleIgnore;

            *pUncalX = PrevX;
            *pUncalY = PrevY;

            *pTipState |= TouchSampleDownFlag;

            TSP_SampleStart();
        }

        g_pADCReg->ADCCLRWK = CLEAR_ADCWK_INT;

        InterruptDone(gIntrTouch);        // Not handled in MDD
    }
    else    // gIntrTouchTimer Interrupt Case
    {
        TSPMSG((_T("[TSP] gIntrTouchChanged(PHYIRQ_TIMER3) Case\r\n")));

        // Check for Pen-Up case on the event of timer3 interrupt
        if ((g_pADCReg->ADCDAT0 & D_UPDOWN_UP)
            || (g_pADCReg->ADCDAT1 & D_UPDOWN_UP))
        {
            TSPMSG((_T("[TSP] Pen Up +\r\n")));

            g_bTSP_DownFlag = FALSE;

            g_pADCReg->ADCTSC = ADCTSC_WAIT_PENDOWN;

            *pUncalX = PrevX;
            *pUncalY = PrevY;

            *pTipState = TouchSampleValidFlag;

            TSP_SampleStop();
        }
        else if (g_bTSP_DownFlag)
        {
            if (TSP_GetXY(&TmpX, &TmpY) == TRUE)
            {
#ifdef NEW_FILTER_SCHEME
                if(Touch_Pen_Filtering(&TmpX, &TmpY))
#else
                if(Touch_Pen_Filtering_Legacy(&TmpX, &TmpY))
#endif
                {
                    *pTipState = TouchSampleValidFlag | TouchSampleDownFlag;
                    *pTipState &= ~TouchSampleIgnore;
                }
                else        // Invalid touch pen
                {
//                    *pTipState = TouchSampleValidFlag;
//                    *pTipState |= TouchSampleIgnore;
                    *pTipState = TouchSampleIgnore;
                }

                *pUncalX = PrevX = TmpX;
                *pUncalY = PrevY = TmpY;

                g_pADCReg->ADCTSC = ADCTSC_WAIT_PENUP;
            }
            else
            {
                *pTipState = TouchSampleIgnore;
            }
        }
        else
        {
            RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP] Unknown State\r\n")));

            *pTipState = TouchSampleIgnore;
            TSP_SampleStop();
        }

        // timer3 interrupt status clear, Do not use OR/AND operation on TINTC_CSTAT directly
        g_pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(g_pPWMReg->TINT_CSTAT) | TIMER3_PENDING_CLEAR;

        InterruptDone(gIntrTouchChanged);        // Not Handled in MDD
    }

    TSPMSG((_T("[TSP] --DdsiTouchPanelGetPoint()\r\n")));
}

LONG
DdsiTouchPanelAttach(VOID)
{
    return (0);
}

LONG
DdsiTouchPanelDetach(VOID)
{
    return (0);
}

VOID
DdsiTouchPanelPowerHandler(BOOL bOff)
{
    TSPMSG((_T("[TSP] ++DdsiTouchPanelPowerHandler(%d)\r\n"), bOff));

    if (bOff)
    {
        TSP_PowerOff();
    }
    else
    {
        TSP_PowerOn();

        // Detect proper touch state after Wake Up
        SetInterruptEvent(gIntrTouchChanged);
    }

    TSPMSG((_T("[TSP] --DdsiTouchPanelPowerHandler()\r\n")));
}

static BOOL
Touch_Pen_Filtering(INT *px, INT *py)
{
    BOOL RetVal = TRUE;
    // TRUE  : Valid pen sample
    // FALSE : Invalid pen sample
    INT Filter_Margin;
    static int count = 0;
    static INT x[2], y[2];
    INT TmpX, TmpY;
    INT dx, dy;

    if(*px <0 && *py <0)
    {
        count = 0;
        return FALSE;
    }
    else
    {
        count++;
    }

    if (count > 2)
    {
        // apply filtering rule
        count = 2;

        // average between x,y[0] and *px,y
        TmpX = (x[0] + *px)>>1;
        TmpY = (y[0] + *py)>>1;

        // difference between x,y[1] and TmpX,Y
        dx = (x[1] > TmpX) ? (x[1] - TmpX) : (TmpX - x[1]);
        dy = (y[1] > TmpY) ? (y[1] - TmpY) : (TmpY - y[1]);

        Filter_Margin = (x[1] > x[0]) ? (x[1]-x[0]) : (x[0]-x[1]);
        Filter_Margin += (y[1] > y[0]) ? (y[1]-y[0]) : (y[0]-y[1]);
        Filter_Margin += TSP_FILTER_LIMIT;

        if ((dx > Filter_Margin) || (dy > Filter_Margin)) {
            // Invalid pen sample
            *px = x[1];
            *py = y[1]; // previous valid sample
            RetVal = FALSE;
            count = 0;
        }
        else
        {
            // Valid pen sample
            x[0] = x[1]; y[0] = y[1];
            x[1] = *px; y[1] = *py; // reserve pen samples

            RetVal = TRUE;
        }
    }
    else // (count > 2)
    { // till 2 samples, no filtering rule
        x[0] = x[1]; y[0] = y[1];
        x[1] = *px; y[1] = *py; // reserve pen samples

        RetVal = FALSE;
    }

    return RetVal;
}
static BOOL
Touch_Pen_Filtering_Legacy(INT *px, INT *py)
{    
    BOOL RetVal = TRUE;
    // TRUE  : Valid pen sample
    // FALSE : Invalid pen sample
    static int count = 0;
    static INT x[2], y[2];
    INT TmpX, TmpY;
    INT dx, dy;
    count++;

    if (count > 2)
    {
        // apply filtering rule
        count = 2;

        // average between x,y[0] and *px,y
        TmpX = (x[0] + *px) / 2;
        TmpY = (y[0] + *py) / 2;

        // difference between x,y[1] and TmpX,Y
        dx = (x[1] > TmpX) ? (x[1] - TmpX) : (TmpX - x[1]);
        dy = (y[1] > TmpY) ? (y[1] - TmpY) : (TmpY - y[1]);

        if ((dx > TSP_FILTER_LIMIT) || (dy > TSP_FILTER_LIMIT))
        {
            // Invalid pen sample

            *px = x[1];
            *py = y[1]; // previous valid sample
            RetVal = FALSE;
            count = 0;
        }
        else
        {
            // Valid pen sample
            x[0] = x[1]; y[0] = y[1];
            x[1] = *px; y[1] = *py; // reserve pen samples

            RetVal = TRUE;
        }
    }
    else
    { // till 2 samples, no filtering rule
        x[0] = x[1]; y[0] = y[1];
        x[1] = *px; y[1] = *py; // reserve pen samples

        RetVal = FALSE;
    }

    return RetVal;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -