zte's code,first commit

Change-Id: I9a04da59e459a9bc0d67f101f700d9d7dc8d681b
diff --git a/boot/common/src/uboot/downloader/cmd_efuse_program.c b/boot/common/src/uboot/downloader/cmd_efuse_program.c
new file mode 100644
index 0000000..abe9532
--- /dev/null
+++ b/boot/common/src/uboot/downloader/cmd_efuse_program.c
@@ -0,0 +1,276 @@
+/*******************************************************************************
+ * Copyright (C) 2016, ZIXC Corporation.
+ *
+ * File Name:cmd_efuse_program.c
+ * File Mark:
+ * Description:
+ * Others:
+ * Version:       1.0
+ * Author:        zhangdongdong
+ * Date:          2013-3-13
+ * History 1:
+ *     Date:
+ *     Version:
+ *     Author:
+ *     Modification:
+ * History 2:
+  ********************************************************************************/
+
+
+/****************************************************************************
+* 	                                     Include files
+****************************************************************************/
+#include <common.h>
+#include <command.h>
+#include "downloader_config.h"
+#include "downloader_nand.h"
+#include "downloader_serial.h"
+#include <secure_verify.h>
+#include <asm/arch/efuse.h>
+
+/*
+*******************************************************************
+* 	                                     Macro define
+*******************************************************************
+*/
+#define BOARD_TYPE_ZX297520V3		0x0
+#define BOARD_TYPE_ZX297520V3E32M	0x1
+#define BOARD_TYPE_ZX297520V3E64M	0x2
+#define BOARD_TYPE_ZX297520V3E256M	0x3
+
+#define BOARD_TYPE_UNKNOWN			0xFF
+
+
+/****************************************************************************
+*							Global Function Prototypes
+****************************************************************************/
+extern char *tsp_console_buffer;
+
+/*******************************************************************************
+ * Function:do_efuse_program
+ * Description:
+ * Parameters:
+ *	 Input:
+ *
+ *	 Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+ int do_efuse_program(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+    char *cmd = NULL;
+	unsigned int secure_en = 0;
+	unsigned int chip_flag = 0;
+	unsigned int puk_hash[4] = {0};
+
+	if(argc<6)
+    {
+    	printf("invalid parameter\n");
+        return cmd_usage(cmdtp);
+    }
+
+	cmd = argv[1];
+
+	if (strcmp(cmd, "secure_en") == 0) 
+    {
+    	printf("argv2 = %4s\n",argv[2]);
+		if(strcmp(argv[2], "enable") == 0)
+			efuse_program_secure_en(1);
+		else if(strcmp(argv[2], "disable") == 0)
+			efuse_program_secure_en(0);
+		else
+			return -1;
+
+        return 0;
+	}
+
+	if (strcmp(cmd, "chip_flag") == 0) 
+    {
+		chip_flag = (unsigned int)simple_strtoul (argv[2], NULL, 16);
+		printf("efuse chip_flag=0x%x\n",chip_flag);
+		efuse_program_chip_flag(chip_flag);
+			
+        return 0;
+	}
+
+	if (strcmp(cmd, "puk_hash") == 0) 
+    {
+		puk_hash[0] = (unsigned int)simple_strtoul (argv[2], NULL, 16);
+		puk_hash[1] = (unsigned int)simple_strtoul (argv[3], NULL, 16);
+		puk_hash[2] = (unsigned int)simple_strtoul (argv[4], NULL, 16);
+		puk_hash[3] = (unsigned int)simple_strtoul (argv[5], NULL, 16);
+		printf("efuse puk hash0=0x%x, hash1=0x%x, hash2=0x%x, hash3=0x%x\n",puk_hash[0],puk_hash[1],puk_hash[2],puk_hash[3]);
+		efuse_program_puk_hash(puk_hash);
+        return 0;
+	}
+
+	return -1;	
+}
+
+
+/*******************************************************************************
+ * Function:do_efuse_read
+ * Description:
+ * Parameters:
+ *	 Input:
+ *
+ *	 Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+ int do_efuse_read(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+    char *cmd = NULL;
+    char *rx_buffer = tsp_console_buffer;
+    char *ack = tsp_console_buffer;
+	efuse_struct efuse_info ={0};	
+	unsigned int dev_id[3] = {0};
+
+
+	if(argc < 2)
+    {
+    	printf("invalid read parameter\n");
+        return cmd_usage(cmdtp);
+    }
+
+	cmd = argv[1];
+
+	efuse_get_devinfo(&efuse_info);
+	
+	if (strcmp(cmd, "dev_id") == 0) 
+    {
+	
+		dev_id[0] = efuse_info.dev_id[0];
+		dev_id[1] = efuse_info.dev_id[1];
+		dev_id[2] = efuse_info.dev_id[2];
+		
+		sprintf(ack,"dev_id:");
+		downloader_serial_write(ack, strlen(ack)+1);
+
+		memcpy((unsigned char*)(DOWNLOADER_BUFFER_BASE),(unsigned char *)(dev_id),12);	
+		downloader_serial_write_actuallen((const char *)DOWNLOADER_BUFFER_BASE, 12); 
+		
+		printf("devid:[id0] =0x%x, [id1]=0x%x, [id2] =0x%x\n",dev_id[0],dev_id[1],dev_id[2]);
+
+		downloader_readline(rx_buffer);
+		if(memcmp(rx_buffer,"OKAY",4)==0)
+	    {
+	    	sprintf(ack,"DEVID SUCCESS");
+		    downloader_serial_write(ack, strlen(ack)+1);		
+	        return 0;
+	    }	
+	}
+	
+   sprintf(ack,"FAIL COMMAND ERROR");
+   downloader_serial_write(ack, strlen(ack)+1);
+   return -1;	
+}
+
+
+U_BOOT_CMD(
+	efuse_program, CONFIG_SYS_MAXARGS, 0, do_efuse_program,
+	"efuse_program: program [puk_hash/secure_en/chip_flag] [hash0/enable/SPE][hash1][hash2][hash3]",
+	""
+);
+
+U_BOOT_CMD(
+	efuse_read, CONFIG_SYS_MAXARGS, 0, do_efuse_read,
+	"efuse_read: read [devid]",
+	""
+);
+
+/*
+ ******************************************************************************
+ * Function:do_read_board_type
+ * Description:
+ * Parameters:
+ *	 Input:
+ *	 Output:
+ * Returns:
+ * Others:
+ *******************************************************************************
+ */
+ int do_read_board_type(cmd_tbl_t *cmdtp, int flag, 
+ 								int argc, char * const argv[])
+{
+    char *ack = tsp_console_buffer;
+	efuse_struct efuse_info ={0};
+	unsigned int secure_flag = 0;
+	unsigned int chip_flag = 0;
+	unsigned int board_type = 0;
+
+	if(argc != 1)
+    {
+        return cmd_usage(cmdtp);
+    }
+
+	efuse_get_devinfo(&efuse_info);
+
+	secure_flag = efuse_info.secure_flag;
+	chip_flag = secure_flag >> 8;
+	if((chip_flag == ZX297520V3_GW_NYB_1G_DDR)
+		||(chip_flag == ZX297520V3_GW_NYC_1G_DDR)
+		||(chip_flag == ZX297520V3ECO_GW_NYB_1G_DDR)
+		||(chip_flag == ZX297520V3ECO_GW_NYC_1G_DDR)
+		||(chip_flag == ZX297520V3SC_GW_NYC_1G_DDR)
+		||(chip_flag == ZX297520V3ECOSCC_GW_UNILC_1G_DDR)
+		||(chip_flag == ZX297520V3ECOSCC_GW_NYC_1G_DDR)
+		||(chip_flag == ZX297520V3ECOSC_GW_NYC_1G_DDR)
+		||(chip_flag == ZX297520V3ECOSC_GW_UNILC_1G_DDR)
+		||(chip_flag == ZX297520V3_ZW_NYB_1G_DDR)
+		||(chip_flag == ZX297520V3_ZW_NYC_1G_DDR)
+		||(chip_flag == ZX297520V3ECO_ZW_NYB_1G_DDR)
+		||(chip_flag == ZX297520V3ECO_ZW_NYC_1G_DDR))
+	{
+		printf("chip_flag=0x%x board_type is V3.\n", chip_flag);
+		board_type = BOARD_TYPE_ZX297520V3;
+	}
+	else if((chip_flag == ZX297520V3ECO_GW_UNILC_512M_DDR)
+			||(chip_flag == ZX297520V3ECO_GW_APM_512M_DDR)
+			||(chip_flag == ZX297520V3ECO_GW_ESMT_512M_DDR)
+			||(chip_flag == ZX297520V3ECO_ZW_UNILC_512M_DDR)
+			||(chip_flag == ZX297520V3ECO_AZW_UNILC_512M_DDR)
+			||(chip_flag == ZX297520V3ECO_ZW_APM_512M_DDR)
+			||(chip_flag == ZX297520V3ECO_ZW_ESMT_512M_DDR))
+	{
+		printf("chip_flag=0x%x board_type is V3E.\n", chip_flag);
+		board_type = BOARD_TYPE_ZX297520V3E64M;
+	}
+	else if(chip_flag == ZX297520V3ECOSC_GW_NYC_2G_DDR)
+	{
+		printf("chip_flag=0x%x board_type is V3E.\n", chip_flag);
+		board_type = BOARD_TYPE_ZX297520V3E256M;
+	}	
+	else if((chip_flag == ZX297520V3ECO_GW_WINBD_256M_DDR)
+			||(chip_flag == ZX297520V3ECO_GW_UNILC_256M_DDR)
+			||(chip_flag == ZX297520V3ECO_GW_APM_256M_DDR)
+			||(chip_flag == ZX297520V3ECO_ZW_WINBD_256M_DDR)
+			||(chip_flag == ZX297520V3ECO_ZW_UNILC_256M_DDR)
+			||(chip_flag == ZX297520V3ECO_ZW_APM_256M_DDR))
+	{
+		printf("chip_flag=0x%x board_type is V3T.\n", chip_flag);
+		board_type = BOARD_TYPE_ZX297520V3E32M;
+	}
+	else
+	{
+		printf("chip_flag=0x%x board_type is unknown.\n", chip_flag);
+		board_type = BOARD_TYPE_UNKNOWN;
+	}
+
+	sprintf(ack,"%04x", board_type);
+	downloader_serial_write(ack, strlen(ack)+1);
+   	return 0;	
+}
+
+U_BOOT_CMD(
+	read_board_type, CONFIG_SYS_MAXARGS, 0, do_read_board_type,
+	"read board type.",
+	""
+);
+