[U-Boot] [RFC][DFU] Unification of dfu_alt_info alt settings description + command execution

Heiko Schocher hs at denx.de
Thu Jul 18 07:36:40 CEST 2013


Hello Lukasz,

Am 17.07.2013 16:34, schrieb Lukasz Majewski:
> On Wed, 17 Jul 2013 12:26:35 +0200 Heiko Schocher hs at denx.de wrote,
>
> Hi Heiko,
>
>> Hello Lukasz,
>>
>> Am 16.07.2013 17:35, schrieb Lukasz Majewski:
>>> Dear All,
>>>
>>> Since DFU usage at u-boot is spreading to different device types
>>> (MMC, NAND), file systems, raw partitions, ubi, etc, I think that
>>> it is a good moment to unify and structure the form of dfu_alt_info
>>> environment variable.
>>
>> Full Ack!
>>
>>> Proposed new format for single dfu entity:
>>>
>>> NAME     | Type | Device | Dev_num | Dev_part | FS   | start |
>>> size  |
>>>
>>> where:
>>>
>>> Name     - name of the alt setting (as seen by dfu-util -l)
>>> Type     - description of the image (raw, file, img, command [*])
>>> Device   - physical device on which data are stored (mmc, nand, "-")
>>> Dev_num  - number of the device - it is possible to store data via
>>> DFU on several devices of the same type.
>>> Dev_part - number of partitions on the device.
>>
>> Should this be "number of the partition on the device"
>
> No. I made a mistake. It should be "partition to which we want to write"
>
>>
>> You mean here the mtd partition for storing, right?
>
> Yes, number of the partition to store data. The exact address will be
> extracted from mtdparts or partitions env variable.

Ok.

>>
>>> FS       - information about file system on the device (fat,
>>> 	   ext2/ext4, ubi).
>>> start    - start offset from the beginning of the Device (byte or
>>> LBA number addressed)
>>> size     - maximal number of blocks to be stored on the Device
>>>    	   (expressed with Bytes of LBA number) (protection from
>>>    	   overwriting the whole device)
>>>
>>>
>>> Example:
>>
>> Maybe dummy questions ...
>>
>>> NAME     | Type | Device | Dev_num | Dev_part | FS   | start |
>>> size  |
>>> ----------------------------------------------------------------------
>>> u-boot   | raw  | mmc    | 0       | "-" [**] | "-"  | 0x80  |
>>> 0x100 | uImage   | file | mmc    | 0       | 2        | ext4 |
>>> "-"   | "-"   |
>>
>> Is this enough information? Where to store the uImage file on the ext4
>> partition?
>
> To store uImage file on ext4/fat/ext2 partition it is enough to only
> give:
>
> uImage mmc 0 2,
>
> which maps to the following command:
>
> ext4write mmc 0:2 0x44000000 /uImage [size]

Hmm... and what if I have my uImage in /boot/ ?

> The file size is taken from number of sent bytes via DFU/USB.

Yes.

> With writing to file system, one need to first store the whole
> transmitted data to a buffer and then store the (big) buffer on the
> SD/eMMC device.

Ok, same for an ubi image.

> Since, we aren't supporting "seek" kind of write to current ext4
> implementation at u-boot, the "big" buffer must be used.

Ok, there are places to optimize ;-)

>>> root.img | img  | mmc    | 0       | 5        | "-"  | "-"   |
>>> "-"   |
>>
>> img means here: getting an image and storing it on the mtd partition
>> "Dev_part" if start and size are marked with "-", beginning
>> on start of the partition?
>
> No, here img is for example a rootfs image. When storing it on the
> eMMC, it would be better to specify destination partition.
>
>>
>> Wouldn't it be better to use here mtd partition names instead
>> numbers for "Dev_part"?
>
> I'd prefer to create a new entrance here (Part_name):
>
> NAME | Type | Device | Dev_num | Dev_part | Part_name | FS | start |
> size |
>
> I would like to avoid situation with ambiguous fields. One field
> shall only serve for one (clear) purpose. When not needed/used - field
> shall be marked as "-".

Ok. but this gives long constructs ...

>> What if "start" and "size" are filled with values for the "Type"
>> "img"? Or is this forbidden for the "Type" "img"?
>
> I think, that each "Type" shall have predefined set of allowed
> attributes:
>
> 1. img: "Device" + "Dev num" + "Dev parts"
> 2. raw: "Device" + "Dev num" + "start" + "size"
> 3. file: "Device" + "Dev num" + "Dev parts" + "FS"
>
> and so on.

If we introduce a "Part_name" this should be also possible:

4. img: "Device" + "Dev num" + "Part_name"
5. file: "Device" + "Dev num" + "Part_name" + "FS"

or?

>>> root.img | raw  | mmc    | 0       | "-"      | "-"  | 0x1000|
>>> 0x4000|
>>>
>>> u-boot   | raw  | nand   | 0       | "-"      | "-"  | 0x100 |
>>> 0x100 | uImage   | file | nand   | 0       | 3        | ubi  |
>>> "-"   | "-"   |
>>
>> s/uImage/rootfs.img ? s/file/img ?
>
> NAME: uImage and rootfs.img maps to files sent to board.
>
> The "NAME" is used thereafter to provide exact name for file system
> write (ext4write/ fatwrite).

Ah! If we have to write in a subdirectory, "NAME" is the fullpath + filename?

> With DFU the distinction between dfu entities (files, raw images, etc)
> is performed via alt settings (-aX switch at dfu-util).
>
>>
>> For the FS "ubi" we need to specify, how to burn this into nand.
>> I think we have no "ubi format" command.
>
> Is already ubi format command available at u-boot?

No.

> _As a side note:_
>
> I'm now developing proof-of-concept idea of executing set of commands
> sent to u-boot by dfu-util [***].

Ok.

> Rationale for this is the lack of ability to reset u-boot after sending
> data to u-boot via DFU. dfu-util has -R option, but this seems to reset
> usb interface, not the target device.

That answers my next question which comed in my mind ...

> I will set an env:
>
> setenv dfu "dfu mmc 0;${dfu_commands}"
>
> Then at dfu itself, I will read commands to be performed. Then I will
> set $dfu_commands env and exit from dfu command.

Hmm... is this not oversized for the "reset board" use case?

>> With "ubi write ..."
>> we can only write ubi volumes ... and we want here to burn an ubi
>> image, which was created with ubinize and contains one or more ubi
>> volumes
>>
>> Maybe usecase for updating ubi volumes:
>> ubivolumename   | img | nand   | 0       | 3        | ubivol | "-"
>> | "-"   |
>>
>> If you want to update an ubivolume ...
>>
>> results in this steps:
>> - get image per dfu @ img_addr
>>     We need to get here the complete image, as ubi write
>>     cannot write incremental ...
>
> So each volume shall have different dfu entity. Then those volumes are
> stored at ram with different addresses [*]?

Yes for every volume have different dfu entity.
You update only one volume with one dfu-util command, or? So
no different addresses needed ...

>> - ubi part get_mtd_partition_name("Dev_part=3") vid_header_offset
>>                                                   ^
>>                                                   From where get we
>> this parameter ... value in "start"?
>
> So here you get information about the ("Dev_part=3") partition start
> offset [**]?

Yes ... what is with the "vid_header_offset" parameter?

>> - ubi write img_addr ubivolumename ${filesize}
>
> Here you combine volumes sent at [*] and store it at correct offset
> [**]?

Yes! But just one volume at once ...

> I'm not an expert about ubi, so please be patient with my
> questions :-).

No problem! I also just learning ;-)

The above steps are just to get the idea, what must be done for
updating an ubi image, as this were the steps if you type in commands.

> For me it looks like a mixture of ordinary u-boot commands with dfu
> transfer[s] needed to perform correct ubi image write. Maybe [***] will
> help you?

If we have the dfu_buf address availiable ... maybe it is worth a
try ... thinking of sending per dfu a "run upd_ubi" and the
"upd_ubi" command do the complete update ... but, if we update
more than one image ... this will not work.

bye,
Heiko
-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany


More information about the U-Boot mailing list