Re: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
Hi, On 10/5/21 3:41 PM, patrick.delau...@foss.st.com wrote: Hi, ST Restricted -Original Message- From: Marek Vasut Sent: mardi 5 octobre 2021 15:33 To: patrick.delau...@foss.st.com; u-boot@lists.denx.de Cc: 'Lukasz Majewski' Subject: Re: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes On 10/5/21 2:50 PM, patrick.delau...@foss.st.com wrote: Hi Marek, ST Restricted -Original Message- From: U-Boot On Behalf Of Marek Vasut Sent: mardi 5 octobre 2021 14:40 To: u-boot@lists.denx.de Cc: Marek Vasut ; Lukasz Majewski 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 Cc: Lukasz Majewski --- 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(, " "); 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++; dfu->data.sf.size = hextoul(s, ); + } else if (!strcmp(st, "sf")) { + st = strsep(, " "); + 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, ); @@ -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 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 0:1=raw 0x0 " '&' 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 Test with dfu MTD backend + export of all device present on STM32MP157C-EV1 dfu_alt_info=ram 0=uImage ram 0xc200 0x200;devicetree.dtb ram 0xc400 0x10;uramdisk.image.gz ram 0xc440 0x1000 0=mmc0_fsbl1 part 0 1;mmc0_fsbl2 part 0 2;m
RE: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
Hi, ST Restricted > -Original Message- > From: Marek Vasut > Sent: mardi 5 octobre 2021 15:33 > To: patrick.delau...@foss.st.com; u-boot@lists.denx.de > Cc: 'Lukasz Majewski' > Subject: Re: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes > > On 10/5/21 2:50 PM, patrick.delau...@foss.st.com wrote: > > Hi Marek, > > > > > > ST Restricted > > > >> -Original Message- > >> From: U-Boot On Behalf Of Marek Vasut > >> Sent: mardi 5 octobre 2021 14:40 > >> To: u-boot@lists.denx.de > >> Cc: Marek Vasut ; Lukasz Majewski > >> 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 > >> Cc: Lukasz Majewski > >> --- > >> 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(, " "); > >>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++; > >>dfu->data.sf.size = hextoul(s, ); > >> + } else if (!strcmp(st, "sf")) { > >> + st = strsep(, " "); > >> + 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, ); > >> @@ -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
Re: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
On 10/5/21 2:50 PM, patrick.delau...@foss.st.com wrote: Hi Marek, ST Restricted -Original Message- From: U-Boot On Behalf Of Marek Vasut Sent: mardi 5 octobre 2021 14:40 To: u-boot@lists.denx.de Cc: Marek Vasut ; Lukasz Majewski 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 Cc: Lukasz Majewski --- 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(, " "); 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++; dfu->data.sf.size = hextoul(s, ); + } else if (!strcmp(st, "sf")) { + st = strsep(, " "); + 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, ); @@ -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 ?
RE: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
Hi, ST Restricted > -Original Message- > From: patrick.delau...@foss.st.com > Sent: mardi 5 octobre 2021 14:50 > To: 'Marek Vasut' ; 'u-boot@lists.denx.de' b...@lists.denx.de> > Cc: 'Lukasz Majewski' > Subject: RE: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes > > Hi Marek, > > > ST Restricted > > > -Original Message- > > From: U-Boot On Behalf Of Marek Vasut > > Sent: mardi 5 octobre 2021 14:40 > > To: u-boot@lists.denx.de > > Cc: Marek Vasut ; Lukasz Majewski > > 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 > > Cc: Lukasz Majewski > > --- > > 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(, " "); > > 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++; > > dfu->data.sf.size = hextoul(s, ); > > + } else if (!strcmp(st, "sf")) { > > + st = strsep(, " "); > > + 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, ); > > @@ -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 0:1=raw 0x0 " '&' 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
RE: [PATCH v2] dfu: dfu_sf: Add support for multiple flashes
Hi Marek, ST Restricted > -Original Message- > From: U-Boot On Behalf Of Marek Vasut > Sent: mardi 5 octobre 2021 14:40 > To: u-boot@lists.denx.de > Cc: Marek Vasut ; Lukasz Majewski > 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 > Cc: Lukasz Majewski > --- > 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(, " "); > 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++; > dfu->data.sf.size = hextoul(s, ); > + } else if (!strcmp(st, "sf")) { > + st = strsep(, " "); > + 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, ); > @@ -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"
[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 Cc: Lukasz Majewski --- 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(, " "); 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++; dfu->data.sf.size = hextoul(s, ); + } else if (!strcmp(st, "sf")) { + st = strsep(, " "); + 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, ); @@ -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