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