[U-Boot] [RFC PATCH v2 2/5] common: dfu: saperate the dfu common functionality
B, Ravi
ravibabu at ti.com
Mon Jul 25 15:12:33 CEST 2016
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.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_ */
Regards
Ravi
More information about the U-Boot
mailing list