[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