[U-Boot] [RFC PATCH v2 10/20] fastboot: Merge USB and UDP getvar implementation
Joe Hershberger
joe.hershberger at ni.com
Thu May 3 20:56:55 UTC 2018
On Mon, Apr 30, 2018 at 3:32 AM, Alex Kiernan <alex.kiernan at gmail.com> wrote:
> Merge the USB and UDP getvar implementations into one. The USB side
> gains new variables previously defined in the network side and the
> network side now supports fetching of arbitrary variables prefixed with
> 'fastboot.'
>
> Signed-off-by: Alex Kiernan <alex.kiernan at gmail.com>
> ---
>
> Changes in v2: None
>
> drivers/fastboot/Makefile | 1 +
> drivers/fastboot/fb_common.c | 7 ++++
> drivers/fastboot/fb_getvar.c | 93 +++++++++++++++++++++++++++++++++++++++++
> drivers/usb/gadget/f_fastboot.c | 56 +------------------------
> include/fastboot.h | 18 ++++++++
> net/fastboot.c | 75 +--------------------------------
> 6 files changed, 121 insertions(+), 129 deletions(-)
> create mode 100644 drivers/fastboot/fb_getvar.c
>
> diff --git a/drivers/fastboot/Makefile b/drivers/fastboot/Makefile
> index c12dfa8..9af4073 100644
> --- a/drivers/fastboot/Makefile
> +++ b/drivers/fastboot/Makefile
> @@ -1,6 +1,7 @@
> # SPDX-License-Identifier: GPL-2.0+
>
> obj-y += fb_common.o
> +obj-y += fb_getvar.o
> obj-$(CONFIG_FASTBOOT_FLASH) += image-sparse.o
>
> obj-$(CONFIG_FASTBOOT_FLASH_MMC) += fb_mmc.o
> diff --git a/drivers/fastboot/fb_common.c b/drivers/fastboot/fb_common.c
> index f0bf53d..3b68f25 100644
> --- a/drivers/fastboot/fb_common.c
> +++ b/drivers/fastboot/fb_common.c
> @@ -65,3 +65,10 @@ void timed_send_info(ulong *start, const char *msg)
> }
> #endif
> }
> +
> +int strcmp_l1(const char *s1, const char *s2)
> +{
> + if (!s1 || !s2)
> + return -1;
> + return strncmp(s1, s2, strlen(s1));
> +}
> diff --git a/drivers/fastboot/fb_getvar.c b/drivers/fastboot/fb_getvar.c
> new file mode 100644
> index 0000000..aa68371
> --- /dev/null
> +++ b/drivers/fastboot/fb_getvar.c
> @@ -0,0 +1,93 @@
> +// SPDX-License-Identifier: BSD-2-Clause
> +/*
> + * Copyright (C) 2016 The Android Open Source Project
> + */
> +
> +#include <common.h>
> +#include <fastboot.h>
> +#include <version.h>
> +
> +/**
> + * Writes ascii string specified by cmd_parameter to response.
> + *
> + * @param cmd_parameter Point to command parameter
> + * @param response Pointer to fastboot response buffer
> + */
> +void fb_getvar(char *cmd_parameter, char *response)
> +{
> + if (!cmd_parameter) {
> + fastboot_fail("missing var", response);
> + } else if (!strcmp("version", cmd_parameter)) {
> + fastboot_okay(FASTBOOT_VERSION, response);
> + } else if (!strcmp("bootloader-version", cmd_parameter) ||
> + !strcmp("version-bootloader", cmd_parameter)) {
> + fastboot_okay(U_BOOT_VERSION, response);
> + } else if (!strcmp("downloadsize", cmd_parameter) ||
> + !strcmp("max-download-size", cmd_parameter)) {
> + fastboot_response("OKAY", response,
> + "0x%08x", CONFIG_FASTBOOT_BUF_SIZE);
> + } else if (!strcmp("serialno", cmd_parameter)) {
> + const char *tmp = env_get("serial#");
> +
> + if (tmp)
> + fastboot_okay(tmp, response);
> + else
> + fastboot_fail("Value not set", response);
> + } else if (!strcmp("version-baseband", cmd_parameter)) {
> + fastboot_okay("N/A", response);
> + } else if (!strcmp("product", cmd_parameter)) {
> + const char *board = env_get("board");
> +
> + if (board)
> + fastboot_okay(board, response);
> + else
> + fastboot_fail("Board not set", response);
> + } else if (!strcmp("current-slot", cmd_parameter)) {
> + /* A/B not implemented, for now always return _a */
> + fastboot_okay("_a", response);
> + } else if (!strcmp("slot-suffixes", cmd_parameter)) {
> + fastboot_okay("_a,_b", response);
> + } else if (!strcmp_l1("has-slot", cmd_parameter)) {
> + char *part_name = cmd_parameter;
> +
> + cmd_parameter = strsep(&part_name, ":");
> + if (!strcmp(part_name, "boot") || !strcmp(part_name, "system"))
> + fastboot_okay("yes", response);
> + else
> + fastboot_okay("no", response);
> + } else if (!strcmp_l1("partition-type", cmd_parameter) ||
> + !strcmp_l1("partition-size", cmd_parameter)) {
> + disk_partition_t part_info;
> + struct blk_desc *dev_desc;
> + char *part_name = cmd_parameter;
> +
> + cmd_parameter = strsep(&part_name, ":");
> + dev_desc = blk_get_dev("mmc", 0);
> + if (!dev_desc) {
> + fastboot_fail("block device not found", response);
> + } else if (part_get_info_by_name(dev_desc, part_name,
> + &part_info) < 0) {
> + fastboot_fail("partition not found", response);
> + } else if (!strcmp_l1("partition-type", cmd_parameter)) {
> + fastboot_okay((char *)part_info.type, response);
> + } else if (!strcmp_l1("partition-size", cmd_parameter)) {
> + fastboot_response("OKAY", response,
> + "0x%016x", (int)part_info.size);
> + }
> + } else {
> +#define FASTBOOT_ENV_PREFIX "fastboot."
> + char envstr[FASTBOOT_RESPONSE_LEN];
> + const char *s;
> +
> + snprintf(envstr, sizeof(envstr) - 1,
> + FASTBOOT_ENV_PREFIX "%s", cmd_parameter);
> + s = env_get(envstr);
> + if (s) {
> + fastboot_response("OKAY", response, "%s", s);
> + } else {
> + pr_warn("WARNING: unknown variable: %s\n",
> + cmd_parameter);
> + fastboot_fail("Variable not implemented", response);
> + }
> + }
> +}
> diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c
> index e757c3e..a493c75 100644
> --- a/drivers/usb/gadget/f_fastboot.c
> +++ b/drivers/usb/gadget/f_fastboot.c
> @@ -148,7 +148,6 @@ static struct usb_gadget_strings *fastboot_strings[] = {
> };
>
> static void rx_handler_command(struct usb_ep *ep, struct usb_request *req);
> -static int strcmp_l1(const char *s1, const char *s2);
>
> static void fastboot_complete(struct usb_ep *ep, struct usb_request *req)
> {
> @@ -376,66 +375,13 @@ static void cb_reboot(struct usb_ep *ep, struct usb_request *req)
> fastboot_tx_write_str("OKAY");
> }
>
> -static int strcmp_l1(const char *s1, const char *s2)
> -{
> - if (!s1 || !s2)
> - return -1;
> - return strncmp(s1, s2, strlen(s1));
> -}
> -
> static void cb_getvar(struct usb_ep *ep, struct usb_request *req)
> {
> char *cmd = req->buf;
> char response[FASTBOOT_RESPONSE_LEN];
> - const char *s;
> - size_t chars_left;
> -
> - strcpy(response, "OKAY");
> - chars_left = sizeof(response) - strlen(response) - 1;
>
> strsep(&cmd, ":");
> - if (!cmd) {
> - pr_err("missing variable");
> - fastboot_tx_write_str("FAILmissing var");
> - return;
> - }
> -
> - if (!strcmp_l1("version", cmd)) {
> - strncat(response, FASTBOOT_VERSION, chars_left);
> - } else if (!strcmp_l1("bootloader-version", cmd)) {
> - strncat(response, U_BOOT_VERSION, chars_left);
> - } else if (!strcmp_l1("downloadsize", cmd) ||
> - !strcmp_l1("max-download-size", cmd)) {
> - char str_num[12];
> -
> - sprintf(str_num, "0x%08x", CONFIG_FASTBOOT_BUF_SIZE);
> - strncat(response, str_num, chars_left);
> - } else if (!strcmp_l1("serialno", cmd)) {
> - s = env_get("serial#");
> - if (s)
> - strncat(response, s, chars_left);
> - else
> - strcpy(response, "FAILValue not set");
> - } else {
> - char *envstr;
> -
> - envstr = malloc(strlen("fastboot.") + strlen(cmd) + 1);
> - if (!envstr) {
> - fastboot_tx_write_str("FAILmalloc error");
> - return;
> - }
> -
> - sprintf(envstr, "fastboot.%s", cmd);
> - s = env_get(envstr);
> - if (s) {
> - strncat(response, s, chars_left);
> - } else {
> - printf("WARNING: unknown variable: %s\n", cmd);
> - strcpy(response, "FAILVariable not implemented");
> - }
> -
> - free(envstr);
> - }
> + fb_getvar(cmd, response);
> fastboot_tx_write_str(response);
> }
>
> diff --git a/include/fastboot.h b/include/fastboot.h
> index 6f69423..fb58358 100644
> --- a/include/fastboot.h
> +++ b/include/fastboot.h
> @@ -13,6 +13,8 @@
> #ifndef _FASTBOOT_H_
> #define _FASTBOOT_H_
>
> +#define FASTBOOT_VERSION "0.4"
This should be pulled out of net/fastboot.c. Probably just put it in
include/fastboot.h to begin with.
> +
> /* The 64 defined bytes plus \0 */
> #define FASTBOOT_RESPONSE_LEN (64 + 1)
>
> @@ -24,6 +26,14 @@ void fastboot_fail(const char *reason, char *response);
> void fastboot_okay(const char *reason, char *response);
>
> /**
> + * Writes ascii string specified by cmd_parameter to response.
> + *
> + * @param cmd_parameter Pointer to variable name
> + * @param response Pointer to fastboot response buffer
> + */
> +void fb_getvar(char *cmd_parameter, char *response);
> +
> +/**
> * Send an INFO packet during long commands based on timer. If
> * CONFIG_UDP_FUNCTION_FASTBOOT is defined, an INFO packet is sent
> * if the time is 30 seconds after start. Else, noop.
> @@ -36,4 +46,12 @@ void fastboot_okay(const char *reason, char *response);
> */
> void timed_send_info(ulong *start, const char *msg);
>
> +/**
> + * Compare strings over the length of s1
> + *
> + * @param s1 Pointer to string which limits the comparisson
comparisson -> comparison
> + * @param s2 Second string
> + */
> +int strcmp_l1(const char *s1, const char *s2);
This doesn't seem like the right place for this. Probably just make it
a static inline in include/common.h
> +
> #endif /* _FASTBOOT_H_ */
> diff --git a/net/fastboot.c b/net/fastboot.c
> index 960e7f1..cd09ada 100644
> --- a/net/fastboot.c
> +++ b/net/fastboot.c
> @@ -57,7 +57,6 @@ static int fastboot_remote_port;
> /* The UDP port at our end */
> static int fastboot_our_port;
>
> -static void fb_getvar(char *);
> static void fb_download(char *, unsigned int, char *);
> #if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC)
> static void fb_flash(char *);
> @@ -167,7 +166,7 @@ static void fastboot_send(struct fastboot_header fb_header, char *fastboot_data,
> if (cmd_parameter)
> cmd_parameter = strdup(cmd_parameter);
> } else if (!strcmp("getvar", cmd_string)) {
> - fb_getvar(response);
> + fb_getvar(cmd_parameter, response);
> } else if (!strcmp("download", cmd_string)) {
> fb_download(fastboot_data, fastboot_data_len, response);
> #if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC)
> @@ -233,78 +232,6 @@ static void fastboot_send(struct fastboot_header fb_header, char *fastboot_data,
> }
>
> /**
> - * Writes ascii string specified by cmd_parameter to response.
> - *
> - * @param repsonse Pointer to fastboot response buffer
> - */
> -static void fb_getvar(char *response)
> -{
> - if (!cmd_parameter) {
> - fastboot_fail("missing var", response);
> - } else if (!strcmp("version", cmd_parameter)) {
> - fastboot_okay(FASTBOOT_VERSION, response);
> - } else if (!strcmp("bootloader-version", cmd_parameter) ||
> - !strcmp("version-bootloader", cmd_parameter)) {
> - fastboot_okay(U_BOOT_VERSION, response);
> - } else if (!strcmp("downloadsize", cmd_parameter) ||
> - !strcmp("max-download-size", cmd_parameter)) {
> - fastboot_response("OKAY", response,
> - "0x%08x", CONFIG_FASTBOOT_BUF_SIZE);
> - } else if (!strcmp("serialno", cmd_parameter)) {
> - const char *tmp = env_get("serial#");
> -
> - if (tmp)
> - fastboot_okay(tmp, response);
> - else
> - fastboot_fail("Value not set", response);
> - } else if (!strcmp("version-baseband", cmd_parameter)) {
> - fastboot_okay("N/A", response);
> - } else if (!strcmp("product", cmd_parameter)) {
> - const char *board = env_get("board");
> -
> - if (board)
> - fastboot_okay(board, response);
> - else
> - fastboot_fail("Board not set", response);
> - } else if (!strcmp("current-slot", cmd_parameter)) {
> - /* A/B not implemented, for now always return _a */
> - fastboot_okay("_a", response);
> - } else if (!strcmp("slot-suffixes", cmd_parameter)) {
> - fastboot_okay("_a,_b", response);
> - } else if (!strncmp("has-slot", cmd_parameter, 8)) {
> - char *part_name = cmd_parameter;
> -
> - cmd_parameter = strsep(&part_name, ":");
> - if (!strcmp(part_name, "boot") || !strcmp(part_name, "system"))
> - fastboot_okay("yes", response);
> - else
> - fastboot_okay("no", response);
> - } else if (!strncmp("partition-type", cmd_parameter, 14) ||
> - !strncmp("partition-size", cmd_parameter, 14)) {
> - disk_partition_t part_info;
> - struct blk_desc *dev_desc;
> - char *part_name = cmd_parameter;
> -
> - cmd_parameter = strsep(&part_name, ":");
> - dev_desc = blk_get_dev("mmc", 0);
> - if (!dev_desc) {
> - fastboot_fail("block device not found", response);
> - } else if (part_get_info_by_name(dev_desc, part_name,
> - &part_info) < 0) {
> - fastboot_fail("partition not found", response);
> - } else if (!strncmp("partition-type", cmd_parameter, 14)) {
> - fastboot_okay((char *)part_info.type, response);
> - } else if (!strncmp("partition-size", cmd_parameter, 14)) {
> - fastboot_response("OKAY", response,
> - "0x%016x", (int)part_info.size);
> - }
> - } else {
> - printf("WARNING: unknown variable: %s\n", cmd_parameter);
> - fastboot_fail("Variable not implemented", response);
> - }
> -}
> -
> -/**
> * Copies image data from fastboot_data to CONFIG_FASTBOOT_BUF_ADDR.
> * Writes to response.
> *
> --
> 2.7.4
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
More information about the U-Boot
mailing list