[PATCH v2] dfu: dfu_sf: Add support for multiple flashes

Marek Vasut marex at denx.de
Tue Oct 5 15:32:52 CEST 2021


On 10/5/21 2:50 PM, patrick.delaunay at foss.st.com wrote:
> Hi Marek,
> 
> 
> ST Restricted
> 
>> -----Original Message-----
>> From: U-Boot <u-boot-bounces at lists.denx.de> On Behalf Of Marek Vasut
>> Sent: mardi 5 octobre 2021 14:40
>> To: u-boot at lists.denx.de
>> Cc: Marek Vasut <marex at denx.de>; Lukasz Majewski <lukma at denx.de>
>> 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 <marex at denx.de>
>> Cc: Lukasz Majewski <lukma at denx.de>
>> ---
>> 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 ?


More information about the U-Boot mailing list