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 void OEMInitializeSystemTimer(UINT32 msecPerSysTick, UINT32 countsPerMSec, UINT32 countsMargin) { UINT32 countsPerSysTick; volatile S3C6400_PWM_REG *pPWMReg; // Validate Input parameters countsPerSysTick = msecPerSysTick * countsPerMSec; // Initialize S3C6400 Timer pPWMReg = (S3C6400_PWM_REG*)OALPAtoUA(S3C6400_BASE_REG_PA_PWM); // Set Prescaler 1 (Timer2,3,4) pPWMReg->TCFG0 = (pPWMReg->TCFG0 & ~(0xff<<8)) | ((SYS_TIMER_PRESCALER-1)<<8); // Set Divider MUX for Timer4 switch(SYS_TIMER_DIVIDER) { case 1: pPWMReg->TCFG1 = (pPWMReg->TCFG1 & ~(0xf<<16)) | (0<<16); break; case 2: pPWMReg->TCFG1 = (pPWMReg->TCFG1 & ~(0xf<<16)) | (1<<16); break; case 4: pPWMReg->TCFG1 = (pPWMReg->TCFG1 & ~(0xf<<16)) | (2<<16); break; case 8: pPWMReg->TCFG1 = (pPWMReg->TCFG1 & ~(0xf<<16)) | (3<<16); break; case 16: pPWMReg->TCFG1 = (pPWMReg->TCFG1 & ~(0xf<<16)) | (4<<16); break; default: pPWMReg->TCFG1 = (pPWMReg->TCFG1 & ~(0xf<<16)) | (0<<16); break; } // Set Timer4 Count Buffer Register pPWMReg->TCNTB4 = countsPerSysTick; // Timer4 Clear Interrupt Pending //pPWMReg->TINT_CSTAT |= (1<<9); // Do not use OR/AND operation on TINTC_CSTAT pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(pPWMReg->TINT_CSTAT) | TIMER4_PENDING_CLEAR; // Timer4 Interrupt Enable //pPWMReg->TINT_CSTAT |= (1<<4); // Do not use OR/AND operation on TINTC_CSTAT pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(pPWMReg->TINT_CSTAT) | TIMER4_INTERRUPT_ENABLE; // Start Timer4 in Auto Reload mode (Fixed Tick!!!) pPWMReg->TCON &= ~(0x7<<20); pPWMReg->TCON |= (1<<21); // Update TCNTB4 pPWMReg->TCON &= ~(1<<21); pPWMReg->TCON |= (1<<22)|(1<<20); // Auto-reload Mode, Timer4 Start }
static VOID TSP_SampleStop(VOID) { STOP_TIMER3(g_pPWMReg); // timer3 interrupt disable, Do not use OR/AND operation on TINTC_CSTAT directly g_pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(g_pPWMReg->TINT_CSTAT) & ~TIMER3_INTERRUPT_ENABLE; // timer3 interrupt status clear, Do not use OR/AND operation on TINTC_CSTAT directly g_pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(g_pPWMReg->TINT_CSTAT) | TIMER3_PENDING_CLEAR; }
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"))); }
static VOID TSP_SampleStart(VOID) { // timer3 interrupt status clear, Do not use OR/AND operation on TINTC_CSTAT directly g_pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(g_pPWMReg->TINT_CSTAT) | TIMER3_PENDING_CLEAR; // timer3 interrupt enable, Do not use OR/AND operation on TINTC_CSTAT directly g_pPWMReg->TINT_CSTAT = TINT_CSTAT_INTMASK(g_pPWMReg->TINT_CSTAT) | TIMER3_INTERRUPT_ENABLE; STOP_TIMER3(g_pPWMReg); UPDATE_TCNTB3(g_pPWMReg); NOUPDATE_TCNTB3(g_pPWMReg); SET_TIMER3_AUTORELOAD(g_pPWMReg); START_TIMER3(g_pPWMReg); }
static VOID TSP_SampleStop(VOID) { //TSPMSG((_T("[TSP] ++TSP_SampleStop()\r\n"))); g_pPWMReg->TCON &= ~(0xf<<16); // Timer3 stop // 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_SampleStop()\r\n"))); }
static VOID TSP_SampleStart(VOID) { //TSPMSG((_T("[TSP] ++TSP_SampleStart()\r\n"))); // 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; // timer3 interrupt enable //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; g_pPWMReg->TCON &= ~(0xf<<16); // Timer3 Stop g_pPWMReg->TCON |= (1<<17); // update TCNTB3 g_pPWMReg->TCON &= ~(1<<17); g_pPWMReg->TCON |= ((1<<19)|(1<<16)); // AutoReload mode, Timer3 Start //TSPMSG((_T("[TSP] --TSP_SampleStart()\r\n"))); }
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"))); }