mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-04-18 04:11:31 +00:00
cmd: fpga: Move fpga_loadbitstream to fpga.c
In bitstream decoding you can directly check device which you want to load and in fpga.c are fpga_validate and fpga_dev_info functions which should be used for it. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Reviewed-by: Tom Rini <trini@ti.com>
This commit is contained in:
parent
fc598412ce
commit
52c2064476
4 changed files with 96 additions and 94 deletions
|
@ -44,100 +44,6 @@ static int fpga_get_op(char *opstr);
|
||||||
#define FPGA_DUMP 3
|
#define FPGA_DUMP 3
|
||||||
#define FPGA_LOADMK 4
|
#define FPGA_LOADMK 4
|
||||||
|
|
||||||
/* Convert bitstream data and load into the fpga */
|
|
||||||
int fpga_loadbitstream(unsigned long dev, char *fpgadata, size_t size)
|
|
||||||
{
|
|
||||||
#if defined(CONFIG_FPGA_XILINX)
|
|
||||||
unsigned int length;
|
|
||||||
unsigned int swapsize;
|
|
||||||
char buffer[80];
|
|
||||||
unsigned char *dataptr;
|
|
||||||
unsigned int i;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
dataptr = (unsigned char *)fpgadata;
|
|
||||||
|
|
||||||
/* skip the first bytes of the bitsteam, their meaning is unknown */
|
|
||||||
length = (*dataptr << 8) + *(dataptr + 1);
|
|
||||||
dataptr += 2;
|
|
||||||
dataptr += length;
|
|
||||||
|
|
||||||
/* get design name (identifier, length, string) */
|
|
||||||
length = (*dataptr << 8) + *(dataptr + 1);
|
|
||||||
dataptr += 2;
|
|
||||||
if (*dataptr++ != 0x61) {
|
|
||||||
debug("%s: Design name id not recognized in bitstream\n",
|
|
||||||
__func__);
|
|
||||||
return FPGA_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
length = (*dataptr << 8) + *(dataptr + 1);
|
|
||||||
dataptr += 2;
|
|
||||||
for (i = 0; i < length; i++)
|
|
||||||
buffer[i] = *dataptr++;
|
|
||||||
|
|
||||||
printf(" design filename = \"%s\"\n", buffer);
|
|
||||||
|
|
||||||
/* get part number (identifier, length, string) */
|
|
||||||
if (*dataptr++ != 0x62) {
|
|
||||||
printf("%s: Part number id not recognized in bitstream\n",
|
|
||||||
__func__);
|
|
||||||
return FPGA_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
length = (*dataptr << 8) + *(dataptr + 1);
|
|
||||||
dataptr += 2;
|
|
||||||
for (i = 0; i < length; i++)
|
|
||||||
buffer[i] = *dataptr++;
|
|
||||||
printf(" part number = \"%s\"\n", buffer);
|
|
||||||
|
|
||||||
/* get date (identifier, length, string) */
|
|
||||||
if (*dataptr++ != 0x63) {
|
|
||||||
printf("%s: Date identifier not recognized in bitstream\n",
|
|
||||||
__func__);
|
|
||||||
return FPGA_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
length = (*dataptr << 8) + *(dataptr+1);
|
|
||||||
dataptr += 2;
|
|
||||||
for (i = 0; i < length; i++)
|
|
||||||
buffer[i] = *dataptr++;
|
|
||||||
printf(" date = \"%s\"\n", buffer);
|
|
||||||
|
|
||||||
/* get time (identifier, length, string) */
|
|
||||||
if (*dataptr++ != 0x64) {
|
|
||||||
printf("%s: Time identifier not recognized in bitstream\n",
|
|
||||||
__func__);
|
|
||||||
return FPGA_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
length = (*dataptr << 8) + *(dataptr+1);
|
|
||||||
dataptr += 2;
|
|
||||||
for (i = 0; i < length; i++)
|
|
||||||
buffer[i] = *dataptr++;
|
|
||||||
printf(" time = \"%s\"\n", buffer);
|
|
||||||
|
|
||||||
/* get fpga data length (identifier, length) */
|
|
||||||
if (*dataptr++ != 0x65) {
|
|
||||||
printf("%s: Data length id not recognized in bitstream\n",
|
|
||||||
__func__);
|
|
||||||
return FPGA_FAIL;
|
|
||||||
}
|
|
||||||
swapsize = ((unsigned int) *dataptr << 24) +
|
|
||||||
((unsigned int) *(dataptr + 1) << 16) +
|
|
||||||
((unsigned int) *(dataptr + 2) << 8) +
|
|
||||||
((unsigned int) *(dataptr + 3));
|
|
||||||
dataptr += 4;
|
|
||||||
printf(" bytes in bitstream = %d\n", swapsize);
|
|
||||||
|
|
||||||
rc = fpga_load(dev, dataptr, swapsize);
|
|
||||||
return rc;
|
|
||||||
#else
|
|
||||||
printf("Bitstream support only for Xilinx devices\n");
|
|
||||||
return FPGA_FAIL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
/* command form:
|
/* command form:
|
||||||
* fpga <op> <device number> <data addr> <datasize>
|
* fpga <op> <device number> <data addr> <datasize>
|
||||||
|
|
|
@ -187,6 +187,15 @@ int fpga_add(fpga_type devtype, void *desc)
|
||||||
return devnum;
|
return devnum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert bitstream data and load into the fpga
|
||||||
|
*/
|
||||||
|
int __weak fpga_loadbitstream(unsigned long dev, char *fpgadata, size_t size)
|
||||||
|
{
|
||||||
|
printf("Bitstream support not implemented for this FPGA device\n");
|
||||||
|
return FPGA_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generic multiplexing code
|
* Generic multiplexing code
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -48,6 +48,92 @@ static int xilinx_validate (Xilinx_desc * desc, char *fn);
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int fpga_loadbitstream(unsigned long dev, char *fpgadata, size_t size)
|
||||||
|
{
|
||||||
|
unsigned int length;
|
||||||
|
unsigned int swapsize;
|
||||||
|
char buffer[80];
|
||||||
|
unsigned char *dataptr;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
dataptr = (unsigned char *)fpgadata;
|
||||||
|
|
||||||
|
/* skip the first bytes of the bitsteam, their meaning is unknown */
|
||||||
|
length = (*dataptr << 8) + *(dataptr + 1);
|
||||||
|
dataptr += 2;
|
||||||
|
dataptr += length;
|
||||||
|
|
||||||
|
/* get design name (identifier, length, string) */
|
||||||
|
length = (*dataptr << 8) + *(dataptr + 1);
|
||||||
|
dataptr += 2;
|
||||||
|
if (*dataptr++ != 0x61) {
|
||||||
|
debug("%s: Design name id not recognized in bitstream\n",
|
||||||
|
__func__);
|
||||||
|
return FPGA_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
length = (*dataptr << 8) + *(dataptr + 1);
|
||||||
|
dataptr += 2;
|
||||||
|
for (i = 0; i < length; i++)
|
||||||
|
buffer[i] = *dataptr++;
|
||||||
|
|
||||||
|
printf(" design filename = \"%s\"\n", buffer);
|
||||||
|
|
||||||
|
/* get part number (identifier, length, string) */
|
||||||
|
if (*dataptr++ != 0x62) {
|
||||||
|
printf("%s: Part number id not recognized in bitstream\n",
|
||||||
|
__func__);
|
||||||
|
return FPGA_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
length = (*dataptr << 8) + *(dataptr + 1);
|
||||||
|
dataptr += 2;
|
||||||
|
for (i = 0; i < length; i++)
|
||||||
|
buffer[i] = *dataptr++;
|
||||||
|
printf(" part number = \"%s\"\n", buffer);
|
||||||
|
|
||||||
|
/* get date (identifier, length, string) */
|
||||||
|
if (*dataptr++ != 0x63) {
|
||||||
|
printf("%s: Date identifier not recognized in bitstream\n",
|
||||||
|
__func__);
|
||||||
|
return FPGA_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
length = (*dataptr << 8) + *(dataptr+1);
|
||||||
|
dataptr += 2;
|
||||||
|
for (i = 0; i < length; i++)
|
||||||
|
buffer[i] = *dataptr++;
|
||||||
|
printf(" date = \"%s\"\n", buffer);
|
||||||
|
|
||||||
|
/* get time (identifier, length, string) */
|
||||||
|
if (*dataptr++ != 0x64) {
|
||||||
|
printf("%s: Time identifier not recognized in bitstream\n",
|
||||||
|
__func__);
|
||||||
|
return FPGA_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
length = (*dataptr << 8) + *(dataptr+1);
|
||||||
|
dataptr += 2;
|
||||||
|
for (i = 0; i < length; i++)
|
||||||
|
buffer[i] = *dataptr++;
|
||||||
|
printf(" time = \"%s\"\n", buffer);
|
||||||
|
|
||||||
|
/* get fpga data length (identifier, length) */
|
||||||
|
if (*dataptr++ != 0x65) {
|
||||||
|
printf("%s: Data length id not recognized in bitstream\n",
|
||||||
|
__func__);
|
||||||
|
return FPGA_FAIL;
|
||||||
|
}
|
||||||
|
swapsize = ((unsigned int) *dataptr << 24) +
|
||||||
|
((unsigned int) *(dataptr + 1) << 16) +
|
||||||
|
((unsigned int) *(dataptr + 2) << 8) +
|
||||||
|
((unsigned int) *(dataptr + 3));
|
||||||
|
dataptr += 4;
|
||||||
|
printf(" bytes in bitstream = %d\n", swapsize);
|
||||||
|
|
||||||
|
return fpga_load(dev, dataptr, swapsize);
|
||||||
|
}
|
||||||
|
|
||||||
int xilinx_load(Xilinx_desc *desc, const void *buf, size_t bsize)
|
int xilinx_load(Xilinx_desc *desc, const void *buf, size_t bsize)
|
||||||
{
|
{
|
||||||
int ret_val = FPGA_FAIL; /* assume a failure */
|
int ret_val = FPGA_FAIL; /* assume a failure */
|
||||||
|
|
|
@ -68,6 +68,7 @@ extern void fpga_init(void);
|
||||||
extern int fpga_add(fpga_type devtype, void *desc);
|
extern int fpga_add(fpga_type devtype, void *desc);
|
||||||
extern int fpga_count(void);
|
extern int fpga_count(void);
|
||||||
extern int fpga_load(int devnum, const void *buf, size_t bsize);
|
extern int fpga_load(int devnum, const void *buf, size_t bsize);
|
||||||
|
extern int fpga_loadbitstream(unsigned long dev, char *fpgadata, size_t size);
|
||||||
extern int fpga_dump(int devnum, const void *buf, size_t bsize);
|
extern int fpga_dump(int devnum, const void *buf, size_t bsize);
|
||||||
extern int fpga_info(int devnum);
|
extern int fpga_info(int devnum);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue