[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/boot/common/src/uboot/downloader/cmd_downloader.c b/boot/common/src/uboot/downloader/cmd_downloader.c
new file mode 100644
index 0000000..9d0cbf4
--- /dev/null
+++ b/boot/common/src/uboot/downloader/cmd_downloader.c
@@ -0,0 +1,229 @@
+/*
+ ******************************************************************************
+ * Copyright (C) 2016, ZIXC Corporation.
+ *
+ * File Name:
+ * File Mark:
+ * Description:
+ * Others:
+ * Version:       1.0
+ * Author:        geanfeng
+ * Date:          2013-3-4
+ * History 1:
+ *     Date:
+ *     Version:
+ *     Author:
+ *     Modification:
+ * History 2:
+ *******************************************************************************
+ */
+
+/*
+ ***************************************************************************
+ * 	                                           Include files
+ ***************************************************************************
+ */
+#include <common.h>
+#include <command.h>
+#include <net.h>
+#include "downloader_serial.h"
+#include "partition_table.h"
+
+
+/****************************************************************************
+* 	                                           Local Macros
+****************************************************************************/
+#define TSP_DOWNLOADER_CBSIZE		256 
+ 
+/****************************************************************************
+*							Local Types
+****************************************************************************/
+
+/****************************************************************************
+*							Global Variables
+****************************************************************************/
+//char        tsp_console_buffer[TSP_DOWNLOADER_CBSIZE + 1];	/* downloader I/O buffer	*/
+ char *tsp_console_buffer = (char*)(CONFIG_NAND_DMA_BUF_ADDR+0x4000);
+
+unsigned int null_slice_flag = 0;
+
+
+/****************************************************************************
+*							Global Function Prototypes
+****************************************************************************/
+extern	void downloader_serial_init(void);
+extern int UART_CmdRead(char *pchBuf, int dwLen);
+
+/****************************************************************************
+*							Function Definitions
+****************************************************************************/
+/*******************************************************************************
+ * Function:downloader_readline_into_buffer
+ * Description:
+ * Parameters:
+ *	 Input:
+ *
+ *	 Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+int downloader_readline_into_buffer (char * buffer)
+{
+	char * p_buf = buffer;
+	unsigned int retSize = 0;
+	unsigned int recvSize = 0;
+	
+	while(1)
+		{
+#if CONFIG_USB_DL
+		retSize = downloader_serial_read(p_buf,512);
+#else
+		retSize = UART_CmdRead(p_buf,512);
+#endif
+		if(retSize<=0)
+			{
+				continue;
+			}
+		recvSize += retSize;
+		if(recvSize >= TSP_DOWNLOADER_CBSIZE)
+		{
+			recvSize = 0;
+			p_buf = buffer;
+		}
+		if(buffer[0] == 0x5a) /*filter syc 0x5a*/
+		{
+			printf("readline filter syc 0x5a\n");
+			recvSize = 0;
+			continue;
+		}
+
+		switch(p_buf[retSize-1])
+			{
+			case '\r':           /*Enter */
+			case '\n':
+			case '\0':
+				while(retSize>0)
+					{
+					if( (p_buf[retSize-1] >='a' && p_buf[retSize-1]<='z')  ||\
+						(p_buf[retSize-1] >='A' && p_buf[retSize-1]<='Z') || \
+						(p_buf[retSize-1] >='0' && p_buf[retSize-1]<='9') )   /*filter invalid character*/
+						{
+							break;
+						}
+					retSize--;
+					}
+				p_buf[retSize]='\0';
+				return 0;
+			default:
+				p_buf += retSize;
+				continue;
+			}
+
+		}
+
+	return 0;
+}
+/*******************************************************************************
+ * Function:downloader_readline
+ * Description:
+ * Parameters:
+ *	 Input:
+ *
+ *	 Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+int downloader_readline (char * buffer)
+{
+	/*
+	 * If console_buffer isn't 0-length the user will be prompted to modify
+	 * it instead of entering it from scratch as desired.
+	 */
+	buffer[0] = '\0';
+
+	return downloader_readline_into_buffer(buffer);
+}
+
+/*******************************************************************************
+ * Function:do_downloader
+ * Description:
+ * Parameters:
+ *	 Input:
+ *
+ *	 Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+int do_downloader(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	int ret = 0;
+	int type = 0;
+	char ack[20] = {0};
+    printf( "[sys_entry]: do downloader\n");
+	
+    ret = read_partition_and_check();
+    if( ret != 0 )
+    {
+        printf( "[sys_entry]: read_partition error...\n");
+    }
+
+	type = read_boot_flashtype();
+	if(type == IF_TYPE_NOR)
+	{
+		ret = get_nor_null_slice_flag(&null_slice_flag);
+	    if(ret)
+	    {
+			printf ("nor flash read null_slice_flag error.\n");
+			return 1; 
+	    }
+	}
+
+	downloader_serial_init();
+	printf ("### downloader : serial init success \n");
+
+	/*sync*/
+	while(1)
+		{
+#if CONFIG_USB_DL
+		downloader_serial_read(tsp_console_buffer,512);
+#else
+		downloader_serial_read(tsp_console_buffer,1);
+#endif
+		if(tsp_console_buffer[0]==0x5a)
+			{
+				tsp_console_buffer[0]=0xa7; /*ack*/
+				downloader_serial_write(tsp_console_buffer,1);
+				break;
+			}
+		}
+	
+	/*run commands*/
+	while(1)
+		{
+			downloader_readline(tsp_console_buffer);
+			ret = run_command (tsp_console_buffer, 0);
+			if(ret == -2)
+			{
+				sprintf(ack,"UNKNOWN COMMAND");
+        		downloader_serial_write(ack, strlen(ack)+1);
+			}
+		}
+	
+	return 0;
+}
+
+U_BOOT_CMD(
+	downloader, 1, 0,	do_downloader,
+	"Perform ZIXC TSP downloader",
+	""
+);
+