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