📄 update.c~
字号:
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 = FILE_IMAGE_START_SEC;i<=FILE_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,FILE_IMAGE_START_ADDR);
rc = fdev->flwrite(fdev,FILE_IMAGE_START_ADDR,(unsigned char *)addr,len);
printf("OK\n");
}
//################ jffs2 file system
if(strcmp(argv[5],"no") != 0)
{
printf("\n Update Jffs2 File system image !!! \n");
printf("\n ============ STEP 1: downloading jffs2 File system image to 0x%x ...\n\n",addr);
tftpsize = tftpGet(addr,argv[1],mode,argv[5],file,flags,info);
if(!tftpsize)
return 0;
// phead = (image_header_t *)addr;
// printf("\n tftpsize is %d \n",tftpzize);
len = tftpsize;
/*
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 2: 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 = JFFS2_IMAGE_START_SEC;i<=JFFS2_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,JFFS2_IMAGE_START_ADDR);
rc = fdev->flwrite(fdev,JFFS2_IMAGE_START_ADDR,(unsigned char *)addr,len);
printf("OK\n");
}
puts("Update successfully,Please restart system!!!\n");
}
// by shunzi
/* get_offset()
* get image offset relative whole image.
*/
long get_offset(e_IMAGE imageid)
{
unsigned int i, ptrs,pos,size,rc;
char p[100];//*p = malloc(sizeof(image_header_t) + 4*IMAGE_NUMBER);
unsigned int offset[IMAGE_NUMBER],*data;
image_header_t *hdr,header;
struct flashinfo *fdev;
fdev = nametofdev(boot_device_name);
if(imageid == UCOS)
{
// printf("dev name = %s, dest = 0x%x, addr = 0x%x\n",fdev->device_name,p,IMAGE_HEAD_ADDR);
rc = fdev->flread(fdev,p,UCOS_IMAGE_START_ADDR,sizeof(image_header_t));
hdr = (image_header_t *)p;
switch(hdr->ih_comp)
{
case IH_COMP_NONE:
printf("\nload %s to address 0x%x...",hdr->ih_name,hdr->ih_ep);
rc = fdev->flread(fdev,hdr->ih_ep,UCOS_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);
printf("OK\n");
break;
case IH_COMP_GZIP:
printf("\nload %s to address 0x%x...",hdr->ih_name,data);
rc = fdev->flread(fdev,TEMP_SPACE,UCOS_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);
printf("OK\n");
printf("Uncompress %s to 0x%x...",hdr->ih_name,hdr->ih_ep);
unZip((char *)TEMP_SPACE, hdr->ih_size, hdr->ih_ep, 99999999);
printf("OK\n");
break;
case IH_COMP_BZIP2:
break;
default:
printf("read image error\n");
break;
}
return hdr->ih_ep;
}
else if(imageid == KERNEL)
{
rc = fdev->flread(fdev,p,KERNEL_IMAGE_START_ADDR,sizeof(image_header_t));
hdr = (image_header_t *)p;
switch(hdr->ih_comp)
{
case IH_COMP_NONE:
printf("\nload %s to address 0x%x...",hdr->ih_name,hdr->ih_ep);
rc = fdev->flread(fdev,hdr->ih_ep,KERNEL_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);
printf("OK\n");
break;
case IH_COMP_GZIP:
printf("\nload %s to address 0x%x...",hdr->ih_name,data);
rc = fdev->flread(fdev,TEMP_SPACE,KERNEL_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);
printf("OK\n");
printf("\nUncompress %s to 0x%x...",hdr->ih_name,hdr->ih_ep);
unZip((char *)TEMP_SPACE, hdr->ih_size, hdr->ih_ep, 99999999);
printf("OK\n");
break;
case IH_COMP_BZIP2:
break;
default:
printf("read image error\n");
break;
}
return hdr->ih_ep;
}
else if(imageid == ROOTFS)
{
rc = fdev->flread(fdev,p,FILE_IMAGE_START_ADDR,sizeof(image_header_t));
hdr = (image_header_t *)p;
switch(hdr->ih_comp)
{
case IH_COMP_NONE:
printf("\nload %s to address 0x%x...",hdr->ih_name,hdr->ih_ep);
rc = fdev->flread(fdev,hdr->ih_ep,FILE_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);
printf("OK\n");
break;
case IH_COMP_GZIP:
printf("\nload %s to address 0x%x...",hdr->ih_name,data);
rc = fdev->flread(fdev,TEMP_SPACE,FILE_IMAGE_START_ADDR + sizeof(image_header_t),hdr->ih_size);
printf("OK\n");
printf("\nUncompress %s to 0x%x...",hdr->ih_name,hdr->ih_ep);
unZip((char *)TEMP_SPACE, hdr->ih_size, hdr->ih_ep, 99999999);
printf("OK\n");
break;
case IH_COMP_BZIP2:
break;
default:
printf("read image error\n");
break;
}
return hdr->ih_ep;
}
}
// by shunzi
#ifdef vb_get_offset // cut off
/* get_offset()
* get image offset relative whole image.
*/
long get_offset(e_IMAGE imageid)
{
unsigned int i, ptrs,pos,size,rc;
char p[100];//*p = malloc(sizeof(image_header_t) + 4*IMAGE_NUMBER);
unsigned int offset[IMAGE_NUMBER],*data;
image_header_t *hdr,header;
struct flashinfo *fdev;
fdev = nametofdev(boot_device_name);
//fdev = nametofdev(boot_device_name);
//fbnk->flread();
printf("dev name = %s, dest = 0x%x, addr = 0x%x\n",fdev->device_name,p,IMAGE_HEAD_ADDR);
rc = fdev->flread(fdev,p,IMAGE_HEAD_ADDR,sizeof(image_header_t)+ 4*IMAGE_NUMBER);
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
NorFlashRd(IMAGE_HEAD_ADDR, (short *)p, (sizeof(image_header_t)+ 4*IMAGE_NUMBER)/2 + 1);
#else
SflashReadByte(IMAGE_HEAD_ADDR,p, sizeof(image_header_t)+ 4*IMAGE_NUMBER);
#endif
*/
hdr = (image_header_t *)p;
//print_image_hdr(hdr);
unsigned long *len_ptr = (unsigned long *) (
(unsigned long)hdr + sizeof(image_header_t)
);
/* determine number of images first (to calculate image offsets) */
for (i=0; len_ptr[i]; ++i) /* null pointer terminates list */
;
ptrs = i; /* null pointer terminates list */
//printf("Image size:0x%x\n",sizeof(image_header_t));
pos = sizeof(image_header_t) + ptrs * sizeof(long);
for (i=0; len_ptr[i]; ++i) {
size = len_ptr[i];
offset[i] = IMAGE_HEAD_ADDR + pos+4;
/* copy_file() will pad the first files to even word align */
size += 3;
size &= ~3;
pos += size;
}
rc = fdev->flread(fdev,p,offset[imageid],sizeof(image_header_t));
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
NorFlashRd(offset[imageid], (short *)p, sizeof(image_header_t)/2 + 1);
#else
SflashReadByte(offset[imageid],p, sizeof(image_header_t));
#endif
*/
print_image_hdr(hdr);
//data = 0xa181e000;
data = TEMP_SPACE;
switch(hdr->ih_comp)
{
case IH_COMP_NONE:
printf("load %s to address 0x%x...",hdr->ih_name,hdr->ih_ep);
rc = fdev->flread(fdev,hdr->ih_ep,offset[imageid] + sizeof(image_header_t),hdr->ih_size);
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
NorFlashRd(offset[imageid] + sizeof(image_header_t), (short *)hdr->ih_ep, hdr->ih_size/2 + 1);
#else
SflashReadWord(offset[imageid] + sizeof(image_header_t), (int *)hdr->ih_ep, hdr->ih_size/4 + 1);
#endif
*/
printf("OK\n");
break;
case IH_COMP_GZIP:
printf("load %s to address 0x%x...",hdr->ih_name,data);
rc = fdev->flread(fdev,TEMP_SPACE,offset[imageid] + sizeof(image_header_t),hdr->ih_size);
/*
#if INCLUDE_NOR_FLASH_S29GL128M90 || INCLUDE_NOR_FLASH_S29GL064A90
NorFlashRd(offset[imageid] + sizeof(image_header_t), (short *)TEMP_SPACE, hdr->ih_size/2 + 1);
#else
SflashReadWord(offset[imageid] + sizeof(image_header_t), (int *)TEMP_SPACE, hdr->ih_size/4 + 1);
#endif
*/
//SflashReadWord(offset[imageid] + sizeof(image_header_t), data, hdr->ih_size/4 + 1);
printf("OK\n");
printf("Uncompress %s to 0x%x...",hdr->ih_name,hdr->ih_ep);
unZip((char *)TEMP_SPACE, hdr->ih_size, hdr->ih_ep, 99999999);
printf("OK\n");
break;
case IH_COMP_BZIP2:
break;
default:
printf("read image error\n");
break;
}
return hdr->ih_ep;
}
#endif
/* RiscBootRisc1
* Boot Risc1 from Risc0
*/
void RiscBootRisc1(void)
{
unsigned int *pTmp;
unsigned int i, tmp;
// copy "jump" to risc1 start address
printf("\ncopy entry instrc to risc1 start address\n");
//pTmp = (unsigned int *)Risc1Entry;
for(i = 0; i < 10; i++) {
*(unsigned int *)(0xa0000000 + i*4) = *pTmp++; // no need flush cache because 0xa0000000 area is used
}
printf("\nLoading UCOS..\n");
get_offset(0);
printf("\nboot ucos...\n");
//CommInqSendString(0, "\r\nset daisy chain...\r\n");
tmp = *(unsigned int *)0xa8010010;
tmp |= 0x10;
*(unsigned int *)0xa8010010 = tmp;
//CommInqSendString(0, "\r\nset sdram as risc0 boot source...\r\n");
*(unsigned int *)0xa8000000 = 0x4;
}
char *StartLinuxHelp[] = {
"Start Linux",
"-[aqv:] {address} [arg1] [arg2] ...",
" -a pass (argc,argv) function",
" -q quiet mode",
" -v {var} put return val in varname",
0,
};
/* RiscSemUnLock
* Description: post the semaphore.
*/
void RiscSemUnLock(int SemID)
{
*(volatile unsigned *)(0xa8000020 + SemID * 4) = 1;
}
/* Startlinux():
* start linux from flash.
*/
int
StartLinux(int argc,char *argv[])
{
long linux_entry;
char *varname;
long args[10];
int i, j, ret, opt, useargc, quiet;
int (*func)(long,long,long,long,long,long,long,long,long,long);
//RiscBootRisc1();
//return;
//RiscSemUnLock(6); // cut by shunzi fot linux first
printf("\n");
linux_entry = get_offset(KERNEL);
//return;
get_offset(ROOTFS);
//docommand("call 0xa0300000", 0);
quiet = 0;
useargc = 0;
varname = (char *)0;
while((opt=getopt(argc,argv,"aqv:")) != -1) {
switch(opt) {
case 'a':
useargc = 1;
break;
case 'q':
quiet = 1;
break;
default:
return(CMD_PARAM_ERROR);
}
}
//if ((argc < optind+1) || (argc > optind+11))
// return(CMD_PARAM_ERROR);
func = (int(*)(long,long,long,long,long,long,long,long,long,long))linux_entry;
//if ((func == 0) && (isdigit(argv[optind][0]) == 0)) {
// return(CMD_PARAM_ERROR);
//}
/* If useargc flag is not set, then retrieve and convert
* args from command line. If the first character of the
* argument is an ampersand (&), then a pointer to the argument
* is passed; otherwise, the argument is converted to a long
* integer using strtol()...
*/
if (!useargc) {
for(j=0,i=optind;i<argc;i++,j++) {
if (argv[i][0] == '&')
args[j] = (unsigned long)&argv[i][1];
else
args[j] = strtol(argv[i],(char **)0,0);
}
}
//ctxAPP();
//EnableBreakInterrupt();
if (useargc) {
ret = func(argc-optind,(long)&argv[optind],0,0,0,0,0,0,0,0);
}
else {
ret = func(args[0],args[1],args[2],args[3],args[4],args[5],args[6],
args[7],args[8],args[9]);
}
//DisableBreakInterrupt();
//ctxMON();
if (!quiet)
printf("Returned: %d (0x%x)\n",ret,ret);
return(CMD_SUCCESS);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -