123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- 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)
|