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

📄 ts.c

📁 usbhostomapOMAP5910下touchscreen的驱动程序
💻 C
字号:
#include "..\header\armperipherals.h"
#include "..\header\FPGA_peripherals.h"
#include "omap30.h"
#include "omap30_arminth.h"
#include "omap1510_inth2.h"

#define BCS      0x04
#define BCLK     0x01
#define BDIN     0x02
#define BBUSY    0x08
#define BOUT     0x10
#define BPENDOWN 0x20

volatile unsigned char *pTouchScreenReg = (unsigned char*)0x08000204;

static void CS_H(void)
{
	//*pFPGAOUTRegs &= ~BCS ; 
	*pTouchScreenReg &= ~BCS ; // EPLD inverts active low signals.
}

static void CS_L(void)
{
	// *pFPGAOUTRegs |= BCS ; 
	*pTouchScreenReg |= BCS ;
}

static void SCLK_L(void)
{
	// *pFPGAOUTRegs &= ~BCLK ;
	*pTouchScreenReg &= ~BCLK ;
}

static void SCLK_H(void)
{
	// *pFPGAOUTRegs |= BCLK ;
	*pTouchScreenReg |= BCLK ;
}

static void SDI_L(void)
{
	// *pFPGAOUTRegs &= ~BDIN;
	*pTouchScreenReg &= ~BDIN ;
}

static void SDI_H(void)
{
	// *pFPGAOUTRegs |= BDIN;
	*pTouchScreenReg |= BDIN ;
}

static unsigned char BUSY(void)
{
	//return *pFPGAINRegs & BBUSY;
	//return (*pTouchScreenReg & BBUSY) ;
	return (((*pTouchScreenReg & BBUSY) == 0)?1:0) ;
}

static unsigned char DOUT(void)
{	 
	//return (*pFPGAINRegs & BOUT) ? 1 : 0;
	return ((*pTouchScreenReg & BOUT) ? 1 : 0) ;
}

void Wait(void)
{
	// 200 -> 1.8 Khz
	// 20 -> 18.0 Khz
	// 10 -> 36.0 Khz
	int i;
	for(i=0; i<4; i++);
}

static unsigned short SPIWriteRead (unsigned char ucVal)
{  
	int	i ;
	unsigned short unVal;

	SCLK_L() ;
	SDI_L();
	CS_L() ;	// enable the chip select

	Wait() ; 


	for (i=0; i<8; i++ )
	{
       		if (ucVal & 0x80)  SDI_H();
        	else SDI_L();   // prepare the data on line sdi OR din
		Wait() ;

		SCLK_H() ;      // clk in the data

      		ucVal = ucVal << 1 ;
		Wait() ;
		SCLK_L() ;
	}
	SDI_L();
	Wait() ;
	while(BUSY());
	unVal = 0;


	Wait() ;
	Wait() ;
	Wait() ;
	Wait() ;
		
	for (i=0 ; i<16 ; i++ )
	{
		SCLK_L() ;
		Wait() ;
		if(i<12)
		{
			unVal <<= 1 ;
			unVal |= DOUT();
		}
		SCLK_H() ;
		Wait() ;
	}
	SCLK_L() ;
	CS_H() ;   // disable the chip select
	return unVal;
}

static void SPIWrite (unsigned char ucVal)
{  
	int	i ;

	SCLK_L() ;
	CS_L() ;	// enable the chip select

	Wait() ;
	for (i=0 ; i<8 ; i++ )
	{
       		if (ucVal & 0x80)  SDI_H();
        	else SDI_L();   // prepare the data on line sdi OR din
		Wait() ;

		SCLK_H() ;      // clk in the data

        	ucVal = ucVal << 1 ;
		Wait() ;
		SCLK_L() ;
	}

	CS_H() ;   // disable the chip select
}

#define S		0x80
#define A2		0x40
#define A1		0x20
#define A0		0x10
#define MODE	0x08
#define SER		0x04
#define PD1		0x02
#define PD0		0x01

#define Ypos	( S |            A0  | PD1 | PD0 )
//#define Ypos	( S |            A0              )
#define Z1pos	( S |       A1 | A0  | PD1 | PD0 )
#define Z2pos	( S | A2 |             PD1 | PD0 )		
#define Xpos	( S | A2 |       A0  | PD1 | PD0 )		
//#define Xpos	( S | A2 |       A0              )		
#define YposPd	( S |            A0              )		
#define Vbat	( S |       A1       | PD1 | PD0 | SER )		
#define AuxIn	( S | A2 |  A1       | PD1 | PD0 | SER )		
#define Refoff  ( S |                        PD0) 


unsigned short GetPenPos (short *pX, short *pY)
{
	short x, y;
	unsigned short bPenDown ;
		
	//bPenDown = ((*pTouchScreenReg & BPENDOWN)  ? 1 : 0) ;
	//CS_L () ;
	Wait () ;
	Wait () ;
	
	x = SPIWriteRead (Xpos) ;
	//x = SPIWriteRead (Xpos) ;
	//x = SPIWriteRead (Xpos) ;
	//x = SPIWriteRead (Xpos) ;
	//x = SPIWriteRead (Xpos) ;
	//x = SPIWriteRead (Xpos) ;

	Wait () ;
	Wait () ;

	y = SPIWriteRead (Ypos) ; 
	//y = SPIWriteRead (Ypos) ; 
	//y = SPIWriteRead (Ypos) ; 
	//y = SPIWriteRead (Ypos) ; 
	//y = SPIWriteRead (Ypos) ; 
	//y = SPIWriteRead (Ypos) ; 

	Wait () ;
	Wait () ;

	SPIWrite(YposPd);
	//SPIWrite(YposPd);
	//SPIWrite(YposPd);
	//SPIWrite(YposPd);
	//SPIWrite(YposPd);

	//CS_H () ; // this must be here for BPENDOWN below to work???
	Wait () ;
	
	bPenDown = ((*pTouchScreenReg & BPENDOWN)  ? 1 : 0) ;
	//FilterTouchScreen (bPenDown, &x, &y) ;
	
	*pX = x;
	*pY = y;
	
	return  bPenDown ;  
}


#pragma SWI_ALIAS(SetIRQ, 0);
extern void SetIRQ(unsigned int OnOff);
extern unsigned int gpio_count ;
extern unsigned short *fpga_intmask ;
extern int idetest_flag ;
void touchscreentest()
{
   if(idetest_flag == 0){
   	INTH2_InitLevel(GPIO_INT,INTH_IRQ,INTH_HIGHEST_PRIORITY,INTH_LOW_LEVEL_SENSITIVE); 
	INTH2_EnableOneIT(GPIO_INT,INTH_IRQ);
	/* Set up GPIO 13 */                                          
	if (SetupGPIO(13, 1, 1, LOW2HIGH_INTERRUPT))
		return ;
   }
   
 
   *((unsigned long *)0xfffecb04) = 0xffffbfff;
   *fpga_intmask |= 0x0010;

   SetIRQ(1);
   while(gpio_count < 10);
   *((unsigned short *)0x08000008) &=(0x00ef);

   return ; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -