📄 update.c~
字号:
/*
**************************************************************************************
* Copyright (c) 2005 vBridge Microsystem, Inc.
* Unpublished & Not for Publication
* All Rights Reserved
*
* Description : for update system
*
* Date : 2006-8-9
**************************************************************************************
*/
#include "cli.h"
#include "image.h"
#include "boot2cpu.h"
#include "update.h"
#include "flash.h"
#define TEMP_SPACE 0x81800000
#define IMAGE_HEAD_ADDR 0x60000
#define IMAGE_NUMBER 5
static int (*startlinux)(void);
int optind = 1;
extern char *boot_device_name;
long get_offset(e_IMAGE imageid);
/*
* print sizes as "xxx kB", "xxx.y kB", "xxx MB" or "xxx.y MB" as needed;
* allow for optional trailing string (like "\n")
*/
void print_size (unsigned int size, const char *s)
{
unsigned int m, n;
unsigned int d = 1 << 20; /* 1 MB */
char c = 'M';
if (size < d) { /* print in kB */
c = 'k';
d = 1 << 10;
}
n = size / d;
m = (10 * (size - (n * d)) + (d / 2) ) / d;
if (m >= 10) {
m -= 10;
n += 1;
}
printf ("%2ld", n);
if (m) {
printf (".%ld", m);
}
printf (" %cB%s", c, s);
}
static void
print_type (image_header_t *hdr)
{
char *os, *arch, *type, *comp;
switch (hdr->ih_os) {
case IH_OS_INVALID: os = "Invalid OS"; break;
case IH_OS_NETBSD: os = "NetBSD"; break;
case IH_OS_LINUX: os = "Linux"; break;
case IH_OS_VXWORKS: os = "VxWorks"; break;
case IH_OS_QNX: os = "QNX"; break;
case IH_OS_U_BOOT: os = "U-Boot"; break;
case IH_OS_RTEMS: os = "RTEMS"; break;
#ifdef CONFIG_ARTOS
case IH_OS_ARTOS: os = "ARTOS"; break;
#endif
#ifdef CONFIG_LYNXKDI
case IH_OS_LYNXOS: os = "LynxOS"; break;
#endif
default: os = "Unknown OS"; break;
}
switch (hdr->ih_arch) {
case IH_CPU_INVALID: arch = "Invalid CPU"; break;
case IH_CPU_ALPHA: arch = "Alpha"; break;
case IH_CPU_ARM: arch = "ARM"; break;
case IH_CPU_I386: arch = "Intel x86"; break;
case IH_CPU_IA64: arch = "IA64"; break;
case IH_CPU_MIPS: arch = "MIPS"; break;
case IH_CPU_MIPS64: arch = "MIPS 64 Bit"; break;
case IH_CPU_PPC: arch = "PowerPC"; break;
case IH_CPU_S390: arch = "IBM S390"; break;
case IH_CPU_SH: arch = "SuperH"; break;
case IH_CPU_SPARC: arch = "SPARC"; break;
case IH_CPU_SPARC64: arch = "SPARC 64 Bit"; break;
case IH_CPU_M68K: arch = "M68K"; break;
case IH_CPU_MICROBLAZE: arch = "Microblaze"; break;
case IH_CPU_NIOS: arch = "Nios"; break;
case IH_CPU_NIOS2: arch = "Nios-II"; break;
default: arch = "Unknown Architecture"; break;
}
switch (hdr->ih_type) {
case IH_TYPE_INVALID: type = "Invalid Image"; break;
case IH_TYPE_STANDALONE:type = "Standalone Program"; break;
case IH_TYPE_KERNEL: type = "Kernel Image"; break;
case IH_TYPE_RAMDISK: type = "RAMDisk Image"; break;
case IH_TYPE_MULTI: type = "Multi-File Image"; break;
case IH_TYPE_FIRMWARE: type = "Firmware"; break;
case IH_TYPE_SCRIPT: type = "Script"; break;
default: type = "Unknown Image"; break;
}
switch (hdr->ih_comp) {
case IH_COMP_NONE: comp = "uncompressed"; break;
case IH_COMP_GZIP: comp = "gzip compressed"; break;
case IH_COMP_BZIP2: comp = "bzip2 compressed"; break;
default: comp = "unknown compression"; break;
}
printf ("%s %s %s (%s)", arch, os, type, comp);
}
void
print_image_hdr (image_header_t *hdr)
{
printf("Magic: 0x%x: \n",hdr->ih_magic);
printf (" Image Name: %s\n", hdr->ih_name);
puts (" Image Type: "); print_type(hdr);
printf ("\n Data Size: %d Bytes = ", hdr->ih_size);
print_size (hdr->ih_size, "\n");
printf (" Load Address: %08x\n"
" Entry Point: %08x\n",
hdr->ih_load,hdr->ih_ep);
if (hdr->ih_type == IH_TYPE_MULTI) {
int i;
unsigned int len;
unsigned int *len_ptr = (unsigned int *)((unsigned int)hdr + sizeof(image_header_t));
puts (" Contents:\n");
for (i=0; (len = *len_ptr); ++i, ++len_ptr) {
printf (" Image %d: %8ld Bytes = ", i, len);
print_size (len, "\n");
}
}
}
void print_warning(void)
{
//printf();
puts(" //********************************************************//\n");
puts(" //*** ***//\n");
puts(" //*** WARNING: Update process will erase flash!!! ***//\n");
puts(" //*** Please keep power on!! ***//\n");
puts(" //*** ***//\n");
puts(" //********************************************************//\n");
puts(" \nPress 'y' for update & 'n' cancel: \n");
}
#ifdef VB_update
char *UpdateHelp[] = {
"Update system image",
"update [tftpsrv] [imagename]",
0,
};
/* Update():
* Code that handles the user interface. See UpdateHelp[] below for usage.
*/
int
Update(int argc,char *argv[])
{
char *mode, *file, *info, *flags;
unsigned int addr,data,len,checksum,verify,tftpsize,new_version,i,snum,process,step,rc;
image_header_t *phead,header;
short *tmp;
struct flashinfo *fdev;
printf("update 1\n");
fdev = nametofdev(boot_device_name);
printf("update 2\n");
//fdev = nametofdev(boot_device_name);
phead = &header;
//get image file through tftp client
file = (char *)0;
info = (char *)0;
flags = (char *)0;
mode = "octet";
//RiscBootRisc1();
//return 0;
if (argc == 4)
addr = (unsigned int)strtol(argv[3],0,0);
else if (argc == 3)
addr = getAppRamStart();
else
return(CMD_PARAM_ERROR);
puts("\n//============ STEP 1: Download image:\n");
printf("Downloader update image from %s to 0x%x...\n",argv[1],addr);
tftpsize = tftpGet(addr,argv[1],mode,argv[2],file,flags,info);
if(!tftpsize)
return 0;
//printf("Downloader OK,CRC check...\n");
phead = (image_header_t *)addr;
puts("\n//============ STEP 2: File check\n");
if(phead->ih_magic != IH_MAGIC)
{
puts ("Bad Magic Number\n");
return 0;
}
data = addr;
len = sizeof(image_header_t);
checksum = phead->ih_hcrc;
phead->ih_hcrc = 0;
if (crc32 (0, (unsigned char *)data, len) != checksum) {
puts ("Bad Header Checksum\n");
return 1;
}
data = addr + sizeof(image_header_t);
len = phead->ih_size;
verify = 1;
if (verify) {
puts (" Verifying Checksum ... ");
if (crc32 (0, (unsigned char *)data, len) != phead->ih_dcrc) {
printf ("Bad Data CRC\n");
return 1;
}
puts ("OK\n");
}
puts("\n//============ STEP 3: Display image header\n");
puts("\nNew image:\n");
print_image_hdr(phead);
len += sizeof(image_header_t);
//new_version = phead->ih_version;
//data = (int *)&header;
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
NorFlashRd(IMAGE_HEAD_ADDR, (short *)&header, sizeof(image_header_t)/2+1);
#else
SflashReadByte(IMAGE_HEAD_ADDR, (char *)&header, sizeof(image_header_t));
#endif
//phead = 0xa181e000;
puts("\nOld image:\n");
print_image_hdr(&header);
*/
puts("\n//============ STEP 4: Erase & Write flash\n\n");
print_warning();
while(1)
{
char readchar = (char)getchar();
if( readchar == 'y')
{
//printf("\nBootloader console...\n");
break;
}
else if(readchar =='n')
{
return 0;
}
else
print_warning();
}
puts("\n");
for(i = IMAGE_START_SEC;i<=IMAGE_END_SEC;i++)
{
printf("Erase sector %d...\n",i);
rc = fdev->flerase(fdev,i);
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
NorFlashErase(i);
#else
SflashSecErase(i);
#endif
printf("OK\n");
*/
}
printf("\nWrite image from 0x%x to 0x%x:\n",addr,IMAGE_HEAD_ADDR);
rc = fdev->flwrite(fdev,IMAGE_HEAD_ADDR,(unsigned char *)addr,len);
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
tmp = (short *)addr;
step = len/200;
process = 0;
for(snum=0;snum<=(len+1);snum+=2)
{
NorFlashProg(IMAGE_HEAD_ADDR+snum, *tmp++);
//dest++;
if(snum>=process)
{
putchar('*');
process += step;
}
}
#else
SflashProgWord(IMAGE_HEAD_ADDR,addr, len/4 + 1);
#endif
*/
printf("OK\n");
puts("Update successfully,Please restart system!!!\n");
}
#endif
char *UpdateQVHelp[] = {
"Updateqv system image",
"updateqv [tftpsrv] [ucos image name] [kernel image name] [romfs image name]",
"If image name is 'no', Don't update the image !!!",
0,
};
/* Update():
* Code that handles the user interface. See UpdateHelp[] below for usage.
*/
int
UpdateQV(int argc,char *argv[])
{
char *mode, *file, *info, *flags;
unsigned int addr,data,len,checksum,verify,tftpsize,new_version,i,snum,process,step,rc;
image_header_t *phead,header;
short *tmp;
struct flashinfo *fdev;
// UPDATE_QV_FLAG = 1; // use UpdateQv to update image
// printf("update 1\n");
fdev = nametofdev(boot_device_name);
// printf("update 2\n");
//fdev = nametofdev(boot_device_name);
phead = &header;
//get image file through tftp client
file = (char *)0;
info = (char *)0;
flags = (char *)0;
mode = "octet";
//RiscBootRisc1();
//return 0;
if (argc == 7)
addr = (unsigned int)strtol(argv[5],0,0);
else if (argc == 6)
addr = getAppRamStart();
else
return(CMD_PARAM_ERROR);
//########## UCOS
if(strcmp(argv[2],"no")!= 0)
{
printf("\n Update UCOS image !!! \n");
printf("\n ============ STEP 1: downloading UCOS image to 0x%x ...\n\n",addr);
tftpsize = tftpGet(addr,argv[1],mode,argv[2],file,flags,info);
if(!tftpsize)
return 0;
phead = (image_header_t *)addr;
printf("\n ============ STEP 2: file checking ...\n\n");
if(phead->ih_magic != IH_MAGIC) //
{
puts ("Bad Magic Number\n");
return 0;
}
if(phead->ih_magic != IH_MAGIC)
{
puts ("Bad Magic Number\n");
return 0;
}
data = addr;
len = sizeof(image_header_t);
checksum = phead->ih_hcrc;
phead->ih_hcrc = 0;
if (crc32 (0, (unsigned char *)data, len) != checksum) {
puts ("Bad Header Checksum\n");
return 1;
}
data = addr + sizeof(image_header_t);
len = phead->ih_size;
verify = 1;
if (verify) {
puts (" Verifying Checksum ... ");
if (crc32 (0, (unsigned char *)data, len) != phead->ih_dcrc) {
printf ("Bad Data CRC\n");
return 1;
}
puts ("OK\n");
}
printf("\n ============ STEP 3: display image header \n\n");
print_image_hdr(phead);
len += sizeof(image_header_t);
printf("\n ============ STEP 4: Erase & Write flash \n\n");
print_warning();
while(1)
{
char readchar = (char)getchar();
if( readchar == 'y')
{
//printf("\nBootloader console...\n");
break;
}
else if(readchar =='n')
{
return 0;
}
else
print_warning();
}
puts("\n");
for(i = UCOS_IMAGE_START_SEC;i<=UCOS_IMAGE_END_SEC;i++)
{
printf("Erase sector %d...",i);
rc = fdev->flerase(fdev,i);
printf("OK\n");
}
printf("\nWrite image from 0x%x to 0x%x:\n",addr,UCOS_IMAGE_START_ADDR);
rc = fdev->flwrite(fdev,UCOS_IMAGE_START_ADDR,(unsigned char *)addr,len);
printf("OK\n");
}
//########### kernel
if(strcmp(argv[3],"no") != 0)
{
printf("\n\n Update Linux kernel image !!! \n");
printf("\n ============ STEP 1: downloading Linux kernel image to 0x%x ...\n\n",addr);
tftpsize = tftpGet(addr,argv[1],mode,argv[3],file,flags,info);
if(!tftpsize)
return 0;
phead = (image_header_t *)addr;
printf("\n ============ STEP 2: file checking ...\n\n");
if(phead->ih_magic != IH_MAGIC) //
{
puts ("Bad Magic Number\n");
return 0;
}
if(phead->ih_magic != IH_MAGIC)
{
puts ("Bad Magic Number\n");
return 0;
}
data = addr;
len = sizeof(image_header_t);
checksum = phead->ih_hcrc;
phead->ih_hcrc = 0;
if (crc32 (0, (unsigned char *)data, len) != checksum) {
puts ("Bad Header Checksum\n");
return 1;
}
data = addr + sizeof(image_header_t);
len = phead->ih_size;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -