⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 toucher_modify_from_samsung.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 2 页
字号:
    // 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 + -