blob: abe9532f0fa3663dad6f2fb5388d3c1028a47cbf [file] [log] [blame]
yuezonghe824eb0c2024-06-27 02:32:26 -07001/*******************************************************************************
2 * Copyright (C) 2016, ZIXC Corporation.
3 *
4 * File Name:cmd_efuse_program.c
5 * File Mark:
6 * Description:
7 * Others:
8 * Version: 1.0
9 * Author: zhangdongdong
10 * Date: 2013-3-13
11 * History 1:
12 * Date:
13 * Version:
14 * Author:
15 * Modification:
16 * History 2:
17 ********************************************************************************/
18
19
20/****************************************************************************
21* Include files
22****************************************************************************/
23#include <common.h>
24#include <command.h>
25#include "downloader_config.h"
26#include "downloader_nand.h"
27#include "downloader_serial.h"
28#include <secure_verify.h>
29#include <asm/arch/efuse.h>
30
31/*
32*******************************************************************
33* Macro define
34*******************************************************************
35*/
36#define BOARD_TYPE_ZX297520V3 0x0
37#define BOARD_TYPE_ZX297520V3E32M 0x1
38#define BOARD_TYPE_ZX297520V3E64M 0x2
39#define BOARD_TYPE_ZX297520V3E256M 0x3
40
41#define BOARD_TYPE_UNKNOWN 0xFF
42
43
44/****************************************************************************
45* Global Function Prototypes
46****************************************************************************/
47extern char *tsp_console_buffer;
48
49/*******************************************************************************
50 * Function:do_efuse_program
51 * Description:
52 * Parameters:
53 * Input:
54 *
55 * Output:
56 *
57 * Returns:
58 *
59 *
60 * Others:
61 ********************************************************************************/
62 int do_efuse_program(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
63{
64 char *cmd = NULL;
65 unsigned int secure_en = 0;
66 unsigned int chip_flag = 0;
67 unsigned int puk_hash[4] = {0};
68
69 if(argc<6)
70 {
71 printf("invalid parameter\n");
72 return cmd_usage(cmdtp);
73 }
74
75 cmd = argv[1];
76
77 if (strcmp(cmd, "secure_en") == 0)
78 {
79 printf("argv2 = %4s\n",argv[2]);
80 if(strcmp(argv[2], "enable") == 0)
81 efuse_program_secure_en(1);
82 else if(strcmp(argv[2], "disable") == 0)
83 efuse_program_secure_en(0);
84 else
85 return -1;
86
87 return 0;
88 }
89
90 if (strcmp(cmd, "chip_flag") == 0)
91 {
92 chip_flag = (unsigned int)simple_strtoul (argv[2], NULL, 16);
93 printf("efuse chip_flag=0x%x\n",chip_flag);
94 efuse_program_chip_flag(chip_flag);
95
96 return 0;
97 }
98
99 if (strcmp(cmd, "puk_hash") == 0)
100 {
101 puk_hash[0] = (unsigned int)simple_strtoul (argv[2], NULL, 16);
102 puk_hash[1] = (unsigned int)simple_strtoul (argv[3], NULL, 16);
103 puk_hash[2] = (unsigned int)simple_strtoul (argv[4], NULL, 16);
104 puk_hash[3] = (unsigned int)simple_strtoul (argv[5], NULL, 16);
105 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]);
106 efuse_program_puk_hash(puk_hash);
107 return 0;
108 }
109
110 return -1;
111}
112
113
114/*******************************************************************************
115 * Function:do_efuse_read
116 * Description:
117 * Parameters:
118 * Input:
119 *
120 * Output:
121 *
122 * Returns:
123 *
124 *
125 * Others:
126 ********************************************************************************/
127 int do_efuse_read(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
128{
129 char *cmd = NULL;
130 char *rx_buffer = tsp_console_buffer;
131 char *ack = tsp_console_buffer;
132 efuse_struct efuse_info ={0};
133 unsigned int dev_id[3] = {0};
134
135
136 if(argc < 2)
137 {
138 printf("invalid read parameter\n");
139 return cmd_usage(cmdtp);
140 }
141
142 cmd = argv[1];
143
144 efuse_get_devinfo(&efuse_info);
145
146 if (strcmp(cmd, "dev_id") == 0)
147 {
148
149 dev_id[0] = efuse_info.dev_id[0];
150 dev_id[1] = efuse_info.dev_id[1];
151 dev_id[2] = efuse_info.dev_id[2];
152
153 sprintf(ack,"dev_id:");
154 downloader_serial_write(ack, strlen(ack)+1);
155
156 memcpy((unsigned char*)(DOWNLOADER_BUFFER_BASE),(unsigned char *)(dev_id),12);
157 downloader_serial_write_actuallen((const char *)DOWNLOADER_BUFFER_BASE, 12);
158
159 printf("devid:[id0] =0x%x, [id1]=0x%x, [id2] =0x%x\n",dev_id[0],dev_id[1],dev_id[2]);
160
161 downloader_readline(rx_buffer);
162 if(memcmp(rx_buffer,"OKAY",4)==0)
163 {
164 sprintf(ack,"DEVID SUCCESS");
165 downloader_serial_write(ack, strlen(ack)+1);
166 return 0;
167 }
168 }
169
170 sprintf(ack,"FAIL COMMAND ERROR");
171 downloader_serial_write(ack, strlen(ack)+1);
172 return -1;
173}
174
175
176U_BOOT_CMD(
177 efuse_program, CONFIG_SYS_MAXARGS, 0, do_efuse_program,
178 "efuse_program: program [puk_hash/secure_en/chip_flag] [hash0/enable/SPE][hash1][hash2][hash3]",
179 ""
180);
181
182U_BOOT_CMD(
183 efuse_read, CONFIG_SYS_MAXARGS, 0, do_efuse_read,
184 "efuse_read: read [devid]",
185 ""
186);
187
188/*
189 ******************************************************************************
190 * Function:do_read_board_type
191 * Description:
192 * Parameters:
193 * Input:
194 * Output:
195 * Returns:
196 * Others:
197 *******************************************************************************
198 */
199 int do_read_board_type(cmd_tbl_t *cmdtp, int flag,
200 int argc, char * const argv[])
201{
202 char *ack = tsp_console_buffer;
203 efuse_struct efuse_info ={0};
204 unsigned int secure_flag = 0;
205 unsigned int chip_flag = 0;
206 unsigned int board_type = 0;
207
208 if(argc != 1)
209 {
210 return cmd_usage(cmdtp);
211 }
212
213 efuse_get_devinfo(&efuse_info);
214
215 secure_flag = efuse_info.secure_flag;
216 chip_flag = secure_flag >> 8;
217 if((chip_flag == ZX297520V3_GW_NYB_1G_DDR)
218 ||(chip_flag == ZX297520V3_GW_NYC_1G_DDR)
219 ||(chip_flag == ZX297520V3ECO_GW_NYB_1G_DDR)
220 ||(chip_flag == ZX297520V3ECO_GW_NYC_1G_DDR)
221 ||(chip_flag == ZX297520V3SC_GW_NYC_1G_DDR)
222 ||(chip_flag == ZX297520V3ECOSCC_GW_UNILC_1G_DDR)
223 ||(chip_flag == ZX297520V3ECOSCC_GW_NYC_1G_DDR)
224 ||(chip_flag == ZX297520V3ECOSC_GW_NYC_1G_DDR)
225 ||(chip_flag == ZX297520V3ECOSC_GW_UNILC_1G_DDR)
226 ||(chip_flag == ZX297520V3_ZW_NYB_1G_DDR)
227 ||(chip_flag == ZX297520V3_ZW_NYC_1G_DDR)
228 ||(chip_flag == ZX297520V3ECO_ZW_NYB_1G_DDR)
229 ||(chip_flag == ZX297520V3ECO_ZW_NYC_1G_DDR))
230 {
231 printf("chip_flag=0x%x board_type is V3.\n", chip_flag);
232 board_type = BOARD_TYPE_ZX297520V3;
233 }
234 else if((chip_flag == ZX297520V3ECO_GW_UNILC_512M_DDR)
235 ||(chip_flag == ZX297520V3ECO_GW_APM_512M_DDR)
236 ||(chip_flag == ZX297520V3ECO_GW_ESMT_512M_DDR)
237 ||(chip_flag == ZX297520V3ECO_ZW_UNILC_512M_DDR)
238 ||(chip_flag == ZX297520V3ECO_AZW_UNILC_512M_DDR)
239 ||(chip_flag == ZX297520V3ECO_ZW_APM_512M_DDR)
240 ||(chip_flag == ZX297520V3ECO_ZW_ESMT_512M_DDR))
241 {
242 printf("chip_flag=0x%x board_type is V3E.\n", chip_flag);
243 board_type = BOARD_TYPE_ZX297520V3E64M;
244 }
245 else if(chip_flag == ZX297520V3ECOSC_GW_NYC_2G_DDR)
246 {
247 printf("chip_flag=0x%x board_type is V3E.\n", chip_flag);
248 board_type = BOARD_TYPE_ZX297520V3E256M;
249 }
250 else if((chip_flag == ZX297520V3ECO_GW_WINBD_256M_DDR)
251 ||(chip_flag == ZX297520V3ECO_GW_UNILC_256M_DDR)
252 ||(chip_flag == ZX297520V3ECO_GW_APM_256M_DDR)
253 ||(chip_flag == ZX297520V3ECO_ZW_WINBD_256M_DDR)
254 ||(chip_flag == ZX297520V3ECO_ZW_UNILC_256M_DDR)
255 ||(chip_flag == ZX297520V3ECO_ZW_APM_256M_DDR))
256 {
257 printf("chip_flag=0x%x board_type is V3T.\n", chip_flag);
258 board_type = BOARD_TYPE_ZX297520V3E32M;
259 }
260 else
261 {
262 printf("chip_flag=0x%x board_type is unknown.\n", chip_flag);
263 board_type = BOARD_TYPE_UNKNOWN;
264 }
265
266 sprintf(ack,"%04x", board_type);
267 downloader_serial_write(ack, strlen(ack)+1);
268 return 0;
269}
270
271U_BOOT_CMD(
272 read_board_type, CONFIG_SYS_MAXARGS, 0, do_read_board_type,
273 "read board type.",
274 ""
275);
276