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 <ravib...@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.majew...@majess.pl>
> + *
> + * Copyright (C) 2012 Samsung Electronics
> + * authors: Andrzej Pietrasiewicz <andrze...@samsung.com>
> + *       Lukasz Majewski <l.majew...@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
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to