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

📄 xllpsspts.c

📁 PXA270硬件测试源代码
💻 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 + -