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"))); }
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; }
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; }
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; }
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"))); }
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"))); }
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; }
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 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"))); }
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"))); }
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"))); }
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"))); }
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; }
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; } }