|
|
|
@ -207,7 +207,32 @@ extern block_dev_desc_t *get_dev (char*, int); |
|
|
|
|
extern int u_boot_hush_start(void); |
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
au_check_valid(int idx, long nbytes) |
|
|
|
|
au_check_cksum_valid(int idx, long nbytes) |
|
|
|
|
{ |
|
|
|
|
image_header_t *hdr; |
|
|
|
|
unsigned long checksum; |
|
|
|
|
|
|
|
|
|
hdr = (image_header_t *)LOAD_ADDR; |
|
|
|
|
|
|
|
|
|
if (nbytes != (sizeof(*hdr) + ntohl(hdr->ih_size))) |
|
|
|
|
{ |
|
|
|
|
printf ("Image %s bad total SIZE\n", aufile[idx]); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
/* check the data CRC */ |
|
|
|
|
checksum = ntohl(hdr->ih_dcrc); |
|
|
|
|
|
|
|
|
|
if (crc32 (0, (char *)(LOAD_ADDR + sizeof(*hdr)), ntohl(hdr->ih_size)) |
|
|
|
|
!= checksum) |
|
|
|
|
{ |
|
|
|
|
printf ("Image %s bad data checksum\n", aufile[idx]); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
au_check_header_valid(int idx, long nbytes) |
|
|
|
|
{ |
|
|
|
|
image_header_t *hdr; |
|
|
|
|
unsigned long checksum; |
|
|
|
@ -222,11 +247,14 @@ au_check_valid(int idx, long nbytes) |
|
|
|
|
printf("size %#x %#lx ", ntohl(hdr->ih_size), nbytes); |
|
|
|
|
printf("type %#x %#x ", hdr->ih_type, IH_TYPE_KERNEL); |
|
|
|
|
#endif |
|
|
|
|
if (ntohl(hdr->ih_magic) != IH_MAGIC || |
|
|
|
|
hdr->ih_arch != IH_CPU_ARM || |
|
|
|
|
nbytes != (sizeof(*hdr) + ntohl(hdr->ih_size))) |
|
|
|
|
if (nbytes < sizeof(*hdr)) |
|
|
|
|
{ |
|
|
|
|
printf ("Image %s bad MAGIC or ARCH or SIZE\n", aufile[idx]); |
|
|
|
|
printf ("Image %s bad header SIZE\n", aufile[idx]); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
if (ntohl(hdr->ih_magic) != IH_MAGIC || hdr->ih_arch != IH_CPU_ARM) |
|
|
|
|
{ |
|
|
|
|
printf ("Image %s bad MAGIC or ARCH\n", aufile[idx]); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
/* check the hdr CRC */ |
|
|
|
@ -238,15 +266,6 @@ au_check_valid(int idx, long nbytes) |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
hdr->ih_hcrc = htonl(checksum); |
|
|
|
|
/* check the data CRC */ |
|
|
|
|
checksum = ntohl(hdr->ih_dcrc); |
|
|
|
|
|
|
|
|
|
if (crc32 (0, (char *)(LOAD_ADDR + sizeof(*hdr)), ntohl(hdr->ih_size)) |
|
|
|
|
!= checksum) |
|
|
|
|
{ |
|
|
|
|
printf ("Image %s bad data checksum\n", aufile[idx]); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
/* check the type - could do this all in one gigantic if() */ |
|
|
|
|
if ((idx == IDX_FIRMWARE) && (hdr->ih_type != IH_TYPE_FIRMWARE)) { |
|
|
|
|
printf ("Image %s wrong type\n", aufile[idx]); |
|
|
|
@ -548,6 +567,18 @@ do_auto_update(void) |
|
|
|
|
bitmap_first = 0; |
|
|
|
|
/* just loop thru all the possible files */ |
|
|
|
|
for (i = 0; i < AU_MAXFILES; i++) { |
|
|
|
|
/* just read the header */ |
|
|
|
|
sz = file_fat_read(aufile[i], LOAD_ADDR, sizeof(image_header_t)); |
|
|
|
|
debug ("read %s sz %ld hdr %d\n", |
|
|
|
|
aufile[i], sz, sizeof(image_header_t)); |
|
|
|
|
if (sz <= 0 || sz < sizeof(image_header_t)) { |
|
|
|
|
debug ("%s not found\n", aufile[i]); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if (au_check_header_valid(i, sz) < 0) { |
|
|
|
|
debug ("%s header not valid\n", aufile[i]); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
sz = file_fat_read(aufile[i], LOAD_ADDR, MAX_LOADSZ); |
|
|
|
|
debug ("read %s sz %ld hdr %d\n", |
|
|
|
|
aufile[i], sz, sizeof(image_header_t)); |
|
|
|
@ -555,8 +586,8 @@ do_auto_update(void) |
|
|
|
|
debug ("%s not found\n", aufile[i]); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if (au_check_valid(i, sz) < 0) { |
|
|
|
|
debug ("%s not valid\n", aufile[i]); |
|
|
|
|
if (au_check_cksum_valid(i, sz) < 0) { |
|
|
|
|
debug ("%s checksum not valid\n", aufile[i]); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
#ifdef CONFIG_VFD |
|
|
|
|