📄 s3c6410_touch.cpp
字号:
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 + -