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