📄 toucher_modify_from_samsung.c
字号:
// Set GPG15 to use as nYPON, GPG14 to use as YMON, GPG13 to use as nXPON, GPG12 to use as XMON
v_pIOPregs->rGPGCON |= ((0x03 << 30)|(0x03 << 28)|(0x03 << 26)|(0x03 << 24));
// Disable full up function
v_pIOPregs->rGPGUP |= ((0x01 << 15)|(0x01 << 14)|(0x01 << 13)|(0x01 << 12));
//
// Setup ADC register
//
// Down Int, YMON:0, nYPON:1, XMON:0;nXPON:1, Pullup:1, Auto Conv.,Waiting.
// v_pADCregs->rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
// v_pADCregs->rADCTSC = (0<<8)|(1<<7)|(1<<6)|(0<<5)|(0<<4)|(0<<3)|(0<<2)|(3);
// v_pADCregs->rADCDLY = ADC_DELAY_TIME;//default value for delay.
// v_pADCregs->rADCCON = (1<<14)|(ADCPRS<<6)|(7<<3); //setup channel, ADCPRS, Touch Input
// v_pADCregs->rADCCON = (1<<14)|(ADCPRS<<6)|(2<<3); //setup channel, ADCPRS, Touch Input
// v_pADCregs->rADCCON = (1<<14)|(ADCPRS<<6)|(0<<3); //setup channel, ADCPRS, Touch Input
return ;
}
// **************************************************
// 申明:void TouchPanelPowerOff( void )
// 参数:
// 无
// 返回值:
// TRUE/FALSE (成功/失败)
// 功能描述:
// 关电操作/使Touch无法工作
// 引用:
// ************************************************
static void TouchPanelPowerOff( void )
{
}
// **************************************************
// 申明:BOOL Touch_Timer0_Setup( void )
// 参数:
// 无
// 返回值:
// TRUE/FALSE (成功/失败)
// 功能描述:
// 建立timer0 去继续得到后续的sample
// 引用:
// ************************************************
static BOOL Touch_Timer0_Setup(void) {
unsigned int TmpTCON;
//
// We use Timer1 of PWM as OS Clock.
// Disable Timer1 Init..
v_pINTregs->rINTMSK |= BIT_TIMER1; // Mask timer1 interrupt.
v_pINTregs->rSRCPND = BIT_TIMER1; // Clear pending bit
v_pINTregs->rINTPND = BIT_TIMER1;
//we operate our board with PCLK=203M/4 = 50750000Hz (50.75 Mhz)
v_pPWMregs->rTCFG0 |= (TOUCH_TIMER_PRESCALER); // prescaler value = 24 + 1
v_pPWMregs->rTCFG1 &= ~(0xf0);
#if( TOUCH_TIMER_DIVIDER == 2 )
v_pPWMregs->rTCFG1 |= (0 << 4); /* 1/2 */
#elif ( TOUCH_TIMER_DIVIDER == 4 )
v_pPWMregs->rTCFG1 |= (1 << 4); /* 1/4 */
#elif ( TOUCH_TIMER_DIVIDER == 8 )
v_pPWMregs->rTCFG1 |= (2 << 4); /* 1/8 */
#elif ( TOUCH_TIMER_DIVIDER == 16 )
v_pPWMregs->rTCFG1 |= (3 << 4); /* 1/16 */
#endif
// v_pPWMregs->rTCNTB1 = 1000; // about 10 ms(203M/4/2/(255+1))=10ms
v_pPWMregs->rTCNTB1 = (10 * (S2410PCLK / (TOUCH_TIMER_PRESCALER+1) / TOUCH_TIMER_DIVIDER)) / 1000; // 10msec, Charlie
v_pPWMregs->rTCMPB1 = 0;
TmpTCON = v_pPWMregs->rTCON; // get TCON value to temp TCON register
TmpTCON &= ~0xf00; // clear fields of Timer 1
TmpTCON |= 0x200; // interval mode(auto reload), update TCVNTB4, stop
v_pPWMregs->rTCON = TmpTCON; // put the value to TCON register
TmpTCON = v_pPWMregs->rTCON; // get TCON value to temp TCON register
TmpTCON &= ~0xf00; // clear fields of Timer 1
TmpTCON |= 0x100; // interval mode, no operation, start for Timer 4
v_pPWMregs->rTCON = TmpTCON; // put the value to TCON register
v_pINTregs->rINTMSK &= ~BIT_TIMER1;
return TRUE;
}
//
// @doc EX_TOUCH_DDSI EXTERNAL DRIVERS DDSI TOUCH_PANEL
//
// @func void | DdsiTouchPanelGetPoint |
// Returns the most recently acquired point and its associated tip state
// information.
//
// @parm PDDSI_TOUCHPANEL_TIPSTATE | pTipState |
// Pointer to where the tip state information will be returned.
// @parm PLONG | pUnCalX |
// Pointer to where the x coordinate will be returned.
// @parm PLONG | pUnCalY |
// Pointer to where the y coordinate will be returned.
//
// @comm
// Implmented in the PDD.
//
#if ( LCD_TYPE == TFT640_480 )
#define TOUCH_MAX_X 1000
#define TOUCH_MIN_X 30
#define TOUCH_MAX_Y 980
#define TOUCH_MIN_Y 30
#define TOUCH_X 640
#define TOUCH_Y 480
#else
#define TOUCH_MAX_X 955 //950
#define TOUCH_MIN_X 100 //90
#define TOUCH_MAX_Y 925 //960
#define TOUCH_MIN_Y 70 //50
/*
#define TOUCH_MAX_X 970 // 950
#define TOUCH_MIN_X 100 // 90
#define TOUCH_MAX_Y 920 // 960 // 910
#define TOUCH_MIN_Y 55 // 70 //50
*/
#define TOUCH_X 240
#define TOUCH_Y 320
#endif
#define TOUCH_ERR 15
static int second = 0;
static VOID Touch_CoordinateConversion(INT *px, INT *py)
{
INT TmpX, TmpY;
INT TmpX0, TmpY0;
TmpX0 = *px; TmpY0 = *py;
TmpX = (*px >= TOUCH_MAX_X) ? (TOUCH_MAX_X) : *px;
TmpY = (*py >= TOUCH_MAX_Y) ? (TOUCH_MAX_Y) : *py;
TmpX -= TOUCH_MIN_X;
TmpY -= TOUCH_MIN_Y;
TmpX = (TmpX) ? TmpX : 0;
TmpY = (TmpY) ? TmpY : 0;
*px = ((TmpX * TOUCH_X) / (TOUCH_MAX_X-TOUCH_MIN_X))*4;
*py = (TOUCH_Y - (TmpY * TOUCH_Y) / (TOUCH_MAX_Y-TOUCH_MIN_Y))*4;
*px = (*px >= TOUCH_X*4)? (TOUCH_X*4 - 1) : *px;
*py = (*py >= TOUCH_Y*4)? (TOUCH_Y*4 - 1) : *py;
#if 0
RETAILMSG(1, (TEXT("first *px,y = (%d, %d)\r\n"), TmpX0, TmpY0));
RETAILMSG(1, (TEXT("TOUCH_MAX_X : %d\r\n"), TOUCH_MAX_X));
RETAILMSG(1, (TEXT("TOUCH_MAX_Y : %d\r\n"), TOUCH_MAX_Y));
RETAILMSG(1, (TEXT("TOUCH_MIN_X : %d\r\n"), TOUCH_MIN_X));
RETAILMSG(1, (TEXT("TOUCH_MIN_Y : %d\r\n"), TOUCH_MIN_Y));
RETAILMSG(1, (TEXT("TOUCH_X : %d\r\n"), TOUCH_X));
RETAILMSG(1, (TEXT("TOUCH_Y : %d\r\n"), TOUCH_Y));
RETAILMSG(1, (TEXT("last *px,y = (%d, %d)\r\n"), *px, *py));
#endif
return;
}
/**************************************************
申明:BOOL TouchPddCreate( void )
参数:无
返回值:TRUE/FALSE 创建(成功/失败)
功能描述:初始化触摸屏设备层需要的资源
引用:
************************************************/
BOOL TouchPddCreate( void )
{
return TRUE;
}
/**************************************************
申明:void TouchPddDestroy( void )
参数:无
返回值:无
功能描述:释放触摸屏设备层分配的资源
引用:
************************************************/
void TouchPddDestroy( void )
{
INTR_Disable(SYSINTR_TOUCH);
}
/**************************************************
申明:BOOL TouchPddEnable( void )
参数:无
返回值:TRUE/FALSE (成功/失败)
功能描述:允许中断
引用:
************************************************/
#define DEBUG_TouchPddEnable 1
BOOL TouchPddEnable( void )
{
RETAILMSG(DEBUG_TouchPddEnable, (TEXT("TouchPddEnable entry.\r\n") ));
// Power on touch panel
TouchPanelPowerOn();
// Setup pen down interrupts, but leave ints disabled until InterruptEnable().
PddpSetupPenDownIntr(TRUE);
// int enable
INTR_Done( idTouchChangedIrq );
// s2410INT->rINTMSK &= ~BIT_ADC;
// s2410INT->rINTSUBMSK &= ~INTSUB_TC;
// //
RETAILMSG(1,(TEXT("TouchPanelPowerOn leave.\r\n")));
RETAILMSG(DEBUG_TouchPddEnable, (TEXT("TouchPddEnable leave.\r\n") ));
return( TRUE ); // we always succeed!!!!!!
}
/**************************************************
申明:void TouchPddDisable( void )
参数:无
返回值:无
功能描述:禁止中断
引用:
************************************************/
void TouchPddDisable( void )
{
TouchPanelPowerOff(); // Power down the device
}
/**************************************************
申明:void TouchPddClose( void )
参数:无
返回值:无
功能描述:
引用:
************************************************/
void TouchPddClose( void )
{
TouchPddDisable();
}
/**************************************************
申明:void TouchPddPowerHandle( BOOL bPowerOff )
参数:bPowerOff--(TRUE/FALSE)/(开/关)机
返回值:TRUE/FALSE 创建(成功/失败)
功能描述:处理触摸屏(开/关)机
引用:
************************************************/
void TouchPddPowerHandle( BOOL bPowerOff )
{
// Set flag so we know to avoid system calls
bInPowerHandler = TRUE;
if (bPowerOff) {
TouchPanelPowerOff();
}
else {
TouchPanelPowerOn();
PddpSetupPenDownIntr(TRUE);
}
bInPowerHandler = FALSE;
}
/**************************************************
申明:BOOL TouchPddGetPoint(int *pUnCalx, int *pUnCaly, DWORD *pFlag)
参数:*pUnCalx--返回未刻度的x坐标
*pUnCaly--返回未刻度的y坐标
*pFlag--当前笔的状态
返回值:TRUE/FALSE (成功/失败)
功能描述:获得未刻度的坐标和笔的状态
引用:
************************************************/
VOID TouchPddGetPoint(int *pUncalX, int *pUncalY, DWORD *pTipStateFlags)
{
/*
ULONG status;
static int SampleCount = 0;
static DWORD PrevStateFlags = SAMPLE_IGNORE;//TouchSampleIgnore;
static INT PrevX = 0;
static INT PrevY = 0;
DWORD TmpStateFlags;
INT TmpX = 0;
INT TmpY = 0;
int i;
RETAILMSG( JYLEE_TEST, (TEXT("TouchPddGetPoint entry.\r\n")));
// Read the status passed back by the HAL
status = READ_REGISTER_ULONG( &(v_pDriverGlobals->tch.status) );
if(status == TOUCH_PEN_UP) {
v_pADCregs->rADCTSC = 0xD3; // Set stylus down interrupt
*pTipStateFlags = SAMPLE_VALID;
*pUncalX = PrevX;
*pUncalY = PrevY;
INTR_Done( idTouchChangedIrq );
}
else if(status == TOUCH_PEN_DOWN){
*pTipStateFlags |= SAMPLE_IGNORE;
*pUncalX = PrevX;
*pUncalY = PrevY;
Touch_Timer0_Setup();
INTR_Done( idTouchChangedIrq );
}
else {
if( (v_pADCregs->rADCDAT0 & 0x8000) || (v_pADCregs->rADCDAT1 & 0x8000) ){
v_pADCregs->rADCTSC = 0xD3; // Set stylus down interrupt
*pTipStateFlags = SAMPLE_VALID;
*pUncalX = PrevX;
*pUncalY = PrevY;
INTR_Done( idTouchChangedIrq );
}
else{ // charlie
// <Auto X-Position and Y-Position Read>
for (i =0; i < 3; i++) {
v_pADCregs->rADCTSC=(0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0);
// Stylus Down,Don't care,Don't care,Don't care,Don't care,XP pullup Dis,Auto,No operation
v_pADCregs->rADCCON|=0x1; // Start Auto conversion
while(v_pADCregs->rADCCON & 0x1); //check if Enable_start is low
while(!(0x8000&v_pADCregs->rADCCON)); // Check ECFLG
ybuf[i] = 0x3ff & v_pADCregs->rADCDAT0;
xbuf[i] = 0x3ff & v_pADCregs->rADCDAT1;
}
PddpTouchPanelEvaluateSamples( &TmpStateFlags, &TmpX, &TmpY);
v_pADCregs->rADCTSC=(1<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
Touch_CoordinateConversion(&TmpX, &TmpY);
if (Touch_Pen_filtering(&TmpX, &TmpY)) // Valid touch pen
{
//RETAILMSG(JYLEE_TEST, (TEXT("valid touch pen\r\n")));
*pTipStateFlags = SAMPLE_VALID | SAMPLE_DOWN;
*pTipStateFlags &= ~SAMPLE_IGNORE;
}
else // Invalid touch pen
{
//RETAILMSG(JYLEE_TEST, (TEXT("invalid touch pen\r\n")));
*pTipStateFlags = SAMPLE_VALID;
*pTipStateFlags |= SAMPLE_IGNORE;
}
*pUncalX = PrevX = TmpX;
*pUncalY = PrevY = TmpY;
INTR_Done( idTouchIrq );
RETAILMSG( JYLEE_TEST, (TEXT("0 - (%d, %d) 0x%X\r\n"), *pUncalX, *pUncalY, *pTipStateFlags));
}
}
return;
*/
{
int x, y;
RETAILMSG(1, (TEXT("toucher entry0.\r\n")));
/*
v_pADCregs->rADCTSC =(0<<8)|(1<<7)|(0<<6)|(1<<5)|(1<<4)|(1<<3)|(0<<2)|(0); //power to Y channel
v_pADCregs->rADCCON &= ~(0x7<<3);
v_pADCregs->rADCCON |= (2<<3) | (1<<0);
while(!(0x8000&v_pADCregs->rADCCON));
if( ( x = (0x3ff & v_pADCregs->rADCDAT0)) >= MAX_ADVAL)
{
RETAILMSG(1, (TEXT("x=%d.\r\n"), x ));
*pTipStateFlags |= SAMPLE_IGNORE;
}*/
v_pADCregs->rADCTSC = (0<<8)|(0<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(0); //power to Y channel
v_pADCregs->rADCCON &= ~(0x7<<3);
v_pADCregs->rADCCON |= (0<<3) | (1<<0);
while(!(0x8000&v_pADCregs->rADCCON));
if( ( x = (0x3ff & v_pADCregs->rADCDAT0)) == MAX_ADVAL)
{
RETAILMSG(1, (TEXT("x=%d.\r\n"), x ));
*pTipStateFlags |= SAMPLE_IGNORE;
}else{
*pTipStateFlags |= SAMPLE_IGNORE;
return;
}
{
v_pADCregs->rADCTSC =(0<<8)|(1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(0); //power to Y channel
v_pADCregs->rADCCON &= ~(0x7<<3); // Start Auto conversion
v_pADCregs->rADCCON |= (0<<3) | (1<<0);
while(v_pADCregs->rADCCON & 0x1); //check if Enable_start is low
while(!(0x8000&v_pADCregs->rADCCON)); // Check ECFLG
x = 0x3ff & v_pADCregs->rADCDAT0;
RETAILMSG(1, (TEXT("toucher entry1.\r\n")));
v_pADCregs->rADCCON &= ~(0x7<<3); // Start Auto conversion
v_pADCregs->rADCCON |= (0<<3) | (1<<0);
while(v_pADCregs->rADCCON & 0x1); //check if Enable_start is low
while(!(0x8000&v_pADCregs->rADCCON)); // Check ECFLG
y = 0x3ff & v_pADCregs->rADCDAT0;
v_pADCregs->rADCTSC =(0<<8)|(0<<7)|(1<<6)|(0<<5)|(1<<4)|(1<<3)|(0<<2)|(0); //power to idle
*pUncalX = x;
*pUncalY = y;
*pTipStateFlags |= SAMPLE_VALID | SAMPLE_DOWN;
RETAILMSG(1, (TEXT("x=%d, y=%d\r\n"), x, y));
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -