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

📄 pendev.c

📁 基于EPSON 的一种操作系统内核改造的实时嵌入式操作系统ASIXOS,国内一家研发中心开发。精炼可靠
💻 C
字号:
//#define EZ328
//#include "M68328.h"
//#include "stddefs.h"

#include "ppsm.h"
#include "m68328.h"
#include "pen.h"

//#include "ppsmtype.h"
#include "HA_TypeDef.h"
#include "hardware.h" 
#include "hardware_reg.h"  

#include <string.h>  

void init_Pen(void);
U16 PenSPIXfer(U16);
void SPISetup(void);
void TurnOnADS7843(void);
void TurnOFFADS7843(void);
void PenEnable(void);
void PenDisable(void);
STATUS PenRead(U16* ,U16*);

extern esram;

#ifdef AD7846 
void init_Pen(void)
{
	U16 tmpx, tmpy;

	*(RP)PORTE_DIR |= (0X1<<8);
	*(RP)PORTE_SEL |= 0X1<<8;	
	*(RP)PORTE_INTRCTL |= 0X30000;
	*(RP)PORTE_INCTL |= (0X1<<8);
	*(RP)PORTE_INTRCLR |= (0X1<<8);

	SPISetup();

	PenRead(&tmpx, &tmpy);

	irq_enable(INT_TP);		//enable AD interrupt
	unmask_irq(INT_TP);
	
	memset(PEN_BUF,0x00,sizeof(PENDATA) * MAX_PENBUF);
	PEN_BUF_readcount=0;
	PEN_BUF_writecount=0;
}


U16 PenSPIXfer(U16 ADCommd)
{
	U16 data;

////	TurnOnADS7843();
  
        /* set the command through the spi that let AD exchange data */     
	*(RP)SPITR = ADCommd;
	*(RP)SPICR |= transenable;
	while(!(( (*(RP)SPISR)) & 0x01));// wait for the data from spi

	data = *(RP)SPIRR; 

	return data;
}     
     
 void SPISetup(void)
{
	*(RP)SPICR = ctrlw;
	*(RP)SPIBR = bt256;	

	TurnOnADS7843();
} 

void TurnOnADS7843(void)
{
	/* turn on Pen AD chip selected */
	*(RP)PORTE_SEL |= 0X1<<9;
	*(RP)PORTE_DATA &=~( 0X1 << 9);
}

void TurnOFFADS7843(void)
{	
	/* turn off Pen AD chip selected */
	*(RP)PORTE_SEL |= 0X1<<9;
	*(RP)PORTE_DATA |=( 0X1 << 9);			
}

void PenEnable(void)
{
	unmask_irq(INT_TP);	
}

void PenDisable(void)
{
	mask_irq(INT_TP);	
}

STATUS PenRead(P_U16 ValueX,P_U16 ValueY)
{
	U16 TempX,TempY;
	U16 x_upper, x_lower, y_upper, y_lower;
	U16 retcmd;
	U32 penflag;

	penflag = *(RP)(INTC_IRSTAT);

	/* read x location */  
        retcmd = PenSPIXfer(x_location);
        x_upper= PenSPIXfer(val_upper);   // read the data from the external device
	 x_lower= PenSPIXfer(val_lower); 
	 //TempX=(((x_upper<<5) & 0x0FE0) | ((x_lower>>11) & 0x001F)) >> 2 ;	//New Version in case of new LCD
/*
	TempX = ((((x_upper&0x00FF)<<8)|(x_lower&0x00FF))&0x7ff8)>>3;	//AD 的精度是12位
	TempX = 0xfff-TempX;
*/	
	TempX = ((((x_upper&0x00FF)<<8)|(x_lower&0x00FF))&0x7ff8)>>4;	//AD 的精度是11位
	TempX = 0x7ff-TempX;
	
	/* read y location */
        retcmd = PenSPIXfer(y_location);
        y_upper= PenSPIXfer(val_upper);   // read the data from the external device
	 y_lower= PenSPIXfer(val_lower); 
	 //TempY= (((y_upper<<5) & 0x0FE0) | ((y_lower>>11) & 0x001F)) >> 2 ;  //New Version in case of new LCD
/*
	TempY = ((((y_upper&0x00FF)<<8)|(y_lower&0x00FF))&0x7ff8)>>3;	//AD 的精度是12位
   	TempY = 0xfff-TempY;
*/
	TempY = ((((y_upper&0x00FF)<<8)|(y_lower&0x00FF))&0x7ff8)>>4;	//AD 的精度是11位
   	TempY = 0x7ff-TempY;
   	
        /* end conversion */

	/* test for AD by gfd */
//	*(RP)(0x1fff0000 + 4*(esram++)) = TempX;
//	*(RP)(0x1fff0000 + 4*(esram++)) = TempY;
	
	/* check pen up? */
	 if(!(penflag&0x00000200))
     {
     	*ValueX=0;
        *ValueY=0;
        ////TurnOFFADS7843(); 	//Turn off AD7843 chip select
        return 0;
     }else{       
////     	*ValueX=TempX;
////     	*ValueY=TempY;
	*ValueX=TempY;
    	*ValueY=TempX;
     }
     ////TurnOFFADS7843(); 	//Turn off AD7843 chip select
     
     return 1;
}

#else

touchinit()                                          
{
	*(RP)PORTH_DIR |=0x10;
	*(RP)PORTH_SEL |=0x10;
	*(RP)PORTH_INTRCTL |=0X200;
	*(RP)PORTH_INCTL |=0X10;
	*(RP)PORTH_INTRCLR =0x3f ;
	
	unmask_irq(INT_EXT16);		////open ad int mask register
}
void ResetUCB(void)
{
//**********Enable TMXP Negative INT,ADDR: 60H
	*(RP)AC97_CRAC=WRITE + 0x600000 + 0x2000;  
	do{}while(!OVER_WRITE);

//**********Touch Screen Control register,ADDR: 64H
	*(RP)AC97_CRAC=WRITE + 0x640000 + 0x00C3;          //D9-D8=00 interupt mode
	do{}while(!OVER_WRITE);
}

void InitAC97(void)
{
//*********Reset AC97
    *(RP)AC97_ENABLE=0x1;
	*(RP)AC97_CONR=0X13;	

//*********Reset Codec ,ADDR: 00H
	 *(RP)AC97_CRAC=WRITE+ 0x0 + 0x0;	
	do{}while(!OVER_WRITE);

//************configure Codec,	
//**********Enable TMXP Negative INT,ADDR: 60H
	*(RP)AC97_CRAC=WRITE + 0x600000 + 0x2000;  
	do{}while(!OVER_WRITE);

//**********Touch Screen Control register,ADDR: 64H
	*(RP)AC97_CRAC=WRITE + 0x640000 + 0x00C3;          //D9-D8=00 interupt mode
	do{}while(!OVER_WRITE);

//*********clear INT Clear/Status register,ADDR:62H 
	      *(RP)AC97_CRAC=WRITE + 0x620000+0xf800;
	      do{}while(!OVER_WRITE);

//remove do while after debug;	      
}

U32 CheckPenUp()
{  
      //*********Touch Screen Control register; ADDR:64H 
	          *(RP)AC97_CRAC=WRITE + 0x640000+0x00C3;      //Interupt mode
	           do{}while(!OVER_WRITE);
      //_________________________________________________  

      //*********Touch Screen Control register; ADDR:64H 
	          *(RP)AC97_CRAC=READ + 0x640000+0x00C3;      //Interupt mode
	          do{}while(!OVER_READ);
      //_________________________________________________  
      if(*(RP)AC97_CRAC & (0x00003000))
          return 0;
      else
          return 1;
}
 
void clrcodecint()
{	
   //*********Touch Screen Control register; ADDR:64H 
	      *(RP)AC97_CRAC=WRITE + 0x640000+0x00C3;      //Interupt mode
	      do{}while(!OVER_WRITE);
   //_________________________________________________  

   //*********clear INT Clear/Status register,ADDR:62H 
	      *(RP)AC97_CRAC=WRITE + 0x620000+0x2000;
	      do{}while(!OVER_WRITE);
   
   //**********Enable TMXP Negative INT,ADDR: 60H
	      *(RP)AC97_CRAC=WRITE + 0x600000 + 0x2000;  
	       do{}while(!OVER_WRITE); 
  //**********clr H PORT
  //        *(RP)PORTH_INTRCLR=0x3f;
}

U32 readx(U32 *tmp)
{  
   //*********Touch Screen Control register; ADDR:64H 
	      *(RP)AC97_CRAC=WRITE + 0x640000+0xA48;                     //X Position
	      do{}while(!OVER_WRITE);
   //_________________________________________________  
	
	
	
   //*********ADC Control register; ADDR:66H 
	      *(RP)AC97_CRAC=WRITE + 0x660000+0x8083;                     //Start X Position Convert
	      do{}while(!OVER_WRITE);
   //_________________________________________________ 
    
    
    
   //*********READ ADC Data register ,ADDR:68H                       // Check ADC Complete (First Time)
	      *(RP)AC97_CRAC=READ + 0x680000;
	      do{}while(!OVER_READ);
   //_________________________________________________
   
   
   
   while(!(*(RP)AC97_CRAC & (0x1 << 15 )))
   {
	 //*********READ ADC Data register ,ADDR:68H                       // Check ADC Complete
	      *(RP)AC97_CRAC=READ + 0x680000;
	      do{}while(!OVER_READ);
    }
	*tmp = *(RP)AC97_CRAC;
	return *tmp;
}


U32 ready(U32 *tmp)
{
	//*********Touch Screen Control register; ADDR:64H 
	      *(RP)AC97_CRAC=WRITE + 0x640000+0xA12;                     //Y Position
	      do{}while(!OVER_WRITE);
   //_________________________________________________  
	
	
	
   //*********ADC Control register; ADDR:66H 
	      *(RP)AC97_CRAC=WRITE + 0x660000+0x808B;                     //Y Position Convert
	      do{}while(!OVER_WRITE);
   //_________________________________________________ 
    
    
    
   //*********READ ADC Data register ,ADDR:68H                       // Check ADC Complete (First Time)
	      *(RP)AC97_CRAC=READ + 0x680000;
	      do{}while(!OVER_READ);
   //_________________________________________________
   
   
   
   while(!(*(RP)AC97_CRAC & (0x1 << 15 )))
	{
	
	 //*********READ ADC Data register ,ADDR:68H                       // Check ADC Complete
	      *(RP)AC97_CRAC=READ + 0x680000;
	      do{}while(!OVER_READ);
     //_________________________________________________
	 }
	*tmp = *(RP)AC97_CRAC;
	return *tmp;
}

void init_Pen(void)
{
	touchinit();
	InitAC97();
}

void PenEnable(void)
{
	clrcodecint();			//change mode into int; clear int source and clear GPIO int.
	
	unmask_irq(INT_EXT16);	
}

void PenDisable(void)
{
	mask_irq(INT_EXT16);	
}

STATUS PenRead(P_U16 ValueX,P_U16 ValueY)
{
	U32 *tmpx,*tmpy;

	*ValueY = (readx(tmpx) & 0x000003ff);
	*ValueX = (ready(tmpy) & 0x000003ff);
	
		/* check pen up? */
	 if(!(CheckPenUp()))
     {
     	*ValueX=0;
        *ValueY=0;
             return 0;
     }else{       
		*ValueY = (readx(tmpx) & 0x000003ff);
		*ValueX = (ready(tmpy) & 0x000003ff);
     }

     return 1;
}

#endif

⌨️ 快捷键说明

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