Hi Marek,

ST Restricted

> -----Original Message-----
> From: U-Boot <[email protected]> On Behalf Of Marek Vasut
> Sent: mardi 5 octobre 2021 14:40
> To: [email protected]
> Cc: Marek Vasut <[email protected]>; Lukasz Majewski <[email protected]>
> Subject: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
> 
> Add dfu_alt_info option which allows specifying multiple SPI flashes as an
alt info.
> The syntax is as follows:
> 
> altname sf bus:cs[:speed[:mode]]
> 
> Example:
> dfu_alt_info=qspi0 sf 0:0;qspi1 sf 0:1
> 
> Signed-off-by: Marek Vasut <[email protected]>
> Cc: Lukasz Majewski <[email protected]>
> ---
> V2: Fix device string parsing in all cases
> ---
>  drivers/dfu/dfu_sf.c | 31 ++++++++++++++++++++++++-------
>  1 file changed, 24 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/dfu/dfu_sf.c b/drivers/dfu/dfu_sf.c index
> b72493ced86..6d33497990a 100644
> --- a/drivers/dfu/dfu_sf.c
> +++ b/drivers/dfu/dfu_sf.c
> @@ -168,30 +168,46 @@ static struct spi_flash *parse_dev(char *devstr)
int
> dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, char *s)  {
>       char *st;
> -     char *devstr_bkup = strdup(devstr);
> -
> -     dfu->data.sf.dev = parse_dev(devstr_bkup);
> -     free(devstr_bkup);
> -     if (!dfu->data.sf.dev)
> -             return -ENODEV;
> 
>       dfu->dev_type = DFU_DEV_SF;
> -     dfu->max_buf_size = dfu->data.sf.dev->sector_size;
> 
>       st = strsep(&s, " ");
>       if (!strcmp(st, "raw")) {
> +             char *devstr_bkup = strdup(devstr);
> +             dfu->data.sf.dev = parse_dev(devstr_bkup);
> +             free(devstr_bkup);
> +             if (!dfu->data.sf.dev)
> +                     return -ENODEV;
> +
>               dfu->layout = DFU_RAW_ADDR;
> +             dfu->max_buf_size = dfu->data.sf.dev->sector_size;
>               dfu->data.sf.start = hextoul(s, &s);
>               s++;
>               dfu->data.sf.size = hextoul(s, &s);
> +     } else if (!strcmp(st, "sf")) {
> +             st = strsep(&s, " ");
> +             dfu->data.sf.dev = parse_dev(st);
> +             if (!dfu->data.sf.dev)
> +                     return -ENODEV;
> +
> +             dfu->layout = DFU_RAW_ADDR;
> +             dfu->max_buf_size = dfu->data.sf.dev->sector_size;
> +             dfu->data.sf.start = 0;
> +             dfu->data.sf.size = dfu->data.sf.dev->size;
>       } else if (CONFIG_IS_ENABLED(DFU_SF_PART) &&
>                  (!strcmp(st, "part") || !strcmp(st, "partubi"))) {
> +             char *devstr_bkup = strdup(devstr);
>               char mtd_id[32];
>               struct mtd_device *mtd_dev;
>               u8 part_num;
>               struct part_info *pi;
>               int ret, dev, part;
> 
> +             dfu->data.sf.dev = parse_dev(devstr_bkup);
> +             free(devstr_bkup);
> +             if (!dfu->data.sf.dev)
> +                     return -ENODEV;
> +
>               dfu->layout = DFU_RAW_ADDR;
> 
>               dev = dectoul(s, &s);
> @@ -208,6 +224,7 @@ int dfu_fill_entity_sf(struct dfu_entity *dfu, char
*devstr,
> char *s)
>                       printf("Could not locate '%s'\n", mtd_id);
>                       return -1;
>               }
> +             dfu->max_buf_size = dfu->data.sf.dev->sector_size;
>               dfu->data.sf.start = pi->offset;
>               dfu->data.sf.size = pi->size;
>               if (!strcmp(st, "partubi"))
> --
> 2.33.0

The same use case can be supported with mtd backend

https://elixir.bootlin.com/u-boot/latest/source/doc/usage/dfu.rst


U-Boot> env set dfu_alt_info \
     "mtd nor0=spl part 1;u-boot part 2;u-boot-env part 3&"\
     "mtd nand0=UBI partubi 1"

Reply via email to