[PATCH v2] fastboot: Add OEM run command
Patrick DELAUNAY
patrick.delaunay at foss.st.com
Mon Dec 5 20:04:30 CET 2022
Hi,
On 12/2/22 22:03, Sean Anderson wrote:
> This adds the UUU UCmd functionality as an OEM command. While the
> fastboot tool allows sending arbitrary commands as long as they are
> prefixed with "oem". This allows running generic U-Boot commands over
> fastboot without UUU, which is especially useful when not using USB.
> This is really the route we should have gone in the first place when
> adding these commands.
>
> While we're here, clean up the Kconfig a bit.
>
> Signed-off-by: Sean Anderson <sean.anderson at seco.com>
> ---
>
> Changes in v2:
> - Document usage
> - Keep enum in order
>
> doc/android/fastboot.rst | 15 +++++++++++++++
> drivers/fastboot/Kconfig | 10 +++++-----
> drivers/fastboot/fb_command.c | 4 ++++
> include/fastboot.h | 1 +
> 4 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/doc/android/fastboot.rst b/doc/android/fastboot.rst
> index 7611f07038..7f343d5dfc 100644
> --- a/doc/android/fastboot.rst
> +++ b/doc/android/fastboot.rst
> @@ -28,6 +28,7 @@ The following OEM commands are supported (if enabled):
> - ``oem partconf`` - this executes ``mmc partconf %x <arg> 0`` to configure eMMC
> with <arg> = boot_ack boot_partition
> - ``oem bootbus`` - this executes ``mmc bootbus %x %s`` to configure eMMC
> +- ``oem run`` - this executes an arbitrary U-Boot command
>
> Support for both eMMC and NAND devices is included.
>
> @@ -127,6 +128,19 @@ Boot command
> When executing the fastboot ``boot`` command, if ``fastboot_bootcmd`` is set
> then that will be executed in place of ``bootm <CONFIG_FASTBOOT_BUF_ADDR>``.
>
> +Running Shell Commands
> +----------------------
> +
> +Normally, arbitrary U-Boot command execution is not enabled. This is so
> +fastboot can be used to update systems using verified boot. However, such
> +functionality can be useful for production or when verified boot is not in use.
> +Enable ``CONFIG_FASTBOOT_UUU_SUPPORT`` to use this functionality. This will
> +enable the ``UCmd`` and ``ACmd`` commands for use with UUU [3]_. It also
> +enables the ``oem run`` command, which can be used with the fastboot client.
> +For example, to print "Hello world", run::
> +
> + $ fastboot oem run:echo Hello world
> +
> Partition Names
> ---------------
>
> @@ -232,3 +246,4 @@ References
>
> .. [1] :doc:`fastboot-protocol`
> .. [2] https://developer.android.com/studio/releases/platform-tools
> +.. [3] https://github.com/NXPmicro/mfgtools
> diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig
> index b97c67bf60..8f2d52cb8a 100644
> --- a/drivers/fastboot/Kconfig
> +++ b/drivers/fastboot/Kconfig
> @@ -80,12 +80,12 @@ config FASTBOOT_FLASH
> this to enable the "fastboot flash" command.
>
> config FASTBOOT_UUU_SUPPORT
> - bool "Enable FASTBOOT i.MX UUU special command"
> + bool "Enable running arbitrary commands from FASTBOOT"
> help
> - The fastboot protocol includes "UCmd" and "ACmd" command.
> - Be aware that you provide full access to any U-Boot command,
> - including working with memory and may open a huge backdoor,
> - when enabling this option.
> + This extends the fastboot protocol with the "UCmd" and "ACmd"
> + commands, as well as the "oem run" command. These commands provide
> + full access to any U-Boot command, including working with memory.
> + This may open a huge backdoor if you are using verified boot.
>
why the support of "oem run" generic support is include in the IMX config CONFIG_FASTBOOT_UUU_SUPPORT
"UCmd" and "Acmd" are imx additions in fastboot standard for UUU support
https://android.googlesource.com/platform/system/core/+/2ec418a4c98f6e8f95395456e1ad4c2956cac007/fastboot/fastboot_protocol.txt
but "oem run" can be see as generic U-Boot 'oem' command to execute
U-boot command.
for me I see 2 separate configs to handle other platform than IMX ones (with UUU support)
config FASTBOOT_CMD_OEM_RUN
bool "Enable fastboot oem run command"
config FASTBOOT_UUU_SUPPORT
bool "Enable FASTBOOT i.MX UUU special command"
select FASTBOOT_CMD_OEM_RUN
PS: FASTBOOT_UUU_SUPPORT could depends on CONFIG_ARCH_IMX*
> choice
> prompt "Flash provider for FASTBOOT"
> diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c
> index 98eccc3455..1732406c18 100644
> --- a/drivers/fastboot/fb_command.c
> +++ b/drivers/fastboot/fb_command.c
> @@ -123,6 +123,10 @@ static const struct {
> },
> #endif
> #if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
> + [FASTBOOT_COMMAND_OEM_RUN] = {
> + .command = "oem run",
> + .dispatch = run_ucmd,
> + },
#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_RUN)
[FASTBOOT_COMMAND_OEM_RUN] = {
.command = "oem run",
.dispatch = run_ucmd,
},
#endif
#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
[FASTBOOT_COMMAND_UCMD] = {
.command = "UCmd",
.dispatch = run_ucmd,
That allows other platform to enable FASTBOOT_CMD_OEM_RUN but not
FASTBOOT_UUU_SUPPORT.
> [FASTBOOT_COMMAND_UCMD] = {
> .command = "UCmd",
> .dispatch = run_ucmd,
> diff --git a/include/fastboot.h b/include/fastboot.h
> index 57daaf1298..8b6b4b934a 100644
> --- a/include/fastboot.h
> +++ b/include/fastboot.h
> @@ -45,6 +45,7 @@ enum {
> FASTBOOT_COMMAND_OEM_BOOTBUS,
> #endif
> #if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
> + FASTBOOT_COMMAND_OEM_RUN,
> FASTBOOT_COMMAND_ACMD,
> FASTBOOT_COMMAND_UCMD,
> #endif
+#if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_RUN)
+ FASTBOOT_COMMAND_OEM_RUN,
+#endif
and also some stuff to compile the fucntion run_ucmd()
PS: we have many #if CONFIG is the fastboot source code
they can be replaced by CONFIG_IS_ENABLED macro and
__maybe_unused in .h and .c ?
and that avoids the compilation issue => let the linker remove
the used functions
for example
enum {
FASTBOOT_COMMAND_GETVAR = 0,
FASTBOOT_COMMAND_DOWNLOAD,
CONFIG_IS_ENABLED(FASTBOOT_FLASH, (FASTBOOT_COMMAND_FLASH,))
CONFIG_IS_ENABLED(FASTBOOT_FLASH, (FASTBOOT_COMMAND_ERASE,))
FASTBOOT_COMMAND_BOOT,
FASTBOOT_COMMAND_CONTINUE,
FASTBOOT_COMMAND_REBOOT,
FASTBOOT_COMMAND_REBOOT_BOOTLOADER,
FASTBOOT_COMMAND_REBOOT_FASTBOOTD,
FASTBOOT_COMMAND_REBOOT_RECOVERY,
FASTBOOT_COMMAND_SET_ACTIVE,
CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_FORMAT, (FASTBOOT_COMMAND_OEM_FORMAT,))
CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_PARTCONF, (FASTBOOT_COMMAND_OEM_PARTCONF,))
CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_BOOTBUS, (FASTBOOT_COMMAND_OEM_BOOTBUS,))
CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT, (FASTBOOT_COMMAND_ACMD,))
CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT, (FASTBOOT_COMMAND_UCMD,))
FASTBOOT_COMMAND_COUNT
};
...
ommands[FASTBOOT_COMMAND_COUNT] = {
[FASTBOOT_COMMAND_GETVAR] = {
.command = "getvar",
.dispatch = getvar
},
[FASTBOOT_COMMAND_DOWNLOAD] = {
.command = "download",
.dispatch = download
},
CONFIG_IS_ENABLED(FASTBOOT_FLASH, (
[FASTBOOT_COMMAND_FLASH] = {
.command = "flash",
.dispatch = flash
},
[FASTBOOT_COMMAND_ERASE] = {
.command = "erase",
.dispatch = erase
},
))
....
staticvoid__maybe_unused erase(char*cmd_parameter, char*response)
{
if(CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC))
fastboot_mmc_erase(cmd_parameter, response);
if(CONFIG_IS_ENABLED(FASTBOOT_FLASH_NAND))
fastboot_nand_erase(cmd_parameter, response);
}
regards
Patrick
More information about the U-Boot
mailing list