X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=board%2Fmpl%2Fcommon%2Fcommon_util.c;h=8454420f10551ac8e08d589dbadd0a0a26592561;hb=225f0eaa745adfae05931848543d99942798756a;hp=30dcdadde05bbbe669dd0b9ecf62a2a2e8acf28c;hpb=7205e4075d8b50e4dd89fe39ed03860b23cbb704;p=platform%2Fkernel%2Fu-boot.git diff --git a/board/mpl/common/common_util.c b/board/mpl/common/common_util.c index 30dcdad..8454420 100644 --- a/board/mpl/common/common_util.c +++ b/board/mpl/common/common_util.c @@ -31,83 +31,121 @@ #include #include #include +#include +#include #ifdef CONFIG_PIP405 #include "../pip405/pip405.h" -#include <405gp_pci.h> +#include #endif #ifdef CONFIG_MIP405 #include "../mip405/mip405.h" -#include <405gp_pci.h> +#include #endif -extern int gunzip (void *, int, unsigned char *, int *); -extern int mem_test(unsigned long start, unsigned long ramsize, int quiet); +DECLARE_GLOBAL_DATA_PTR; -#define I2C_BACKUP_ADDR 0x7C00 /* 0x200 bytes for backup */ -#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405) -#define IMAGE_SIZE 0x80000 -#elif defined(CONFIG_VCMA9) -#define IMAGE_SIZE 0x40000 /* ugly, but it works for now */ +#if defined(CONFIG_PATI) +#define FIRM_START 0xFFF00000 #endif -extern flash_info_t flash_info[]; /* info for FLASH chips */ +extern int gunzip(void *, int, uchar *, unsigned long *); +extern int mem_test(ulong start, ulong ramsize, int quiet); -static image_header_t header; +#define I2C_BACKUP_ADDR 0x7C00 /* 0x200 bytes for backup */ +#define IMAGE_SIZE CFG_MONITOR_LEN /* ugly, but it works for now */ +extern flash_info_t flash_info[]; /* info for FLASH chips */ -int mpl_prg(unsigned long src,unsigned long size) +static int +mpl_prg(uchar *src, ulong size) { - unsigned long start; + ulong start; flash_info_t *info; - int i,rc; -#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405) + int i, rc; +#if defined(CONFIG_PATI) + int start_sect; +#endif +#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405) || defined(CONFIG_PATI) char *copystr = (char *)src; - unsigned long *magic = (unsigned long *)src; + ulong *magic = (ulong *)src; #endif info = &flash_info[0]; -#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405) - if(ntohl(magic[0]) != IH_MAGIC) { - printf("Bad Magic number\n"); +#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405) || defined(CONFIG_PATI) + if (uimage_to_cpu (magic[0]) != IH_MAGIC) { + puts("Bad Magic number\n"); return -1; } /* some more checks before we delete the Flash... */ /* Checking the ISO_STRING prevents to program a * wrong Firmware Image into the flash. */ - i=4; /* skip Magic number */ - while(1) { - if(strncmp(©str[i],"MEV-",4)==0) + i = 4; /* skip Magic number */ + while (1) { + if (strncmp(©str[i], "MEV-", 4) == 0) break; - if(i++>=0x100) { - printf("Firmware Image for unknown Target\n"); + if (i++ >= 0x100) { + puts("Firmware Image for unknown Target\n"); return -1; } } /* we have the ISO STRING, check */ - if(strncmp(©str[i],CONFIG_ISO_STRING,sizeof(CONFIG_ISO_STRING)-1)!=0) { - printf("Wrong Firmware Image: %s\n",©str[i]); + if (strncmp(©str[i], CONFIG_ISO_STRING, sizeof(CONFIG_ISO_STRING)-1) != 0) { + printf("Wrong Firmware Image: %s\n", ©str[i]); return -1; } +#if !defined(CONFIG_PATI) start = 0 - size; - for(i=info->sector_count-1;i>0;i--) - { + for (i = info->sector_count-1; i > 0; i--) { info->protect[i] = 0; /* unprotect this sector */ - if(start>=info->start[i]) - break; + if (start >= info->start[i]) + break; } /* set-up flash location */ /* now erase flash */ printf("Erasing at %lx (sector %d) (start %lx)\n", start,i,info->start[i]); - flash_erase (info, i, info->sector_count-1); + if ((rc = flash_erase (info, i, info->sector_count-1)) != 0) { + puts("ERROR "); + flash_perror(rc); + return (1); + } + +#else /* #if !defined(CONFIG_PATI */ + start = FIRM_START; + start_sect = -1; + for (i = 0; i < info->sector_count; i++) { + if (start < info->start[i]) { + start_sect = i - 1; + break; + } + } + + info->protect[i - 1] = 0; /* unprotect this sector */ + for (; i < info->sector_count; i++) { + if ((start + size) < info->start[i]) + break; + info->protect[i] = 0; /* unprotect this sector */ + } + + i--; + /* set-up flash location */ + /* now erase flash */ + printf ("Erasing at %lx to %lx (sector %d to %d) (%lx to %lx)\n", + start, start + size, start_sect, i, + info->start[start_sect], info->start[i]); + if ((rc = flash_erase (info, start_sect, i)) != 0) { + puts ("ERROR "); + flash_perror (rc); + return (1); + } +#endif /* defined(CONFIG_PATI) */ #elif defined(CONFIG_VCMA9) start = 0; - for (i = 0; i sector_count; i++) - { + for (i = 0; i sector_count; i++) { info->protect[i] = 0; /* unprotect this sector */ if (size < info->start[i]) break; @@ -116,76 +154,120 @@ int mpl_prg(unsigned long src,unsigned long size) /* now erase flash */ printf("Erasing at %lx (sector %d) (start %lx)\n", start,0,info->start[0]); - flash_erase (info, 0, i); + if ((rc = flash_erase (info, 0, i)) != 0) { + puts("ERROR "); + flash_perror(rc); + return (1); + } #endif - printf("flash erased, programming from 0x%lx 0x%lx Bytes\n",src,size); - if ((rc = flash_write ((uchar *)src, start, size)) != 0) { - puts ("ERROR "); - flash_perror (rc); + printf("flash erased, programming from 0x%lx 0x%lx Bytes\n", + (ulong)src, size); + if ((rc = flash_write ((char *)src, start, size)) != 0) { + puts("ERROR "); + flash_perror(rc); return (1); } - puts ("OK programming done\n"); + puts("OK programming done\n"); return 0; } -int mpl_prg_image(unsigned long ld_addr) +static int +mpl_prg_image(uchar *ld_addr) { - unsigned long data,len,checksum; - image_header_t *hdr=&header; - /* Copy header so we can blank CRC field for re-calculation */ - memcpy (&header, (char *)ld_addr, sizeof(image_header_t)); - if (ntohl(hdr->ih_magic) != IH_MAGIC) { - printf ("Bad Magic Number\n"); + unsigned long len; + uchar *data; + image_header_t *hdr = (image_header_t *)ld_addr; + int rc; + +#if defined(CONFIG_FIT) + if (genimg_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { + puts ("Non legacy image format not supported\n"); + return -1; + } +#endif + + if (!image_check_magic (hdr)) { + puts("Bad Magic Number\n"); return 1; } - print_image_hdr(hdr); - if (hdr->ih_os != IH_OS_U_BOOT) { - printf ("No U-Boot Image\n"); + image_print_contents (hdr); + if (!image_check_os (hdr, IH_OS_U_BOOT)) { + puts("No U-Boot Image\n"); return 1; } - if (hdr->ih_type != IH_TYPE_FIRMWARE) { - printf ("No Firmware Image\n"); + if (!image_check_type (hdr, IH_TYPE_FIRMWARE)) { + puts("No Firmware Image\n"); return 1; } - data = (ulong)&header; - len = sizeof(image_header_t); - checksum = ntohl(hdr->ih_hcrc); - hdr->ih_hcrc = 0; - if (crc32 (0, (char *)data, len) != checksum) { - printf ("Bad Header Checksum\n"); + if (!image_check_hcrc (hdr)) { + puts("Bad Header Checksum\n"); return 1; } - data = ld_addr + sizeof(image_header_t); - len = ntohl(hdr->ih_size); - printf ("Verifying Checksum ... "); - if (crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) { - printf ("Bad Data CRC\n"); + puts("Verifying Checksum ... "); + if (!image_check_dcrc (hdr)) { + puts("Bad Data CRC\n"); return 1; } - switch (hdr->ih_comp) { - case IH_COMP_NONE: - break; - case IH_COMP_GZIP: - printf (" Uncompressing ... "); - if (gunzip ((void *)(data+0x100000), 0x400000, - (uchar *)data, (int *)&len) != 0) { - printf ("GUNZIP ERROR\n"); + puts("OK\n"); + + data = (uchar *)image_get_data (hdr); + len = image_get_data_size (hdr); + + if (image_get_comp (hdr) != IH_COMP_NONE) { + uchar *buf; + /* reserve space for uncompressed image */ + if ((buf = malloc(IMAGE_SIZE)) == NULL) { + puts("Insufficient space for decompression\n"); return 1; } - data+=0x100000; - break; - default: - printf (" Unimplemented compression type %d\n", hdr->ih_comp); - return 1; + + switch (image_get_comp (hdr)) { + case IH_COMP_GZIP: + puts("Uncompressing (GZIP) ... "); + rc = gunzip ((void *)(buf), IMAGE_SIZE, data, &len); + if (rc != 0) { + puts("GUNZIP ERROR\n"); + free(buf); + return 1; + } + puts("OK\n"); + break; +#ifdef CONFIG_BZIP2 + case IH_COMP_BZIP2: + puts("Uncompressing (BZIP2) ... "); + { + uint retlen = IMAGE_SIZE; + rc = BZ2_bzBuffToBuffDecompress ((char *)(buf), &retlen, + (char *)data, len, 0, 0); + len = retlen; + } + if (rc != BZ_OK) { + printf ("BUNZIP2 ERROR: %d\n", rc); + free(buf); + return 1; + } + puts("OK\n"); + break; +#endif + default: + printf ("Unimplemented compression type %d\n", + image_get_comp (hdr)); + free(buf); + return 1; + } + + rc = mpl_prg(buf, len); + free(buf); + } else { + rc = mpl_prg(data, len); } - printf (" OK\n"); - return(mpl_prg(data,len)); + return(rc); } - +#if !defined(CONFIG_PATI) void get_backup_values(backup_t *buf) { i2c_read(CFG_DEF_EEPROM_ADDR, I2C_BACKUP_ADDR,2,(void *)buf,sizeof(backup_t)); @@ -199,20 +281,20 @@ void set_backup_values(int overwrite) get_backup_values(&back); if(!overwrite) { if(strncmp(back.signature,"MPL\0",4)==0) { - printf("Not possible to write Backup\n"); + puts("Not possible to write Backup\n"); return; } } memcpy(back.signature,"MPL\0",4); i = getenv_r("serial#",back.serial_name,16); if(i < 0) { - printf("Not possible to write Backup\n"); + puts("Not possible to write Backup\n"); return; } back.serial_name[16]=0; i = getenv_r("ethaddr",back.eth_addr,20); if(i < 0) { - printf("Not possible to write Backup\n"); + puts("Not possible to write Backup\n"); return; } back.eth_addr[20]=0; @@ -227,7 +309,7 @@ void clear_env_values(void) memset(&back,0xff,sizeof(backup_t)); memset(env_crc,0x00,4); i2c_write(CFG_DEF_EEPROM_ADDR,I2C_BACKUP_ADDR,2,(void *)&back,sizeof(backup_t)); - i2c_write(CFG_DEF_EEPROM_ADDR,CFG_ENV_OFFSET,2,(void *)env_crc,4); + i2c_write(CFG_DEF_EEPROM_ADDR,CONFIG_ENV_OFFSET,2,(void *)env_crc,4); } /* @@ -241,7 +323,7 @@ int check_env_old_size(ulong oldsize) /* read old CRC */ eeprom_read (CFG_DEF_EEPROM_ADDR, - CFG_ENV_OFFSET, + CONFIG_ENV_OFFSET, (uchar *)&crc, sizeof(ulong)); new = 0; @@ -251,7 +333,7 @@ int check_env_old_size(ulong oldsize) while (len > 0) { int n = (len > sizeof(buf)) ? sizeof(buf) : len; - eeprom_read (CFG_DEF_EEPROM_ADDR, CFG_ENV_OFFSET+off, buf, n); + eeprom_read (CFG_DEF_EEPROM_ADDR, CONFIG_ENV_OFFSET+off, buf, n); new = crc32 (new, buf, n); len -= n; off += n; @@ -275,12 +357,12 @@ void copy_old_env(ulong size) unsigned off; uchar *name, *value; - name=&name_buf[0]; - value=&value_buf[0]; + name = &name_buf[0]; + value = &value_buf[0]; len=size; off = sizeof(long); while (len > off) { - eeprom_read (CFG_DEF_EEPROM_ADDR, CFG_ENV_OFFSET+off, &c, 1); + eeprom_read (CFG_DEF_EEPROM_ADDR, CONFIG_ENV_OFFSET+off, &c, 1); if(c != '=') { *name++=c; off++; @@ -289,16 +371,16 @@ void copy_old_env(ulong size) *name++='\0'; off++; do { - eeprom_read (CFG_DEF_EEPROM_ADDR, CFG_ENV_OFFSET+off, &c, 1); + eeprom_read (CFG_DEF_EEPROM_ADDR, CONFIG_ENV_OFFSET+off, &c, 1); *value++=c; off++; if(c == '\0') break; } while(len > off); - name=&name_buf[0]; - value=&value_buf[0]; - if(strncmp(name,"baudrate",8)!=0) { - setenv(name,value); + name = &name_buf[0]; + value = &value_buf[0]; + if(strncmp((char *)name,"baudrate",8)!=0) { + setenv((char *)name,(char *)value); } } @@ -308,7 +390,7 @@ void copy_old_env(ulong size) void check_env(void) { - unsigned char *s; + char *s; int i=0; char buf[32]; backup_t back; @@ -334,7 +416,7 @@ void check_env(void) } else { copy_old_env(oldsizes[i]); - printf ("INFO: old environment ajusted, use saveenv\n"); + puts("INFO: old environment ajusted, use saveenv\n"); } } else { @@ -353,46 +435,49 @@ extern char *stdio_names[]; void show_stdio_dev(void) { /* Print information */ - printf ("In: "); + puts("In: "); if (stdio_devices[stdin] == NULL) { - printf ("No input devices available!\n"); + puts("No input devices available!\n"); } else { printf ("%s\n", stdio_devices[stdin]->name); } - printf ("Out: "); + puts("Out: "); if (stdio_devices[stdout] == NULL) { - printf ("No output devices available!\n"); + puts("No output devices available!\n"); } else { printf ("%s\n", stdio_devices[stdout]->name); } - printf ("Err: "); + puts("Err: "); if (stdio_devices[stderr] == NULL) { - printf ("No error devices available!\n"); + puts("No error devices available!\n"); } else { printf ("%s\n", stdio_devices[stderr]->name); } } +#endif /* #if !defined(CONFIG_PATI) */ int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { - ulong size,src,ld_addr; + ulong size,src,ld_addr; int result; +#if !defined(CONFIG_PATI) backup_t back; src = MULTI_PURPOSE_SOCKET_ADDR; size = IMAGE_SIZE; +#endif if (strcmp(argv[1], "flash") == 0) { -#if (CONFIG_COMMANDS & CFG_CMD_FDC) +#if defined(CONFIG_CMD_FDC) if (strcmp(argv[2], "floppy") == 0) { - char *local_args[3]; + char *local_args[3]; extern int do_fdcboot (cmd_tbl_t *, int, int, char *[]); - printf ("\nupdating bootloader image from floppy\n"); + puts("\nupdating bootloader image from floppy\n"); local_args[0] = argv[0]; - if(argc==4) { + if(argc==4) { local_args[1] = argv[3]; local_args[2] = NULL; ld_addr=simple_strtoul(argv[3], NULL, 16); @@ -403,26 +488,28 @@ int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) ld_addr=CFG_LOAD_ADDR; result=do_fdcboot(cmdtp, 0, 1, local_args); } - result=mpl_prg_image(ld_addr); + result=mpl_prg_image((uchar *)ld_addr); return result; } -#endif /* (CONFIG_COMMANDS & CFG_CMD_FDC) */ +#endif if (strcmp(argv[2], "mem") == 0) { - if(argc==4) { + if(argc==4) { ld_addr=simple_strtoul(argv[3], NULL, 16); } else { ld_addr=load_addr; } printf ("\nupdating bootloader image from memory at %lX\n",ld_addr); - result=mpl_prg_image(ld_addr); + result=mpl_prg_image((uchar *)ld_addr); return result; } +#if !defined(CONFIG_PATI) if (strcmp(argv[2], "mps") == 0) { - printf ("\nupdating bootloader image from MPS\n"); - result=mpl_prg(src,size); + puts("\nupdating bootloader image from MPS\n"); + result=mpl_prg((uchar *)src,size); return result; } +#endif /* #if !defined(CONFIG_PATI) */ } if (strcmp(argv[1], "mem") == 0) { @@ -437,7 +524,7 @@ int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) src&=0xfff00000; size=0; do { - size++; + size++; printf("\n\nPass %ld\n",size); mem_test(CFG_MEMTEST_START,src,1); if(ctrlc()) @@ -448,9 +535,10 @@ int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) }while(result); return 0; } +#if !defined(CONFIG_PATI) if (strcmp(argv[1], "clearenvvalues") == 0) { - if (strcmp(argv[2], "yes") == 0) + if (strcmp(argv[2], "yes") == 0) { clear_env_values(); return 0; @@ -470,13 +558,13 @@ int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) set_backup_values(1); return 0; } +#endif printf("Usage:\n%s\n", cmdtp->usage); return 1; } -#if (CONFIG_COMMANDS & CFG_CMD_DOC) -extern void doc_probe(ulong physadr); +#if defined(CONFIG_CMD_DOC) void doc_init (void) { doc_probe(MULTI_PURPOSE_SOCKET_ADDR); @@ -498,15 +586,14 @@ extern int get_boot_mode(void); void video_get_info_str (int line_number, char *info) { /* init video info strings for graphic console */ - DECLARE_GLOBAL_DATA_PTR; - PPC405_SYS_INFO sys_info; + PPC4xx_SYS_INFO sys_info; char rev; int i,boot; unsigned long pvr; char buf[64]; char tmp[16]; char cpustr[16]; - unsigned char *s, *e, bc; + char *s, *e, bc; switch (line_number) { case 2: @@ -548,12 +635,12 @@ void video_get_info_str (int line_number, char *info) ++s; break; } - buf[i++]=*s; + buf[i++] = *s; } sprintf(&buf[i]," SN "); i+=4; for (; s < e; ++s) { - buf[i++]=*s; + buf[i++] = *s; } buf[i++]=0; }