Hi,
ST Restricted > -----Original Message----- > From: [email protected] <[email protected]> > Sent: mardi 5 octobre 2021 14:50 > To: 'Marek Vasut' <[email protected]>; '[email protected]' <u- > [email protected]> > Cc: 'Lukasz Majewski' <[email protected]> > Subject: RE: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes > > 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" with '&' in dfu_alt_info you can have several dfu backend... something as (not tested) : U-Boot> env set dfu_alt_info "sf 0:0=raw 0x0 <size>&sf 0:1=raw 0x0 <size>" '&' It is working for ANY existing backend => used today in STM32MP15x + stm32prog command as backend when flashlayout is parsed to update any device. + for dfu command (board/st/common/stm32mp_dfu.c) => all devices are exported (mtd nand0 and mtd nor0) Patrick

