[U-Boot] Automatic firmware upgrade using USB DFU
Lukasz Majewski
l.majewski at samsung.com
Tue Aug 19 14:02:14 CEST 2014
Hi Tamás,
> Dear All,
>
> I am trying to implement an automatic firmware upgrade functionality
> on a U-Boot / embedded Linux board the following way. If anyone has
> done something similar before, please, comment if this is the right
> approach to the problem or I should choose a different solution? The
> hardware is a BeagleBone Black acting as the DFU device (to be
> updated). It is connected to a host machine (PC) that downloads the
> new firmware using USB DFU.
>
>
> So, here are my planned steps for DFU fw upgrade.
>
> 1) A U-Boot environment variable is set from embedded Linux if a fw
> upgrade is required.
I suppose that you have already managed to modify the u-boot envs. When
I was extracting the envs to restore them, I've found following script
very useful.
cp `find . -name "env_common.o"` copy_env_common.o
objcopy -O binary --only-section=.rodata.default_environment `find .
-name "copy_env_common.o"` tr '\0' '\n' < copy_env_common.o >
default_envs.txt
Here you can modify default_envs.txt
mkenvimage -s 4096 -o params.bin default_envs.txt
rm copy_env_common.o default_envs.txt
params.bin should be stored on the medium.
> Then the board is rebooted.
>
> 2) In the boot-up script, U-Boot checks the value of the environment
> variable and enters DFU mode instead of booting the Linux kernel.
> This command is executed to enter DFU mode: 'dfu 0 mmc 0'.
>
> 3) At this point the host recognises the DFU device and downloads the
> new firmware image.
>
> 4) After the download has finished,
Here since we are polling we need to either press ctrl+C or specify -R
with dfu-util command. The problem with -R is that we will reset
without executing any commands, so the env will not be reset.
Workaround (as I use it in our boards) is to perform
dfu-util -R -aX -D params.bin as the last command.
What presumably you are requiring is to be able to perform:
setenv UPDATE "1"; dfu-util -aX -D file1; dfu-util -aX -D file2; setenv
UPDATE "0"; reset;
For now I can only propose the above workaround.
However, up till now we are only supporting -R switch, but in the
dfu-util (version 0.7) there is the -e/--detach option.
I will investigate if we could use dfu-util -e from host to replace
pressing ctrl+C after flashing the device.
> the environment variable is reset
> to indicate normal boot and the board is rebooted.
>
> 5) Board boots up using the new firmware.
>
>
> When tested this manually, I found a problem in step 4) because
> U-Boot requires pressing Ctrl+C after the download finished. This
> suggests me that DFU can't be controlled by a script as I described
> above. Is this correct?
> What is the idea behind waiting for Ctrl+C
> and not returning immediately?
In the u-boot UDC/gadget is polled and hence we must either specify -R
switch at dfu-util or press ctrl-c to end USB transmission and return
to target's prompt.
> Any comments or hints are appreciated.
>
> Thanks,
> -Tamás
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
--
Best regards,
Lukasz Majewski
Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
More information about the U-Boot
mailing list