1.. SPDX-License-Identifier: GPL-2.0+
2
3Android Fastboot
4================
5
6Overview
7--------
8
9The protocol that is used over USB and UDP is described in [1]_.
10
11The current implementation supports the following standard commands:
12
13- ``boot``
14- ``continue``
15- ``download``
16- ``erase`` (if enabled)
17- ``flash`` (if enabled)
18- ``getvar``
19- ``reboot``
20- ``reboot-bootloader``
21- ``set_active`` (only a stub implementation which always succeeds)
22- ``ucmd`` (if enabled)
23- ``acmd`` (if enabled)
24
25The following OEM commands are supported (if enabled):
26
27- ``oem format`` - this executes ``gpt write mmc %x $partitions``
28- ``oem partconf`` - this executes ``mmc partconf %x <arg> 0`` to configure eMMC
29  with <arg> = boot_ack boot_partition
30- ``oem bootbus``  - this executes ``mmc bootbus %x %s`` to configure eMMC
31- ``oem run`` - this executes an arbitrary U-Boot command
32
33Support for both eMMC and NAND devices is included.
34
35Client installation
36-------------------
37
38The counterpart to this is the fastboot client which can be found in
39Android's ``platform/system/core`` repository in the fastboot
40folder. It runs on Windows, Linux and OSX. The fastboot client is
41part of the Android SDK Platform-Tools and can be downloaded from [2]_.
42
43Board specific
44--------------
45
46USB configuration
47^^^^^^^^^^^^^^^^^
48
49The fastboot gadget relies on the USB download gadget, so the following
50options must be configured:
51
52::
53
54   CONFIG_USB_GADGET_DOWNLOAD
55   CONFIG_USB_GADGET_VENDOR_NUM
56   CONFIG_USB_GADGET_PRODUCT_NUM
57   CONFIG_USB_GADGET_MANUFACTURER
58
59NOTE: The ``CONFIG_USB_GADGET_VENDOR_NUM`` must be one of the numbers
60supported by the fastboot client. The list of vendor IDs supported can
61be found in the fastboot client source code.
62
63General configuration
64^^^^^^^^^^^^^^^^^^^^^
65
66The fastboot protocol requires a large memory buffer for
67downloads. This buffer should be as large as possible for a
68platform. The location of the buffer and size are set with
69``CONFIG_FASTBOOT_BUF_ADDR`` and ``CONFIG_FASTBOOT_BUF_SIZE``. These
70may be overridden on the fastboot command line using ``-l`` and
71``-s``.
72
73Fastboot environment variables
74------------------------------
75
76Partition aliases
77^^^^^^^^^^^^^^^^^
78
79Fastboot partition aliases can also be defined for devices where GPT
80limitations prevent user-friendly partition names such as ``boot``, ``system``
81and ``cache``.  Or, where the actual partition name doesn't match a standard
82partition name used commonly with fastboot.
83
84The current implementation checks aliases when accessing partitions by
85name (flash_write and erase functions).  To define a partition alias
86add an environment variable similar to::
87
88    fastboot_partition_alias_<alias partition name>=<actual partition name>
89
90for example::
91
92    fastboot_partition_alias_boot=LNX
93
94Raw partition descriptors
95^^^^^^^^^^^^^^^^^^^^^^^^^
96
97In cases where no partition table is present, a raw partition descriptor can be
98defined, specifying the offset, size, and optionally the MMC hardware partition
99number for a given partition name.
100
101This is useful when using fastboot to flash files (e.g. SPL or U-Boot) to a
102specific offset in the eMMC boot partition, without having to update the entire
103boot partition.
104
105To define a raw partition descriptor, add an environment variable similar to::
106
107    fastboot_raw_partition_<raw partition name>=<offset> <size> [mmcpart <num>]
108
109for example::
110
111    fastboot_raw_partition_boot=0x100 0x1f00 mmcpart 1
112
113Variable overrides
114^^^^^^^^^^^^^^^^^^
115
116Variables retrived through ``getvar`` can be overridden by defining
117environment variables of the form ``fastboot.<variable>``. These are
118looked up first so can be used to override values which would
119otherwise be returned. Using this mechanism you can also return types
120for NAND filesystems, as the fully parameterised variable is looked
121up, e.g.::
122
123    fastboot.partition-type:boot=jffs2
124
125Boot command
126^^^^^^^^^^^^
127
128When executing the fastboot ``boot`` command, if ``fastboot_bootcmd`` is set
129then that will be executed in place of ``bootm <CONFIG_FASTBOOT_BUF_ADDR>``.
130
131Partition Names
132---------------
133
134The Fastboot implementation in U-Boot allows to write images into disk
135partitions. Target partitions are referred on the host computer by
136their names.
137
138For GPT/EFI the respective partition name is used.
139
140For MBR the partitions are referred by generic names according to the
141following schema::
142
143    <device type><device index letter><partition index>
144
145Example: ``hda3``, ``sdb1``, ``usbda1``.
146
147The device type is as follows:
148
149  * IDE, ATAPI and SATA disks: ``hd``
150  * SCSI disks: ``sd``
151  * USB media: ``usbd``
152  * MMC and SD cards: ``mmcsd``
153  * Disk on chip: ``docd``
154  * other: ``xx``
155
156The device index starts from ``a`` and refers to the interface (e.g. USB
157controller, SD/MMC controller) or disk index. The partition index starts
158from ``1`` and describes the partition number on the particular device.
159
160Alternatively, partition types may be specified using :ref:`U-Boot's partition
161syntax <partitions>`. This allows specifying partitions like ``0.1``,
162``0#boot``, or ``:3``. The interface is always ``mmc``.
163
164Writing Partition Table
165-----------------------
166
167Fastboot also allows to write the partition table to the media. This can be
168done by writing the respective partition table image to a special target
169"gpt" or "mbr". These names can be customized by defining the following
170configuration options:
171
172::
173
174   CONFIG_FASTBOOT_GPT_NAME
175   CONFIG_FASTBOOT_MBR_NAME
176
177In Action
178---------
179
180Enter into fastboot by executing the fastboot command in U-Boot for either USB::
181
182   => fastboot usb 0
183
184or UDP::
185
186   => fastboot udp
187   link up on port 0, speed 100, full duplex
188   Using ethernet@4a100000 device
189   Listening for fastboot command on 192.168.0.102
190
191On the client side you can fetch the bootloader version for instance::
192
193   $ fastboot getvar version-bootloader
194   version-bootloader: U-Boot 2019.07-rc4-00240-g00c9f2a2ec
195   Finished. Total time: 0.005s
196
197or initiate a reboot::
198
199   $ fastboot reboot
200
201and once the client comes back, the board should reset.
202
203You can also specify a kernel image to boot. You have to either specify
204the an image in Android format *or* pass a binary kernel and let the
205fastboot client wrap the Android suite around it. On OMAP for instance you
206take zImage kernel and pass it to the fastboot client::
207
208   $ fastboot -b 0x80000000 -c "console=ttyO2 earlyprintk root=/dev/ram0 mem=128M" boot zImage
209   creating boot image...
210   creating boot image - 1847296 bytes
211   downloading 'boot.img'...
212   OKAY [  2.766s]
213   booting...
214   OKAY [ -0.000s]
215   finished. total time: 2.766s
216
217and on the U-Boot side you should see::
218
219   Starting download of 1847296 bytes
220   ........................................................
221   downloading of 1847296 bytes finished
222   Booting kernel..
223   ## Booting Android Image at 0x81000000 ...
224   Kernel load addr 0x80008000 size 1801 KiB
225   Kernel command line: console=ttyO2 earlyprintk root=/dev/ram0 mem=128M
226      Loading Kernel Image ... OK
227   OK
228
229   Starting kernel ...
230
231Running Shell Commands
232^^^^^^^^^^^^^^^^^^^^^^
233
234Normally, arbitrary U-Boot command execution is not enabled. This is so
235fastboot can be used to update systems using verified boot. However, such
236functionality can be useful for production or when verified boot is not in use.
237Enable ``CONFIG_FASTBOOT_OEM_RUN`` to use this functionality. This will enable
238``oem run`` command, which can be used with the fastboot client. For example,
239to print "Hello at 115200 baud" (or whatever ``CONFIG_BAUDRATE`` is), run::
240
241    $ fastboot oem run:'echo Hello at $baudrate baud'
242
243You can run any command you would normally run on the U-Boot command line,
244including multiple commands (using e.g. ``;`` or ``&&``) and control structures
245(``if``, ``while``, etc.). The exit code of ``fastboot`` will reflect the exit
246code of the command you ran.
247
248References
249----------
250
251.. [1] :doc:`fastboot-protocol`
252.. [2] https://developer.android.com/studio/releases/platform-tools
253