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

📄 s3c6410_touch.cpp

📁 SAMSUNG S3C6410 CPU BSP for winmobile6
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if ((*py & 0x7) > 3) *py = (*py>>3) + 1;
	else *py = *py>>3;

	dx = x[5] - x[2];
	dy = y[5] - y[2];
#else
	// 2 samples average
	*px = (x[1] + x[2] + 1)>>1;
	*py = (y[1] + y[2] + 1)>>1;

	dx = x[2]-x[1];
	dy = y[2]-y[1];
#endif

	
	if ((dx > TSP_INVALIDLIMIT) || (dy > TSP_INVALIDLIMIT))
	{
		return FALSE;
	}
	else
	{
		return TRUE;
	}
}


//---------------------------------------------------------------------------


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())
		{
			TSPERR((_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))
		{
			TSPERR((_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))
		{
			TSPERR((_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 )
	{
		TSPERR((_T("[TSP:ERR] DdsiTouchPanelGetDeviceCaps() : ERROR_INVALID_PARAMETER\r\n")));
		SetLastError(ERROR_INVALID_PARAMETER);
		DebugBreak();
		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;
		}
		break;
	case TPDC_CALIBRATION_POINT_ID:
		return(TSP_CalibrationPointGet((TPDC_CALIBRATION_POINT*)lpOutput));
	default:
		TSPERR((_T("[TSP:ERR] DdsiTouchPanelGetDeviceCaps() : ERROR_INVALID_PARAMETER\r\n")));
		SetLastError(ERROR_INVALID_PARAMETER);
		DebugBreak();
		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:
		TSPERR((_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// if (g_pVIC0Reg->VICRAWINTR & (1<<(PHYIRQ_TIMER3)))		// 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)
			{
				//TSP_TransXY(&TmpX, &TmpY);

				if(Touch_Pen_Filtering(&TmpX, &TmpY))
				{
					*pTipState = TouchSampleValidFlag | TouchSampleDownFlag;
					*pTipState &= ~TouchSampleIgnore;
				}
				else		// Invalid touch pen
				{
					*pTipState = TouchSampleValidFlag;
					*pTipState |= TouchSampleIgnore;
				}

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

				g_pADCReg->ADCTSC = ADCTSC_WAIT_PENUP;

				//TSPMSG((_T("[TSP] UncalX = %d, UncalY = %d\r\n"), *pUncalX,*pUncalY));
			}
			else
			{
				*pTipState = TouchSampleIgnore;
			}
		}
		else
		{
			TSPERR((_T("[TSP] Unknown State\r\n")));

			*pTipState = TouchSampleIgnore;
			TSP_SampleStop();
		}

		// timer3 interrupt status clear
		//g_pPWMReg->TINT_CSTAT |= (1<<8);		// Do not use OR/AND operation on TINTC_CSTAT
		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)
{
#ifdef	NEW_FILTER_SCHEME	// New Scheme from PJR
	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;	// <- TRUE jylee 2003.03.04
	}

	return RetVal;
#else
	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;	// <- TRUE jylee 2003.03.04
	}

	return RetVal;
#endif
}

// jylee_20070411
// To pass CETK Test Case 8007 : "Initialize Cursor Test"
BOOL TouchPanelInitializeCursor()
{
    return TRUE;
}

⌨️ 快捷键说明

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