Ejemplo n.º 1
0
static VOID
TSP_PowerOn(VOID)
{
    TSPMSG((_T("[TSP] ++TSP_PowerOn()\r\n")));

    g_pADCReg->ADCDLY = ADC_DELAY(TSP_ADC_DELAY);

    g_pADCReg->ADCCON = RESSEL_12BIT | PRESCALER_EN | PRESCALER_VAL(TSP_ADC_PRESCALER) | STDBM_NORMAL;
    
    g_pADCReg->ADCTSC = ADCTSC_WAIT_PENDOWN;
    g_pADCReg->ADCCLRINT = CLEAR_ADC_INT;
    g_pADCReg->ADCCLRWK = CLEAR_ADCWK_INT;

    g_SampleTick_Low = TSP_TIMER_CNT_LOW;
    g_SampleTick_High = TSP_TIMER_CNT_HIGH;

    // Set Divider MUX for Timer3
    SET_TIMER3_DIVIDER_MUX(g_pPWMReg, TSP_TIMER_DIVIDER);    

    g_pPWMReg->TCNTB3  = g_SampleTick_Low;

    // timer3 interrupt disable
    g_pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(g_pPWMReg->TINT_CSTAT) & ~TIMER3_INTERRUPT_ENABLE;

    // timer3 interrupt status clear
    g_pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(g_pPWMReg->TINT_CSTAT) | TIMER3_PENDING_CLEAR;

    TSPMSG((_T("[TSP] --TSP_PowerOn()\r\n")));
}
Ejemplo n.º 2
0
static BOOL
TSP_VirtualAlloc(VOID)
{
	BOOL bRet = TRUE;

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

	g_pGPIOReg = (S3C6400_GPIO_REG *)DrvLib_MapIoSpace(S3C6400_BASE_REG_PA_GPIO, sizeof(S3C6400_GPIO_REG), FALSE);
	if (g_pGPIOReg == NULL)
	{
		TSPERR((_T("[TSP:ERR] TSP_VirtualAlloc() : g_pGPIOReg Allocation Fail\r\n")));
		bRet = FALSE;
		goto CleanUp;
	}

	g_pADCReg = (S3C6400_ADC_REG *)DrvLib_MapIoSpace(S3C6400_BASE_REG_PA_ADC, sizeof(S3C6400_ADC_REG), FALSE);
	if (g_pADCReg == NULL)
	{
		TSPERR((_T("[TSP:ERR] TSP_VirtualAlloc() : g_pADCReg Allocation Fail\r\n")));
		bRet = FALSE;
		goto CleanUp;
	}

	g_pVIC0Reg = (S3C6400_VIC_REG *)DrvLib_MapIoSpace(S3C6400_BASE_REG_PA_VIC0, sizeof(S3C6400_VIC_REG), FALSE);
	if (g_pVIC0Reg == NULL)
	{
		TSPERR((_T("[TSP:ERR] TSP_VirtualAlloc() : g_pVIC0Reg Allocation Fail\r\n")));
		bRet = FALSE;
		goto CleanUp;
	}

	g_pVIC1Reg = (S3C6400_VIC_REG *)DrvLib_MapIoSpace(S3C6400_BASE_REG_PA_VIC1, sizeof(S3C6400_VIC_REG), FALSE);
	if (g_pVIC1Reg == NULL)
	{
		TSPERR((_T("[TSP:ERR] TSP_VirtualAlloc() : g_pVIC1Reg Allocation Fail\r\n")));
		bRet = FALSE;
		goto CleanUp;
	}

	g_pPWMReg = (S3C6400_PWM_REG *)DrvLib_MapIoSpace(S3C6400_BASE_REG_PA_PWM, sizeof(S3C6400_PWM_REG), FALSE);
	if (g_pPWMReg == NULL)
	{
		TSPERR((_T("[TSP:ERR] TSP_VirtualAlloc() : g_pPWMReg Allocation Fail\r\n")));
		bRet = FALSE;
		goto CleanUp;
	}

CleanUp:

	if (bRet == FALSE)
	{
		TSPERR((_T("[TSP:ERR] TSP_VirtualAlloc() : Failed\r\n")));

		TSP_VirtualFree();
	}

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

	return bRet;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
static BOOL
TSP_CalibrationPointGet(TPDC_CALIBRATION_POINT *pTCP)
{
    int cDisplayWidth, cDisplayHeight;
    int CalibrationRadiusX, CalibrationRadiusY;

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

    cDisplayWidth = pTCP->cDisplayWidth;
    cDisplayHeight = pTCP->cDisplayHeight;

    CalibrationRadiusX = cDisplayWidth  / 20;
    CalibrationRadiusY = cDisplayHeight / 20;

    switch (pTCP->PointNumber)
    {
    case    0:
        pTCP->CalibrationX = cDisplayWidth  / 2;
        pTCP->CalibrationY = cDisplayHeight / 2;
        break;

    case    1:
        pTCP->CalibrationX = CalibrationRadiusX * 2;
        pTCP->CalibrationY = CalibrationRadiusY * 2;
        break;

    case    2:
        pTCP->CalibrationX = CalibrationRadiusX * 2;
        pTCP->CalibrationY = cDisplayHeight - CalibrationRadiusY * 2;
        break;

    case    3:
        pTCP->CalibrationX = cDisplayWidth  - CalibrationRadiusX * 2;
        pTCP->CalibrationY = cDisplayHeight - CalibrationRadiusY * 2;
        break;

    case    4:
        pTCP->CalibrationX = cDisplayWidth - CalibrationRadiusX * 2;
        pTCP->CalibrationY = CalibrationRadiusY * 2;
        break;

    default:
        pTCP->CalibrationX = cDisplayWidth  / 2;
        pTCP->CalibrationY = cDisplayHeight / 2;
        SetLastError(ERROR_INVALID_PARAMETER);
        RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] TSP_CalibrationPointGet() : ERROR_INVALID_PARAMETER\r\n")));
        return FALSE;
    }

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

    return TRUE;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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")));
}
Ejemplo n.º 7
0
static VOID
TSP_PowerOn(VOID)
{
	TSPMSG((_T("[TSP] ++TSP_PowerOn()\r\n")));

	g_pADCReg->ADCDLY = ADC_DELAY(TSP_ADC_DELAY);
	g_pADCReg->ADCCON = PRESCALER_EN | PRESCALER_VAL(TSP_ADC_PRESCALER);
	g_pADCReg->ADCTSC = ADCTSC_WAIT_PENDOWN;
	g_pADCReg->ADCCLRINT = CLEAR_ADC_INT;
	g_pADCReg->ADCCLRWK = CLEAR_ADCWK_INT;

	g_SampleTick_Low = TSP_TIMER_CNT_LOW;
	g_SampleTick_High = TSP_TIMER_CNT_HIGH;

	// Set Divider MUX for Timer3
	switch(TSP_TIMER_DIVIDER)
	{
	case 1:
		g_pPWMReg->TCFG1 = (g_pPWMReg->TCFG1 & ~(0xf<<12)) | (0<<12);
		break;
	case 2:
		g_pPWMReg->TCFG1 = (g_pPWMReg->TCFG1 & ~(0xf<<12)) | (1<<12);
		break;
	case 4:
		g_pPWMReg->TCFG1 = (g_pPWMReg->TCFG1 & ~(0xf<<12)) | (2<<12);
		break;
	case 8:
		g_pPWMReg->TCFG1 = (g_pPWMReg->TCFG1 & ~(0xf<<12)) | (3<<12);
		break;
	case 16:
		g_pPWMReg->TCFG1 = (g_pPWMReg->TCFG1 & ~(0xf<<12)) | (4<<12);
		break;
	default:
		g_pPWMReg->TCFG1 = (g_pPWMReg->TCFG1 & ~(0xf<<12)) | (0<<12);
		break;
	}

	g_pPWMReg->TCNTB3  = g_SampleTick_Low;

	// timer3 interrupt disable
	//g_pPWMReg->TINT_CSTAT &= ~(1<<3);	// Do not use OR/AND operation on TINTC_CSTAT
	g_pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(g_pPWMReg->TINT_CSTAT) & ~TIMER3_INTERRUPT_ENABLE;

	// 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;

	TSPMSG((_T("[TSP] --TSP_PowerOn()\r\n")));
}
Ejemplo n.º 8
0
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;
}
Ejemplo n.º 9
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")));
}
Ejemplo n.º 10
0
static VOID
TSP_PowerOff(VOID)
{
	TSPMSG((_T("[TSP] ++TSP_PowerOff()\r\n")));

	TSP_SampleStop();

	//-----------------------------------------------
	// To prevent touch locked after wake up !!!
	// Wait for ADC Done
	// Do not turn off ADC before its A/D conversion finished
	EnterCriticalSection(&g_csTouchADC);
	// ADC Done..
	LeaveCriticalSection(&g_csTouchADC);

	g_pADCReg->ADCTSC = UD_SEN_DOWN | YM_SEN_EN | YP_SEN_DIS | XM_SEN_DIS | XP_SEN_DIS | PULL_UP_DIS | AUTO_PST_DIS | XY_PST_NOP;

	TSPMSG((_T("[TSP] --TSP_PowerOff()\r\n")));
}
Ejemplo n.º 11
0
static VOID
TSP_PowerOff(VOID)
{
    TSPMSG((_T("[TSP] ++TSP_PowerOff()\r\n")));

    TSP_SampleStop();

    // To prevent touch locked after wake up,
    // Wait for ADC Done
    // Do not turn off ADC before its A/D conversion finished
    EnterCriticalSection(&g_csTouchADC);
    // ADC Done in TSP_GETXy()..
    LeaveCriticalSection(&g_csTouchADC);

    g_pADCReg->ADCTSC = UD_SEN_DOWN | YM_SEN_EN | YP_SEN_DIS | XM_SEN_DIS | XP_SEN_DIS | PULL_UP_DIS | AUTO_PST_DIS | XY_PST_NOP;

    // ADC Standby Mode, conversion data will be preserved.
    g_pADCReg->ADCCON |= STDBM_STANDBY; 

    TSPMSG((_T("[TSP] --TSP_PowerOff()\r\n")));
}
Ejemplo n.º 12
0
static VOID
TSP_VirtualFree(VOID)
{
    TSPMSG((_T("[TSP] ++TSP_VirtualFree()\r\n")));

    if (g_pGPIOReg)
    {
        MmUnmapIoSpace((PVOID)g_pGPIOReg, sizeof(S3C6410_SYSCON_REG));
        g_pGPIOReg = NULL;
    }

    if (g_pADCReg)
    {
        MmUnmapIoSpace((PVOID)g_pADCReg, sizeof(S3C6410_ADC_REG));
        g_pADCReg = NULL;
    }

    if (g_pVIC0Reg)
    {
        MmUnmapIoSpace((PVOID)g_pVIC0Reg, sizeof(S3C6410_VIC_REG));
        g_pVIC0Reg = NULL;
    }

    if (g_pVIC1Reg)
    {
        MmUnmapIoSpace((PVOID)g_pVIC1Reg, sizeof(S3C6410_VIC_REG));
        g_pVIC1Reg = NULL;
    }

    if (g_pPWMReg)
    {
        MmUnmapIoSpace((PVOID)g_pPWMReg, sizeof(S3C6410_PWM_REG));
        g_pPWMReg = NULL;
    }

    TSPMSG((_T("[TSP] --TSP_VirtualFree()\r\n")));
}
Ejemplo n.º 13
0
static VOID
TSP_VirtualFree(VOID)
{
	TSPMSG((_T("[TSP] ++TSP_VirtualFree()\r\n")));

	if (g_pGPIOReg)
	{
		DrvLib_UnmapIoSpace((PVOID)g_pGPIOReg);
		g_pGPIOReg = NULL;
	}

	if (g_pADCReg)
	{
		DrvLib_UnmapIoSpace((PVOID)g_pADCReg);
		g_pADCReg = NULL;
	}

	if (g_pVIC0Reg)
	{
		DrvLib_UnmapIoSpace((PVOID)g_pVIC0Reg);
		g_pVIC0Reg = NULL;
	}

	if (g_pVIC1Reg)
	{
		DrvLib_UnmapIoSpace((PVOID)g_pVIC1Reg);
		g_pVIC1Reg = NULL;
	}

	if (g_pPWMReg)
	{
		DrvLib_UnmapIoSpace((PVOID)g_pPWMReg);
		g_pPWMReg = NULL;
	}

	TSPMSG((_T("[TSP] --TSP_VirtualFree()\r\n")));
}
Ejemplo n.º 14
0
static BOOL
TSP_VirtualAlloc(VOID)
{
    BOOL bRet = TRUE;
    PHYSICAL_ADDRESS    ioPhysicalBase = {0,0};

    DEBUGMSG(TSP_ZONE_FUNCTION,(_T("[TSP] ++TSP_VirtualAlloc()\r\n")));

    ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_GPIO;
    g_pGPIOReg = (S3C6410_GPIO_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_GPIO_REG), FALSE);
    if (g_pGPIOReg == NULL)
    {
        RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] TSP_VirtualAlloc() : g_pGPIOReg Allocation Fail\r\n")));
        bRet = FALSE;
        goto CleanUp;
    }

    ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_ADC;
    g_pADCReg = (S3C6410_ADC_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_ADC_REG), FALSE);
    if (g_pADCReg == NULL)
    {
        RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] TSP_VirtualAlloc() : g_pADCReg Allocation Fail\r\n")));
        bRet = FALSE;
        goto CleanUp;
    }
    
    ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_VIC0;
    g_pVIC0Reg = (S3C6410_VIC_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_VIC_REG), FALSE);
    if (g_pVIC0Reg == NULL)
    {
        RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] TSP_VirtualAlloc() : g_pVIC0Reg Allocation Fail\r\n")));
        bRet = FALSE;
        goto CleanUp;
    }

    ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_VIC1;
    g_pVIC1Reg = (S3C6410_VIC_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_VIC_REG), FALSE);
    if (g_pVIC1Reg == NULL)
    {
        RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] TSP_VirtualAlloc() : g_pVIC1Reg Allocation Fail\r\n")));
        bRet = FALSE;
        goto CleanUp;
    }

    ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_PWM;
    g_pPWMReg = (S3C6410_PWM_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_PWM_REG), FALSE);
    if (g_pPWMReg == NULL)
    {
        RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] TSP_VirtualAlloc() : g_pPWMReg Allocation Fail\r\n")));
        bRet = FALSE;
        goto CleanUp;
    }

CleanUp:

    if (bRet == FALSE)
    {
        RETAILMSG(TSP_ZONE_ERROR,(_T("[TSP:ERR] TSP_VirtualAlloc() : Failed\r\n")));

        TSP_VirtualFree();
    }

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

    return bRet;
}
Ejemplo n.º 15
0
static BOOL
TSP_GetXY(int *px, int *py)
{
	int i,j,k;
	int temp;
	int x[TSP_SAMPLE_NUM], y[TSP_SAMPLE_NUM];
	int dx, dy;

	EnterCriticalSection(&g_csTouchADC);

	for (i = 0; i < TSP_SAMPLE_NUM; i++)
	{
		g_pADCReg->ADCTSC = ADCTSC_AUTO_ADC;	// Auto Conversion
		g_pADCReg->ADCCON |= ENABLE_START_EN;	// ADC Conversion Start

		while (g_pADCReg->ADCCON & ENABLE_START_EN)
		{	// Wait for Start Bit Cleared
			Sleep(1);
		}

		while (!(g_pADCReg->ADCCON & ECFLG_END))
		{	// Wait for ADC Conversion Ended
			Sleep(1);
		}

		x[i] = D_XPDATA_MASK(g_pADCReg->ADCDAT0);
		y[i] = D_YPDATA_MASK(g_pADCReg->ADCDAT1);
	}

	LeaveCriticalSection(&g_csTouchADC);

	for (j = 0; j < TSP_SAMPLE_NUM -1; ++j)
	{
		for (k = j+1; k < TSP_SAMPLE_NUM; ++k)
		{
			if(x[j]>x[k])
			{
				temp = x[j];
				x[j]=x[k];
				x[k]=temp;
			}

			if(y[j]>y[k])
			{
				temp = y[j];
				y[j]=y[k];
				y[k]=temp;
			}
		}
	}

	*px = (x[1]+x[2])>>1;
	*py = (y[1]+y[2])>>1;

#if	0
	TSPMSG((_T("[TSP] TSP_GetXY() : (%d, %d)\r\n"), *px, *py));
	TSPMSG((_T("[TSP] TSP_GetXY() : 1st (%d, %d)\r\n"), x[0], y[0]));
	TSPMSG((_T("[TSP] TSP_GetXY() : 2nd (%d, %d)\r\n"), x[1], y[1]));
	TSPMSG((_T("[TSP] TSP_GetXY() : 3rd (%d, %d)\r\n"), x[2], y[2]));
	TSPMSG((_T("[TSP] TSP_GetXY() : 4th (%d, %d)\r\n"), x[3], y[3]));
#endif

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

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