[U-Boot-Users] [PATCH] add: fpga loadi <dev> <src> sub command.

eran liberty eran.liberty at gmail.com
Wed Jul 4 09:13:03 CEST 2007


On 7/3/07, Grant Likely <grant.likely at secretlab.ca> wrote:
> On 7/3/07, eran.liberty at gmail.com <eran.liberty at gmail.com> wrote:
> > Adds the capability to load an image packaged with mkimage either in compressed form or not.
> > (raw gzip & bzip2 images packed with mkimage)
> >
> > fpga loadi <device number> <address of image>
>
> I might be missing something here; wouldn't it be better to extend the
> loadmk command?  It looks to me that loadmk currently only handles
> uncompressed images, but that it could be fixed to do compressed ones
> too.  Correct me if I'm wrong.
>

You are not wrong.
Still I would like to argue 4 points

1. To start with, when i wrote this functionality, loadmk was not
patched in yet... (not a very strong point :) )

2. If we take a closer look at loadmk, its 10 lines long and this same
functionality is within my loadi under the "IH_COMP_NONE" case. (some
what stornger)

3. with the addition of the decompression functionality, loadmk will
be too long to be inlined in the the switch - case as it is right now.
It would be exported to a function loadmk_func() and it will be called
from the switch case. That is what loadi does.  So you can either
trash the original loadmk or rename my function to loadmk function and
call it from loadmk... the out come is the same, only syntactical
change. (Even stronger)

4. I prefer the name loadi over loadmk. (The best argue in the world :) )

> >
> > Signed-off-by: Eran Liberty <eran.liberty at gmail.com>
> >
> > Index: common/cmd_fpga.c
> > ===================================================================
> > --- common/cmd_fpga.c   (.../tags/trunk/20070620_2_merge_to_exsw6000)   (revision 69)
> > +++ common/cmd_fpga.c   (.../branches/exsw6000) (revision 69)
> > @@ -32,6 +32,7 @@
> >  #endif
> >  #include <fpga.h>
> >  #include <malloc.h>
> > +#include <bzlib.h>
> >
> >  #if 0
> >  #define        FPGA_DEBUG
> > @@ -45,6 +46,9 @@
> >
> >  #if defined (CONFIG_FPGA) && ( CONFIG_COMMANDS & CFG_CMD_FPGA )
> >
> > +extern int gunzip (void *dst, int dstlen, unsigned char *src,
> > +                  unsigned long *lenp);
> > +
>
> Very bad; please don't do this (even if it is done elsewhere).  Please
> fix/create the appropriate gzip header file instead.
>

Agree!
the gunzip function is not exported (defined in the header file)
I wanted not to change any files I had no direct need to.
should I add gunzip declaration to a header file?


> >  /* Local functions */
> >  static void fpga_usage (cmd_tbl_t * cmdtp);
> >  static int fpga_get_op (char *opstr);
> > @@ -56,7 +60,92 @@
> >  #define FPGA_LOADB  2
> >  #define FPGA_DUMP   3
> >  #define FPGA_LOADMK 4
> > +#define FPGA_LOADI  5
> >
> > +/* Load an image */
> > +int fpga_loadi (int devnum, void *buf)
> > +{
> > +       ulong addr = (ulong) (buf);
> > +       ulong data, len, checksum;
> > +       image_header_t hdr;
> > +       unsigned int unc_len;
> > +       unsigned int *punc_len = &unc_len;
> > +       int i;
> > +
> > +       /* Copy header so we can blank CRC field for re-calculation */
> > +#ifdef CONFIG_HAS_DATAFLASH
> > +       if (addr_dataflash (addr)) {
> > +               read_dataflash (addr, sizeof (image_header_t), (char *)&hdr);
> > +       } else
> > +#endif
>
> The Dataflash-as-memory concept is depreciated.  You shouldn't add the
> dataflash hooks to new code.
>

OK,

> > +               memmove (&hdr, (char *)addr, sizeof (image_header_t));
> > +       if (ntohl (hdr.ih_magic) != IH_MAGIC) {
> > +               puts ("Bad Magic Number\n");
> > +               return 1;
> > +       }
> > +       data = (ulong) & hdr;
> > +       len = sizeof (image_header_t);
> > +
> > +       checksum = ntohl (hdr.ih_hcrc);
> > +       hdr.ih_hcrc = 0;
> > +
> > +       if (crc32 (0, (uchar *) data, len) != checksum) {
> > +               puts ("Bad Header Checksum\n");
> > +               return 1;
> > +       }
> > +#ifdef CONFIG_HAS_DATAFLASH
> > +       if (addr_dataflash (addr)) {
> > +               len = ntohl (hdr.ih_size) + sizeof (image_header_t);
> > +               read_dataflash (addr, len, (char *)CFG_LOAD_ADDR);
> > +               addr = CFG_LOAD_ADDR;
> > +       }
> > +#endif
>
> Ditto
>

OK again,

> > +
> > +       print_image_hdr ((image_header_t *) addr);
> > +
> > +       data = addr + sizeof (image_header_t);
> > +       len = ntohl (hdr.ih_size);
> > +
> > +       puts ("   Verifying Checksum ... ");
> > +       if (crc32 (0, (uchar *) data, len) != ntohl (hdr.ih_dcrc)) {
> > +               printf ("Bad Data CRC\n");
> > +               return 1;
> > +       }
> > +       puts ("OK\n");
> > +
> > +       switch (hdr.ih_comp) {
> > +       case IH_COMP_NONE:
> > +               memmove ((char *)CFG_LOAD_ADDR, (void *)data, len);
>
> Can you use (void*) instead of (char*)?
>

sure!

> > +               break;
> > +       case IH_COMP_GZIP:
> > +               if (gunzip
> > +                   ((char *)CFG_LOAD_ADDR, unc_len, (uchar *) data, &len)
> > +                   != 0) {
>
> nit: a little ugly; can you split the gunzip call and if() into
> separate lines for easy readability?
>

not ugly in my book, but can do. :)

> > +                       puts ("GUNZIP ERROR - FPGA not loaded\n");
> > +                       return 1;
> > +               }
> > +               len = unc_len;
> > +               break;
> > +
> > +#ifdef CONFIG_BZIP2
> > +       case IH_COMP_BZIP2:
> > +               i = BZ2_bzBuffToBuffDecompress ((char *)CFG_LOAD_ADDR, punc_len,
> > +                                               (char *)data, len, 1, 0);
> > +               if (i != BZ_OK) {
> > +                       printf ("BUNZIP2 ERROR %d - FPGA not loaded!\n", i);
> > +                       return 1;
> > +               }
> > +               len = unc_len;
> > +               break;
> > +#endif                         /* CONFIG_BZIP2 */
>
> Aside: I really hate these #defs; is it feasable to make it table
> driven instead to keep things clean?  But maybe it's not worth it
> since there are only 3 paths including the default.
>

Lets leave this one alone...

> > +       default:
> > +               printf ("Unimplemented compression type %d\n", hdr.ih_comp);
> > +               return 1;
> > +       }
> > +
> > +       return fpga_load(devnum,(char *)CFG_LOAD_ADDR,len);
> > +}
> > +
> >  /* Convert bitstream data and load into the fpga */
> >  int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)
> >  {
> > @@ -248,6 +337,10 @@
> >                 rc = fpga_load (dev, fpga_data, data_size);
> >                 break;
> >
> > +       case FPGA_LOADI:
> > +               rc = fpga_loadi (dev, fpga_data);
> > +               break;
> > +
> >         case FPGA_LOADB:
> >                 rc = fpga_loadbitstream(dev, fpga_data, data_size);
> >                 break;
> > @@ -298,6 +391,8 @@
> >                 op = FPGA_INFO;
> >         } else if (!strcmp ("loadb", opstr)) {
> >                 op = FPGA_LOADB;
> > +       } else if (!strcmp ("loadi", opstr)) {
> > +               op = FPGA_LOADI;
> >         } else if (!strcmp ("load", opstr)) {
> >                 op = FPGA_LOAD;
> >         } else if (!strcmp ("loadmk", opstr)) {
> > @@ -317,6 +412,7 @@
> >             "fpga [operation type] [device number] [image address] [image size]\n"
> >             "fpga operations:\n"
> >             "\tinfo\tlist known device information\n"
> > +           "\tloadi\tLoad device from u-boot image\n"
> >             "\tload\tLoad device from memory buffer\n"
> >             "\tloadb\tLoad device from bitstream buffer (Xilinx devices only)\n"
> >             "\tloadmk\tLoad device generated with mkimage\n"
> >
> >
> > -------------------------------------------------------------------------
> > This SF.net email is sponsored by DB2 Express
> > Download DB2 Express C - the FREE version of DB2 express and take
> > control of your XML. No limits. Just data. Click to get it now.
> > http://sourceforge.net/powerbar/db2/
> > _______________________________________________
> > U-Boot-Users mailing list
> > U-Boot-Users at lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/u-boot-users
> >
>
>
> --
> Grant Likely, B.Sc., P.Eng.
> Secret Lab Technologies Ltd.
> grant.likely at secretlab.ca
> (403) 399-0195
>




More information about the U-Boot mailing list