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