diff options
| -rw-r--r-- | tools/envcrc.c | 46 | 
1 files changed, 42 insertions, 4 deletions
| diff --git a/tools/envcrc.c b/tools/envcrc.c index 4334cdf74..5b0f7cd4e 100644 --- a/tools/envcrc.c +++ b/tools/envcrc.c @@ -24,6 +24,7 @@  #include <stdio.h>  #include <stdint.h>  #include <stdlib.h> +#include <string.h>  #include <unistd.h>  #ifndef __ASSEMBLY__ @@ -77,19 +78,56 @@ extern unsigned char environment;  int main (int argc, char **argv)  {  #ifdef	ENV_IS_EMBEDDED +	unsigned char pad = 0x00;  	uint32_t crc;  	unsigned char *envptr = &environment,  		*dataptr = envptr + ENV_HEADER_SIZE;  	unsigned int datasize = ENV_SIZE; +	unsigned int eoe; + +	if (argv[1] && !strncmp(argv[1], "--binary", 8)) { +		int ipad = 0xff; +		if (argv[1][8] == '=') +			sscanf(argv[1] + 9, "%i", &ipad); +		pad = ipad; +	} + +	if (pad) { +		/* find the end of env */ +		for (eoe = 0; eoe < datasize - 1; ++eoe) +			if (!dataptr[eoe] && !dataptr[eoe+1]) { +				eoe += 2; +				break; +			} +		if (eoe < datasize - 1) +			memset(dataptr + eoe, pad, datasize - eoe); +	}  	crc = crc32 (0, dataptr, datasize);  	/* Check if verbose mode is activated passing a parameter to the program */  	if (argc > 1) { -		printf ("CRC32 from offset %08X to %08X of environment = %08X\n", -			(unsigned int) (dataptr - envptr), -			(unsigned int) (dataptr - envptr) + datasize, -			crc); +		if (!strncmp(argv[1], "--binary", 8)) { +			int le = (argc > 2 ? !strcmp(argv[2], "le") : 1); +			size_t i, start, end, step; +			if (le) { +				start = 0; +				end = ENV_HEADER_SIZE; +				step = 1; +			} else { +				start = ENV_HEADER_SIZE - 1; +				end = -1; +				step = -1; +			} +			for (i = start; i != end; i += step) +				printf("%c", (crc & (0xFF << (i * 8))) >> (i * 8)); +			fwrite(dataptr, 1, datasize, stdout); +		} else { +			printf("CRC32 from offset %08X to %08X of environment = %08X\n", +				(unsigned int) (dataptr - envptr), +				(unsigned int) (dataptr - envptr) + datasize, +				crc); +		}  	} else {  		printf ("0x%08X\n", crc);  	} |