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