[PATCH] fastboot: add UUU command UCmd and ACmd support

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@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_ */

Hi Heiko,
On Mon, 11 Jan 2021 at 03:19, Heiko Schocher hs@denx.de wrote:
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@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(+)
Reviewed-by: Simon Glass sjg@chromium.org
You can try to use if() for the CONFIG options here. See for example vid_console_color().
It is sometimes possible to do this, too, but it is a bit riskier:
switch (xxx) { case SOMETHING: if (CONFIG_IS_ENABLED...) { do stuff if this feature is enabled break; } /* no break */ default: /* not supported */ }
Regards, Simon

Hello Tom,
this patch is assigned to you ... any issues with it, or can it go into master?
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@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_ */

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.
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@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@denx.de

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@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@denx.de

Hi Heiko,
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@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@denx.de
As Roman has re-send the cmd:bcb:* patches I will take this one and prepare PR in a few days time.
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de

Hello Heiko,
Looks like these commands will provide full access to any u-boot commands, including working with memory. It can be used to read/set any registers/data which is not in the trust zone, thus opening a huge backdoor.
This command could be useful for debug/CI purposes, but do you really want this in release builds?
Best regards, Roman
пн, 11 янв. 2021 г. в 12:19, Heiko Schocher hs@denx.de:
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@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_ */
2.25.4

Hello Roman,
Am 27.01.21 um 10:34 schrieb Roman Stratiienko:
Hello Heiko,
Looks like these commands will provide full access to any u-boot commands, including working with memory. It can be used to read/set any registers/data which is not in the trust zone, thus opening a huge backdoor.
This command could be useful for debug/CI purposes, but do you really want this in release builds?
Hmm.. indeed.
I set the default to no not to yes, so you need to enable it, and add a comment in Kconfig.
Thanks!
bye, Heiko
Best regards, Roman
пн, 11 янв. 2021 г. в 12:19, Heiko Schocher hs@denx.de:
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@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_ */
2.25.4

Hi Heiko,
Hello Roman,
Am 27.01.21 um 10:34 schrieb Roman Stratiienko:
Hello Heiko,
Looks like these commands will provide full access to any u-boot commands, including working with memory. It can be used to read/set any registers/data which is not in the trust zone, thus opening a huge backdoor.
This command could be useful for debug/CI purposes, but do you really want this in release builds?
Hmm.. indeed.
I set the default to no not to yes, so you need to enable it, and add a comment in Kconfig.
Do you plan to send another version of this patch? Or is it ready for being pull?
Thanks!
bye, Heiko
Best regards, Roman
пн, 11 янв. 2021 г. в 12:19, Heiko Schocher hs@denx.de:
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@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_ */
2.25.4
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de

Hello Lukasz,
Am 01.02.21 um 08:56 schrieb Lukasz Majewski:
Hi Heiko,
Hello Roman,
Am 27.01.21 um 10:34 schrieb Roman Stratiienko:
Hello Heiko,
Looks like these commands will provide full access to any u-boot commands, including working with memory. It can be used to read/set any registers/data which is not in the trust zone, thus opening a huge backdoor.
This command could be useful for debug/CI purposes, but do you really want this in release builds?
Hmm.. indeed.
I set the default to no not to yes, so you need to enable it, and add a comment in Kconfig.
Do you plan to send another version of this patch? Or is it ready for being pull?
I send a v2 ... sorry, had not the time yet for it.
bye, Heiko
Thanks!
bye, Heiko
Best regards, Roman
пн, 11 янв. 2021 г. в 12:19, Heiko Schocher hs@denx.de:
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@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_ */
2.25.4
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
participants (5)
-
Heiko Schocher
-
Lukasz Majewski
-
Roman Stratiienko
-
Simon Glass
-
Tom Rini