[PATCH] fastboot: add UUU command UCmd and ACmd support
Heiko Schocher
hs at denx.de
Tue Jan 26 13:08:58 CET 2021
Hello Tom,
Am 26.01.21 um 12:46 schrieb Tom Rini:
> On Tue, Jan 26, 2021 at 06:23:24AM +0100, Heiko Schocher wrote:
>
>> Hello Tom,
>>
>> this patch is assigned to you ... any issues with it, or can
>> it go into master?
>
> As Lukasz is back and reviewing code and making PRs, he should take it.
> Thanks.
Ok, so I moved the patch in patchwork to Lukasz.
Thanks!
bye,
Heiko
>
>>
>> Thanks!
>>
>> bye,
>> Heiko
>>
>> Am 11.01.21 um 11:19 schrieb Heiko Schocher:
>>> add support for the UUU commands ACmd and UCmd.
>>>
>>> Enable them through the Kconfig option
>>> CONFIG_FASTBOOT_UUU_SUPPORT
>>>
>>> base was commit in NXP kernel
>>> 9b149c2a2882: ("MLK-18591-3 android: Add FSL android fastboot support")
>>>
>>> and ported it to current mainline. Tested this patch
>>> on imx6ul based board.
>>>
>>> Signed-off-by: Heiko Schocher <hs at denx.de>
>>> ---
>>> azure build:
>>> https://dev.azure.com/hs0298/hs/_build/results?buildId=57&view=results
>>>
>>> version uuu tool used for tests:
>>> commit 3870fb781b35: ("fastboot: default to logical-block-size 4096")
>>>
>>> doc/android/fastboot-protocol.rst | 5 +++
>>> doc/android/fastboot.rst | 2 +
>>> drivers/fastboot/Kconfig | 7 ++++
>>> drivers/fastboot/fb_command.c | 62 +++++++++++++++++++++++++++++++
>>> drivers/usb/gadget/f_fastboot.c | 17 +++++++++
>>> include/fastboot.h | 7 ++++
>>> 6 files changed, 100 insertions(+)
>>>
>>> diff --git a/doc/android/fastboot-protocol.rst b/doc/android/fastboot-protocol.rst
>>> index e723659e49c..e8cbd7f24ea 100644
>>> --- a/doc/android/fastboot-protocol.rst
>>> +++ b/doc/android/fastboot-protocol.rst
>>> @@ -144,6 +144,11 @@ Command Reference
>>>
>>> "powerdown" Power off the device.
>>>
>>> + "ucmd" execute any bootloader command and wait until it
>>> + finishs.
>>> +
>>> + "acmd" execute any bootloader command, do not wait.
>>> +
>>> Client Variables
>>> ----------------
>>>
>>> diff --git a/doc/android/fastboot.rst b/doc/android/fastboot.rst
>>> index 2877c3cbaaa..b58d1b5b31a 100644
>>> --- a/doc/android/fastboot.rst
>>> +++ b/doc/android/fastboot.rst
>>> @@ -19,6 +19,8 @@ The current implementation supports the following standard commands:
>>> - ``reboot``
>>> - ``reboot-bootloader``
>>> - ``set_active`` (only a stub implementation which always succeeds)
>>> +- ``ucmd`` (if enabled)
>>> +- ``acmd`` (if enabled)
>>>
>>> The following OEM commands are supported (if enabled):
>>>
>>> diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig
>>> index 4352ba67a71..b1f8cd74a15 100644
>>> --- a/drivers/fastboot/Kconfig
>>> +++ b/drivers/fastboot/Kconfig
>>> @@ -72,6 +72,13 @@ config FASTBOOT_FLASH
>>> the downloaded image to a non-volatile storage device. Define
>>> this to enable the "fastboot flash" command.
>>>
>>> +config FASTBOOT_UUU_SUPPORT
>>> + bool "Enable FASTBOOT i.MX UUU special command"
>>> + default y if ARCH_MX7 || ARCH_MX6 || ARCH_IMX8 || ARCH_IMX8M || ARCH_MX7ULP
>>> + select FSL_FASTBOOT
>>> + help
>>> + The fastboot protocol includes "UCmd" command and "ACmd" command
>>> +
>>> choice
>>> prompt "Flash provider for FASTBOOT"
>>> depends on FASTBOOT_FLASH
>>> diff --git a/drivers/fastboot/fb_command.c b/drivers/fastboot/fb_command.c
>>> index d3c578672dc..31a47e46386 100644
>>> --- a/drivers/fastboot/fb_command.c
>>> +++ b/drivers/fastboot/fb_command.c
>>> @@ -43,6 +43,11 @@ static void reboot_recovery(char *, char *);
>>> static void oem_format(char *, char *);
>>> #endif
>>>
>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>> +static void run_ucmd(char *, char *);
>>> +static void run_acmd(char *, char *);
>>> +#endif
>>> +
>>> static const struct {
>>> const char *command;
>>> void (*dispatch)(char *cmd_parameter, char *response);
>>> @@ -99,6 +104,16 @@ static const struct {
>>> .dispatch = oem_format,
>>> },
>>> #endif
>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>> + [FASTBOOT_COMMAND_UCMD] = {
>>> + .command = "UCmd",
>>> + .dispatch = run_ucmd,
>>> + },
>>> + [FASTBOOT_COMMAND_ACMD] = {
>>> + .command = "ACmd",
>>> + .dispatch = run_acmd,
>>> + },
>>> +#endif
>>> };
>>>
>>> /**
>>> @@ -309,6 +324,53 @@ static void erase(char *cmd_parameter, char *response)
>>> }
>>> #endif
>>>
>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>> +/**
>>> + * run_ucmd() - Execute the UCmd command
>>> + *
>>> + * @cmd_parameter: Pointer to command parameter
>>> + * @response: Pointer to fastboot response buffer
>>> + */
>>> +static void run_ucmd(char *cmd_parameter, char *response)
>>> +{
>>> + if (!cmd_parameter) {
>>> + pr_err("missing slot suffix\n");
>>> + fastboot_fail("missing command", response);
>>> + return;
>>> + }
>>> +
>>> + if (run_command(cmd_parameter, 0))
>>> + fastboot_fail("", response);
>>> + else
>>> + fastboot_okay(NULL, response);
>>> +}
>>> +
>>> +static char g_a_cmd_buff[64];
>>> +
>>> +void fastboot_acmd_complete(void)
>>> +{
>>> + run_command(g_a_cmd_buff, 0);
>>> +}
>>> +
>>> +/**
>>> + * run_acmd() - Execute the ACmd command
>>> + *
>>> + * @cmd_parameter: Pointer to command parameter
>>> + * @response: Pointer to fastboot response buffer
>>> + */
>>> +static void run_acmd(char *cmd_parameter, char *response)
>>> +{
>>> + if (!cmd_parameter) {
>>> + pr_err("missing slot suffix\n");
>>> + fastboot_fail("missing command", response);
>>> + return;
>>> + }
>>> +
>>> + strcpy(g_a_cmd_buff, cmd_parameter);
>>> + fastboot_okay(NULL, response);
>>> +}
>>> +#endif
>>> +
>>> /**
>>> * reboot_bootloader() - Sets reboot bootloader flag.
>>> *
>>> diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c
>>> index d1d087e12b2..bf52d2505f4 100644
>>> --- a/drivers/usb/gadget/f_fastboot.c
>>> +++ b/drivers/usb/gadget/f_fastboot.c
>>> @@ -419,6 +419,18 @@ static void do_bootm_on_complete(struct usb_ep *ep, struct usb_request *req)
>>> do_exit_on_complete(ep, req);
>>> }
>>>
>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>> +static void do_acmd_complete(struct usb_ep *ep, struct usb_request *req)
>>> +{
>>> + /* When usb dequeue complete will be called
>>> + * Need status value before call run_command.
>>> + * otherwise, host can't get last message.
>>> + */
>>> + if (req->status == 0)
>>> + fastboot_acmd_complete();
>>> +}
>>> +#endif
>>> +
>>> static void rx_handler_command(struct usb_ep *ep, struct usb_request *req)
>>> {
>>> char *cmdbuf = req->buf;
>>> @@ -457,6 +469,11 @@ static void rx_handler_command(struct usb_ep *ep, struct usb_request *req)
>>> case FASTBOOT_COMMAND_REBOOT_RECOVERY:
>>> fastboot_func->in_req->complete = compl_do_reset;
>>> break;
>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>> + case FASTBOOT_COMMAND_ACMD:
>>> + fastboot_func->in_req->complete = do_acmd_complete;
>>> + break;
>>> +#endif
>>> }
>>> }
>>>
>>> diff --git a/include/fastboot.h b/include/fastboot.h
>>> index 8e9ee80907d..ef8cd842bb3 100644
>>> --- a/include/fastboot.h
>>> +++ b/include/fastboot.h
>>> @@ -38,6 +38,10 @@ enum {
>>> #if CONFIG_IS_ENABLED(FASTBOOT_CMD_OEM_FORMAT)
>>> FASTBOOT_COMMAND_OEM_FORMAT,
>>> #endif
>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>> + FASTBOOT_COMMAND_ACMD,
>>> + FASTBOOT_COMMAND_UCMD,
>>> +#endif
>>>
>>> FASTBOOT_COMMAND_COUNT
>>> };
>>> @@ -172,4 +176,7 @@ void fastboot_data_download(const void *fastboot_data,
>>> */
>>> void fastboot_data_complete(char *response);
>>>
>>> +#if CONFIG_IS_ENABLED(FASTBOOT_UUU_SUPPORT)
>>> +void fastboot_acmd_complete(void);
>>> +#endif
>>> #endif /* _FASTBOOT_H_ */
>>>
>>
>> --
>> DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
>> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
>> Phone: +49-8142-66989-52 Fax: +49-8142-66989-80 Email: hs at denx.de
>
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52 Fax: +49-8142-66989-80 Email: hs at denx.de
More information about the U-Boot
mailing list