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

📄 sam9261_touch.cpp

📁 CE5.0下矩阵式触摸板驱动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    RETAILMSG(0, (TEXT("pTCP -> CalibrationX : %4d\r\n"), pTCP->CalibrationX));
    RETAILMSG(0, (TEXT("pTCP -> CalibrationY : %4d\r\n"), pTCP->CalibrationY));
    return (TRUE);
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* Kernel can get Touch Panel Info by this function */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PUBLIC BOOL DdsiTouchPanelGetDeviceCaps(INT iIndex, LPVOID  lpOutput)
{
RETAILMSG(1, (TEXT("::: DdsiTouchPanelGetDeviceCaps\r\n")));	
	if ( lpOutput == NULL )
    {
        ERRORMSG(1, (__TEXT("TouchPanelGetDeviceCaps: 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;
            	RETAILMSG(0, (TEXT("TouchPanelGetDeviceCaps::TPDC_SAMPLE_RATE_ID\r\n")));

	            pTSR->SamplesPerSecondLow      = TSP_SAMPLE_RATE_LOW;
	            pTSR->SamplesPerSecondHigh     = TSP_SAMPLE_RATE_HIGH;
	            pTSR->CurrentSampleRateSetting = TSP_CurRate;
        	}
    		break;

    	case TPDC_CALIBRATION_POINT_COUNT_ID:
	        {
	            TPDC_CALIBRATION_POINT_COUNT *pTCPC = (TPDC_CALIBRATION_POINT_COUNT *)lpOutput;
	            RETAILMSG(0, (TEXT("TouchPanelGetDeviceCaps::TPDC_CALIBRATION_POINT_COUNT_ID\r\n")));
	
	            pTCPC->flags              = 0;
	            pTCPC->cCalibrationPoints = 5;   	//don`t need Calibration Points 
	        }
	        break;
	        
	case TPDC_CALIBRATION_POINT_ID:
		RETAILMSG(0, (TEXT("TouchPanelGetDeviceCaps::TPDC_CALIBRATION_POINT_ID\r\n")));
		return(TSP_CalibrationPointGet((TPDC_CALIBRATION_POINT*)lpOutput));
        	break;

		default:
	        ERRORMSG(1, (__TEXT("TouchPanelGetDeviceCaps: invalid parameter.\r\n")));
	        SetLastError(ERROR_INVALID_PARAMETER);
	        DebugBreak();
	        return (FALSE); 
	}	       	
    		    	
	return (TRUE);
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PUBLIC VOID DdsiTouchPanelPowerHandler(BOOL bOff)
{
RETAILMSG(1, (TEXT("::: DdsiTouchPanelPowerHandler()\r\n")));
    if (bOff)
    {
        TSP_PowerOff();
    }
    else
    {
        TSP_PowerOn();
    }
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PUBLIC BOOL DdsiTouchPanelSetMode(INT iIndex, LPVOID  lpInput)
{
    BOOL  ReturnCode = FALSE;

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

    switch ( iIndex )
    {
	    case TPSM_SAMPLERATE_LOW_ID:
	    case TPSM_SAMPLERATE_HIGH_ID:
	        SetLastError( ERROR_SUCCESS );
	        ReturnCode = TRUE;
	        break;
	
	    default:
	        SetLastError( ERROR_INVALID_PARAMETER );
	        break;
    }

    return( ReturnCode );
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* Delay,cann't calc acutely  */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/*
VOID TSP_WaitUs( UINT32 num )
{
	UINT32	i;
	
	for( i=0; i<num * 2; i++ );
	for( i=0; i<(num>>1); i++ );
	for( i=0; i<(num>>2); i++ );
	for( i=0; i<num * 20; i++ );
}
*/
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* check TouchPanel IRQ low. 1-low..0-high */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PRIVATE BOOL TSP_GetKeyStatus( VOID )
{
	UINT32	PIOCStatus;
	
//RETAILMSG(1, (TEXT("::: TSP_GetKeyStatus()\r\n")));
	PIOCStatus = v_pPioCregs->PIO_PDSR;
	return( Key_IRQ_LOGIC ? ( ( PIOCStatus & TouchPanel_IRQ ) != 0 ) : !( ( PIOCStatus & TouchPanel_IRQ ) != 0 ) );
}

#if		(TouchKeyPanelRowNum > 16 )
PRIVATE VOID TSP_SetMatrixKeyRow( UINT32 RowVal )
{	// A60T
	RowVal = MatrixKeyRow_LOGIC ? RowVal: ~ RowVal;

	*v_KEY_WR_LT07 = LowByte( LowWord( RowVal ) );
	*v_KEY_WR_LT15 = HighByte( LowWord( RowVal ) );
	*v_KEY_WR_LT23 = LowByte( HighWord( RowVal ) );
}
#else
PRIVATE VOID TSP_SetMatrixKeyRow( UINT32 RowVal )
{	// 560T
	RowVal = MatrixKeyRow_LOGIC ? RowVal: ~ RowVal;

	*v_KEY_WR_LT07 = LowByte( RowVal );
	*v_KEY_WR_LT15 = HighByte( RowVal );
}
#endif

UINT32 TSP_GetMatrixKeyCol( VOID )
{
	UINT32  KeyColVal;

#if		(TouchKeyPanelColNum > 24)
	KeyColVal = Word2DWord( Byte2Word( *v_KEY_RD_LT31, *v_KEY_RD_LT23 ), Byte2Word( *v_KEY_RD_LT15, *v_KEY_RD_LT07 ) ); 
#elif	(TouchKeyPanelColNum > 16)
	KeyColVal = Word2DWord( *v_KEY_RD_LT23, Byte2Word( *v_KEY_RD_LT15, *v_KEY_RD_LT07 ) );
#else
	KeyColVal = Byte2Word( *v_KEY_RD_LT15, *v_KEY_RD_LT07 ); 
#endif

	return( MatrixKeyCol_LOGIC ? KeyColVal: ~ KeyColVal );
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* scan matrix key and write to key image */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PRIVATE VOID TSP_ReadPressedMatrixBlock( BYTE ( *XY_Array )[TouchKeyPanelColNum] )
{
	UINT32	X_Scan;
	int		i,j;

	DEBUGMSG(ZONE_TIPSTATE, (TEXT("::: TSP_ReadPressedMatrixBlock()\r\n")));
	for( i=0; i<TouchKeyPanelOutputNum; i++ )
	{
		TSP_SetMatrixKeyRow( 1 << i );
		Sleep(2);

		X_Scan = TSP_GetMatrixKeyCol();
#if (TouchKeyPanelInputNum < 32)
		X_Scan = X_Scan & ( ( 1 << TouchKeyPanelInputNum ) - 1 );
#endif
		if( X_Scan != 0 )
		{
			for( j=0; j<TouchKeyPanelInputNum; j++ )
			{
				if( ( X_Scan & ( 1 << j ) ) != 0 )
				{
					Cur_XY_Array = 1;							// 1 indicates key pressed
				}
				else
				{
					Cur_XY_Array = 0;							// 0 indicates key not press
				}
			}
		}
		else
		{
			for( j=0; j<TouchKeyPanelInputNum; j++ )
			{
				Cur_XY_Array = 0;
			}
		}
	}
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* calculate a key middle point */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PRIVATE VOID TSP_GetAMidPoint(UINT32 Row, UINT32 Col, UINT32 *pMidX, UINT32 *pMidY)
{	
	UINT32 	BlockLeftTopX,BlockLeftTopY;
	UINT32 	BlockRightBottomX,BlockRightBottomY;
	
	/* a key's region */
	BlockLeftTopX = LCD_DOT_WIDTH * Col / TouchKeyPanelColNum;
	BlockLeftTopY = LCD_DOT_HEIGHT * Row / TouchKeyPanelRowNum;
	
	BlockRightBottomX =  BlockLeftTopX + ( LCD_DOT_WIDTH  / TouchKeyPanelColNum );
	BlockRightBottomY =  BlockLeftTopY + ( LCD_DOT_HEIGHT / TouchKeyPanelRowNum );
	
	*pMidX = (BlockLeftTopX + BlockRightBottomX) / 2;
	*pMidY = (BlockLeftTopY + BlockRightBottomY) / 2;
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* with the key image, we will calculate the middle point of the pressed block */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PRIVATE VOID TSP_CalcPoint(INT  * pUncalX, INT  * pUncalY, BYTE ( *XY_Array )[TouchKeyPanelColNum])
{
	UINT32	i, j;
	UINT32	x_Sum = 0;
	UINT32	y_Sum = 0;
	UINT32	tmpMidX = 0, tmpMidY = 0;
	UINT32	n_Count = 0;
	
	for( i=0;i<TouchKeyPanelRowNum;i++ )
	{
		for( j=0;j<TouchKeyPanelColNum;j++ )
		{
			if( XY_Array[ i ][ j ] == 1 )
			{	// a key pressed
				TSP_GetAMidPoint(i,j,&tmpMidX,&tmpMidY);
				x_Sum += tmpMidX;
				y_Sum += tmpMidY;
				n_Count++;
			}
		}
	}
	if(n_Count != 0)
	{
		*pUncalX = x_Sum / n_Count;
		*pUncalY = y_Sum / n_Count;
	}
	else
	{
		*pUncalX = 0;
		*pUncalY = 0;
	}
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* Valid press so start T0 for Timer interrupt */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PRIVATE VOID TSP_StartTC0( VOID )
{
#ifdef TouchNeedTimer	
	UINT32	RCValue;

	DEBUGMSG(ZONE_TIPSTATE, (TEXT("::: TSP_StartTC0()\r\n")));
	RCValue = 50 * (AT91C_TIMER0_CLOCK / 1000);
	v_pTCRegs->TC_RC = RCValue;
	v_pTCRegs->TC_IER = AT91C_TC_CPCS;
	v_pTCRegs->TC_CCR = AT91C_TC_CLKEN;
	v_pTCRegs->TC_CCR = AT91C_TC_SWTRG;
	InterruptDone(gIntrTouchChanged);
#endif
}

/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* remove from touch panel so stop t0 */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PRIVATE VOID TSP_StopTC0( VOID )
{
#ifdef TouchNeedTimer
	DEBUGMSG(ZONE_TIPSTATE, (TEXT("::: TSP_StopTC0()\r\n")));
	v_pTCRegs->TC_IDR = AT91C_TC_CPCS;
	/* Maybe need disable T0's clock??? */
	v_pTCRegs->TC_CCR = AT91C_TC_CLKDIS;
	InterruptDone(gIntrTouchChanged);
#endif
}

#define		VERIFY_INTERVAL		3		/* unit: ms */
#define		VERIFY_TIMES_OFF2ON	4		/* times */
#define		VERIFY_TIMES_ON2OFF	3		/* times */
static BOOL	Pre_Key_Sts = OFF;			//Previous Key Status ( 0:remove;1:press )
static INT PrevX = 0;
static INT PrevY = 0;
BYTE	XY_Array[TouchKeyPanelRowNum][TouchKeyPanelColNum];	//Key Image

PRIVATE VOID GetPreeKeyArray()
{
	DWORD dummy;
	DisableKeyInt();
	TSP_ReadPressedMatrixBlock(XY_Array);
	/* row recover intial state */
	TSP_SetMatrixKeyRow( ( ROW_VAL_TYPE ) 0xFFFFFFFF );
	Sleep(2);
	if(TSP_GetKeyStatus() == ON)
	{
		dummy = v_pPioCregs->PIO_ISR;
	}
	EnableKeyInt();
}
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
/* handle key press */
/* :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: */
PUBLIC VOID DdsiTouchPanelGetPoint(TOUCH_PANEL_SAMPLE_FLAGS *pTipStateFlags, INT *pUncalX, INT *pUncalY)
{
	BOOL	Cur_Key_Sts;
	UINT32	PioBISR;
	DWORD	dwTimesCount;	

	DEBUGMSG(ZONE_TIPSTATE, (TEXT("::: DdsiTouchPanelGetPoint()\r\n")));

	// First clear for preventing( before read key status )
	PioBISR = v_pPioCregs->PIO_ISR;

	if(Pre_Key_Sts == OFF)
	{
		dwTimesCount = VERIFY_TIMES_OFF2ON;
		while(dwTimesCount)
		{
			Sleep(VERIFY_INTERVAL);
			Cur_Key_Sts = TSP_GetKeyStatus();
			if(Cur_Key_Sts == ON)
			{
				dwTimesCount--;
			}
			else
			{
				DEBUGMSG(ZONE_TIPSTATE,(TEXT("Pressed Check Times:%d\r\n"),(VERIFY_TIMES_OFF2ON-dwTimesCount)));
				InterruptDone(gIntrTouch);
				*pTipStateFlags = TouchSampleIgnore;
				return;
			}
		}
		// 连续的几次检测均为按键按住状态
		GetPreeKeyArray();
		//calculate a middle point
		TSP_CalcPoint(pUncalX, pUncalY, XY_Array);
		if( (*pUncalX!=0x00)||(*pUncalY!=0x00) )
		{
			DEBUGMSG(ZONE_TIPSTATE, (TEXT("down\r\n")));
			*pTipStateFlags = TouchSampleValidFlag | TouchSampleDownFlag;
			PrevX = *pUncalX;
			PrevY = *pUncalY;
			//Now, press valid, start T0
			Pre_Key_Sts = ON;
			TSP_StartTC0();
		}
		else
		{
			*pTipStateFlags = TouchSampleIgnore;
		}
		InterruptDone(gIntrTouch);
		DEBUGMSG(ZONE_TIPSTATE,(TEXT("Pressed point(x,y):(%d,%d)\r\n"),*pUncalX, *pUncalY));
	}
	else
	{
		dwTimesCount = VERIFY_TIMES_ON2OFF;
		while(dwTimesCount)
		{
			Cur_Key_Sts = TSP_GetKeyStatus();
			if(Cur_Key_Sts == OFF)
			{
				dwTimesCount--;
				Sleep(VERIFY_INTERVAL);
			}
			else
			{
				DWORD dwTCIntStatus;
				dwTCIntStatus = v_pTCRegs->TC_SR;
				if(dwTCIntStatus & AT91C_TC_CPCS)
				{	// Timer Int has occured.
					GetPreeKeyArray();
					//calculate a middle point
					TSP_CalcPoint(pUncalX, pUncalY, XY_Array);
					if( (*pUncalX!=0x00)||(*pUncalY!=0x00) )
					{
						PrevX = *pUncalX;
						PrevY = *pUncalY;
						*pTipStateFlags = TouchSampleValidFlag | TouchSampleDownFlag;
						DEBUGMSG(ZONE_TIPSTATE, (TEXT("Key Move In timer, point(x,y):(%d,%d)\r\n"),PrevX, PrevY));
					}
					else
					{
						*pTipStateFlags = TouchSampleValidFlag;
						*pUncalX = PrevX;
						*pUncalY = PrevY;
						Pre_Key_Sts = OFF;
						TSP_StopTC0();
						DEBUGMSG(ZONE_TIPSTATE, (TEXT("Key up In timer,Removed point(x,y):(%d,%d)\r\n"),PrevX, PrevY));
					}
					InterruptDone(gIntrTouchChanged);
				}
				else
				{
					*pTipStateFlags = TouchSampleIgnore;
				}
				InterruptDone(gIntrTouch);
				return;
			}
		}
		// 连续的几次检测均为按键松开状态
		*pTipStateFlags = TouchSampleValidFlag;
		*pUncalX = PrevX;
		*pUncalY = PrevY;
		Pre_Key_Sts = OFF;
		TSP_StopTC0();
		InterruptDone(gIntrTouch);
		DEBUGMSG(ZONE_TIPSTATE, (TEXT("Key up,Removed point(x,y):(%d,%d)\r\n"),PrevX, PrevY));
	}
}

⌨️ 快捷键说明

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