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.",
+ ""
+);
+