📄 xllpsspts.c
字号:
#include "xllp_bcr.h"
#include "xllp_defs.h"
#include "xllp_gpio.h"
#include "xllpsspts.h"
/***********************************
*
* SSP Link Related Functions
*
***********************************/
//------------------------------------------------------------------------------------------------------------
// Function: XllpInitSspLink
//
// Purpose: Initialises the SSP Controller of the XScale Processor in order to communicate with the ADI 7873.
// Returns: returns TRUE on success, otherwise return FALSE.
//
//-------------------------------------------------------------------------------------------------------------
XLLP_BOOL_T XllpInitSspLink(volatile SSP_REGS *v_pSSPregs)
{
XLLP_BOOL_T retval=XLLP_TRUE;
// sets up the controller to receive 12 bit Data from the codec, frames appearing in Microwire format, using an OnChip
// clock and a clock rate of 614400 Hz
if(v_pSSPregs)
{
v_pSSPregs->sscr0 = SSCR0_DSS_12BIT | SSCR0_DSS_FRF_MWI | SSCR0_DSS_ONCHIP_CLK | SSCR0_SCR;
v_pSSPregs->sscr1 = 0x00000000;
v_pSSPregs->sscr0 |= SSCR0_SSP_EN; // enable SSP here
}
else
retval = XLLP_FALSE;
return(retval);
}
//----------------------------------------------------------------------------------------------------------------
//
// Function XllpSspGPIOConfigure
//
// Purpose: This function will configure the GPIO pins according to the functionality shown in the table below
//
// Signals Pin# Direction Alternate Function
// SSPSCLK GP23 output 2
// SSPSFRM GP24 output 2
// SSPTXD GP25 output 2
// SSPRXD GP26 input 1
// ***SSPEXTCLK GP27 input 1
//
//----------------------------------------------------------------------------------------------------------------
XLLP_BOOL_T XllpSspGPIOConfigure(volatile XLLP_GPIO_T *v_pGPIOReg)
{
XLLP_BOOL_T retval = XLLP_FALSE;
if(v_pGPIOReg)
{
v_pGPIOReg->GPDR0 |= XLLP_GPIO_SSPSCLK | XLLP_GPIO_SSPSFRM | XLLP_GPIO_SSPTXD;
v_pGPIOReg->GPDR0 &= ~XLLP_GPIO_SSPRXD ;
v_pGPIOReg->GAFR1_L |= XLLP_GPIO_AF_BIT_SSPSCLK | XLLP_GPIO_AF_BIT_SSPSFRM |
XLLP_GPIO_AF_BIT_SSPTXD | XLLP_GPIO_AF_BIT_SSPRXD;
retval = XLLP_TRUE;
}
return(retval);
}
//------------------------------------------------------------------------------------------------------------
// Function: ReadSSPLink
//
// Purpose: Reads the data from the SSP's Rx FIFO. Currently this is a busy wait read operation. It may not hurt
// because the bandwidth requirements for the touch driver is low. However this can still be improved in 2 ways
// one would be to increase the bit rate of the SSP Link and the other would be to make it interrupt driven.
//
// Returns: returns TRUE on success, otherwise return FALSE.
//
//-------------------------------------------------------------------------------------------------------------
XLLP_BOOL_T XllpReadSspFiFO(volatile SSP_REGS *v_pSSPregs,XLLP_UINT32_T *data,XLLP_UINT32_T IoType,XLLP_UINT32_T NumOfWords)
{
XLLP_BOOL_T retval = XLLP_TRUE;
XLLP_UINT32_T WordCnt = 0, cnt;
while(NumOfWords)
{
if(IoType == IO_BLOCKING)
{
while(v_pSSPregs->ssr & SSP_BUSY) ;
while((v_pSSPregs->ssr & SSP_RECEIVE_FIFO_NOT_EMPTY)==0) ;
}
else if(IoType == IO_NON_BLOCKING)
{
for(cnt=10000000;(v_pSSPregs->ssr & SSP_BUSY) && cnt;cnt--) ;
for(cnt=10000000;((v_pSSPregs->ssr & SSP_RECEIVE_FIFO_NOT_EMPTY)==0) && cnt;cnt--) ;
}
else
{
retval = XLLP_FALSE;
break;
}
data[WordCnt++] = (v_pSSPregs->ssdr & 0xFFFF);
NumOfWords--;
}
return(retval);
}
//------------------------------------------------------------------------------------------------------------
// Function: XllpWriteSspFifo
//
// Purpose: Writes the data to the SSP's Tx FIFO. Currently this is a busy wait read operation. It may not hurt
// because the bandwidth requirements for the touch driver is low. However this can still be improved in 2 ways
// one would be to increase the bit rate of the SSP Link and the other would be to make it interrupt driven.
//
// Returns: returns TRUE on success, otherwise return FALSE.
//
//-------------------------------------------------------------------------------------------------------------
XLLP_BOOL_T XllpWriteSspFifo(volatile SSP_REGS *v_pSSPregs,XLLP_UINT32_T *data,XLLP_UINT32_T IoType,XLLP_UINT32_T NumOfWords)
{
XLLP_BOOL_T retval = XLLP_TRUE;
XLLP_UINT32_T WordCnt = 0, cnt;
while(NumOfWords)
{
if(IoType == IO_BLOCKING)
{
while(v_pSSPregs->ssr & SSP_BUSY) ;
while((v_pSSPregs->ssr & SSP_TRANSMIT_FIFO_NOT_FULL)==0) ;
}
else if(IoType == IO_NON_BLOCKING)
{
for(cnt=10000000;(v_pSSPregs->ssr & SSP_BUSY) && cnt;cnt--) ;
for(cnt=10000000;((v_pSSPregs->ssr & SSP_TRANSMIT_FIFO_NOT_FULL)==0) && cnt;cnt--) ;
}
else
{
retval = XLLP_FALSE;
break;
}
v_pSSPregs->ssdr = data[WordCnt++];
NumOfWords--;
}
return(retval);
}
/***********************************
*
* ADI 7873 Touch Screen Related Functions
*
************************************/
//------------------------------------------------------------------------------------------------------------
// Function: XllpReadTSCodec
//
// Purpose: Reads the Codec Data by reading the SSP Link.
// returns TRUE on success, otherwise return FALSE.
//
//-------------------------------------------------------------------------------------------------------------
XLLP_BOOL_T XllpReadTSCodec(volatile SSP_REGS *v_pSSPregs,XLLP_UINT32_T *data)
{
return(XllpReadSspFiFO(v_pSSPregs,data,IO_BLOCKING,1));
}
//------------------------------------------------------------------------------------------------------------
// Function: XllpWriteTSCodec
//
// Purpose: Writes the Codec Data by writing to the SSP Link.
//
// returns TRUE on success, otherwise return FALSE.
//
//-------------------------------------------------------------------------------------------------------------
XLLP_BOOL_T XllpWriteTSCodec(volatile SSP_REGS *v_pSSPregs,volatile XLLP_BCR_T *v_pBLReg,XLLP_UINT32_T *data)
{
return(XllpWriteSspFifo(v_pSSPregs,data,IO_BLOCKING,1));
}
//------------------------------------------------------------------------------------------------------------
// Function: XllpSetUpTSInterrupts
//
// Purpose: Puts the Codec in Interrupt mode so that we can detect pen down interrupts.
//
// returns TRUE on success, otherwise return FALSE.
//
//-------------------------------------------------------------------------------------------------------------
XLLP_BOOL_T XllpSetUpTSInterrupts(volatile SSP_REGS *v_pSSPregs,volatile XLLP_BCR_T *v_pBLReg)
{
XLLP_UINT32_T data = 0x90;
XllpWriteTSCodec(v_pSSPregs,v_pBLReg,&data);
XllpReadTSCodec(v_pSSPregs,&data);
return(XLLP_TRUE);
}
//------------------------------------------------------------------------------------------------------------
// Function: XllpGetPenStatus
//
// Purpose: This function can be used to query the codec in order to determine the status of the pen .
// Returns: returns TRUE if the pen is Down, otherwise return FALSE.
//
//-------------------------------------------------------------------------------------------------------------
XLLP_BOOL_T XllpGetPenStatus(volatile XLLP_BCR_T *v_pBLReg)
{
return((v_pBLReg->MISCRR1 & TS_BUSY) ? XLLP_TRUE : XLLP_FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -