| # 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" | |
| 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) |