<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
  <!-- Please adjust the date whenever revising the manpage. -->
  <!ENTITY date        "<date>26 February,2015</date>">
  <!ENTITY package     "dfu-tool">
  <!ENTITY gnu         "<acronym>GNU</acronym>">
  <!ENTITY gpl         "&gnu; <acronym>GPL</acronym>">
]>

<refentry>
  <refentryinfo>
    <address>
      <email>richard@hughsie.com</email>;
    </address>
    <author>
      <firstname>Richard</firstname>
      <surname>Hughes</surname>
    </author>
    <copyright>
      <year>2015</year>
      <holder>Richard Hughes</holder>
    </copyright>
    &date;
  </refentryinfo>
  <refmeta>
    <refentrytitle>dfu-tool</refentrytitle>
    <manvolnum>1</manvolnum>
  </refmeta>
  <refnamediv>
    <refname>&package;</refname>
    <refpurpose>Device Firmware Upgrade Tool</refpurpose>
  </refnamediv>
  <refsynopsisdiv>
    <cmdsynopsis>
      <command>&package;</command>
      <arg><option>--verbose</option></arg>
      <arg><option>--version</option></arg>
      <arg><option>--force</option></arg>
      <arg><option>--device=VID:PID</option></arg>
      <arg><option>--transfer-size=BYTES</option></arg>
    </cmdsynopsis>
  </refsynopsisdiv>
  <refsect1>
    <title>DESCRIPTION</title>
    <para>
      This manual page documents briefly the <command>&package;</command> command.
    </para>
    <para>
      <command>&package;</command> allows a user to write various kinds of
      firmware onto devices supporting the USB Device Firmware Upgrade protocol.
      This tool can be used to switch the device from the normal runtime mode
      to `DFU mode' which allows the user to read and write firmware.
      Either the whole device can be written in one operation, or individual
      `targets' can be specified with the alternative name or number.
    </para>
    <para>
      <command>&package;</command> uses the <literal>libdfu</literal> shared
      library to perform actions.
      All synchronous actions can be safely cancelled and on failure will return
      errors with both a type and a full textual description.
      libdfu supports DFU 1.0, DFU 1.1 and the ST DfuSe vendor extension, and
      handles many device `quirks' necessary for the real-world implementations
      of <acronym>DFU</acronym>.
    </para>
    <para>
      Additionally <command>&package;</command> can be used to convert firmware
      from various different formats, or to modify details about the elements,
      images and metadata contained inside the firmware file.
      For example, you can easily convert DFU 1.1 firmware into the
      vendor-specific DfuSe format, convert a Intel HEX file into a raw file
      padded to a specific size, or add new copyright and licensing information
      to an existing file.
      Fields such as the vendor and product IDs can be changed, and the firmware
      elements can be encrypted and decrypted using various different methods.
      Merging two DfuSe files together is also possible, although specifying
      different alt-setting numbers before merging is a good idea to avoid
      confusion.
    </para>
    <para>
      Although <command>&package;</command> tries to provide a large number of
      easy-to-use commands, it may only be possible to do certain operations
      using the <literal>libdfu</literal> library directly.
      This is easier than it sounds, as the library is built with GObject
      Introspection support making it usable in many languages such as C,
      Javascript and Python.
      Furthermore, using the library is a good idea if you want to perform
      multiple operations on large firmware files, for instance,
      converting from an Intel HEX file, padding to a certain size, setting
      vendor and adding licensing information and then saving to a remote
      location.
    </para>
  </refsect1>
  <refsect1>
    <title>OPTIONS</title>
    <para>
      This program follows the usual &gnu; command line syntax,
      with long options starting with two dashes (<literal>-</literal>).
      A summary of options is included below.
    </para>
    <variablelist>
      <varlistentry>
        <term>
          <option>--help</option>
        </term>
        <listitem>
          <para>Show summary of all the commands available for use.</para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>--version</option>
        </term>
        <listitem>
          <para>Show the version of <command>&package;</command> installed.</para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>--verbose</option>
        </term>
        <listitem>
          <para>Show extra debugging information.</para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>--device=VID:PID</option>
        </term>
        <listitem>
          <para>
            If multiple DFU-capable devices are attached you can specify the
            specific vendor and product ID of the DFU device you want to query.
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>--transfer-size=BYTES</option>
        </term>
        <listitem>
          <para>
            Manually override the size of each USB transfer, which you may want
            for unreliable hardware or when the device lies about the maximum
            packet size it accepts.
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>--force</option>
        </term>
        <listitem>
          <para>
            Force the operation, disregarding warnings or sanity checks like
            file CRC and checksums.
            This is useful if you really know what you are doing, or in the
            specialised case of fuzz-testing libdfu.
          </para>
        </listitem>
      </varlistentry>
    </variablelist>
  </refsect1>
  <refsect1>
    <title>DEVICE COMMANDS</title>
    <para>
      These commands are used to interface with DFU-capable devices.
    </para>
    <variablelist>
      <varlistentry>
        <term>
          <option>list</option>
        </term>
        <listitem>
          <para>
            This command lists currently attached DFU capable devices.
            Some devices do not support the official DFU <literal>runtime</literal>
            mode and thus do not support auto-discovery using this command.
            For those devices, putting the device into DFU mode manually (e.g. by
            holding a button down when rebooting the device) will make it show
            up here.
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>detach</option>
        </term>
        <listitem>
          <para>
            This command detaches the currently attached DFU capable device into
            a special programming mode.
            Whilst the device is in this special <acronym>DFU</acronym> mode it
            can not be used as a normal device.
            For example, a printer will not accept documents when in DFU mode.
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>attach</option>
        </term>
        <listitem>
          <para>
            This command attaches a DFU capable device back to runtime so it can
            be used as a normal device.
            Some devices do not support attaching, and need to be manually
            disconnected and connected before changing modes.
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>watch</option>
        </term>
        <listitem>
          <para>
            This command watches DFU devices being hotplugged and can be used to
            verify <literal>libdfu</literal> matches up the runtime and DFU modes
            when attaching and detaching.
            Use <option>CTRL+C</option> to make this command quit.
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>read FILENAME</option>
        </term>
        <listitem>
          <para>
            This command uploads all the firmware from device into a file.
            If the device has multiple partitions exported as different alternative
            sections then they will all be read into a multi-image DfuSe-format
            file.
            If you just want the contents of one partition, <option>read-alt</option>
            is the command you want.
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>read-alt FILENAME DEVICE-ALT-NAME|DEVICE-ALT-ID</option>
        </term>
        <listitem>
          <para>
            This command uploads firmware from one partition into a file.
            You can specify the partition by either the ALT-ID or ALT-NAME if set.
          </para>
          <para>e.g. <command>&package; read-alt backup.dfu SRAM</command></para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>write</option>
        </term>
        <listitem>
          <para>
            This command downloads firmware from a file into all possible
            partitions of a device.
            If you only want to write one partition, <option>write-alt</option>
            is the command you want.
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>write-alt FILENAME DEVICE-ALT-NAME|DEVICE-ALT-ID [IMAGE-ALT-NAME|IMAGE-ALT-ID]</option>
        </term>
        <listitem>
          <para>
            This command downloads firmware from the file into one partition.
            You can specify the partition by either the ALT-ID or ALT-NAME if set.
          </para>
          <para>e.g. <command>&package; write-alt sram.dfu SRAM __SRAM</command></para>
        </listitem>
      </varlistentry>
    </variablelist>
  </refsect1>
  <refsect1>
    <title>FIRMWARE COMMANDS</title>
    <para>
      These commands are used to read and modify existing firmware files.
    </para>
    <variablelist>
      <varlistentry>
        <term>
          <option>dump FILENAME</option>
        </term>
        <listitem>
          <para>
            This command dumps all know details about a firmware file.
            The complete memory map is shown, along with any metadata or vendor
            information about the firmware file.
          </para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>convert FORMAT FILE-IN FILE-OUT [SIZE]</option>
        </term>
        <listitem>
          <para>
            This command converts the firmware from one format to another, optionally
            padding to a certain size.
            Possible values for the destination <option>FORMAT</option> include:
            <literal>raw</literal>, <literal>ihex</literal>,
            <literal>dfu</literal> and <literal>dfuse</literal>.
            The <option>FILE-IN</option> and <option>FILE-OUT</option> values can
            be the same if the source file is to be overwritten.
            Although padding increases the file size with no apparent advantages
            it can be used to support devices that do not store the runtime image
            size and where validation of the written firmware is required.
          </para>
          <para>e.g. <command>&package; convert dfu firmware.hex firmware.dfu 8000</command></para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>encrypt FILENAME-IN FILENAME-OUT TYPE KEY</option>
        </term>
        <listitem>
          <para>
            This command encrypts firmware data.
            Only the image contents are actually modified, the DFU footer and
            DfuSe header are left unaltered.
            Possible values for the destination <option>TYPE</option> include:
            <literal>xtea</literal> and <literal>nop</literal>.
            If the <option>KEY</option> is not of the required length it is used
            as an input to a hash function which can produce a key of the
            required size.
          </para>
          <para>e.g. <command>&package; encrypt firmware.dfu firmware.xdfu xtea deadbeef</command></para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>decrypt FILENAME-IN FILENAME-OUT TYPE KEY</option>
        </term>
        <listitem>
          <para>
            This command decrypts firmware data.
            Only the image contents are actually modified, the DFU footer and
            DfuSe header are left unaltered.
            Possible values for the destination <option>TYPE</option> include:
            <literal>xtea</literal> and <literal>nop</literal>.
            If the <option>KEY</option> is not of the required length it is used
            as an input to a hash function which can produce a key of the
            required size.
          </para>
          <para>e.g. <command>&package; decrypt firmware.xdfu firmware.dfu xtea deadbeef</command></para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>merge FILE-OUT FILE1 FILE2 [FILE3...]</option>
        </term>
        <listitem>
          <para>
            This command merges multiple firmware files into one file.
            Although you can merge files with the same ALT-ID or ALT-NAME this
            probably isn't what you want to do.
          </para>
          <para>e.g. <command>&package; merge combined.dfu lib.dfu app.dfu</command></para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>set-alt-setting FILE ALT-ID</option>
        </term>
        <listitem>
          <para>
            This command modifies the alternative number on firmware file.
          </para>
          <para>e.g. <command>&package; set-alt-setting firmware.dfu 1</command></para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>set-alt-setting-name</option>
        </term>
        <listitem>
          <para>
            This command modifies the alternative name on firmware file.
          </para>
          <para>e.g. <command>&package; set-alt-setting-name firmware.dfu SRAM</command></para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>set-metadata FILE KEY VALUE</option>
        </term>
        <listitem>
          <para>
            This command adds or modifies existing metadata on a firmware file.
            NOTE: There is only very limited metadata storage space in DFU files,
            so keys and values should be kept as short as possible.
            In particular, the <literal>License</literal> value should be
            specified in SPDX format.
          </para>
          <para>e.g. <command>&package; set-metadata firmware.dfu Licence GPL-2.0+</command></para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>set-vendor FILE VID</option>
        </term>
        <listitem>
          <para>
            This command sets vendor ID on a firmware file that will be used to
            match specific devices.
            Values of <literal>ffff</literal> will match any device vendor.
          </para>
          <para>e.g. <command>&package; set-vendor firmware.dfu 273f</command></para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>set-product FILE PID</option>
        </term>
        <listitem>
          <para>
            This command sets the product ID on a firmware file that will be used to
            match specific devices.
            Values of <literal>ffff</literal> will match any device product.
          </para>
          <para>e.g. <command>&package; set-product firmware.dfu 1004</command></para>
        </listitem>
      </varlistentry>
      <varlistentry>
        <term>
          <option>set-release FILE RELEASE</option>
        </term>
        <listitem>
          <para>
            This command sets the release version on firmware file that will be used to
            match specific devices.
            Values of <literal>ffff</literal> will match any device release.
          </para>
          <para>e.g. <command>&package; set-release firmware.dfu ffff</command></para>
        </listitem>
      </varlistentry>
    </variablelist>
  </refsect1>
  <refsect1>
    <title>AUTHOR</title>
    <para>This manual page was written by Richard Hughes <email>richard@hughsie.com</email>.
    </para>
  </refsect1>
</refentry>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:2
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:nil
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
