亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tchpdd.cpp

?? 跟640x480屏幕配套的觸摸屏的驅動(for winCE)
?? CPP
?? 第 1 頁 / 共 3 頁
字號:

// @doc EX_TOUCH_DDSI EXTERNAL DRIVERS DDSI TOUCH_PANEL
//
// @func ULONG | DdsiTouchPanelDisable |
// Powers down the touch panel device.
//
// @comm
// Implemented in the PDD.
//

VOID
DdsiTouchPanelDisable(
    VOID
    )
{
    //
    // Check pointers in case the enable failed.
    //
    if(v_pADCregs == NULL) 
        return ;

    TouchPanelPowerOff();  // Power down the device

    PddpTouchPanelDeallocateVm();  // free up any resources
}

//
// @doc EX_TOUCH_DDSI EXTERNAL DRIVERS DDSI TOUCH_PANEL
//
// @func LONG | DdsiTouchPanelAttach |
// This routine no longer does anything.  All functionallity has been moved
// from here into DdsiTouchPanelEnable to allow this code to be statically
// linked with GWE rather than existing as a DLL.  Technically, when built
// as a DLL we should keep an attach count and only allow touh.dll to be
// loaded once.  But, since we are loaded at boot time by GWE, there is
// no real concern about multiple loads (unless gwe has a bug!).
//
// @rdesc
// Always returns 0
//
// @comm
// Implemented in the PDD.
//

LONG
DdsiTouchPanelAttach(
    VOID
    )
{
    return( 1 );
}


//
// @doc EX_TOUCH_DDSI EXTERNAL DRIVERS DDSI TOUCH_PANEL
//
// @func LONG | DdsiTouchPanelDetach |
// See the descrition for attach.  All functionallity has been moved into
// DdsiTouchPanelDisable.
//
// @rdesc
// The updated global counter.  If the initializations failed, the returned
// count is 0.
//
// @comm
// Implemented in the PDD.
//


LONG
DdsiTouchPanelDetach(
    VOID
    )
{
    return ( 0 );
}

#define COODI_Y

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

VOID Touch_CoordinateConversion(INT *px, INT *py)
{
	INT TmpX, TmpY;
	INT temp;

	temp = *px;
	*px = *py;
	*py = temp;

	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;
//	*px = TOUCH_X*4 -1 - *px;
	*py = ((TmpY * TOUCH_Y) / (TOUCH_MAX_Y-TOUCH_MIN_Y))*4;
	*py = TOUCH_Y*4 - 1 - *py;
	
//	*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;
}


VOID
DdsiTouchPanelGetPoint(
	TOUCH_PANEL_SAMPLE_FLAGS	*pTipStateFlags,
	INT							*pUncalX,
	INT							*pUncalY
    )
{
	ULONG status;
//	USHORT ioAdcCntr, intrMask;
    static int SampleCount = 0;
    static TOUCH_PANEL_SAMPLE_FLAGS PrevStateFlags = TouchSampleIgnore;
    static INT PrevX = 0;
    static INT PrevY = 0;
    TOUCH_PANEL_SAMPLE_FLAGS TmpStateFlags;
    INT TmpX = 0;
    INT TmpY = 0;
    int i;
    
    // 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 = TouchSampleValidFlag;
		*pUncalX = PrevX;
		*pUncalY = PrevY;
	    InterruptDone( gIntrTouchChanged );
    }
    else if(status == TOUCH_PEN_DOWN){
		*pTipStateFlags |= TouchSampleIgnore;
		*pUncalX = PrevX;
		*pUncalY = PrevY;
		Touch_Timer0_Setup();
		InterruptDone( gIntrTouchChanged );
	}
	else {		
		if( (v_pADCregs->rADCDAT0 & 0x8000) || (v_pADCregs->rADCDAT1 & 0x8000) ){
			v_pADCregs->rADCTSC = 0xD3;	// Set stylus down interrupt
			*pTipStateFlags = TouchSampleValidFlag;
			*pUncalX = PrevX;
			*pUncalY = PrevY;
			InterruptDone( gIntrTouchChanged );
		}
		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 = TouchSampleValidFlag | TouchSampleDownFlag;			
				*pTipStateFlags &= ~TouchSampleIgnore;
			}
			else	// Invalid touch pen 
			{
		    	//RETAILMSG(JYLEE_TEST, (TEXT("invalid touch pen\r\n")));
				*pTipStateFlags = TouchSampleValidFlag;
				*pTipStateFlags |= TouchSampleIgnore;				
			}		
			*pUncalX = PrevX = TmpX;
			*pUncalY = PrevY = TmpY;
	
	   		InterruptDone( gIntrTouch);
	   		
   			RETAILMSG(JYLEE_TEST, (TEXT("0 - (%d, %d) 0x%X\r\n"), *pUncalX, *pUncalY, *pTipStateFlags));

		}
	}

    return;

}

#define FILTER_LIMIT 25

static BOOL
Touch_Pen_filtering(INT *px, INT *py)
{
	BOOL RetVal = TRUE;
	// TRUE  : Valid pen sample
	// FALSE : Invalid pen sample
	static int count = 0;
	static INT x[2], y[2];
	INT TmpX, TmpY;
	INT dx, dy;
	

	count++;

	if (count > 2) 
	{ 
		// apply filtering rule
		count = 2;
		
		// average between x,y[0] and *px,y
		TmpX = (x[0] + *px) / 2;
		TmpY = (y[0] + *py) / 2;
		
		// difference between x,y[1] and TmpX,Y
		dx = (x[1] > TmpX) ? (x[1] - TmpX) : (TmpX - x[1]);
		dy = (y[1] > TmpY) ? (y[1] - TmpY) : (TmpY - y[1]);
		
		if ((dx > FILTER_LIMIT) || (dy > FILTER_LIMIT)) {

			// Invalid pen sample

			*px = x[1];
			*py = y[1]; // previous valid sample
			RetVal = FALSE;
			count = 0;
			
		} else {
			// Valid pen sample
			x[0] = x[1]; y[0] = y[1];		
			x[1] = *px; y[1] = *py; // reserve pen samples
			
			RetVal = TRUE;
		}
		
	} else { // till 2 samples, no filtering rule
	
		x[0] = x[1]; y[0] = y[1];		
		x[1] = *px; y[1] = *py; // reserve pen samples
		
		RetVal = FALSE;	// <- TRUE jylee 2003.03.04 
	}
	
	return RetVal;
}



/*++

 @func VOID | DdsiTouchPanelPowerHandler |
 System power state notification.

 @parm BOOL | bOff | TRUE, the system is powering off; FALSE, the system is powering up.

 @comm
 This routine is called in a kernel context and may not make any system
 calls whatsoever.  It may read and write its own memory and that's about
 it.  This routine is called by the MDD and also serves as an internal
 helper routine for touch enable/disable.

 @devnote This routine will run in kernel context, and may not make
 any system calls.  If you can any subroutines inside here, make sure
 that they also follow this restriction.

--*/
void
DdsiTouchPanelPowerHandler(
	BOOL	bOff
	)
{
//    USHORT mask;

    // Set flag so we know to avoid system calls
    bInPowerHandler = TRUE;

    if (bOff) {
        TouchPanelPowerOff();
    }
    else {
        TouchPanelPowerOn();
        PddpSetupPenDownIntr(TRUE);
    }

    bInPowerHandler = FALSE;
}

static void
TouchPanelPowerOff()
{
    // Powering down, stop DMA and power off touch screen
    RETAILMSG(0,(TEXT("Touch Power Off\r\n")));
}


static void
TouchPanelPowerOn()
{
    DWORD tmp = 0;

    
    RETAILMSG(0,(TEXT("Touch Init\r\n")));

    //
    // Setup GPIOs for touch
    // 
    
    // Clear GPG15, 14, 13, 12
    v_pIOPregs->rGPGCON &= ~((0x03 << 30)|(0x03 << 28)|(0x03 << 26)|(0x03 << 24));
    // 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->rADCDLY = ADC_DELAY_TIME;//default value for delay.    
    v_pADCregs->rADCCON	= (1<<14)|(ADCPRS<<6)|(7<<3);	//setup channel, ADCPRS, Touch Input

	return ;
}


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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天天综合色天天综合| 欧美专区在线观看一区| 亚洲国产另类av| 一区二区视频免费在线观看| 国产亚洲欧美激情| 久久综合色之久久综合| 欧美精品乱码久久久久久| 欧美性一二三区| 在线国产电影不卡| 欧美性大战久久久| 欧美久久高跟鞋激| 欧美一区二区三区在线视频| 欧美视频一区二区三区在线观看 | 免费看日韩精品| 激情久久五月天| 久久超级碰视频| 韩国在线一区二区| 国产成人免费av在线| 成人黄色综合网站| 色婷婷av一区| 欧美裸体bbwbbwbbw| 日韩欧美一区在线| 久久综合久久久久88| 国产视频在线观看一区二区三区| 久久久国产一区二区三区四区小说| 欧美精品一区二区三区蜜桃| 国产欧美1区2区3区| 综合色中文字幕| 亚洲大片免费看| 久久精品免费观看| 国产91在线观看丝袜| 91精品福利视频| 精品理论电影在线| 中文字幕中文字幕在线一区| 午夜私人影院久久久久| 极品少妇xxxx精品少妇偷拍 | 国产精品久久久久精k8| 亚洲视频资源在线| 免费国产亚洲视频| 风间由美中文字幕在线看视频国产欧美| av一区二区久久| 欧美一级久久久| 成人免费一区二区三区在线观看| 亚洲高清免费观看| 风间由美性色一区二区三区| 欧洲一区在线观看| 久久精品一区四区| 亚洲成人av免费| 成人av手机在线观看| 欧美裸体bbwbbwbbw| 亚洲免费观看高清| 国产一区二区三区四| 91福利在线看| 国产精品久久久久久户外露出| 热久久久久久久| 欧美日韩一级二级三级| 中文在线一区二区| 久久99精品久久久久久| 91福利国产成人精品照片| 久久久蜜桃精品| 日韩成人一区二区| 欧美三级韩国三级日本三斤| 中国色在线观看另类| 国内精品写真在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 欧美性一二三区| 亚洲欧洲无码一区二区三区| 日本中文字幕一区二区视频 | aaa国产一区| 久久综合久久综合亚洲| 日韩精品一二三四| 欧美三级视频在线| 亚洲激情中文1区| 色婷婷国产精品| 欧美色涩在线第一页| 成人欧美一区二区三区在线播放| 国产成人综合网| 国产精品网曝门| 激情成人午夜视频| 欧美一区二区三区性视频| 午夜视频在线观看一区二区三区| 欧美综合天天夜夜久久| 亚洲一区二区三区四区的| 欧美色大人视频| 亚洲午夜成aⅴ人片| 欧美三级韩国三级日本一级| 日日噜噜夜夜狠狠视频欧美人| 欧美三级中文字| 欧美aaaaaa午夜精品| 欧美精品免费视频| 日本不卡的三区四区五区| 日韩精品一区二区三区swag| 国产一区二区按摩在线观看| 中文字幕高清不卡| 色哟哟一区二区三区| 亚洲成精国产精品女| 精品国产乱码久久| 91免费精品国自产拍在线不卡| 亚洲欧美乱综合| 欧美亚洲丝袜传媒另类| 天堂精品中文字幕在线| 欧美精品1区2区| 日韩欧美一二三| 色综合久久久久久久久| 综合久久久久久久| 色综合久久久久| 欧美精品久久天天躁| 中文字幕在线一区二区三区| 国产91精品欧美| 亚洲日本乱码在线观看| 日本三级亚洲精品| 国产精品萝li| 色哟哟欧美精品| 亚洲高清一区二区三区| 欧美三级乱人伦电影| 三级在线观看一区二区 | www.亚洲在线| 国产精品美女久久久久av爽李琼| 97久久精品人人澡人人爽| 欧美日韩一区在线观看| 免费成人小视频| 国产午夜亚洲精品不卡| 成人夜色视频网站在线观看| 国产精品久久影院| 一本一道波多野结衣一区二区 | 日韩一级精品视频在线观看| 伊人性伊人情综合网| 欧美日韩视频专区在线播放| 蜜桃视频一区二区三区在线观看| 精品久久久久久综合日本欧美| 亚洲乱码一区二区三区在线观看| 日韩一区二区高清| 成人免费毛片aaaaa**| 中文字幕日韩欧美一区二区三区| 欧美性xxxxxx少妇| 国产精品久久午夜| 欧美午夜精品久久久久久超碰 | 国产三级欧美三级日产三级99| 国v精品久久久网| 亚洲欧美aⅴ...| 欧美一区二区视频网站| 国产成人av福利| 亚洲伊人色欲综合网| 91色porny在线视频| 成人免费精品视频| 狠狠色丁香久久婷婷综| 亚洲欧洲av在线| 欧美女孩性生活视频| 成人国产精品免费| 国精品**一区二区三区在线蜜桃| 久久精品视频免费| 91麻豆免费视频| 国产精品资源网站| 天天综合日日夜夜精品| 欧美专区日韩专区| 激情丁香综合五月| 免费三级欧美电影| 亚洲成人综合在线| 国产女人18水真多18精品一级做 | 久久综合九色综合欧美98| 95精品视频在线| 国产欧美日韩在线视频| 1区2区3区欧美| 久久久精品tv| 欧美xxxxx裸体时装秀| 欧美日韩国产综合视频在线观看| 精品亚洲欧美一区| 免费成人在线网站| 亚洲视频一区在线| 久久蜜臀精品av| 国产乱码精品一区二区三区av| 久久人人超碰精品| 欧美久久久久久久久久 | 中文字幕av资源一区| 日韩欧美色电影| 日韩一级片网址| 精品久久久久久综合日本欧美| 欧美日韩午夜在线视频| 欧美一区二区在线看| 欧美精品视频www在线观看| 欧美性猛交xxxx乱大交退制版 | 99久久精品国产一区二区三区 | 国产亚洲欧美中文| 精品欧美一区二区久久| 制服丝袜亚洲播放| 日韩亚洲欧美在线观看| 蜜臀久久久久久久| 日韩精品欧美精品| 午夜电影一区二区三区| 樱花草国产18久久久久| 一区二区久久久久久| 久久久99精品久久| 亚洲综合在线免费观看| 17c精品麻豆一区二区免费| 久久精品网站免费观看| 日韩色在线观看| 日韩一区二区三区视频在线观看| 日韩一卡二卡三卡四卡| 一区二区三区四区激情| 亚洲成在线观看|