diff options
| -rw-r--r-- | tools/pblimage.c | 32 | 
1 files changed, 25 insertions, 7 deletions
| diff --git a/tools/pblimage.c b/tools/pblimage.c index 508a747a3..5f39dc5bb 100644 --- a/tools/pblimage.c +++ b/tools/pblimage.c @@ -26,18 +26,14 @@  #include "pblimage.h"  /* - * The PBL can load up to 64 bytes at a time, so we split the U-Boot - * image into 64 byte chunks. PBL needs a command for each piece, of - * the form "81xxxxxx", where "xxxxxx" is the offset. SYS_TEXT_BASE - * is 0xFFF80000 for PBL boot, and PBL only cares about low 24-bit, - * so it starts from 0x81F80000. + * Initialize to an invalid value.   */ -static uint32_t next_pbl_cmd = 0x81F80000; +static uint32_t next_pbl_cmd = 0x82000000;  /*   * need to store all bytes in memory for calculating crc32, then write the   * bytes to image file for PBL boot.   */ -static unsigned char mem_buf[600000]; +static unsigned char mem_buf[1000000];  static unsigned char *pmem_buf = mem_buf;  static int pbl_size;  static char *fname = "Unknown"; @@ -52,6 +48,27 @@ static union  #define ENDIANNESS ((char)endian_test.l) +/* + * The PBL can load up to 64 bytes at a time, so we split the U-Boot + * image into 64 byte chunks. PBL needs a command for each piece, of + * the form "81xxxxxx", where "xxxxxx" is the offset. Calculate the + * start offset by subtracting the size of the u-boot image from the + * top of the allowable 24-bit range. + */ +static void init_next_pbl_cmd(FILE *fp_uboot) +{ +	struct stat st; +	int fd = fileno(fp_uboot); + +	if (fstat(fd, &st) == -1) { +		printf("Error: Could not determine u-boot image size. %s\n", +			strerror(errno)); +		exit(EXIT_FAILURE); +	} + +	next_pbl_cmd = 0x82000000 - st.st_size; +} +  static void generate_pbl_cmd(void)  {  	uint32_t val = next_pbl_cmd; @@ -80,6 +97,7 @@ static void pbl_fget(size_t size, FILE *stream)  /* load split u-boot with PBI command 81xxxxxx. */  static void load_uboot(FILE *fp_uboot)  { +	init_next_pbl_cmd(fp_uboot);  	while (next_pbl_cmd < 0x82000000) {  		generate_pbl_cmd();  		pbl_fget(64, fp_uboot); |