blob: bbb6c27fc6de245558c322d19b0d9a31539f1823 [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001/*
2 * (C) Copyright 2016, ZIXC Corporation.
3 *
4 */
5
6#include <common.h>
7#include <errno.h>
8#include <command.h>
9#include <malloc.h>
10#include <jffs2/load_kernel.h>
11#include <linux/list.h>
12#include <linux/ctype.h>
13#include <linux/err.h>
14#include <linux/mtd/mtd.h>
15#include <linux/mtd/partitions.h>
16#include <asm/io.h>
17#include <image.h>
18#include <partition_table.h>
19#include <board.h>
20#include <mmc.h>
21#include <boot_mode.h>
22#include <led.h>
23
24#if defined(CONFIG_CMD_NAND)
25#include <linux/mtd/nand.h>
26#include <nand.h>
27#endif
28
29#include <config.h>
30#include <load_image.h>
31#include <asm/arch/cpu.h>
32#include <secure_verify.h>
33#include <linux/mtd/nor_spifc.h>
xf.li6c8fc1e2023-08-12 00:11:09 -070034#include "pub_flags.h"
lh9ed821d2023-04-07 01:36:19 -070035
36#if LOAD_IMAGE_DEBUG
37#define load_debug_printf(fmt,args...) printf (fmt ,##args)
38#else
39#define load_debug_printf(fmt,args...)
40#endif /* LOAD_IMAGE_DEBUG */
41
42#if TIME_DEBUG
43#define time_debug_reset(fmt) fmt = get_timer(0)
44#define time_debug_printf(fmt, val) printf(fmt ,get_timer(val))
45#else
46#define time_debug_reset(fmt)
47#define time_debug_printf(fmt, val)
48#endif /* TIME_DEBUG */
49#define reg16(addr) (*(volatile unsigned short*)(addr))
50
51DECLARE_GLOBAL_DATA_PTR;
52
53#define ZSP_IMAGE_PATH "/evb_cpuphy.bin"
54#define M0_IMAGE_PATH "/evb_cpurpm.img"
55#define DTB_IMAGE_PATH "/ap_cpucap.dtb"
56#define FOTAFLAG_PATH "/fotaflag"
57
58#if defined(CONFIG_ZX297520V3E_JFFS2_COMPRESS)
59typedef struct lzmaheader_p{
60 uint8_t p_properties;
61 uint8_t p_dict[4];
62 uint8_t p_uncompress_size[8];
63}lzma_header_t;
64
65extern uint32_t ztelzma_compresssize;
66extern int lzmanodeflag;
67#endif
68
69//#ifdef CONFIG_ZX297520V3E_MDL_AB
xf.li6c8fc1e2023-08-12 00:11:09 -070070#if defined(CONFIG_ZX297520V3E_MDL_AB) || defined(CONFIG_ZX297520V3E_VEHICLE_DC) || defined(CONFIG_ZX297520V3E_VEHICLE_DC_REF)
lh9ed821d2023-04-07 01:36:19 -070071extern int imagefs_flag;
72static uint32_t flags;
73#endif
74extern int nand_curr_device;
75extern nand_info_t nand_info[CONFIG_SYS_MAX_NAND_DEVICE];
76extern partition_table_t * g_partition_table;
77extern int flash_dmabuf_disable_flag;
78extern struct fsl_qspi spi_nor_flash;
79
80/* Secure Verify Flag. 1->Disable, 0->Enable */
81extern unsigned int guiEfuseStatus;
82
83uint32_t arm_ps_ep = 0; /* Entry Point Address */
84uint32_t arm_cpucap_ep = 0;
85static uint32_t arm_phy_ep = 0; /* Entry Point Address */
86
87static uint32_t fota_upflag = FOTA_NORMAL;
88static uint32_t fota_psup_flag = FOTA_PS_NORMAL;
89
90uint32_t g_gmac_init_flag = 0;
91uint32_t g_gmac_init_overtime = 0;
92
93static uint32_t sys_ddr_kernel_start = 0; /* kernel ÔËÐпռä Ê×µØÖ· */
94
95master_header_t *master_head = NULL;
96int update_start_time = 0;
97int update_recent_time = 0;
98int led_state = 0;
99
100int rd_offset = 0;
101int rd_size = 0;
102
103
104/* ================================================================================
105 * page_align : Ò³¶ÔÆë
106 */
107static uint32_t page_align(uint32_t offset)
108{
109 struct flash_ops *flash = NULL;
110 uint32_t page_size = 0;
111
112 flash = get_flash_ops();
113 page_size = flash->page_size;
114 if( offset & (page_size - 1) )
115 {
116 offset &= (~(page_size - 1));
117 offset += page_size;
118 }
119 return offset;
120}
121
122/* ================================================================================
123 * page_align : Ò³¶ÔÆë
124 */
125int set_entry_point(uchar * part_name, uint32_t entry_point)
126{
127 if ( strcmp( (char *)ARM_PS_IMAGE, (char *)part_name ) == 0 )
128 {
129 arm_ps_ep = entry_point;
130 return 0;
131 }
132 else if ( strcmp( (char *)ARM_PHY_IMAGE, (char *)part_name ) == 0 )
133 {
134 arm_phy_ep = entry_point;
135 return 0;
136 }
137 else if ( strcmp( (char *)ARM_RAMDISK_IMAGE, (char *)part_name ) == 0 )
138 {
139 return 0;
140 }
141 else
142 {
143 return 1;
144 }
145}
146
147static int arm_image_crc_calc(char* pcPartName,
148 uint32_t uiCRCChkSum,
149 uint32_t uiEntryPoint,
150 uint32_t uiImgSize)
151{
152 uint32_t uiCRCCalRes = 0;
153
154 BOOT_PRINTF(UBOOT_NOTICE, "(%s)CRC Calculate start\n",pcPartName);
155 uiCRCCalRes = crc32(0, (unsigned char*)uiEntryPoint, uiImgSize);
156 BOOT_PRINTF(UBOOT_NOTICE, "(%s) CRC Calculate Res=0x%0x, Size=%d Bytes\n",
157 pcPartName, uiCRCCalRes, uiImgSize);
158 if(uiCRCChkSum != uiCRCCalRes||uiCRCCalRes == 0)
159 {
160 BOOT_PRINTF(UBOOT_ERR, "(%s) CRC Check Failed!\n", pcPartName);
161 return 1;
162 }
163 BOOT_PRINTF(UBOOT_NOTICE, "(%s) CRC Check PASS!\n", pcPartName);
164 return 0;
165}
166
167/* ================================================================================
168 * reform_zsp_image : ´ÓDDRÖжÁÈ¡ZSPÏà¹ØµÄ°æ±¾
169 * @return 0 : ³É¹¦
170 * @return 1 : ʧ°Ü
171 */
172static int reform_zsp_image(uint32_t addr)
173{
174 int ret = 0;
175 int offSet = 0;
176 int lenToRead = 0;
177 int length = 0;
178
179 offSet = addr; /*DDR address for zsp,0x25000000*/
180 uint32_t arm_size = ((reg16(offSet))+(reg16(offSet+2)<<16));/*zsp bin length*/
181
182 /*move zsp's bin from zsp buf to ddr address*/
183 offSet = offSet + 0x4;
184
185 while(1)
186 {
187 if(length >= arm_size - 0x4)
188 {
189 break;
190 }
191 if((reg16(offSet+0x4)+(reg16(offSet+0x4+2)<<16))*2 <0x20000000)//not in ddr
192 {
193 lenToRead = (reg16(offSet+0x8)+(reg16(offSet+0x8+2)<<16))*2;
194 length += lenToRead + 0xc;
195 offSet = offSet + lenToRead+0xc;
196 continue;
197 }
198
199 lenToRead = (reg16(offSet+0x8)+(reg16(offSet+0x8+2)<<16))*2;
200 memcpy((void*)((reg16(offSet+0x4)+(reg16(offSet+0x4+2)<<16))*2),(const void *)(offSet+0xc),lenToRead);
201 length += lenToRead + 0xc;
202 offSet = offSet + lenToRead+0xc;
203 }
204 return 0;
205
206}
207
208
209/* ================================================================================
210 * load_arm_image : ´ÓFLASHÖжÁÈ¡ARM°æ±¾
211 * @return 0 : ³É¹¦
212 * @return 1 : ʧ°Ü
213 */
214int load_arm_image( uchar * part_name )
215{
216 int ret = 0;
217 struct flash_ops *flash = NULL;
218
219#if TIME_DEBUG
220 ulong start_time = 0;
221#endif
222
223 flush_dcache_all();
224 flash_dmabuf_disable_flag = 1;
225 flash = get_flash_ops();
226 time_debug_reset(start_time);
227 load_debug_printf("\n");
228
229 /* ѰÕÒ·ÖÇø */
230 partition_entry_t * entry = find_partition_para(part_name);
231 if( entry == NULL )
232 {
233 BOOT_PRINTF(UBOOT_ERR, "[%s]: can't find the partition...\n", part_name);
234 return 1;
235 }
236
237 /* »ñµÃ·ÖÇøÊ×µØÖ· */
238 uint32_t part_offset = entry->part_offset;
239 nand_info_t *nand = &nand_info[nand_curr_device];
240
241 /* ¶ÁÈ¡°æ±¾ËùÔÚµØÖ·µÄµÚÒ»Ò³Êý¾Ý */
242 uint32_t page_size = flash->page_size; /*¶ÁÈ¡arm °æ±¾mmcµÚÒ»¿éÊý¾Ý*/
243 ret = flash->read(nand,(loff_t)part_offset,&page_size,(u_char *)CONFIG_SYS_SDRAM_TEMP_BASE);
244 if( ret != 0 )
245 {
246 BOOT_PRINTF(UBOOT_ERR, "[%s]: read the first page error!\n", part_name);
247 return 1;
248 }
249
250 /* »ñÈ¡°æ±¾µÄ´óСºÍÔËÐеØÖ· */
251 image_header_t *header = (image_header_t *)CONFIG_SYS_SDRAM_TEMP_BASE;
252 if( ___htonl(header->ih_magic) != IH_MAGIC )
253 {
254 BOOT_PRINTF(UBOOT_ERR, "[%s]: NO bin !!!\n", part_name );
255 return 1;
256 }
257
258 uint32_t arm_size = ___htonl(header->ih_size);
259 uint32_t entey_point = ___htonl(header->ih_ep);
260 if( set_entry_point(part_name, entey_point) )
261 {
262 BOOT_PRINTF(UBOOT_ERR, "[%s][set_entry_point]: error!\n", part_name );
263 }
264
265 BOOT_PRINTF(UBOOT_NOTICE, "[%s] [size=0x%0x] from [0x%0x] to [0x%0x]\n",
266 part_name, arm_size, part_offset, entey_point);
267
268#if LOAD_IMAGE_CRC
269 uint32_t crc_bin = ___htonl(header->ih_dcrc);
270 BOOT_PRINTF(UBOOT_NOTICE, "[%s][crc_bin] ------------------- [0x%0x]\n", part_name, crc_bin);
271#endif
272
273 /* Õû¸öÍ·ºÍ·ÖÇø±íµÄ´óС */
274 uint32_t image_header_size = sizeof(image_header_t);
275 uint32_t arm_is_read_size = flash->page_size - image_header_size;
276 uint32_t arm_size_left = arm_size - arm_is_read_size; /* »¹Ã»ÓжÁÈ¡µÄ³¤¶È */
277 arm_size_left = page_align(arm_size_left); /* Ò³¶ÔÆë */
278
279 /* ¸´ÖƵÚÒ»Ò³ÖеÄÊý¾Ý */
280 memcpy((uchar *)entey_point, (uchar *)(CONFIG_SYS_SDRAM_TEMP_BASE + image_header_size), arm_is_read_size);
281 /* ¶ÁȡʣÓàµÄÊý¾Ý */
282
283 ret = flash->read(nand,(loff_t)(part_offset + page_size), &arm_size_left,(u_char *)(entey_point + arm_is_read_size));
284 if( ret != 0 )
285 {
286 BOOT_PRINTF(UBOOT_ERR, "[%s]: read the others page error...\n", part_name);
287 return 1;
288 }
289
290 BOOT_PRINTF(UBOOT_NOTICE, "[loading...] -------------------- takes [%ld] us\n", start_time);
291
292#if LOAD_IMAGE_CRC
293 time_debug_reset(start_time);
294 uint32_t crc_cal = crc32(0,(unsigned char*)entey_point, arm_size);
295 BOOT_PRINTF(UBOOT_NOTICE, "[%s][crc_bin] ------------------- [0x%0x]\n", part_name, crc_cal);
296 if( crc_bin != crc_cal )
297 {
298 BOOT_PRINTF(UBOOT_ERR, "[%s] ---------------- crc error...\n", part_name);
299 return 1;
300 }
301 BOOT_PRINTF(UBOOT_NOTICE, "[crc...] ------------------------ takes [%ld] us\n", start_time);
302#endif /* LOAD_IMAGE_CRC */
303
304 flash_dmabuf_disable_flag = 0;
305
306 return 0;
307}
308
xf.li6c8fc1e2023-08-12 00:11:09 -0700309#if defined(CONFIG_ZX297520V3E_VEHICLE_DC) || defined(CONFIG_ZX297520V3E_VEHICLE_DC_REF)
lh9ed821d2023-04-07 01:36:19 -0700310int fs_load_dtb_image(void)
311{
312 char cmd[64] = {0};
313 /*1¡¢½«dtbÎļþloadµ½ÁÙʱµØÖ·*/
xf.li6c8fc1e2023-08-12 00:11:09 -0700314#if defined(CONFIG_ZX297520V3E_VEHICLE_DC) || defined(CONFIG_ZX297520V3E_VEHICLE_DC_REF)
lh9ed821d2023-04-07 01:36:19 -0700315 if(imagefs_flag == 1)
316 sprintf(cmd, "fsload imagefs 0x%x %s", (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, DTB_IMAGE_PATH);
317 else
318 sprintf(cmd, "fsload imagefs2 0x%x %s", (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, DTB_IMAGE_PATH);
319#else
320 sprintf(cmd, "fsload imagefs 0x%x %s", (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, DTB_IMAGE_PATH);
321#endif
322 run_command(cmd, 0);
323 flush_dcache_all();
324 /*2¡¢¿½±´°æ±¾Êý¾Ýµ½ÔËÐеØÖ· */
xf.libdd93d52023-05-12 07:10:14 -0700325 memcpy((uchar *)DDR_BASE_CAP_DTB_ADDR,
lh9ed821d2023-04-07 01:36:19 -0700326 (uchar *)(CONFIG_SYS_SDRAM_TEMP_BASE),
327 CAP_DTB_LEN);
328
329 BOOT_PRINTF(UBOOT_NOTICE, "dtb load image finished\n");
330
331 return 0;
332}
xf.libdd93d52023-05-12 07:10:14 -0700333#endif
lh9ed821d2023-04-07 01:36:19 -0700334
335int fs_load_m0_image(void)
336{
337 char cmd[64] = {0};
338 int remap = 0;
339
340 remap = readl(0x140000);
341 remap |= 0x800000;
342 writel(remap,0x140000);
343
344 /*1¡¢½«m0 imgÎļþloadµ½ÁÙʱµØÖ·*/
345//#ifdef CONFIG_ZX297520V3E_MDL_AB
xf.li6c8fc1e2023-08-12 00:11:09 -0700346#if defined(CONFIG_ZX297520V3E_MDL_AB) || defined(CONFIG_ZX297520V3E_VEHICLE_DC) || defined(CONFIG_ZX297520V3E_VEHICLE_DC_REF)
lh9ed821d2023-04-07 01:36:19 -0700347 if(imagefs_flag == 1)
348 sprintf(cmd, "fsload imagefs 0x%x %s", (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, M0_IMAGE_PATH);
349 else
350 sprintf(cmd, "fsload imagefs2 0x%x %s", (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, M0_IMAGE_PATH);
351#else
352 sprintf(cmd, "fsload imagefs 0x%x %s", (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, M0_IMAGE_PATH);
353#endif
354 run_command(cmd, 0);
355 flush_dcache_all();
356
357 /*2¡¢ÉèÖÃM0µÄÈë¿ÚµØÖ·ÒÔ¼°M0°æ±¾°áÔËÍê³Éflagµ½iramÖÐ */
358 writel(1, M0_IMAGE_READY_FLAG_ADDR);
359
360 /*3¡¢µÈ´ýM0¿½±´Íê³É*/
361 while(readl(M0_IMAGE_READY_FLAG_ADDR));
362
363 printf("M0 image load success!\n");
364
365 return 0;
366}
367
368
369#if defined(CONFIG_ZX297520V3E_JFFS2_COMPRESS)
370uint32_t lzma_header(uint32_t *ztelzma_dict,
371 int *ztelzma_lc,
372 int *ztelzma_lp,
373 int *ztelzma_pb)
374{
375 uint8_t temp_properties = 0;
376 uint32_t temp_dict = 0;
377 uint32_t temp_uncompress_size = 0;
378 uint32_t lzma_uncompresssize = 0;
379 lzma_header_t *lzmaheader;
380
381 lzmaheader = (lzma_header_t *)CONFIG_SYS_SDRAM_TEMP_BASE;
382
383 temp_properties = lzmaheader->p_properties;
384 temp_dict = (lzmaheader->p_dict[3]<<24)
385 |(lzmaheader->p_dict[2]<<16)
386 |(lzmaheader->p_dict[1]<<8)
387 |lzmaheader->p_dict[0];
388 temp_uncompress_size = (lzmaheader->p_uncompress_size[3]<<24)
389 |(lzmaheader->p_uncompress_size[2]<<16)
390 |(lzmaheader->p_uncompress_size[1]<<8)
391 |lzmaheader->p_uncompress_size[0];
392
393 *ztelzma_pb = temp_properties / (9 * 5);
394 temp_properties -= *ztelzma_pb * 9 * 5;
395 *ztelzma_lp = temp_properties / 9 ;
396 *ztelzma_lc = temp_properties - *ztelzma_lp * 9;
397 *ztelzma_dict = temp_dict;
398 lzma_uncompresssize = temp_uncompress_size;
399
400 return lzma_uncompresssize;
401}
402
403int fs_load_zsp_image(void)
404{
405 uint32_t image_tmp_buf = 0;
406 int zspimagenum=0;
407 uint32_t ztelzma_uncompresssize = 0;
408 uint32_t ztelzma_dict=0;
409 int ztelzma_lc=0;
410 int ztelzma_lp=0;
411 int ztelzma_pb=0;
412 int firstlzma_flag = 0;
413 int lzma_init_flag = 0;
414 int lzmainit_ret = 0;
415 int lzmadecompr_ret = 1;
416 uint32_t lzmaoffsize = 0;
417 char cmd[64] = {0};
418 uint32_t uiImgHdrlzma = 13;
419
420 BOOT_PRINTF(UBOOT_NOTICE, "zsp image load begin...\n");
421
422 lzmanodeflag = 1;
423
424 /* ÁÙʱ´æ·Å½âѹºóµÄzsp°æ±¾ */
425 image_tmp_buf = CONFIG_SYS_SDRAM_TEMP_LZMA;
426
427 while(lzmanodeflag == 1)
428 {
429 /* ½«zsp imgÎļþloadµ½ÁÙʱµØÖ·*/
430//#ifdef CONFIG_ZX297520V3E_MDL_AB
xf.li6c8fc1e2023-08-12 00:11:09 -0700431#if defined(CONFIG_ZX297520V3E_MDL_AB) || defined(CONFIG_ZX297520V3E_VEHICLE_DC) || defined(CONFIG_ZX297520V3E_VEHICLE_DC_REF)
lh9ed821d2023-04-07 01:36:19 -0700432 if(imagefs_flag == 1)
433 sprintf(cmd, "fsload imagefs 0x%x cpuphy_%02d.lzma",
434 (ulong)CONFIG_SYS_SDRAM_TEMP_BASE,
435 zspimagenum);
436 else
437 sprintf(cmd, "fsload imagefs2 0x%x cpuphy_%02d.lzma",
438 (ulong)CONFIG_SYS_SDRAM_TEMP_BASE,
439 zspimagenum);
440#else
441 sprintf(cmd, "fsload imagefs 0x%x cpuphy_%02d.lzma",
442 (ulong)CONFIG_SYS_SDRAM_TEMP_BASE,
443 zspimagenum);
444#endif
445 run_command(cmd, 0);
446
447 if(ztelzma_compresssize)
448 {
449 /* ½âѹС°üÎļþ*/
450 ztelzma_uncompresssize=lzma_header(&ztelzma_dict,
451 &ztelzma_lc,
452 &ztelzma_lp,
453 &ztelzma_pb);
454
455 if(lzma_init_flag == 0)
456 {
457 lzmainit_ret = lzma_init(&ztelzma_dict,
458 &ztelzma_lc,
459 &ztelzma_lp,
460 &ztelzma_pb);
461 if(lzmainit_ret < 0)
462 {
463 printf("lzma_init failed\n");
464 return -1;
465 }
466 else
467 {
468 lzma_init_flag = 1;
469 }
470 }
471
472 lzmadecompr_ret=lzma_decompress((unsigned char *)(CONFIG_SYS_SDRAM_TEMP_BASE + uiImgHdrlzma),
473 (unsigned char *)(image_tmp_buf + lzmaoffsize),
474 ztelzma_compresssize,
475 ztelzma_uncompresssize);
476 if(lzmadecompr_ret)
477 {
478 printf("lzma_decompress failed\n");
479 return -1;
480 }
481 lzmaoffsize += ztelzma_uncompresssize ;
482 zspimagenum++;
483 }
484 }
485
486 /* °´ÕÕZSPµÄ¸ñÊ½ÖØÅÅ */
487 reform_zsp_image(image_tmp_buf);
488 BOOT_PRINTF(UBOOT_NOTICE, "zsp image load finished.\n");
489
490 return 0;
491}
492
493int fs_load_arm_image_linux(char* image_name)
494{
495 char cmd[64] = {0};
496 int ret = 0;
497 int lzmainit_ret = 0;
498 int lzmadecompr_ret = 1;
499 u8 ucRet = 0;
500 int apimagenum=0;
501 uint32_t uiImgSize = 0;
502 uint32_t uiEntryPoint = 0;
503 uint32_t uiLoadPoint = 0;
504 uint32_t lzmaLoadPoint = 0;
505 uint32_t ztelzma_uncompresssize = 0;
506 uint32_t ztelzma_dict=0;
507 int ztelzma_lc=0;
508 int ztelzma_lp=0;
509 int ztelzma_pb=0;
510 int firstlzma_flag = 0;
511#if LOAD_IMAGE_CRC
512 uint32_t uiCRCChkSum = 0;
513 uint32_t uiCRCCalRes = 0;
514#endif
515 uint32_t uiImgHdrSizeOld = sizeof(image_header_t);
516 uint32_t uiImgHdrSizeNew = 0;
517 uint32_t uiImgHdrlzma = 13;
518 uint32_t lastlzmaSize = 0;
519
520 int lzma_init_flag = 0;
521 lzmanodeflag = 1;
522
523 BOOT_PRINTF(UBOOT_NOTICE, "AP image load begin...\n");
524
525 uiImgHdrSizeNew = sizeof(sImageHeader);
526
527 image_header_t *psImgHdrOld = NULL;
528
529 while(lzmanodeflag == 1)
530 {
531 /*1¡¢½«ap imgÎļþloadµ½ÁÙʱµØÖ·*/
532//#ifdef CONFIG_ZX297520V3E_MDL_AB
xf.li6c8fc1e2023-08-12 00:11:09 -0700533#if defined(CONFIG_ZX297520V3E_MDL_AB) || defined(CONFIG_ZX297520V3E_VEHICLE_DC) || defined(CONFIG_ZX297520V3E_VEHICLE_DC_REF)
lh9ed821d2023-04-07 01:36:19 -0700534 if(imagefs_flag == 1)
535 sprintf(cmd, "fsload imagefs 0x%x /%s_%02d.lzma",
536 (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, image_name, apimagenum);
537 else
538 sprintf(cmd, "fsload imagefs2 0x%x /%s_%02d.lzma",
539 (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, image_name, apimagenum);
540#else
541 sprintf(cmd, "fsload imagefs 0x%x /%s_%02d.lzma",
542#endif
543 (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, image_name, apimagenum);
544
545 run_command(cmd, 0);
546
547 if(ztelzma_compresssize)
548 {
549 /*2¡¢½âѹС°üÎļþ*/
550 ztelzma_uncompresssize=lzma_header(&ztelzma_dict,
551 &ztelzma_lc,
552 &ztelzma_lp,
553 &ztelzma_pb);
554
555 if(lzma_init_flag == 0)
556 {
557 lzmainit_ret = lzma_init(&ztelzma_dict,
558 &ztelzma_lc,
559 &ztelzma_lp,
560 &ztelzma_pb);
561 if(lzmainit_ret < 0)
562 {
563 printf("lzma_init failed\n");
564 return -1;
565 }
566 else
567 {
568 lzma_init_flag = 1;
569 }
570 }
571
572 /*3¡¢»ñÈ¡°æ±¾µÄ´óСºÍÔËÐеØÖ· */
573 if(firstlzma_flag == 0)
574 {
575 lzmadecompr_ret=lzma_decompress((unsigned char *)(CONFIG_SYS_SDRAM_TEMP_BASE+uiImgHdrlzma),
576 (unsigned char *)(CONFIG_SYS_SDRAM_TEMP_LZMA),
577 ztelzma_compresssize,
578 ztelzma_uncompresssize);
579 if(lzmadecompr_ret)
580 {
581 printf("lzma_decompress failed\n");
582 return -1;
583 }
584
585 /*»ñÈ¡¹«Ô¿´«µÝ¸ø´ó°æ±¾Ê¹ÓÃ*/
586 memcpy(CFG_SECURE_PUK_ADDR,CONFIG_SYS_SDRAM_TEMP_LZMA,256);
587
588 psImgHdrOld = (image_header_t *)(CONFIG_SYS_SDRAM_TEMP_LZMA + uiImgHdrSizeNew);
589
590 if(___htonl(psImgHdrOld->ih_magic) != IH_MAGIC)
591 {
592 BOOT_PRINTF(UBOOT_ERR, "Magic Num Check Failed,Maybe no AP bin !!!\n");
593 return 1;
594 }
595
596 uiImgSize = ___htonl(psImgHdrOld->ih_size);
597 uiEntryPoint = ___htonl(psImgHdrOld->ih_ep);
598 uiLoadPoint = ___htonl(psImgHdrOld->ih_load) - uiImgHdrSizeOld; /* ÕâÀïʹÓÃLOADµØÖ· */
599 lzmaLoadPoint = uiLoadPoint;
600 BOOT_PRINTF(UBOOT_NOTICE, "Load AP image, Size=0x%0x, to 0x%0x.\n",
601 uiImgSize, uiLoadPoint);
602
603#if LOAD_IMAGE_CRC
604 uiCRCChkSum = ___htonl(psImgHdrOld->ih_dcrc);
605 BOOT_PRINTF(UBOOT_NOTICE, "AP image CRC Checksum=0x%0x.\n", uiCRCChkSum);
606#endif
607 /*4¡¢¿½±´µÚÒ»°ü°æ±¾Êý¾Ýµ½ÔËÐеØÖ· */
608 memcpy((uchar *)(uiLoadPoint - uiImgHdrSizeNew),
609 (uchar *)(CONFIG_SYS_SDRAM_TEMP_LZMA),
610 ztelzma_uncompresssize);
611 firstlzma_flag = 1;
612 lastlzmaSize = ztelzma_uncompresssize - uiImgHdrSizeNew;
613 }
614 else
615 {
616 lzmaLoadPoint = lzmaLoadPoint + lastlzmaSize ;
617 lastlzmaSize = ztelzma_uncompresssize;
618 /*5¡¢¿½±´Ê£Óà°ü°æ±¾Êý¾Ýµ½ÔËÐеØÖ· */
619
620 lzmadecompr_ret=lzma_decompress((unsigned char *)(CONFIG_SYS_SDRAM_TEMP_BASE+uiImgHdrlzma),
621 (unsigned char *)(lzmaLoadPoint),
622 ztelzma_compresssize, lastlzmaSize);
623 if(lzmadecompr_ret)
624 {
625 printf("lzma_decompress failed\n");
626 return -1;
627 }
628 }
629 apimagenum++;
630 }
631 }
632
633 BOOT_PRINTF(UBOOT_NOTICE, "AP image load finished\n");
634
635 if(guiEfuseStatus == 0) //Secure Verify.
636 {
637 BOOT_PRINTF(UBOOT_DBG, "AP image Start Secure Verify...\n");
638
639 ucRet = secure_verify((u32 )uiLoadPoint - uiImgHdrSizeNew);
640 if(ucRet != 0)
641 {
642 BOOT_PRINTF(UBOOT_ERR, "AP image Secure Verify FAILED!\n");
643 return 1;
644 }
645 BOOT_PRINTF(UBOOT_NOTICE, "AP image Secure Verify PASS!\n");
646 }
647 else
648 {
649 BOOT_PRINTF(UBOOT_NOTICE, "AP image Skip Secure Verify...\n");
650 }
651
652 if(strncmp((const char *)image_name, "cpucap", 6) == 0)
653 {
654 arm_cpucap_ep = uiEntryPoint; /* usually */
655 }
656 else
657 {
658 sys_ddr_kernel_start = uiEntryPoint - 0x8000; /* usually */
659 gd->bd->bi_boot_params = sys_ddr_kernel_start + 0x100;
660 sprintf((char *)cmd," bootm 0x%0x", uiLoadPoint);
661 setenv("bootcmd", (char *)cmd);
662 }
663
664#if LOAD_IMAGE_CRC
665 //invalidate_dcache_range(uiEntryPoint, uiEntryPoint + uiImgSize);
666 ret = arm_image_crc_calc(ARM_APP_IMAGE, uiCRCChkSum, uiEntryPoint, uiImgSize);
667 if(ret != 0)
668 {
669 BOOT_PRINTF(UBOOT_ERR, "ap image crc calc failed, ret = %d! \n", ret);
670 return -1;
671 }
672#endif
673
674 return 0;
675
676}
677#else
678
679int fs_load_zsp_image(void)
680{
681 char cmd[64] = {0};
682 uint32_t image_tmp_buf = 0;
683
684 BOOT_PRINTF(UBOOT_NOTICE, "zsp image load begin...\n");
685 image_tmp_buf = CONFIG_SYS_SDRAM_TEMP_BASE;
686//#ifdef CONFIG_ZX297520V3E_MDL_AB
xf.li6c8fc1e2023-08-12 00:11:09 -0700687#if defined(CONFIG_ZX297520V3E_MDL_AB) || defined(CONFIG_ZX297520V3E_VEHICLE_DC) || defined(CONFIG_ZX297520V3E_VEHICLE_DC_REF)
lh9ed821d2023-04-07 01:36:19 -0700688 if(imagefs_flag == 1)
689 sprintf(cmd, "fsload imagefs 0x%x %s", (ulong)image_tmp_buf, ZSP_IMAGE_PATH);
690 else
691 sprintf(cmd, "fsload imagefs2 0x%x %s", (ulong)image_tmp_buf, ZSP_IMAGE_PATH);
692#else
693 sprintf(cmd, "fsload imagefs 0x%x %s", (ulong)image_tmp_buf, ZSP_IMAGE_PATH);
694#endif
695 run_command(cmd, 0);
696
697 reform_zsp_image(image_tmp_buf);
698 BOOT_PRINTF(UBOOT_NOTICE, "zsp image load finished.\n");
699
700 return 0;
701}
702
703int fs_load_arm_image_linux(char* image_name )
704{
705 char cmd[64] = {0};
706 int ret = 0;
707 u8 ucRet = 0;
708
709 uint32_t uiImgSize = 0;
710 uint32_t uiEntryPoint = 0;
711 uint32_t uiLoadPoint = 0;
712#if LOAD_IMAGE_CRC
713 uint32_t uiCRCChkSum = 0;
714 uint32_t uiCRCCalRes = 0;
715#endif
716 uint32_t uiImgHdrSizeOld = sizeof(image_header_t);
717 uint32_t uiImgHdrSizeNew = 0;
718
719 uiImgHdrSizeNew = sizeof(sImageHeader);
720
721 image_header_t *psImgHdrOld = NULL;
722
723 /*1¡¢½«ap imgÎļþloadµ½ÁÙʱµØÖ·*/
724//#ifdef CONFIG_ZX297520V3E_MDL_AB
xf.li6c8fc1e2023-08-12 00:11:09 -0700725#if defined(CONFIG_ZX297520V3E_MDL_AB) || defined(CONFIG_ZX297520V3E_VEHICLE_DC) || defined(CONFIG_ZX297520V3E_VEHICLE_DC_REF)
lh9ed821d2023-04-07 01:36:19 -0700726 if(imagefs_flag == 1)
727 sprintf(cmd, "fsload imagefs 0x%x /ap_%s.bin",
728 (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, image_name);
729 else
730 sprintf(cmd, "fsload imagefs2 0x%x /ap_%s.bin",
731 (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, image_name);
732#else
733 sprintf(cmd, "fsload imagefs 0x%x /ap_%s.bin",
734 (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, image_name);
735#endif
736 run_command(cmd, 0);
737
738 /*»ñÈ¡¹«Ô¿´«µÝ¸ø´ó°æ±¾Ê¹ÓÃ*/
739 memcpy(CFG_SECURE_PUK_ADDR,CONFIG_SYS_SDRAM_TEMP_BASE,256);
740
741 /*2¡¢»ñÈ¡°æ±¾µÄ´óСºÍÔËÐеØÖ· */
742 psImgHdrOld = (image_header_t *)(CONFIG_SYS_SDRAM_TEMP_BASE + uiImgHdrSizeNew);
743 if(___htonl(psImgHdrOld->ih_magic) != IH_MAGIC)
744 {
745 BOOT_PRINTF(UBOOT_ERR, "Magic Num Check Failed,Maybe no AP bin !!!\n");
746 return 1;
747 }
748
749 uiImgSize = ___htonl(psImgHdrOld->ih_size);
750 uiEntryPoint = ___htonl(psImgHdrOld->ih_ep);
751 uiLoadPoint = ___htonl(psImgHdrOld->ih_load) - uiImgHdrSizeOld; /* ÕâÀïʹÓÃLOADµØÖ· */
752
753 BOOT_PRINTF(UBOOT_NOTICE, "Load AP image, Size=0x%0x, to 0x%0x.\n",
754 uiImgSize, uiLoadPoint);
755
756#if LOAD_IMAGE_CRC
757 uiCRCChkSum = ___htonl(psImgHdrOld->ih_dcrc);
758 BOOT_PRINTF(UBOOT_NOTICE, "AP image CRC Checksum=0x%0x.\n", uiCRCChkSum);
759#endif
760 BOOT_PRINTF(UBOOT_NOTICE, "AP image uiLoadPoint=0x%0x.\n", uiLoadPoint);
761
762 /*3¡¢¿½±´°æ±¾Êý¾Ýµ½ÔËÐеØÖ· */
763 memcpy((uchar *)uiLoadPoint,
764 (uchar *)(CONFIG_SYS_SDRAM_TEMP_BASE + uiImgHdrSizeNew),
765 uiImgSize +uiImgHdrSizeOld);
766
767 BOOT_PRINTF(UBOOT_NOTICE, "AP image load image finished\n");
768
769 if(guiEfuseStatus == 0) //Secure Verify.
770 {
771 BOOT_PRINTF(UBOOT_DBG, "AP image Start Secure Verify...\n");
772
773 ucRet = secure_verify((u32 )CONFIG_SYS_SDRAM_TEMP_BASE);
774 if(ucRet != 0)
775 {
776 BOOT_PRINTF(UBOOT_ERR, "AP image Secure Verify FAILED!\n");
777 return 1;
778 }
779 BOOT_PRINTF(UBOOT_NOTICE, "AP image Secure Verify PASS!\n");
780 }
781 else
782 {
783 BOOT_PRINTF(UBOOT_NOTICE, "AP image Skip Secure Verify...\n");
784 }
785
786 if(strncmp((const char *)image_name, "cpucap", 6) == 0)
787 {
788 arm_cpucap_ep = uiEntryPoint; /* usually */
789 printf("cpucap load finish....\n");
790 }
791 else
792 {
793 sys_ddr_kernel_start = uiEntryPoint - 0x8000; /* usually */
794 gd->bd->bi_boot_params = sys_ddr_kernel_start + 0x100;
795
796 sprintf((char *)cmd," bootm 0x%0x", uiLoadPoint);
797 setenv("bootcmd", (char *)cmd);
798 }
799#if LOAD_IMAGE_CRC
800 //invalidate_dcache_range(uiEntryPoint, uiEntryPoint + uiImgSize);
801 ret = arm_image_crc_calc(ARM_APP_IMAGE, uiCRCChkSum, uiEntryPoint, uiImgSize);
802 if(ret != 0)
803 {
804 BOOT_PRINTF(UBOOT_ERR, "ap image crc calc failed, ret = %d! \n", ret);
805 return -1;
806 }
807#endif
808
809 return 0;
810}
811
812#endif
813
814int load_imagefs(uchar * part_name)
815{
816 int ret = 0;
817 int type = 0;
818 struct flash_ops *flash = NULL;
819 uint32_t i = 0;
820 uint32_t bad_nums = 0;
821 uint32_t part_block_nums = 0;
822 uint32_t part_offset = 0;
823 uint32_t part_size = 0;
824 nand_info_t *nand = &nand_info[nand_curr_device];
825 struct fsl_qspi *nor = &spi_nor_flash;
826
827 /* ´Ë´¦±ØÐëÇå0xFF£¬±£Ö¤¾µÏñÍêÕû£¬²»ÊÜÉÏ´ÎÒÅÁôÊý¾ÝÓ°Ïì*/
828 memset(CONFIG_SYS_SDRAM_IMAGEFS_BASE, 0xFF, CONFIG_SYS_SDRAM_IMAGEFS_SIZE);
829 flush_dcache_all();
830
831 flash_dmabuf_disable_flag = 1;
832 flash = get_flash_ops();
833 type = read_boot_flashtype();
834
835 /* ѰÕÒ·ÖÇø */
836 partition_entry_t * entry = find_partition_para(part_name);
837 if( entry == NULL )
838 {
839 BOOT_PRINTF(UBOOT_ERR, "[%s]: can't find the partition...\n", part_name);
840 return 1;
841 }
842
843 /* »ñµÃ·ÖÇøÊ×µØÖ· */
844 part_offset = entry->part_offset;
845 part_size = entry->part_size;
846
847 if(part_size > CONFIG_SYS_SDRAM_IMAGEFS_SIZE)
848 {
849 BOOT_PRINTF(UBOOT_ERR, "[%s] part size more than SDRAM IMAGEFS space !!!\n", part_name);
850 return 1;
851 }
852
853 if(type == IF_TYPE_NAND || type == IF_TYPE_SPI_NAND)
854 {
855 /* ²éѯµ±Ç°·ÖÇø»µ¿éÊý*/
856 bad_nums = 0;
857 part_block_nums = entry->part_size / nand->erasesize;
858 for(i = 0; i < part_block_nums; i++)
859 {
860 if(nand_block_isbad (nand, entry->part_offset + (loff_t)i * nand->erasesize))
861 {
862 printf("bad block addr = 0x%x\n", (entry->part_offset + i * nand->erasesize));
863 bad_nums++;
864 }
865 }
866
867 part_size = part_size - bad_nums * nand->erasesize;
868 ret = flash->read(nand,(loff_t)part_offset,
869 &part_size,(u_char *)CONFIG_SYS_SDRAM_IMAGEFS_BASE);
870 if( ret != 0 )
871 {
872 BOOT_PRINTF(UBOOT_ERR, "[%s]: read the imagefs error!\n", part_name);
873 return 1;
874 }
875 }
876 else if(type == IF_TYPE_NOR)
877 {
878 ret = nand_read(&(nor->nor[0].mtd), (loff_t)part_offset,
879 &part_size, (u_char *)CONFIG_SYS_SDRAM_IMAGEFS_BASE);
880 if(ret)
881 {
882 BOOT_PRINTF(UBOOT_ERR, "[%s]: read the imagefs error!\n", part_name);
883 return -1;
884 }
885 }
886
887 flash_dmabuf_disable_flag = 0;
888 flush_dcache_all();
889
890 return 0;
891}
892
893//#ifdef CONFIG_ZX297520V3E_MDL_AB
xf.li6c8fc1e2023-08-12 00:11:09 -0700894#if defined(CONFIG_ZX297520V3E_MDL_AB) || defined(CONFIG_ZX297520V3E_VEHICLE_DC) || defined(CONFIG_ZX297520V3E_VEHICLE_DC_REF)
895int load_flags(T_FLAGS_INFO *fotaFlagInfo)
lh9ed821d2023-04-07 01:36:19 -0700896{
897 int ret = 0;
898 int type = 0;
899 uchar * part_name = "flags";
900 struct flash_ops *flash = NULL;
901 uint32_t i = 0;
902 uint32_t off = 0;
903 uint32_t bad_nums = 0;
904 uint32_t part_block_nums = 0;
905 uint32_t part_offset = 0;
906 uint32_t part_size = 0;
907 uint32_t blockNum = 0;
908 uint32_t work_area_offset = 0;
909 uint32_t backup_area_offset = 0;
910 uint32_t flag_one = 0;
xf.li6c8fc1e2023-08-12 00:11:09 -0700911 uint32_t fota_size = sizeof(T_FLAGS_INFO);
lh9ed821d2023-04-07 01:36:19 -0700912 nand_info_t *nand = &nand_info[nand_curr_device];
913 struct fsl_qspi *nor = &spi_nor_flash;
914
915 flush_dcache_all();
916 flash_dmabuf_disable_flag = 1;
917 flash = get_flash_ops();
918 type = read_boot_flashtype();
919
920 /* ѰÕÒ·ÖÇø */
921 partition_entry_t * entry = find_partition_para(part_name);
922 if( entry == NULL )
923 {
924 BOOT_PRINTF(UBOOT_ERR, "[%s]: can't find the partition...\n", part_name);
925 return 1;
926 }
927
928 /* »ñµÃ·ÖÇøÊ×µØÖ· */
929 part_offset = entry->part_offset;
930 part_size = entry->part_size;
931 //while(flag);
932 if(type == IF_TYPE_NAND || type == IF_TYPE_SPI_NAND)
933 {
934 /*È·¶¨¹¤×÷ÇøºÍ±¸·ÝÇøÆ«ÒÆµØÖ·*/
935 for (off = part_offset; off < part_offset+part_size; off += nand->erasesize)
936 {
937 if (!(nand_block_isbad(nand,off)))
938 {
939 blockNum += 1;
940 }
941
942 if((blockNum == 1) && (flag_one == 0))
943 {
944 work_area_offset = off;
945 flag_one = 1;
946 }
947
948 else if(blockNum == 2)
949 {
950 backup_area_offset = off;
951 break;
952 }
953 }
954
955 if(blockNum < 2)
956 {
957 printf("flags partition have not enough space!\n");
958
959 return -1;
960 }
961
962 ret = flash->read(nand,(loff_t)work_area_offset,
963 &fota_size,(u_char *)(fotaFlagInfo));
964 if( ret != 0 )
965 {
966 BOOT_PRINTF(UBOOT_ERR, "[%s]: read the flags error!\n", part_name);
967 return 1;
968 }
969
xf.li6c8fc1e2023-08-12 00:11:09 -0700970 if(fotaFlagInfo->magic_start != FLAGS_MAGIC)
xf.libdd93d52023-05-12 07:10:14 -0700971 {
972 flush_dcache_all();
lh9ed821d2023-04-07 01:36:19 -0700973 ret = flash->read(nand,(loff_t)backup_area_offset,
974 &fota_size,(u_char *)(fotaFlagInfo));
975 if(ret != 0)
976 {
977 printf("read flags backup partition err.\n");
978
979 return -1;
980 }
981
xf.li6c8fc1e2023-08-12 00:11:09 -0700982 if(fotaFlagInfo->magic_start != FLAGS_MAGIC)
lh9ed821d2023-04-07 01:36:19 -0700983 {
984 printf("flags magic err.\n");
985 return -1;
986 }
987 }
988 }
989 else if(type == IF_TYPE_NOR)
990 {
991 work_area_offset = part_offset;
992 backup_area_offset = part_offset + nor->nor[0].mtd.erasesize;
993 ret = nand_read(&(nor->nor[0].mtd), (loff_t)work_area_offset,
994 &fota_size, (u_char *)(fotaFlagInfo));
995 if(ret)
996 {
997 BOOT_PRINTF(UBOOT_ERR, "[%s]: read the flags error!\n", part_name);
998 return -1;
999 }
xf.li6c8fc1e2023-08-12 00:11:09 -07001000 if(fotaFlagInfo->magic_start != FLAGS_MAGIC)
lh9ed821d2023-04-07 01:36:19 -07001001 {
xf.libdd93d52023-05-12 07:10:14 -07001002 flush_dcache_all();
lh9ed821d2023-04-07 01:36:19 -07001003 ret = nand_read(&(nor->nor[0].mtd), (loff_t)backup_area_offset,
1004 &fota_size, (u_char *)(fotaFlagInfo));
1005 if(ret != 0)
1006 {
1007 printf("read flags backup partition err.\n");
1008
1009 return -1;
1010 }
1011
xf.li6c8fc1e2023-08-12 00:11:09 -07001012 if(fotaFlagInfo->magic_start != FLAGS_MAGIC)
lh9ed821d2023-04-07 01:36:19 -07001013 {
1014 printf("flags magic err.\n");
1015 return -1;
1016 }
1017 }
1018 }
1019
1020 flash_dmabuf_disable_flag = 0;
1021 flush_dcache_all();
1022
1023 return 0;
1024}
1025
1026#endif
1027/* ================================================================================
1028 * get_fota_update_flag :
1029 * @return 0 : not fota update
1030 * @return 1 : fota update
1031 * @return -1 : error
1032 */
1033int get_fota_update_flag( void )
1034{
1035 char cmd[64] = {0};
1036//#ifdef CONFIG_ZX297520V3E_MDL_AB
xf.li6c8fc1e2023-08-12 00:11:09 -07001037#if defined(CONFIG_ZX297520V3E_MDL_AB) || defined(CONFIG_ZX297520V3E_VEHICLE_DC) || defined(CONFIG_ZX297520V3E_VEHICLE_DC_REF)
lh9ed821d2023-04-07 01:36:19 -07001038 if(imagefs_flag == 1)
1039 sprintf(cmd, "fsload imagefs 0x%x %s", (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, FOTAFLAG_PATH);
1040 else
1041 sprintf(cmd, "fsload imagefs2 0x%x %s", (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, FOTAFLAG_PATH);
1042#else
1043 sprintf(cmd, "fsload imagefs 0x%x %s", (ulong)CONFIG_SYS_SDRAM_TEMP_BASE, FOTAFLAG_PATH);
1044#endif
1045 run_command(cmd, 0);
1046
1047 if( strncmp( (char *)CONFIG_SYS_SDRAM_TEMP_BASE, (char *)ARM_FOTA_FLAG, strlen(ARM_FOTA_FLAG)) == 0)
1048 {
1049 fota_upflag = FOTA_UPDATE;
1050 }
1051 else if( strncmp( (char *)CONFIG_SYS_SDRAM_TEMP_BASE, (char *)ARM_LOCAL_UPDATE_FLAG, strlen(ARM_LOCAL_UPDATE_FLAG)) == 0)
1052 {
1053 fota_upflag = FOTA_LOCALUPDATE;
1054 }
1055 else if( strncmp( (char *)CONFIG_SYS_SDRAM_TEMP_BASE, (char *)ARM_RECOVERY_FLAG, strlen(ARM_RECOVERY_FLAG)) == 0)
1056 {
1057 fota_upflag = FOTA_RECOVERY;
1058 }
1059 else
1060 {
1061 fota_upflag = FOTA_NORMAL;
1062 }
1063
1064 BOOT_PRINTF(UBOOT_NOTICE, "fota_upflag=%d\n", fota_upflag);
1065
1066 return 0;
1067}
1068
1069/* ================================================================================
1070 * get_gmac_init_flag :
1071 * @return 0 :
1072 * @return 1 :
1073 * @return -1 :
1074 */
1075int get_gmac_init_flag( void )
1076{
1077 //hsy
1078 return 0;
1079}
1080
1081/* ================================================================================
1082 * read_gmac_init_flag :
1083 * @return 0 : not init
1084 * @return 1 : init
1085 */
1086int read_gmac_init_flag( void )
1087{
1088 return g_gmac_init_flag;
1089}
1090
1091/* ================================================================================
1092 * read_gmac_init_overtime :
1093 * @return : Ãë
1094 */
1095int read_gmac_init_overtime( void )
1096{
1097 return g_gmac_init_overtime;
1098}
1099
1100/* ================================================================================
1101 * read_fota_update_flag :
1102 * @return 0 : not fota update
1103 * @return 1 : fota update
1104 */
1105int read_fota_update_flag( void )
1106{
1107 return fota_upflag;
1108}
1109
1110/* ================================================================================
1111 * read_fota_update_flag :
1112 * @return 0 : not fota update
1113 * @return 1 : fota update
1114 */
1115
1116int read_fota_psup_flag( void )
1117{
1118 return fota_psup_flag;
1119}
1120
1121/* ================================================================================
1122 * start_arm_ps : Æô¶¯ ARM_PS °æ±¾
1123 */
1124void start_arm_ps( void )
1125{
1126 void (*ps_start)();
1127
1128 printf("Starting the arm_ps ...\n");
1129 ps_start = (void (*)())arm_ps_ep;
1130 ps_start();
1131}
1132
1133/* ================================================================================
1134 * start_arm_phy : Æô¶¯ ARM_PHY °æ±¾
1135 */
1136void start_arm_phy( void )
1137{
1138 /* д PHY Ìø×ªÆô¶¯´úÂë */
1139 writel(0xE59ff000, SYS_IRAM3_BASE);
1140 writel(arm_phy_ep, SYS_IRAM3_BASE + 8);
1141
1142 /* ÊÍ·ÅÆô¶¯ ARM_PHY */
1143 printf("Starting the arm_phy ...\n");
1144 writel(CPU_PHY_SW_RSTEN, CPU_PHY_SUBSYS_CFG);
1145}
1146
1147/* ================================================================================
1148 * start_cpucap_cores : Æô¶¯°æ±¾
1149 */
1150void start_cpucap_cores( void )
1151{
1152 writel(0xE59ff000, SYS_CPUCAP_BOOT_BASE);
1153 writel(arm_cpucap_ep, SYS_CPUCAP_BOOT_BASE + 8);
1154 printf("cap addr is 0x%x\n",arm_cpucap_ep);
1155 BOOT_PRINTF(UBOOT_NOTICE, "Starting the cpu cap ...\n");
1156 writel(CPU_CAP_SW_RSTEN, CPU_CAP_SUBSYS_CFG);
1157}
1158
1159static void usdelay(volatile int count)
1160{
1161 volatile int cnt = 0;
1162 count =count *8;
1163
1164 while(cnt<count)
1165 {
1166 cnt++;
1167 }
1168 return;
1169}
1170void cap_poweron(void)
1171{
1172 u32 tmp;
1173
1174 BOOT_PRINTF(UBOOT_NOTICE, "cap_poweron ...\n");
1175
1176 tmp = readl(CORE_OUTPUT_SW_CONFIG_REG2) ;/*ap mg on*/
1177 tmp |= (0x1<<3);
1178 writel(tmp, CORE_OUTPUT_SW_CONFIG_REG2);
1179
1180 usdelay(1);
1181
1182 tmp = readl(CORE_OUTPUT_SW_CONFIG_REG2) ;/*ap mg rst*/
1183 tmp &= ~(0x1<<4);
1184 writel(tmp, CORE_OUTPUT_SW_CONFIG_REG2);
1185
1186 usdelay(1);
1187
1188 tmp = readl(CORE_OUTPUT_SW_CONFIG_REG2) ;/*ap mg iso*/
1189 tmp &= ~(0x1<<5);
1190 writel(tmp, CORE_OUTPUT_SW_CONFIG_REG2);
1191
1192 usdelay(1);
1193
1194 tmp = readl(CORE_OUTPUT_SW_CONFIG_REG1) ;/*ap clk on*/
1195 tmp |= (0x1<<2);
1196 writel(tmp, CORE_OUTPUT_SW_CONFIG_REG1);
1197
1198 tmp = readl(CORE_OUTPUT_SWITCH_CONFIG_REG) ; /*ap clk&mg control by hw*/
1199 tmp |= ((0x1<<2)|(0x1<<5));
1200 writel(tmp, CORE_OUTPUT_SWITCH_CONFIG_REG);
1201 //__REG(0x0013a0ac) |= ((0x1<<2)|(0x1<<5)); /*ap clk&mg control by hw*/
1202 //__REG(0x0013a0bc) |= (0x1<<3); /*ap mg off*/
1203 //__REG(0x0013a0bc) &= ~(0x1<<4); /*ap mg rst*/
1204 //__REG(0x0013a0bc) &= ~(0x1<<5); /*ap mg iso*/
1205 //__REG(0x0013a0b8) |= (0x1<<2); /*ap clk off*/
1206
1207}
1208
1209/* ================================================================================
1210 * read_sys_ddr_kernel_start : »ñÈ¡ kernel ÔËÐпռä Ê×µØÖ·
1211 */
1212uint32_t read_sys_ddr_kernel_start(void)
1213{
1214 /* Get Addr from Image Header. */
1215 return sys_ddr_kernel_start;
1216}
1217
1218/* ================================================================================
1219 * update_led_enable : enable led
1220 * @return 0 : ³É¹¦
1221 * @return 1 : ʧ°Ü
1222 */
1223int update_led_enable(int enable)
1224{
1225 int ret = 0;
1226
1227 if(enable)
1228 {
1229#ifdef CONFIG_BOARD_7520_UFI_956
1230 ret = sn3216_SetStatus(LED_CHANNEL_WAN_GREEN,SN3216_LED_STATUS_ON);
1231 ret = sn3216_SetStatus(LED_CHANNEL_LAN_GREEN,SN3216_LED_STATUS_ON);
1232 ret = sn3216_SetStatus(LED_CHANNEL_BAT_GREEN,SN3216_LED_STATUS_ON);
1233 ret = sn3216_SetStatus(LED_CHANNEL_SMS_GREEN,SN3216_LED_STATUS_ON);
1234#endif
1235 }
1236 else
1237 {
1238#ifdef CONFIG_BOARD_7520_UFI_956
1239 ret = sn3216_SetStatus(LED_CHANNEL_WAN_GREEN,SN3216_LED_STATUS_OFF);
1240 ret = sn3216_SetStatus(LED_CHANNEL_LAN_GREEN,SN3216_LED_STATUS_OFF);
1241 ret = sn3216_SetStatus(LED_CHANNEL_BAT_GREEN,SN3216_LED_STATUS_OFF);
1242 ret = sn3216_SetStatus(LED_CHANNEL_SMS_GREEN,SN3216_LED_STATUS_OFF);
1243#endif
1244 }
1245 return ret;
1246}
1247
1248/* ================================================================================
1249 * update_led_twinkle : config led in local update
1250 * @return 0 : ³É¹¦
1251 * @return 1 : ʧ°Ü
1252 */
1253void update_led_twinkle(void)
1254{
1255 int start_time = 0;
1256 if(update_start_time)
1257 {
1258 update_recent_time = get_timer(0);
1259 if(update_recent_time-update_start_time > 6000000) /*1s*/
1260 {
1261 led_state = (~led_state)& 0x00000001;
1262 update_led_enable(led_state); /*LED on/off*/
1263 update_start_time = update_recent_time;
1264 }
1265 }
1266 return ;
1267}
1268
1269/* ================================================================================
1270 * copy_write_part : write data to flash
1271 * @return 0 : ³É¹¦
1272 * @return 1 : ʧ°Ü
1273 */
1274int copy_write_part_gmac(int cnt)
1275{
1276 int ret = 0;
1277 nand_info_t *nand = &nand_info[nand_curr_device];
1278 image_bin_header_t * img_head = &(master_head->image[cnt]);
1279 int filesize = img_head->filelength;
1280 char *partname = (char *)(img_head->partitonname);
1281 int bin_offset = img_head->fileaddr;
1282 int part_offset = img_head->partitonoffset;
1283 //uchar * buf = malloc(12*1024);
1284 uchar *buf = NULL;
1285 partition_entry_t * part = NULL;
1286
1287 buf = kzalloc(12*1024, GFP_KERNEL);
1288 if(buf == NULL)
1289 {
1290 return -1;
1291 }
1292
1293 part = find_partition_para((uchar *)partname);
1294 if(part == NULL)
1295 {
1296 return -1;
1297 }
1298
1299 /* µ±Ç°ÊÇÔÚµçÄÔÉÏÖ´ÐУ¬Ã»ÓеôµçΣÏÕ£¬ËùÒÔ¿ÉÒÔ²Á³ýzloader */
1300 /* zloaderÓÐÁ½²¿·Ö×é³É: 8kµÄbin + 4kµÄ·ÖÇø±í */
1301 if(!strcmp(partname, "zloader"))
1302 {
1303 BOOT_PRINTF(UBOOT_NOTICE, "write part %s, offset=0x%x, filesize=0x%x.\n",
1304 partname, part->part_offset, filesize);
1305 ret = downloader_nand_erase(part,part->part_size);
1306
1307 //memcpy(buf,(u_char *)(CONFIG_SYS_SDRAM_BASE+bin_offset),8192);//zloader
1308 memcpy(buf, (u_char *)(CONFIG_LOADADDR+bin_offset), 8192);//zloader
1309 memcpy((char *)(buf+8192), g_partition_table, 4096);//part
1310
1311 int times = 12*1024/nand->writesize;
1312 int i;
1313 for(i = 0; i < times; i++)
1314 {
1315 ret += nand_write_page_with_no_ecc(nand,
1316 ((loff_t)i*(nand->writesize)),
1317 buf );
1318 buf += nand->writesize;
1319 }
1320 // free(buf);
1321 return ret;
1322 }
1323
1324 if(strcmp(img_head->partitontype,"nand") == 0)
1325 {
1326 BOOT_PRINTF(UBOOT_NOTICE, "write part %s, offset=0x%x, filesize=0x%x\n",
1327 partname, part->part_offset, filesize);
1328 ret = downloader_nand_erase(part,part->part_size);
1329 //ret = nand_write_skip_bad(nand, part->part_offset, &filesize, (u_char *)(CONFIG_SYS_SDRAM_BASE+bin_offset),0);
1330 ret = nand_write_skip_bad(nand, part->part_offset, &filesize, (u_char *)(CONFIG_LOADADDR+bin_offset),0);
1331
1332 }
1333
1334 return ret;
1335}
1336
1337/* ================================================================================
1338 * copy_ddr_allbin : webui local update
1339 * @return 0 : ³É¹¦
1340 * @return 1 : ʧ°Ü
1341 */
1342int copy_ddr_allbin(void)
1343{
1344 int ret = 0;
1345 int i = 0;
1346 int head_size = 0x2000; //total 6608 bytes
1347 nand_info_t *nand = &nand_info[nand_curr_device];
1348
1349 master_head = kzalloc(0x2000, GFP_KERNEL);
1350 if(master_head == NULL)
1351 {
1352 BOOT_PRINTF(UBOOT_ERR, "kzalloc fail!\n");
1353 return -1;
1354 }
1355
1356 memcpy(( u_char *)master_head,(char *)CONFIG_LOADADDR, head_size);
1357
1358 BOOT_PRINTF(UBOOT_NOTICE, "file number = %d\n", master_head->dwFileNumber);
1359
1360 for(i = 0; i < (sizeof(master_head->image)/sizeof(image_bin_header_t))
1361 && i < master_head->dwFileNumber; i++) /* update each partition */
1362 {
1363 ret = copy_write_part_gmac(i);
1364 if(ret != 0)
1365 {
1366 BOOT_PRINTF(UBOOT_ERR, "write from ddr to nand ERROR !!!\n");
1367 return -1;
1368 }
1369 }
1370
1371 return 0;
1372}
1373