diff options
Diffstat (limited to 'board/trab/auto_update.c')
| -rw-r--r-- | board/trab/auto_update.c | 82 | 
1 files changed, 38 insertions, 44 deletions
| diff --git a/board/trab/auto_update.c b/board/trab/auto_update.c index 54d3645ff..bd9ee0c01 100644 --- a/board/trab/auto_update.c +++ b/board/trab/auto_update.c @@ -209,20 +209,16 @@ int  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))) +	if (nbytes != image_get_image_size (hdr))  	{  		printf ("Image %s bad total SIZE\n", aufile[idx]);  		return -1;  	}  	/* check the data CRC */ -	checksum = ntohl(hdr->ih_dcrc); - -	if (crc32 (0, (uchar *)(LOAD_ADDR + sizeof(*hdr)), ntohl(hdr->ih_size)) -		!= checksum) +	if (!image_check_dcrc (hdr)) {  	{  		printf ("Image %s bad data checksum\n", aufile[idx]);  		return -1; @@ -241,50 +237,46 @@ au_check_header_valid(int idx, long nbytes)  	/* check the easy ones first */  #undef CHECK_VALID_DEBUG  #ifdef CHECK_VALID_DEBUG -	printf("magic %#x %#x ", ntohl(hdr->ih_magic), IH_MAGIC); -	printf("arch %#x %#x ", hdr->ih_arch, IH_CPU_ARM); -	printf("size %#x %#lx ", ntohl(hdr->ih_size), nbytes); -	printf("type %#x %#x ", hdr->ih_type, IH_TYPE_KERNEL); +	printf("magic %#x %#x ", image_get_magic (hdr), IH_MAGIC); +	printf("arch %#x %#x ", image_get_arch (hdr), IH_ARCH_ARM); +	printf("size %#x %#lx ", image_get_data_size (hdr), nbytes); +	printf("type %#x %#x ", image_get_type (hdr), IH_TYPE_KERNEL);  #endif -	if (nbytes < sizeof(*hdr)) +	if (nbytes < image_get_header_size ())  	{  		printf ("Image %s bad header SIZE\n", aufile[idx]);  		return -1;  	} -	if (ntohl(hdr->ih_magic) != IH_MAGIC || hdr->ih_arch != IH_CPU_ARM) +	if (!image_check_magic (hdr) || !image_check_arch (hdr, IH_ARCH_ARM))  	{  		printf ("Image %s bad MAGIC or ARCH\n", aufile[idx]);  		return -1;  	}  	/* check the hdr CRC */ -	checksum = ntohl(hdr->ih_hcrc); -	hdr->ih_hcrc = 0; - -	if (crc32 (0, (uchar *)hdr, sizeof(*hdr)) != checksum) { +	if (!image_check_hcrc (hdr)) {  		printf ("Image %s bad header checksum\n", aufile[idx]);  		return -1;  	} -	hdr->ih_hcrc = htonl(checksum);  	/* check the type - could do this all in one gigantic if() */ -	if ((idx == IDX_FIRMWARE) && (hdr->ih_type != IH_TYPE_FIRMWARE)) { +	if ((idx == IDX_FIRMWARE) && !image_check_type (hdr, IH_TYPE_FIRMWARE)) {  		printf ("Image %s wrong type\n", aufile[idx]);  		return -1;  	} -	if ((idx == IDX_KERNEL) && (hdr->ih_type != IH_TYPE_KERNEL)) { +	if ((idx == IDX_KERNEL) && !image_check_type (hdr, IH_TYPE_KERNEL)) {  		printf ("Image %s wrong type\n", aufile[idx]);  		return -1;  	} -	if ((idx == IDX_DISK) && (hdr->ih_type != IH_TYPE_FILESYSTEM)) { +	if ((idx == IDX_DISK) && !image_check_type (hdr, IH_TYPE_FILESYSTEM)) {  		printf ("Image %s wrong type\n", aufile[idx]);  		return -1;  	} -	if ((idx == IDX_APP) && (hdr->ih_type != IH_TYPE_RAMDISK) -	    && (hdr->ih_type != IH_TYPE_FILESYSTEM)) { +	if ((idx == IDX_APP) && !image_check_type (hdr, IH_TYPE_RAMDISK) +	    && !image_check_type (hdr, FILESYSTEM)) {  		printf ("Image %s wrong type\n", aufile[idx]);  		return -1;  	}  	if ((idx == IDX_PREPARE || idx == IDX_PREINST || idx == IDX_POSTINST) -		&& (hdr->ih_type != IH_TYPE_SCRIPT)) +		&& !image_check_type (hdr, IH_TYPE_SCRIPT))  	{  		printf ("Image %s wrong type\n", aufile[idx]);  		return -1; @@ -293,10 +285,10 @@ au_check_header_valid(int idx, long nbytes)  	if (idx == IDX_PREPARE)  		return 0;  	/* recycle checksum */ -	checksum = ntohl(hdr->ih_size); +	checksum = image_get_data_size (hdr);  	/* for kernel and app the image header must also fit into flash */  	if ((idx != IDX_DISK) && (idx != IDX_FIRMWARE)) -		checksum += sizeof(*hdr); +		checksum += image_get_header_size ();  	/* check the size does not exceed space in flash. HUSH scripts */  	/* all have ausize[] set to 0 */  	if ((ausize[idx] != 0) && (ausize[idx] < checksum)) { @@ -310,10 +302,10 @@ au_check_header_valid(int idx, long nbytes)  	printf ("buf[0] %#x buf[1] %#x buf[2] %#x buf[3] %#x "  		"as int %#x time %#x\n",  		buf[0], buf[1], buf[2], buf[3], -		*((unsigned int *)buf), ntohl(hdr->ih_time)); +		*((unsigned int *)buf), image_get_time (hdr));  #endif  	/* check it */ -	if (*((unsigned int *)buf) >= ntohl(hdr->ih_time)) { +	if (*((unsigned int *)buf) >= image_get_time (hdr)) {  		printf ("Image %s is too old\n", aufile[idx]);  		return -1;  	} @@ -340,11 +332,11 @@ au_do_update(int idx, long sz)  	*CPLD_VFD_BK |= POWER_OFF;  	/* execute a script */ -	if (hdr->ih_type == IH_TYPE_SCRIPT) { -		addr = (char *)((char *)hdr + sizeof(*hdr)); +	if (image_check_type (hdr, IH_TYPE_SCRIPT)) { +		addr = (char *)((char *)hdr + image_get_header_size ());  		/* stick a NULL at the end of the script, otherwise */  		/* parse_string_outer() runs off the end. */ -		addr[ntohl(hdr->ih_size)] = 0; +		addr[image_get_data_size (hdr)] = 0;  		addr += 8;  		parse_string_outer(addr, FLAG_PARSE_SEMICOLON);  		return 0; @@ -372,19 +364,20 @@ au_do_update(int idx, long sz)  	flash_sect_erase(start, end);  	wait_ms(100);  	/* strip the header - except for the kernel and ramdisk */ -	if (hdr->ih_type == IH_TYPE_KERNEL || hdr->ih_type == IH_TYPE_RAMDISK) { +	if (image_check_type (hdr, IH_TYPE_KERNEL) || +			image_check_type (hdr, IH_TYPE_RAMDISK)) {  		addr = (char *)hdr; -		off = sizeof(*hdr); -		nbytes = sizeof(*hdr) + ntohl(hdr->ih_size); +		off = image_get_header_size (); +		nbytes = image_get_image_size (hdr);  	} else { -		addr = (char *)((char *)hdr + sizeof(*hdr)); +		addr = (char *)((char *)hdr + image_get_header_size ());  #ifdef AU_UPDATE_TEST  		/* copy it to where Linux goes */  		if (idx == IDX_FIRMWARE)  			start = aufl_layout[1].start;  #endif  		off = 0; -		nbytes = ntohl(hdr->ih_size); +		nbytes = image_get_data_size (hdr);  	}  	/* copy the data from RAM to FLASH */ @@ -396,7 +389,8 @@ au_do_update(int idx, long sz)  	}  	/* check the dcrc of the copy */ -	if (crc32 (0, (uchar *)(start + off), ntohl(hdr->ih_size)) != ntohl(hdr->ih_dcrc)) { +	if (crc32 (0, (uchar *)(start + off), image_get_data_size (hdr)) != +	    image_get_dcrc (hdr)) {  		printf ("Image %s Bad Data Checksum After COPY\n", aufile[idx]);  		return -1;  	} @@ -425,15 +419,15 @@ au_update_eeprom(int idx)  	hdr = (image_header_t *)LOAD_ADDR;  	/* write the time field into EEPROM */  	off = auee_off[idx].time; -	val = ntohl(hdr->ih_time); +	val = image_get_time (hdr);  	i2c_write_multiple(0x54, off, 1, &val, sizeof(val));  	/* write the size field into EEPROM */  	off = auee_off[idx].size; -	val = ntohl(hdr->ih_size); +	val = image_get_data_size (hdr);  	i2c_write_multiple(0x54, off, 1, &val, sizeof(val));  	/* write the dcrc field into EEPROM */  	off = auee_off[idx].dcrc; -	val = ntohl(hdr->ih_dcrc); +	val = image_get_dcrc (hdr);  	i2c_write_multiple(0x54, off, 1, &val, sizeof(val));  	/* enable the power switch */  	*CPLD_VFD_BK &= ~POWER_OFF; @@ -577,10 +571,10 @@ do_auto_update(void)  	/* 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)); +		sz = file_fat_read(aufile[i], LOAD_ADDR, image_get_header_size ());  		debug ("read %s sz %ld hdr %d\n", -			aufile[i], sz, sizeof(image_header_t)); -		if (sz <= 0 || sz < sizeof(image_header_t)) { +			aufile[i], sz, image_get_header_size ()); +		if (sz <= 0 || sz < image_get_header_size ()) {  			debug ("%s not found\n", aufile[i]);  			continue;  		} @@ -590,8 +584,8 @@ do_auto_update(void)  		}  		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)); -		if (sz <= 0 || sz <= sizeof(image_header_t)) { +			aufile[i], sz, image_get_header_size ()); +		if (sz <= 0 || sz <= image_get_header_size ()) {  			debug ("%s not found\n", aufile[i]);  			continue;  		} |