Hi,
ST Restricted > -----Original Message----- > From: Marek Vasut <[email protected]> > Sent: mardi 5 octobre 2021 15:33 > To: [email protected]; [email protected] > Cc: 'Lukasz Majewski' <[email protected]> > Subject: Re: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes > > On 10/5/21 2:50 PM, [email protected] wrote: > > 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" > > Does it work for multiple SPI NORs at the same time ? If it is support on mtd side, yes it is supported in dfu... And I think it is supported now (with u-class UCLASS_SPI_FLASH). I need to check.deeper Patrick

