Hi Lukasz >> +++ b/common/dfu.c >> @@ -0,0 +1,88 @@ >> +/* >> + * dfu.c -- dfu command
>Please write: >dfu.c -- common dfu command code Ok. >> + * >> + * 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_ */ Regards Ravi _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot