📄 pendev.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 + -