[U-Boot] [RFC PATCH v2 2/5] common: dfu: saperate the dfu common functionality
Lukasz Majewski
l.majewski at samsung.com
Mon Jul 25 12:08:48 CEST 2016
Hi Ravi,
> The cmd_dfu functionality is been used by both SPL and
> u-boot, saperating the core dfu functionality moving
> it to common/dfu.c.
>
> Signed-off-by: Ravi Babu <ravibabu at ti.com>
> ---
> cmd/dfu.c | 61 ++------------------------------------
> common/Makefile | 2 ++
> common/dfu.c | 88
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> include/g_dnl.h | 1 + 4 files changed, 93 insertions(+), 59
> deletions(-) create mode 100644 common/dfu.c
>
> diff --git a/cmd/dfu.c b/cmd/dfu.c
> index d8aae26..04291f6 100644
> --- a/cmd/dfu.c
> +++ b/cmd/dfu.c
> @@ -21,7 +21,6 @@
>
> static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const
> argv[]) {
> - bool dfu_reset = false;
>
> if (argc < 4)
> return CMD_RET_USAGE;
> @@ -30,7 +29,7 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int
> argc, char * const argv[]) char *interface = argv[2];
> char *devstring = argv[3];
>
> - int ret, i = 0;
> + int ret;
> #ifdef CONFIG_DFU_TFTP
> unsigned long addr = 0;
> if (!strcmp(argv[1], "tftp")) {
> @@ -52,67 +51,11 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int
> argc, char * const argv[]) }
>
> int controller_index = simple_strtoul(usb_controller, NULL,
> 0);
> - board_usb_init(controller_index, USB_INIT_DEVICE);
> - g_dnl_clear_detach();
> - g_dnl_register("usb_dnl_dfu");
> - while (1) {
> - if (g_dnl_detach()) {
> - /*
> - * Check if USB bus reset is performed after
> detach,
> - * which indicates that -R switch has been
> passed to
> - * dfu-util. In this case reboot the device
> - */
> - if (dfu_usb_get_reset()) {
> - dfu_reset = true;
> - goto exit;
> - }
>
> - /*
> - * This extra number of
> usb_gadget_handle_interrupts()
> - * calls is necessary to assure correct
> transmission
> - * completion with dfu-util
> - */
> - if (++i == 10000)
> - goto exit;
> - }
> + run_usb_dnl_gadget(controller_index, "usb_dnl_dfu");
>
> - if (ctrlc())
> - goto exit;
> -
> - if (dfu_get_defer_flush()) {
> - /*
> - * Call to usb_gadget_handle_interrupts() is
> necessary
> - * to act on ZLP OUT transaction from HOST
> PC after
> - * transmitting the whole file.
> - *
> - * If this ZLP OUT packet is NAK'ed, the
> HOST libusb
> - * function fails after timeout (by default
> it is set to
> - * 5 seconds). In such situation the
> dfu-util program
> - * exits with error message.
> - */
> -
> usb_gadget_handle_interrupts(controller_index);
> - ret = dfu_flush(dfu_get_defer_flush(), NULL,
> 0, 0);
> - dfu_set_defer_flush(NULL);
> - if (ret) {
> - error("Deferred dfu_flush()
> failed!");
> - goto exit;
> - }
> - }
> -
> - WATCHDOG_RESET();
> - usb_gadget_handle_interrupts(controller_index);
> - }
> -exit:
> - g_dnl_unregister();
> - board_usb_cleanup(controller_index, USB_INIT_DEVICE);
> done:
> dfu_free_entities();
> -
> - if (dfu_reset)
> - run_command("reset", 0);
> -
> - g_dnl_clear_detach();
> -
> return ret;
> }
>
> diff --git a/common/Makefile b/common/Makefile
> index 7a7a1b4..83bd3f4 100644
> --- a/common/Makefile
> +++ b/common/Makefile
> @@ -87,6 +87,7 @@ obj-$(CONFIG_USB_KEYBOARD) += usb_kbd.o
> endif # !CONFIG_SPL_BUILD
>
> ifdef CONFIG_SPL_BUILD
> +obj-$(CONFIG_SPL_DFU_SUPPORT) += dfu.o
> obj-$(CONFIG_SPL_DFU_SUPPORT) += cli_hush.o
> obj-$(CONFIG_SPL_HASH_SUPPORT) += hash.o
> obj-$(CONFIG_ENV_IS_IN_FLASH) += env_flash.o
> @@ -160,6 +161,7 @@ obj-$(CONFIG_CMDLINE) += cli_simple.o
>
> obj-y += cli.o
> obj-$(CONFIG_CMDLINE) += cli_readline.o
> +obj-$(CONFIG_CMD_DFU) += dfu.o
> obj-y += command.o
> obj-y += s_record.o
> obj-y += xyzModem.o
> diff --git a/common/dfu.c b/common/dfu.c
> new file mode 100644
> index 0000000..c6a7a58
> --- /dev/null
> +++ b/common/dfu.c
> @@ -0,0 +1,88 @@
> +/*
> + * dfu.c -- dfu command
Please write:
dfu.c -- common dfu command code
> + *
> + * Copyright (C) 2015
> + * Lukasz Majewski <l.majewski at majess.pl>
> + *
> + * Copyright (C) 2012 Samsung Electronics
> + * authors: Andrzej Pietrasiewicz <andrzej.p at samsung.com>
> + * Lukasz Majewski <l.majewski at samsung.com>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <watchdog.h>
> +#include <dfu.h>
> +#include <console.h>
> +#include <g_dnl.h>
> +#include <usb.h>
> +#include <net.h>
> +
> +int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
> +{
> + bool dfu_reset = false;
> + int ret, i = 0;
> +
> + board_usb_init(usbctrl_index, USB_INIT_DEVICE);
> + g_dnl_clear_detach();
> + g_dnl_register(usb_dnl_gadget);
> + while (1) {
> + if (g_dnl_detach()) {
> + /*
> + * Check if USB bus reset is performed after
> detach,
> + * which indicates that -R switch has been
> passed to
> + * dfu-util. In this case reboot the device
> + */
> + if (dfu_usb_get_reset()) {
> + dfu_reset = true;
> + goto exit;
> + }
> +
> + /*
> + * This extra number of
> usb_gadget_handle_interrupts()
> + * calls is necessary to assure correct
> transmission
> + * completion with dfu-util
> + */
> + if (++i == 10000)
> + goto exit;
> + }
> +
> + if (ctrlc())
> + goto exit;
> +
> + if (dfu_get_defer_flush()) {
> + /*
> + * Call to usb_gadget_handle_interrupts() is
> necessary
> + * to act on ZLP OUT transaction from HOST
> PC after
> + * transmitting the whole file.
> + *
> + * If this ZLP OUT packet is NAK'ed, the
> HOST libusb
> + * function fails after timeout (by default
> it is set to
> + * 5 seconds). In such situation the
> dfu-util program
> + * exits with error message.
> + */
> + usb_gadget_handle_interrupts(usbctrl_index);
> + ret = dfu_flush(dfu_get_defer_flush(), NULL,
> 0, 0);
> + dfu_set_defer_flush(NULL);
> + if (ret) {
> + error("Deferred dfu_flush()
> failed!");
> + goto exit;
> + }
> + }
> +
> + WATCHDOG_RESET();
> + usb_gadget_handle_interrupts(usbctrl_index);
> + }
> +exit:
> + g_dnl_unregister();
> + board_usb_cleanup(usbctrl_index, USB_INIT_DEVICE);
> +
> + if (dfu_reset)
> + run_command("reset", 0);
> +
> + g_dnl_clear_detach();
> +
> + return ret;
> +}
> +
> diff --git a/include/g_dnl.h b/include/g_dnl.h
> index ba49f1f..bd29a9f 100644
> --- a/include/g_dnl.h
> +++ b/include/g_dnl.h
> @@ -43,5 +43,6 @@ void g_dnl_set_serialnumber(char *);
> bool g_dnl_detach(void);
> void g_dnl_trigger_detach(void);
> void g_dnl_clear_detach(void);
> +int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget);
>
> #endif /* __G_DOWNLOAD_H_ */
--
Best regards,
Lukasz Majewski
Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
More information about the U-Boot
mailing list