[U-Boot] dfu: using dfu-util -l shows different output

Heiko Schocher hs at denx.de
Tue Jun 25 13:24:31 CEST 2013


Hello Lukasz,

Am 25.06.2013 12:29, schrieb Lukasz Majewski:
> Hi Heiko,
> 
>> Hello Lukasz,
>>
>> Am 25.06.2013 10:44, schrieb Lukasz Majewski:
>>> Hi Heiko,
>>>
>>>> Hello Pantelis,
>>>>
>>>> Am 25.06.2013 10:16, schrieb Pantelis Antoniou:
>>>>> Heiko,
>>>>>
>>>>> I don't think the gadget is initialized before you issue
>>>>> a dfu call.
>>>>>
>>>>> So that makes sense.
>>>>
>>>> ?
>>>>
>>>> I call from the host "dfu-util -l" so the gadget on the board
>>>> should do the answer ... or?
>>>
>>> The gadget is not initialized here (so the dfu-util -l shows no
>>> output).
>>>
>>> After transfer it shows information about proper alt settings.
>>>
>>> This is correct behaviour, but I had discussion about this with Tom
>>> and we agreed, that it would be nice to have "dfu-util -l"
>>> exporting from very beginning the alt setting information.
>>
>> Yes, I vote for this too. Connecting to a board, I first
>> would do a "dfu-util -l" to look, what is possible to
>> update here ...
>>
>>> Frankly, I had too much other work to implement it.
>>>
>>> However, I think, that it would be a very useful feature (e.g. to
>>> get alt settings layout at HOST to facilitate automated flashing).
>>
>> Hmm... I digged into the code, but not really found a place
>> where I have to start. Can you give me a hint where to start?
>> So maybe, I can do it?
> 
> The problem here is to switch:
>   f_dfu->usb_function.strings = dfu_strings | NULL;
>   f_dfu->usb_function.hs_descriptors = f_dfu->function |
>   	dfu_runtime_descs;
> 
> The trick here is to properly fill in hs USB descriptors to embed the
> alt settings strings.
> 
> 
> dfu-util -l can read the alt settings when following patch is applied:
> 
> @@ -655,6 +656,7 @@ static int dfu_bind(struct usb_configuration *c,
> struct usb_function *f) 
>         stringtab_dfu.strings = f_dfu->strings;
>  
> +       to_dfu_mode(f_dfu);
>         cdev->req->context = f_dfu;
>  
>  error:
> 
> Unfortunately this breaks normal dfu operation, since board hangs at
> "dfu mode".

What do you mean with "normal dfu operation" ?

I just tried the following patch, and "dfu-util -l" and
"dfu-util -a ... -D ..." works ...

diff --git a/drivers/usb/gadget/f_dfu.c b/drivers/usb/gadget/f_dfu.c
index a322ae5..0334d9f 100644
--- a/drivers/usb/gadget/f_dfu.c
+++ b/drivers/usb/gadget/f_dfu.c
@@ -653,6 +653,9 @@ static int dfu_bind(struct usb_configuration *c, struct usb_function *f)
                        ->iInterface = id;
        }

+       to_dfu_mode(f_dfu);
+       f_dfu->dfu_state = DFU_STATE_dfuIDLE;
+
        stringtab_dfu.strings = f_dfu->strings;

        cdev->req->context = f_dfu;

log on the host, where I use dfu-util:

after restart of the board:

[root at ts8 ~]# dfu-util -l
dfu-util 0.5

(C) 2005-2008 by Weston Schmidt, Harald Welte and OpenMoko Inc.
(C) 2010-2011 Tormod Volden (DfuSe support)
This program is Free Software and has ABSOLUTELY NO WARRANTY

dfu-util does currently only support DFU version 1.0

Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=0, name="SPL"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=1, name="SPL.backup1"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=2, name="SPL.backup2"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=3, name="SPL.backup3"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=4, name="u-boot"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=5, name="kernel_a"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=6, name="kernel_b"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=7, name="rootfs"
[root at ts8 ~]# dfu-util -a rootfs -D dxr2-org/dxr2.xx-release-image-UNKNOWN-dxr2.ubi
dfu-util 0.5

(C) 2005-2008 by Weston Schmidt, Harald Welte and OpenMoko Inc.
(C) 2010-2011 Tormod Volden (DfuSe support)
This program is Free Software and has ABSOLUTELY NO WARRANTY

dfu-util does currently only support DFU version 1.0

Opening DFU USB device... ID 0525:4a47
WARNING: Can not find cached DFU functional descriptor
Warning: Assuming DFU version 1.0
Run-time device DFU version 0100
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=7, name="rootfs"
Claiming USB DFU Interface...
Setting Alternate Setting #7 ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
Error obtaining cached DFU functional descriptor
DFU mode device DFU version 0110
Device returned transfer size 4096
No valid DFU suffix signature
Warning: File has no DFU suffix
bytes_per_hash=576716
Copying data from PC to DFU device
Starting download: [##################################################] finished!
state(2) = dfuIDLE, status(0) = No error condition is present
Done!
[root at ts8 ~]# dfu-util -l
dfu-util 0.5

(C) 2005-2008 by Weston Schmidt, Harald Welte and OpenMoko Inc.
(C) 2010-2011 Tormod Volden (DfuSe support)
This program is Free Software and has ABSOLUTELY NO WARRANTY

dfu-util does currently only support DFU version 1.0

Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=0, name="SPL"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=1, name="SPL.backup1"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=2, name="SPL.backup2"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=3, name="SPL.backup3"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=4, name="u-boot"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=5, name="kernel_a"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=6, name="kernel_b"
Found DFU: [0525:4a47] devnum=0, cfg=2, intf=0, alt=7, name="rootfs"
[root at ts8 ~]#

seems to me, that we should add

"f_dfu->dfu_state = DFU_STATE_dfuIDLE"
into to_dfu_mode() as, after all places where to_dfu_mode() is called
f_dfu->dfu_state = DFU_STATE_dfuIDLE is set ...

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