blob: 420b8e0d808fd165d751dbd51a4797de7ee2c1af [file] [log] [blame]
/*
* Copyright (C) 2016 ZXIC Inc.
*
*/
#include <common.h>
#include <asm/arch/uart.h>
#include <asm/io.h>
#include <asm/arch/top_clock.h>
#include <asm/arch/gpio.h>
#define CONFIG_BAUDRATE 921600
/*******************************************************************************
* Function: serial_gpio_config
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
static void serial_gpio_config(void)
{
#ifdef CONFIG_ZX297520V3E_CPE
unsigned int tmp = 0;
/*uart0_cts----->uart1_txd*/
__REG(PAD_TOP_FUNC_BASE+0x20) |= (1<<2);
tmp = __REG(PAD_PD_FUNC_BASE+0x4);
tmp &= ~(0x3<<2);
__REG(PAD_PD_FUNC_BASE+0x4) = tmp | (0x1<<2);
/*uart0_rts----->uart1_rxd*/
__REG(PAD_TOP_FUNC_BASE+0x20) |= (1<<3);
tmp = __REG(PAD_PD_FUNC_BASE+0x4);
tmp &= ~(0x3<<4);
__REG(PAD_PD_FUNC_BASE+0x4) = tmp | (0x1<<4);
#endif
}
/*******************************************************************************
* Function:
* Description: ÉèÖô®¿ÚµÄ²¨ÌØÂÊ
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
static void serial_setbrg(void)
{
u32 uartClk = 26000000;
u32 ibrd = uartClk / (CONFIG_BAUDRATE << 4);
u32 fbrd = (((uartClk-((ibrd*CONFIG_BAUDRATE)<<4))<<6)+(CONFIG_BAUDRATE<<3))/(CONFIG_BAUDRATE<<4);
__REG(UART_IBRD) = ibrd;
__REG(UART_FBRD) = fbrd;
#if 0
if( __REG(PLL_624_208_CFG0_REG) & PLL_624_208_CFG0_LOCK )
{
__REG(UART_IBRD) = 0x38;
__REG(UART_FBRD) = 0x1b;
}
else
{
__REG(UART_IBRD) = 0x2; /* midify !!! */
__REG(UART_FBRD) = 0x16;
}
#endif
}
/*******************************************************************************
* Function:
* Description: ³õʼ»¯´®¿Ú²ÎÊý 115200
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
void uart_init(void)
{
int count = 3000;
while(__REG(UART_FR) & UART_FR_TXBUSY){
if(--count == 0)
{
break;
}
}
/* Òý½Å¸´ÓÃÉèÖà */
serial_gpio_config();
/* ½ûÓÃUART */
__REG(UART_ICR) = 0xffff;
__REG(UART_CR) &= (~(UART_EN | UART_TXE));
/* ²¨ÌØÂÊÉèÖà */
serial_setbrg();
/* ÉèÖô«Êä¸ñʽΪ: ÎÞУÑé/1λֹͣλ/8λÊý¾Ýλ/ʹÄÜ FIFO £»¼Ä´æÆ÷³õʼ»¯Îª 0x0 */
__REG(UART_LCR_H) &= (~(UART_BREAK | UART_PEN | UART_STP2 ));
__REG(UART_LCR_H) |= (UART_WLEN_8 | UART_FEN );
/* ÆÁ±ÎËùÓеÄuartÄ£¿é·¢³öµÄÖÐ¶Ï */
__REG(UART_IMSC) &= (~UART_INT_MASK);
/* ʹÄÜUART */
__REG(UART_CR) |= (UART_TXE | UART_EN );
}
/*******************************************************************************
* Function: uart_putc
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
void uart_putc(const char c)
{
/* µÈ´ý·¢ËÍ FIFO ²»Âú£¬¿ÉÒÔдÊý¾Ý */
while ((__REG(UART_FR) & UART_TXFF) != 0 );
__REG(UART_DR) = c;
/* If \n, also do \r */
if (c == '\n')
uart_putc('\r');
}
/*******************************************************************************
* Function: uart_puts
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
void uart_puts (const char *s)
{
while (*s) {
uart_putc (*s++);
}
}
/*******************************************************************************
* Function: uart_getc
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
char uart_getc(void)
{
while ((__REG(UART_FR) & UART_RXFE) != 0 );
return (__REG(UART_DR) & 0xff);
}
/*******************************************************************************
* Function: uart_tstc
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
int uart_tstc(void)
{
if( __REG(UART_FR) & UART_RXFE )
return 0; //µÈÓÚ1ʱ£¬½ÓÊÕFIFOΪ¿Õ£¬Ã»ÓÐÊý¾Ý
else
return 1; //µÈÓÚ0ʱ£¬½ÓÊÕFIFO²»Îª¿Õ£¬ÓÐÊý¾Ý;
}
/*******************************************************************************
* Function:
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
int UART_Read(char *pchBuf, int dwLen)
{
int i = 0;
for(i=0;i<dwLen;i++)
{
pchBuf[i] = (char)uart_getc();
}
return dwLen;
}
/*******************************************************************************
* Function:
* Description:
* Parameters:
* Input:
*
* Output:
*
* Returns:
*
*
* Others:
********************************************************************************/
int UART_Write(char *pchBuf, int dwLen)
{
int i = 0;
for(i=0;i<dwLen;i++)
{
uart_putc(pchBuf[i]);
}
return dwLen;
}
int UART_Check_Sync(char *pchBuf, int dwLen)
{
int ret = 0;
ret = UART_Read(pchBuf,1);
if(0x5A!=*pchBuf)
{
return 0;
}
return ret;
}