[U-Boot] [PATCH 6/8] update: tftp: dfu: Extend update_tftp() function to support DFU

Joe Hershberger joe.hershberger at gmail.com
Fri Jul 17 21:38:20 CEST 2015


Hi Lukasz,

On Thu, Jul 16, 2015 at 3:11 PM, Lukasz Majewski <l.majewski at majess.pl> wrote:
> Hi Joe,
>
>> Hi Lukasz,
>>
>> On Sun, Jul 12, 2015 at 10:30 AM, Lukasz Majewski
>> <l.majewski at majess.pl> wrote:
>> > This code allows using DFU defined mediums for storing data
>> > received via TFTP protocol.
>> >
>> > It reuses legacy code at common/update.c.
>> >
>> > To run update_tftp() during boot one needs to define
>> > "update_tftp_exec_at_boot=true".
>> >
>> > Signed-off-by: Lukasz Majewski <l.majewski at majess.pl>
>> > ---
>> >  common/update.c | 37 ++++++++++++++++++++++++++++---------
>> >  1 file changed, 28 insertions(+), 9 deletions(-)
>> >
>> > diff --git a/common/update.c b/common/update.c
>> > index 75c6d62..f3ed036 100644
>> > --- a/common/update.c
>> > +++ b/common/update.c
>> > @@ -18,6 +18,7 @@
>> >  #include <net.h>
>> >  #include <tftp.h>
>> >  #include <malloc.h>
>> > +#include <dfu.h>
>> >
>> >  /* env variable holding the location of the update file */
>> >  #define UPDATE_FILE_ENV                "updatefile"
>> > @@ -224,11 +225,18 @@ static int update_fit_getparams(const void
>> > *fit, int noffset, ulong *addr,
>> >
>> >  int update_tftp(ulong addr)
>> >  {
>> > -       char *filename, *env_addr;
>> > -       int images_noffset, ndepth, noffset;
>> > +       char *filename, *env_addr, *fit_image_name;
>> >         ulong update_addr, update_fladdr, update_size;
>> > -       void *fit;
>> > +       int images_noffset, ndepth, noffset;
>> > +       bool update_tftp_dfu = false;
>> >         int ret = 0;
>> > +       void *fit;
>> > +
>> > +       if (!getenv("update_tftp_exec_at_boot"))
>> > +               return 0;
>> > +
>> > +       if (getenv("update_tftp_dfu"))
>> > +               update_tftp_dfu = true;
>>
>> As I mentioned in the documentation patch, it would be nice to split
>> these out and drop the env vars.
>
> This would be difficult since update_tftp() is used at dfutftp() and
> legacy fitupd command. Moreover it is called in the early stage of
> booting to perform auto firmware upgrade.

So you are using it for the dfu stuff too. How early does it need to
be? Maybe preboot? That's what I do on my products. Works great for
me.

I'd really prefer not to proliferate this practice.

> Those env variables give some control over its behavior.
>
>>
>> >
>> >         /* use already present image */
>> >         if (addr)
>> > @@ -277,8 +285,8 @@ got_update_file:
>> >                 if (ndepth != 1)
>> >                         goto next_node;
>> >
>> > -               printf("Processing update '%s' :",
>> > -                       fit_get_name(fit, noffset, NULL));
>> > +               fit_image_name = (char *)fit_get_name(fit, noffset,
>> > NULL);
>> > +               printf("Processing update '%s' :", fit_image_name);
>> >
>> >                 if (!fit_image_verify(fit, noffset)) {
>> >                         printf("Error: invalid update hash,
>> > aborting\n"); @@ -294,10 +302,21 @@ got_update_file:
>> >                         ret = 1;
>> >                         goto next_node;
>> >                 }
>> > -               if (update_flash(update_addr, update_fladdr,
>> > update_size)) {
>> > -                       printf("Error: can't flash update,
>> > aborting\n");
>> > -                       ret = 1;
>> > -                       goto next_node;
>> > +
>> > +               if (!update_tftp_dfu) {
>> > +                       if (update_flash(update_addr, update_fladdr,
>> > +                                        update_size)) {
>> > +                               printf("Error: can't flash update,
>> > aborting\n");
>> > +                               ret = 1;
>> > +                               goto next_node;
>> > +                       }
>> > +               } else if (fit_image_check_type(fit, noffset,
>> > +                                               IH_TYPE_FIRMWARE)) {
>> > +                       if (dfu_tftp_write(fit_image_name,
>> > +                                          update_addr,
>> > update_size)) {
>> > +                               ret = 1;
>> > +                               goto next_node;
>> > +                       }
>> >                 }
>> >  next_node:
>> >                 noffset = fdt_next_node(fit, noffset, &ndepth);
>> > --
>> > 2.1.4
>> >
>> > _______________________________________________
>> > U-Boot mailing list
>> > U-Boot at lists.denx.de
>> > http://lists.denx.de/mailman/listinfo/u-boot
>
> Best regards,
> Lukasz Majewski


More information about the U-Boot mailing list