121 lines
3.5 KiB
Plaintext
121 lines
3.5 KiB
Plaintext
|
# SPDX-License-Identifier: GPL-2.0+
|
||
|
#
|
||
|
# Copyright (C) 2015
|
||
|
#
|
||
|
# Lukasz Majewski <l.majewski@majess.pl>
|
||
|
|
||
|
Device Firmware Upgrade (DFU) - extension to use TFTP
|
||
|
=====================================================
|
||
|
|
||
|
Why?
|
||
|
----
|
||
|
|
||
|
* Update TFTP (CONFIG_UPDATE_TFTP) only supports writing
|
||
|
code to NAND memory via TFTP.
|
||
|
* DFU supports writing data to the variety of mediums (NAND,
|
||
|
eMMC, SD, partitions, RAM, etc) via USB.
|
||
|
|
||
|
Combination of both solves their shortcomings!
|
||
|
|
||
|
|
||
|
Overview
|
||
|
--------
|
||
|
|
||
|
This document briefly describes how to use DFU for
|
||
|
upgrading firmware (e.g. kernel, u-boot, rootfs, etc.)
|
||
|
via TFTP protocol.
|
||
|
|
||
|
By using Ethernet (TFTP protocol to be precise) it is
|
||
|
possible to overcome the major problem of USB based DFU -
|
||
|
the relatively low transfer speed for large files.
|
||
|
This was caused by DFU standard, which imposed utilization
|
||
|
of only EP0 for transfer. By using Ethernet we can circumvent
|
||
|
this shortcoming.
|
||
|
|
||
|
Beagle Bone Black rev. C (BBB) powered by TI's am335x CPU has
|
||
|
been used as a demo board.
|
||
|
|
||
|
To utilize this feature, one needs to first enable support
|
||
|
for USB based DFU (CONFIG_DFU_*) and DFU TFTP update
|
||
|
(CONFIG_DFU_TFTP) described in ./doc/README.update.
|
||
|
|
||
|
The "dfu" command has been extended to support transfer via TFTP - one
|
||
|
needs to type for example "dfu tftp 0 mmc 0"
|
||
|
|
||
|
This feature does not depend on "fitupd" command enabled.
|
||
|
|
||
|
As of this writing (SHA1:8d77576371381ade83de475bb639949b44941e8c v2015.10-rc2)
|
||
|
the update.c code is not enabled (CONFIG_UPDATE_TFTP) by any board in the
|
||
|
contemporary u-boot tree.
|
||
|
|
||
|
|
||
|
Environment variables
|
||
|
---------------------
|
||
|
|
||
|
The "dfu tftp" command can be used in the "preboot" environment variable
|
||
|
(when it is enabled by defining CONFIG_PREBOOT).
|
||
|
This is the preferable way of using this command in the early boot stage
|
||
|
as opposed to legacy update_tftp() function invocation.
|
||
|
|
||
|
|
||
|
Beagle Bone Black (BBB) setup
|
||
|
-----------------------------
|
||
|
|
||
|
1. Setup tftp env variables:
|
||
|
* select desired eth device - 'ethact' variable ["ethact=cpsw"]
|
||
|
(use "bdinfo" to check current setting)
|
||
|
* setup "serverip" and "ipaddr" variables
|
||
|
* set "loadaddr" as a fixed buffer where incoming data is placed
|
||
|
["loadaddr=0x81000000"]
|
||
|
|
||
|
#########
|
||
|
# BONUS #
|
||
|
#########
|
||
|
It is possible to use USB interface to emulate ETH connection by setting
|
||
|
"ethact=usb_ether". In this way one can have very fast DFU transfer via USB.
|
||
|
|
||
|
For 33MiB test image the transfer rate was 1MiB/s for ETH over USB and 200KiB/s
|
||
|
for pure DFU USB transfer.
|
||
|
|
||
|
2. Setup update_tftp variables:
|
||
|
* set "updatefile" - the file name to be downloaded via TFTP (stored on
|
||
|
the HOST at e.g. /srv/tftp)
|
||
|
|
||
|
3. If required, to update firmware on boot, put the "dfu tftp 0 mmc 0" in the
|
||
|
"preboot" env variable. Otherwise use this command from u-boot prompt.
|
||
|
|
||
|
4. Inspect "dfu" specific variables:
|
||
|
* "dfu_alt_info" - information about available DFU entities
|
||
|
* "dfu_bufsiz" - variable to set buffer size [in bytes] - when it is not
|
||
|
possible to set large enough default buffer (8 MiB @ BBB)
|
||
|
|
||
|
|
||
|
|
||
|
FIT image format for download
|
||
|
-----------------------------
|
||
|
|
||
|
To create FIT image for download one should follow the update tftp README file
|
||
|
(./doc/README.update) with one notable difference:
|
||
|
|
||
|
The original snippet of ./doc/uImage.FIT/update_uboot.its
|
||
|
|
||
|
images {
|
||
|
update@1 {
|
||
|
description = "U-Boot binary";
|
||
|
|
||
|
should look like
|
||
|
|
||
|
images {
|
||
|
u-boot.bin@1 {
|
||
|
description = "U-Boot binary";
|
||
|
|
||
|
where "u-boot.bin" is the DFU entity name to be stored.
|
||
|
|
||
|
|
||
|
|
||
|
To do
|
||
|
-----
|
||
|
|
||
|
* Extend dfu-util command to support TFTP based transfers
|
||
|
* Upload support (via TFTP)
|