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

📄 toya2_pdic_uart.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
字号:
/*
 * @file   toya2_pdic_uart.c
 * @brief  UART1,2 Control
 * @author 2005/07/11 Masatoshi Kawashima
 * Copyright (C)SEIKO EPSON Corp. All Rights Reserved.
 */

#include "SPRDEF.h"
#include "reg_mx21.h"
#include "toya2_pdic_uart.h"

/*
 * Define
 */
#define MHz 		1000*1000
#define UARTCLK 	16*MHz			/* Clock frequency of UART */


/*
 * Table for UART1 - 4 control register operation
 */
volatile unsigned long* regUCR1[] = {
	&rlMX21_UCR1_1,
//	  &rlMX21_UCR1_2,
//	  &rlMX21_UCR1_3,
//	  &rlMX21_UCR1_4
} ;

volatile unsigned long* regUCR2[] = {
	&rlMX21_UCR2_1,
//	  &rlMX21_UCR2_2,
//	  &rlMX21_UCR2_3,
//	  &rlMX21_UCR2_4
} ;

volatile unsigned long* regUCR3[] = {
	&rlMX21_UCR3_1,
//	  &rlMX21_UCR3_2,
//	  &rlMX21_UCR3_3,
//	  &rlMX21_UCR3_4
} ;

volatile unsigned long* regUCR4[] = {
	&rlMX21_UCR4_1,
//	  &rlMX21_UCR4_2,
//	  &rlMX21_UCR4_3,
//	  &rlMX21_UCR4_4
} ;

volatile unsigned long* regUFCR[] = {
	&rlMX21_UFCR_1,
//	&rlMX21_UFCR_2,
//	&rlMX21_UFCR_3,
//	&rlMX21_UFCR_4,
};

volatile unsigned long* regURXD[] = {
	&rlMX21_URXD_1,
//	&rlMX21_URXD_2,
//	&rlMX21_URXD_3,
//	&rlMX21_URXD_4,
};

volatile unsigned long* regUTXD[] = {
	&rlMX21_UTXD_1,
//	&rlMX21_UTXD_2,
//	&rlMX21_UTXD_3,
//	&rlMX21_UTXD_4,
};


volatile unsigned long* regUBIR[] = {
	&rlMX21_UBIR_1,
//	  &rlMX21_UBIR_2,
//	  &rlMX21_UBIR_3,
//	  &rlMX21_UBIR_4
};

volatile unsigned long* regUBMR[] = {
	&rlMX21_UBMR_1,
//	  &rlMX21_UBMR_2,
//	  &rlMX21_UBMR_3,
//	  &rlMX21_UBMR_4
};


volatile unsigned long* regUSR1[] = {
	&rlMX21_USR1_1,
//	  &rlMX21_USR1_2,
//	  &rlMX21_USR1_3,
//	  &rlMX21_USR1_4
};


volatile unsigned long* regUSR2[] = {
	&rlMX21_USR2_1,
//	  &rlMX21_USR2_2,
//	  &rlMX21_USR2_3,
//	  &rlMX21_USR2_4
};


/*=============================================================================
// Function_Name: TOYA2_UARTInit
// description	: UART initialize
// argument 	: None
// return		: None
// =============================================================================
*/
void TOYA2_UARTInit(void)
{

	/* Set the common Pin */

	/* UART1: PTE12-15	*/
	rlMX21_PTE_GUIS &= ~(0x0000F000) ;
	rlMX21_PTE_GPR	&= ~(0x0000F000) ;

	/* Set clock */
	rlMX21_PCCR0	|=	0x00000001; 	/* UART1 CLK Enable: TOYA2 RS232C port 	*/
	rlMX21_PCCR0	&= ~0x00000002; 	/* UART2 CLK Disable: It is disconnection in default */
	rlMX21_PCCR0	&= ~0x00000004; 	/* UART3 CLK Disable: It is disconnection in default */
	rlMX21_PCCR0	&= ~0x00000008; 	/* UART4 CLK Disable: It is disconnection in default */

}


/*=============================================================================
// Function_Name: TOYA2_UARTOpen
// description	: UART Open
// argument 	: ulPortNum: Port number
// return		: None
// =============================================================================
*/
void TOYA2_UARTOpen(ULONG ulPortNum)
{
	if( ulPortNum > 1 )
	{	/* Parameter error */
		return;
	}
	ulPortNum--;
	*regUCR1[ulPortNum] |= 0x01;		/* UARTEN Bit Enable	 */
	*regUCR2[ulPortNum] |= 0x06;		/* TXEN, RXEN bit Enable */
}


/*=============================================================================
// Function_Name: TOYA2_UARTClose
// description	: UART Close
// argument 	: ulPortNum: Port number
// return		: None
// =============================================================================
*/
void TOYA2_UARTClose(ULONG ulPortNum)
{
	if( ulPortNum > 1 )
	{	/* Parameter error */
		return;
	}
	ulPortNum--;
	*regUCR1[ulPortNum] &= ~0x01;		/* UARTEN Bit Enable	 */
	*regUCR2[ulPortNum] &= ~0x06;		/* TXEN, RXEN bit Enable */
}



/*=============================================================================
// Function_Name: TOYA2_UARTGetConfigX
// description	: Get the UART settings
// argument 	: ulPortNum: Port number
// return		: Present register setting value
// =============================================================================
*/
ULONG TOYA2_UARTGetConfig1(ULONG num){ return(*regUCR1[(num)-1]); }
ULONG TOYA2_UARTGetConfig2(ULONG num){ return(*regUCR2[(num)-1]); }
ULONG TOYA2_UARTGetConfig3(ULONG num){ return(*regUCR3[(num)-1]); }
ULONG TOYA2_UARTGetConfig4(ULONG num){ return(*regUCR4[(num)-1]); }

/*=============================================================================
// Function_Name: TOYA2_UARTSetConfig1
// description	: Set UART
// argument 	: ulPortNum: Port number
//				: ulConfig:  UCR1 setting value
// return		: None
// =============================================================================
*/
void TOYA2_UARTSetConfig1(ULONG ulPortNum, ULONG ulConfig )
{
	UCHAR	idx;		/* Index for array operation */

	if( ulPortNum > 1 )
	{	/* Parameter error */
		return;
	}
	idx = ulPortNum - 1;
	*regUCR1[idx] = ulConfig ;
}

/*=============================================================================
// Function_Name: TOYA2_UARTSetConfig2
// description	: Set UART
// argument 	: ulPortNum: Port number
//				: ulConfig:  UCR1 setting value
// return		: None
// =============================================================================
*/
void TOYA2_UARTSetConfig2(ULONG ulPortNum, ULONG ulConfig )
{
	UCHAR	idx;		/* Index for array operation */

	if( ulPortNum > 1 )
	{	/* Parameter error */
		return;
	}
	idx = ulPortNum - 1;

	*regUCR2[idx] = ulConfig ;
}

/*=============================================================================
// Function_Name: TOYA2_UARTSetConfig3
// description	: Set UART
// argument 	: ulPortNum: Port number
//				: ulConfig:  UCR1 setting value
// return		: None
// =============================================================================
*/
void TOYA2_UARTSetConfig3(ULONG ulPortNum, ULONG ulConfig )
{
	UCHAR	idx;		/* Index for array operation */

	if( ulPortNum > 1 )
	{	/* Parameter error */
		return;
	}
	idx = ulPortNum - 1;

	*regUCR3[idx] = ulConfig ;
}

/*=============================================================================
// Function_Name: TOYA2_UARTSetConfig4
// description	: Set UART
// argument 	: ulPortNum: Port number
//				: ulConfig:  UCR1 setting value
// return		: None
// =============================================================================
*/
void TOYA2_UARTSetConfig4(ULONG ulPortNum, ULONG ulConfig )
{
	UCHAR	idx;		/* Index for array operation */

	if( ulPortNum > 1 )
	{	/* Parameter error */
		return;
	}
	idx = ulPortNum - 1;

	*regUCR4[idx] = ulConfig ;
}


/*=============================================================================
// Function_Name: TOYA2_UARTSetFIFOControl
// description	: Set UART FIFO
// argument 	: ulPortNum: Port number
//				: ulTxTrg  : Transmitter Trigger Level setting vcalue (2 -32)
//				: ulRxTrg  : Receiver Trigger Level setting vcalue(1 - 32)
// return		: None
// =============================================================================
*/
void TOYA2_UARTSetFIFOControl(ULONG ulPortNum, ULONG ulTxTrg, ULONG ulRxTrg )
{
	UCHAR	idx;		/* Index for array operation */
	ULONG	wkUFCR; 	/* Work variable for register setting */

	if( ulPortNum > 1 )
	{	/* Parameter error */
		return;
	}
	idx = ulPortNum - 1;

	wkUFCR = *regUFCR[idx] ;	/* Get the current settings */
	wkUFCR &= ~0x0000FC3F;		 /* Clear the TXTL,RXTL */
	wkUFCR |= ((ulTxTrg<<10) | (ulRxTrg<<0)) ;	/* Reflect the set value */

	*regUFCR[idx] = wkUFCR ;	/* Set the register */
}


/*=============================================================================
// Function_Name: TOYA2_UARTSetRFDIV
// description	: Set UART FIFO
// argument 	: ulPortNum: Port number
//				: ulDivider: Seting of dividing frequency value of input clock(1 - 7)
// return		: None
// =============================================================================
*/
void TOYA2_UARTSetRFDIV(ULONG ulPortNum, ULONG ulDivider )
{
	UCHAR	idx;		/* Index for array operation */
	ULONG	wkUFCR; 	/* Work variable for register setting */

	const ULONG regval[] = { 0, 5, 4, 3, 2, 1, 0, 6 };

	if( ulPortNum > 1 )
	{	/* Parameter error */
		return;
	}
	idx = ulPortNum - 1;

	wkUFCR = *regUFCR[idx] ;			/* Get the current settings */
	wkUFCR &= ~0x00000380;				 /* Clear the value of RFDIV  */

	wkUFCR |= (regval[ulDivider]<<7) ;	/* Reflect the set value */

	*regUFCR[idx] = wkUFCR ;	/* Set the register */
}


/*=============================================================================
// Function_Name: TOYA2_UARTSetDCEMode
// description	: Set UART FIFO
// argument 	: ulPortNum: Port number
//				: ulMode: Set DCE/DTE(0: DCE mode, 1:DTE mode )
// return		: None
// =============================================================================
*/
void TOYA2_UARTSetDCEMode(ULONG ulPortNum, ULONG ulMode )
{
	UCHAR	idx;		/* Index for array operation */
	ULONG	wkUFCR; 	/* Work variable for register setting */

	if( ulPortNum > 1 )
	{	/* Parameter error */
		return;
	}
	idx = ulPortNum - 1;

	wkUFCR = *regUFCR[idx] ;	/* Get the current settings */
	wkUFCR &= ~0x00000040;		 /* Clear RFDIV value. */

	wkUFCR |= (ulMode<<6) ; 	/* Reflect the set value */

	*regUFCR[idx] = wkUFCR ;	/* Set the register */
}


/*=============================================================================
// Function_Name: TOYA2_UARTSetBaudrate
// description	: Set baud rate UART
// argument 	: ulPortNum: Port number
//				: ulBaudrate: Baud rate (bps:
// return		: None
// =============================================================================
*/
void TOYA2_UARTSetBaudrate(ULONG ulPortNum, ULONG ulBaudrate )
{
	ULONG	idx;		/* Index for array operation */

	if( ulPortNum > 1 )
	{	/* Parameter error */
		return;
	}
	idx = ulPortNum - 1;

	*regUBIR[idx] = (ulBaudrate/100) -1;		/* NUM:   Baudrate/100 -1*/
	*regUBMR[idx] = 0x270F; 					/* NUM:   Baudrate/100 -1*/

}

/*=============================================================================
// Function_Name: TOYA2_UARTReadData
// description	: Get the data From UART RxFIFO
// argument 	: ulPortNum: Port number
//				: lDataNum:  The maxmum number of data read
//				: pReadData: Pointer to data reading array
//				: pReadStatus: Pointer to error information storage array
// return		: Number of data (LONG type) actually read. Ret<0 indicates error.
// =============================================================================
*/
LONG TOYA2_UARTReadData(ULONG ulPortNum, LONG lDataNum, UCHAR* pReadData, UCHAR* pReadStatus )
{
	ULONG	idx;		/* Index for array operation */
	ULONG	rxdata;
	LONG	iCnt;

	if( (ulPortNum > 1) ||
		(lDataNum < 1)	||
		(pReadData==0)
	)
	{	/* Parameter error */
		return -1 ;
	}

	idx = ulPortNum - 1;

	for( iCnt=0; iCnt<lDataNum; iCnt++ )
	{
		rxdata = *regURXD[idx];

		if( (rxdata & 0x00008000)==0 )
		{	/* Check out the invalidate data = RxFIFO is emperty  */
			break;
		}

		*pReadStatus = (UCHAR)(rxdata>>8);			/* Save the error information  */
		*pReadData = (UCHAR)(rxdata&0x000000FF);	/* Save the number of data read */

		pReadStatus++;								/* upate pointer */
		pReadData++;
	}
	return iCnt;
}


/*=============================================================================
// Function_Name: TOYA2_UARTSendData
// description	: Write data to UART TxFIFO.
// argument 	: ulPortNum: Port number
//				: lDataNum:  Total number of data written (byte)
//				: pSendData: Pointer to writing data
// return		: Error information: ret<0 indicates error.
// =============================================================================
*/
LONG TOYA2_UARTSendData(ULONG ulPortNum, LONG lDataNum, UCHAR* pSendData )
{
	UCHAR	idx;		/* Index for array operation */
	LONG	iCnt;

	if( (ulPortNum > 1) ||
		(lDataNum < 1)	||
		(pSendData==0)
	)
	{	/* Parameter error */
		return -1 ;
	}
	idx = ulPortNum - 1;

	for( iCnt=0; iCnt<lDataNum; iCnt++ )
	{
		*regUTXD[idx] = *pSendData;
		pSendData++;
	}

	return iCnt;
}



/*=============================================================================
// Function_Name: TOYA2_UARTIsTxReady
// description	: Get the information of if it is possible to transmit
// argument 	: ulPortNum: Port number
// return		: TRUE: It is possible to transmit,FALSE: It is impossible to transmit.
// =============================================================================
*/
LONG TOYA2_UARTIsTxReady(ULONG ulPortNum )
{
	if(ulPortNum > 1)
	{
		return FALSE;
	}

	if( 0==(*regUSR1[ulPortNum-1] & (1<<13)) )
	{
		return FALSE;
	}
	return TRUE;
}



/*
 * Copyright (C)SEIKO EPSON Corp. All Rights Reserved.
 */

⌨️ 快捷键说明

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