[U-Boot] A proposal/hack for an efficient USB DFU for linux based boards
Lukasz Majewski
l.majewski at samsung.com
Fri Mar 14 09:52:34 CET 2014
Hi Krishna,
> Hi,
>
> Thanks for your time,
>
> Please find following comments:
>
> >
> > 1. Current solution (u-boot):
> > - It is possible to specify your own "dfu_alt_info" environment
> > variable when you call dfu command.
> >
> > 2. Speed improvement - section "Making it faster" from:
> > http://codelectron.wordpress.com/2014/02/28/flexible-firmware-upgrade/
> >
> > - I've noticed that you are referring to following dfu-util version:
> > dfu-util - (C) 2007 by Openmoko Inc.
> >
> > It seems to be a bit old one.
> >
>
> I just used the content from my old documentation, But im referring to
> current implementation.
>
>
> > The newest GIT repo can be found at:
> > git://gitorious.org/dfu-util/dfu-util.git
> >
> > I'm referring to following SHA1 (master branch):
> > bda43a52a6c5e9dcd159236553b0d5c511616e77
> >
> > The code at dfuload_do_dnload() function is already rewritten to
> > only wait:
> > milli_sleep(dst.bwPollTimeout);
> >
> > which is correct, since non-zero values are explicitly specified in
> > u-boot (when e.g. target expects that eMMC data will be written).
> >
> > It seems that the proposed improvement is already implemented.
> >
>
> I dont think its implemented, you can refer here, its the block of
> code what I am referring to,
>
> https://gitorious.org/dfu-util/dfu-util/source/bda43a52a6c5e9dcd159236553b0d5c511616e77:src/dfu_load.c#L123
> https://gitorious.org/dfu-util/dfu-util/source/bda43a52a6c5e9dcd159236553b0d5c511616e77:src/dfu_load.c#L137
Ok, so there is the current code:
do {
ret = dfu_get_status(dif, &dst);
if (ret < 0) {
errx(EX_IOERR, "Error during download get_status");
goto out_free;
}
if (dst.bState == DFU_STATE_dfuDNLOAD_IDLE ||
dst.bState == DFU_STATE_dfuERROR)
break;
/* Wait while device executes flashing */
milli_sleep(dst.bwPollTimeout);
} while (1);
And the code you refer in your webpage:
http://codelectron.wordpress.com/2014/02/28/flexible-firmware-upgrade/
do {
ret = dfu_get_status(dif->dev_handle, dif->interface, &dst);
if (ret < 0) {
fprintf(stderr, “Error during download get_status\n”);
goto out_free;
}
if (dst.bState == DFU_STATE_dfuDNLOAD_IDLE ||
dst.bState == DFU_STATE_dfuERROR)
break;
/* Wait while device executes flashing */
if (quirks & QUIRK_POLLTIMEOUT)
milli_sleep(DEFAULT_POLLTIMEOUT);
else
milli_sleep(dst.bwPollTimeout);
} while (1);
I'm a bit confused here, since it looks like the
milli_sleep(DEFAULT_POLLTIMEOUT); is already removed.
Am I missing something?
>
>
> > As a side note:
> > To improve transmission speed we were even trying to increase the
> > EP0 packet size on HOST machine. Unfortunately it has some
> > limitations (4 KiB if I'm not wrong).
> >
> Yes I do think so about the limitation, as a standard EP0 should
> support atleast 64 bytes and DFU is based on that.
>
> >
> > Anyway, I'm open for potential DFU transmission speed improvements.
> >
> >
> > 3. Flexibility improvement - section "Making it flexible"
> >
> > The idea of adding headers seems appealing - but there are as usual
> > some corner cases:
> >
> > - Backward compatibility - dfu-util and dfu use number of alt
> > settings to chose the memory region to be written. That is why you
> > observe a lot of alt=X when you type dfu-util -l. We would need
> > some extra switch in the dfu-util to support yours header based
> > approach.
> >
> > - In u-boot we would like to have some degree of control of where
> > and if we flash data. I personally like to specify beforehand (in
> > envs) what parts of memory are available for flashing.
> >
>
> I developed it keeping in mind a situation in field where there can
> be a complete change in memory organisation.
Maybe some special alt setting could be defined for such a behavior in
u-boot? We can think about that if it solves a real problem.
>
>
> > - Some more complicated schemes shall be considered as well. I've
> > got some pending patches to support eMMC's bootparts flashing via
> > DFU.
> >
> > - Also the header itself only assumes NAND being the backing
> > memory. But we now also alter content of eMMC and RAM with DFU.
> > This is missing.
> >
> > - The information provided by headers is already stored at
> > "dfu_alt_info" environment variable. It is also used by other
> > gadgets.
> >
>
> It was an example code based on what I had implemented some time
> back. It was based on nand flash, but the idea will be the same for
> any other type.
>
> I just wanted to share the idea of a different type of implementation
> of USB DFU.
I'm happy, that you had shared this fresh view.
Do you have any other ideas for improvements?
>
>
> Krishna
> www.codelectron.com
--
Best regards,
Lukasz Majewski
Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
More information about the U-Boot
mailing list