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