[Feature][T106]ZXW P56U09 code

Only Configure: Yes
Affected branch: master
Affected module: unknow
Is it affected on both ZXIC and MTK: only ZXIC
Self-test: No
Doc Update: No

Change-Id: I3cbd8b420271eb20c2b40ebe5c78f83059cd42f3
diff --git a/boot/common/src/loader/drivers/uart.c b/boot/common/src/loader/drivers/uart.c
new file mode 100644
index 0000000..420b8e0
--- /dev/null
+++ b/boot/common/src/loader/drivers/uart.c
@@ -0,0 +1,282 @@
+/*
+ * 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;
+}
+
+
+