Fix sign extension bug in 'fpga loadb' command;

make 'fpga loadb' always print the file header info
Patch by Andrew Dyer, 11 Jan 2005
This commit is contained in:
Wolfgang Denk 2005-08-08 00:14:41 +02:00
parent fe599e17ed
commit 8b019da650
2 changed files with 60 additions and 41 deletions

View file

@ -2,6 +2,10 @@
Changes for U-Boot 1.1.3: Changes for U-Boot 1.1.3:
====================================================================== ======================================================================
* Fix sign extension bug in 'fpga loadb' command;
make 'fpga loadb' always print the file header info
Patch by Andrew Dyer, 11 Jan 2005
* Fix errors that occur when accessing SystemACE CF * Fix errors that occur when accessing SystemACE CF
Patch by Jeff Angielski, 09 Jan 2005 Patch by Jeff Angielski, 09 Jan 2005

View file

@ -59,25 +59,30 @@ static int fpga_get_op (char *opstr);
/* Convert bitstream data and load into the fpga */ /* Convert bitstream data and load into the fpga */
int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size) int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)
{ {
int length; unsigned int length;
char* swapdata; unsigned char* swapdata;
int swapsize; unsigned int swapsize;
char buffer[80]; char buffer[80];
char *ptr; unsigned char *ptr;
char *dataptr; unsigned char *dataptr;
int data; unsigned char data;
int i; unsigned int i;
int rc; int rc;
dataptr = fpgadata; dataptr = fpgadata;
#if CFG_FPGA_XILINX #if CFG_FPGA_XILINX
/* skip the first 13 bytes of the bitsteam, their meaning is unknown */ /* skip the first bytes of the bitsteam, their meaning is unknown */
dataptr+=13; length = (*dataptr << 8) + *(dataptr+1);
dataptr+=2;
dataptr+=length;
/* get design name (identifier, length, string) */ /* get design name (identifier, length, string) */
length = (*dataptr << 8) + *(dataptr+1);
dataptr+=2;
if (*dataptr++ != 0x61) { if (*dataptr++ != 0x61) {
PRINTF("fpga_loadbitstream: Design name identifier not recognized in bitstream.\n"); PRINTF ("%s: Design name identifier not recognized in bitstream\n",
__FUNCTION__ );
return FPGA_FAIL; return FPGA_FAIL;
} }
@ -86,61 +91,71 @@ int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)
for(i=0;i<length;i++) for(i=0;i<length;i++)
buffer[i]=*dataptr++; buffer[i]=*dataptr++;
buffer[length-5]='\0'; /* remove filename extension */ printf(" design filename = \"%s\"\n", buffer);
PRINTF("fpga_loadbitstream: design name = \"%s\".\n",buffer);
/* get part number (identifier, length, string) */ /* get part number (identifier, length, string) */
if (*dataptr++ != 0x62) { if (*dataptr++ != 0x62) {
printf("fpga_loadbitstream: Part number identifier not recognized in bitstream.\n"); printf("%s: Part number identifier not recognized in bitstream\n",
__FUNCTION__ );
return FPGA_FAIL; return FPGA_FAIL;
} }
length = (*dataptr << 8) + *(dataptr+1); dataptr+=2; length = (*dataptr << 8) + *(dataptr+1);
dataptr+=2;
for(i=0;i<length;i++) for(i=0;i<length;i++)
buffer[i]=*dataptr++; buffer[i]=*dataptr++;
PRINTF("fpga_loadbitstream: part number = \"%s\".\n",buffer); printf(" part number = \"%s\"\n", buffer);
/* get date (identifier, length, string) */ /* get date (identifier, length, string) */
if (*dataptr++ != 0x63) { if (*dataptr++ != 0x63) {
printf("fpga_loadbitstream: Date identifier not recognized in bitstream.\n"); printf("%s: Date identifier not recognized in bitstream\n",
__FUNCTION__);
return FPGA_FAIL; return FPGA_FAIL;
} }
length = (*dataptr << 8) + *(dataptr+1); dataptr+=2; length = (*dataptr << 8) + *(dataptr+1);
dataptr+=2;
for(i=0;i<length;i++) for(i=0;i<length;i++)
buffer[i]=*dataptr++; buffer[i]=*dataptr++;
PRINTF("fpga_loadbitstream: date = \"%s\".\n",buffer); printf(" date = \"%s\"\n", buffer);
/* get time (identifier, length, string) */ /* get time (identifier, length, string) */
if (*dataptr++ != 0x64) { if (*dataptr++ != 0x64) {
printf("fpga_loadbitstream: Time identifier not recognized in bitstream.\n"); printf("%s: Time identifier not recognized in bitstream\n",__FUNCTION__);
return FPGA_FAIL; return FPGA_FAIL;
} }
length = (*dataptr << 8) + *(dataptr+1); dataptr+=2; length = (*dataptr << 8) + *(dataptr+1);
dataptr+=2;
for(i=0;i<length;i++) for(i=0;i<length;i++)
buffer[i]=*dataptr++; buffer[i]=*dataptr++;
PRINTF("fpga_loadbitstream: time = \"%s\".\n",buffer); printf(" time = \"%s\"\n", buffer);
/* get fpga data length (identifier, length) */ /* get fpga data length (identifier, length) */
if (*dataptr++ != 0x65) { if (*dataptr++ != 0x65) {
printf("fpga_loadbitstream: Data length identifier not recognized in bitstream.\n"); printf("%s: Data length identifier not recognized in bitstream\n",
__FUNCTION__);
return FPGA_FAIL; return FPGA_FAIL;
} }
swapsize = ((long)*dataptr<<24) + ((long)*(dataptr+1)<<16) + ((long)*(dataptr+2)<<8) + (long)*(dataptr+3); swapsize = ((unsigned int) *dataptr <<24) +
((unsigned int) *(dataptr+1) <<16) +
((unsigned int) *(dataptr+2) <<8 ) +
((unsigned int) *(dataptr+3) ) ;
dataptr+=4; dataptr+=4;
PRINTF("fpga_loadbitstream: bytes in bitstream = %d.\n",swapsize); printf(" bytes in bitstream = %d\n", swapsize);
/* check consistency of length obtained */ /* check consistency of length obtained */
if (swapsize >= size) { if (swapsize >= size) {
printf("fpga_loadbitstream: Could not find right length of data in bitstream.\n"); printf("%s: Could not find right length of data in bitstream\n",
__FUNCTION__);
return FPGA_FAIL; return FPGA_FAIL;
} }
/* allocate memory */ /* allocate memory */
swapdata = (char *)malloc(swapsize); swapdata = (unsigned char *)malloc(swapsize);
if (swapdata == NULL) { if (swapdata == NULL) {
printf("fpga_loadbitstream: Could not allocate %d bytes memory !\n",swapsize); printf("%s: Could not allocate %d bytes memory !\n",
__FUNCTION__, swapsize);
return FPGA_FAIL; return FPGA_FAIL;
} }
@ -164,7 +179,7 @@ int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)
free(swapdata); free(swapdata);
return rc; return rc;
#else #else
printf("Bitstream support only for Xilinx devices.\n"); printf("Bitstream support only for Xilinx devices\n");
return FPGA_FAIL; return FPGA_FAIL;
#endif #endif
} }
@ -196,25 +211,25 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
data_size = simple_strtoul (argv[4], NULL, 16); data_size = simple_strtoul (argv[4], NULL, 16);
case 4: /* fpga <op> <dev> <data> */ case 4: /* fpga <op> <dev> <data> */
fpga_data = (void *) simple_strtoul (argv[3], NULL, 16); fpga_data = (void *) simple_strtoul (argv[3], NULL, 16);
PRINTF ("do_fpga: fpga_data = 0x%x\n", PRINTF ("%s: fpga_data = 0x%x\n", __FUNCTION__, (uint) fpga_data);
(uint) fpga_data);
case 3: /* fpga <op> <dev | data addr> */ case 3: /* fpga <op> <dev | data addr> */
dev = (int) simple_strtoul (argv[2], NULL, 16); dev = (int) simple_strtoul (argv[2], NULL, 16);
PRINTF ("do_fpga: device = %d\n", dev); PRINTF ("%s: device = %d\n", __FUNCTION__, dev);
/* FIXME - this is a really weak test */ /* FIXME - this is a really weak test */
if ((argc == 3) && (dev > fpga_count ())) { /* must be buffer ptr */ if ((argc == 3) && (dev > fpga_count ())) { /* must be buffer ptr */
PRINTF ("do_fpga: Assuming buffer pointer in arg 3\n"); PRINTF ("%s: Assuming buffer pointer in arg 3\n",
__FUNCTION__);
fpga_data = (void *) dev; fpga_data = (void *) dev;
PRINTF ("do_fpga: fpga_data = 0x%x\n", PRINTF ("%s: fpga_data = 0x%x\n",
(uint) fpga_data); __FUNCTION__, (uint) fpga_data);
dev = FPGA_INVALID_DEVICE; /* reset device num */ dev = FPGA_INVALID_DEVICE; /* reset device num */
} }
case 2: /* fpga <op> */ case 2: /* fpga <op> */
op = (int) fpga_get_op (argv[1]); op = (int) fpga_get_op (argv[1]);
break; break;
default: default:
PRINTF ("do_fpga: Too many or too few args (%d)\n", PRINTF ("%s: Too many or too few args (%d)\n",
argc); __FUNCTION__, argc);
op = FPGA_NONE; /* force usage display */ op = FPGA_NONE; /* force usage display */
break; break;
} }
@ -241,7 +256,7 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
break; break;
default: default:
printf ("Unknown operation.\n"); printf ("Unknown operation\n");
fpga_usage (cmdtp); fpga_usage (cmdtp);
break; break;
} }
@ -281,8 +296,8 @@ U_BOOT_CMD (fpga, 6, 1, do_fpga,
"fpga - loadable FPGA image support\n", "fpga - loadable FPGA image support\n",
"fpga [operation type] [device number] [image address] [image size]\n" "fpga [operation type] [device number] [image address] [image size]\n"
"fpga operations:\n" "fpga operations:\n"
"\tinfo\tlist known device information.\n" "\tinfo\tlist known device information\n"
"\tload\tLoad device from memory buffer.\n" "\tload\tLoad device from memory buffer\n"
"\tloadb\tLoad device from bitstream buffer (Xilinx devices only).\n" "\tloadb\tLoad device from bitstream buffer (Xilinx devices only)\n"
"\tdump\tLoad device to memory buffer.\n"); "\tdump\tLoad device to memory buffer\n");
#endif /* CONFIG_FPGA && CONFIG_COMMANDS & CFG_CMD_FPGA */ #endif /* CONFIG_FPGA && CONFIG_COMMANDS & CFG_CMD_FPGA */