All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [RFC PATCH v2 3/5] spl: dfu: adding dfu support functions for SPL-DFU
       [not found] ` <1469193550-19125-4-git-send-email-ravibabu@ti.com>
@ 2016-07-25 10:05   ` Lukasz Majewski
  2016-07-25 13:08     ` B, Ravi
  0 siblings, 1 reply; 8+ messages in thread
From: Lukasz Majewski @ 2016-07-25 10:05 UTC (permalink / raw)
  To: u-boot

Hi Ravi,

> Adding support functions to run dfu spl commands.
> 
> Signed-off-by: Ravi Babu <ravibabu@ti.com>
> ---
>  common/spl/Makefile  |    1 +
>  common/spl/spl_dfu.c |   57
> ++++++++++++++++++++++++++++++++++++++++++++++++++
> include/spl.h        |    8 +++++++ 3 files changed, 66 insertions(+)
>  create mode 100644 common/spl/spl_dfu.c
> 
> diff --git a/common/spl/Makefile b/common/spl/Makefile
> index 2e0f695..0850da0 100644
> --- a/common/spl/Makefile
> +++ b/common/spl/Makefile
> @@ -21,4 +21,5 @@ obj-$(CONFIG_SPL_USB_SUPPORT) += spl_usb.o
>  obj-$(CONFIG_SPL_FAT_SUPPORT) += spl_fat.o
>  obj-$(CONFIG_SPL_EXT_SUPPORT) += spl_ext.o
>  obj-$(CONFIG_SPL_SATA_SUPPORT) += spl_sata.o
> +obj-$(CONFIG_SPL_DFU_SUPPORT) += spl_dfu.o
>  endif
> diff --git a/common/spl/spl_dfu.c b/common/spl/spl_dfu.c
> new file mode 100644
> index 0000000..e8d0ba1
> --- /dev/null
> +++ b/common/spl/spl_dfu.c
> @@ -0,0 +1,57 @@
> +/*
> + * (C) Copyright 2016
> + * Texas Instruments, <www.ti.com>
> + *
> + * Ravi B <ravibabu@ti.com>
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +#include <common.h>
> +#include <spl.h>
> +#include <linux/compiler.h>
> +#include <errno.h>
> +#include <watchdog.h>
> +#include <console.h>
> +#include <g_dnl.h>
> +#include <usb.h>
> +#include <dfu.h>
> +#include <environment.h>
> +
> +static int run_dfu(int usb_index, char *interface, char *devstring)
> +{
> +	int ret;
> +
> +	ret = dfu_init_env_entities(interface, devstring);
> +	if (ret) {
> +		dfu_free_entities();
> +		goto exit;
> +	}
> +
> +	run_usb_dnl_gadget(usb_index, "usb_dnl_dfu");
> +exit:
> +	dfu_free_entities();
> +	return ret;
> +}
> +
> +int spl_dfu_cmd(int usbctrl, char *dfu_alt_info, char *interface,
				     ^^^^^^^^^^^^^^ this is a bit
				     misleading.
				     I would rename it to "alt_info_str"

> char *devstr) +{
> +	char *str_env;
> +	int ret;
> +
> +	/* set default environment */
> +	set_default_env(0);

set_default_env() accepts const char *s as the argument. Please replace
0 -> NULL

> +	str_env = getenv(dfu_alt_info);
> +	if (!str_env) {
> +		error("\"dfu_alt_info\" env variable not
> defined!\n");
> +		return -EINVAL;
> +	}
> +
> +	ret = setenv("dfu_alt_info", str_env);
> +	if (ret) {
> +		error("unable to set env variable
> \"dfu_alt_info\"!\n");
> +		return -EINVAL;
> +	}

I'm a bit confused with this env flow.

Is it required on your platform to:

1. set_default_env(NULL) - which sets default envs (one which are
mostly defined at ./include/<board_config> file) in RAM

2. call getenv with "dfu_alt_info_ram", which reads this value from RAM

3. call setenv() to store already in ram available env variable to some
medium?

If you want to store default envs in the medium (e.g. eMMC), I think
that it would be easier to call "saveenv".

Otherwise, I would stay with default envs, since we only use this
u-boot for flashing other binaries.

> +
> +	/* invoke dfu command */
> +	return run_dfu(usbctrl, interface, devstr);
> +}
> diff --git a/include/spl.h b/include/spl.h
> index 2360466..1524e26 100644
> --- a/include/spl.h
> +++ b/include/spl.h
> @@ -140,4 +140,12 @@ void spl_board_init(void);
>   */
>  bool spl_was_boot_source(void);
>  
> +/**
> + * spl_dfu_cmd- run dfu command with chosen mmc device interface
> + * @param usb_index - usb controller number
> + * @param mmc_dev -  mmc device nubmer
> + *
> + * @return 0 on success, otherwise error code
> + */
> +int spl_dfu_cmd(int usbctrl, char *dfu_alt_info, char *interface,
> char *devstr); #endif



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [RFC PATCH v2 2/5] common: dfu: saperate the dfu common functionality
       [not found] ` <1469193550-19125-3-git-send-email-ravibabu@ti.com>
@ 2016-07-25 10:08   ` Lukasz Majewski
  2016-07-25 13:12     ` B, Ravi
  0 siblings, 1 reply; 8+ messages in thread
From: Lukasz Majewski @ 2016-07-25 10:08 UTC (permalink / raw)
  To: u-boot

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@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@majess.pl>
> + *
> + * Copyright (C) 2012 Samsung Electronics
> + * authors: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
> + *	    Lukasz Majewski <l.majewski@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

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [RFC PATCH v2 0/5] SPL: DFU Support in SPL
       [not found] <1469193550-19125-1-git-send-email-ravibabu@ti.com>
       [not found] ` <1469193550-19125-4-git-send-email-ravibabu@ti.com>
       [not found] ` <1469193550-19125-3-git-send-email-ravibabu@ti.com>
@ 2016-07-25 10:16 ` Lukasz Majewski
  2 siblings, 0 replies; 8+ messages in thread
From: Lukasz Majewski @ 2016-07-25 10:16 UTC (permalink / raw)
  To: u-boot

Hi Ravi,

> Traditionally the DFU support is available only
> as part 2nd stage boot loader(u-boot) and DFU
> is not supported in SPL.
> 
> The SPL-DFU feature is useful for boards which
> does not have MMC/SD, ethernet boot mechanism
> to boot the board and only has USB inteface.
> 
> This patch add DFU support in SPL with RAM
> memory device support to load and execute u-boot 
> from PC over USB interface. And then leverage
> full functional feature of DFU in u-boot to
> flash boot inital binary images to factory or
> bare-metal boards to memory devices like SPI,
> eMMC, MMC/SD card using USB interface.
> 
> As a reference, refer to application note [3]
> on SPL-DFU support based on 2014.07 u-boot.
> 
> Steps to build SPL-DFU/RAM:
> This SPL-DFU support can be enabled through
> Menuconfig->Boot Images->Enable SPL-DFU support
> 1) Soc ROMcode loads the u-boot-spl.bin(+DFU) to IRAM 
> from PC host via usb interface and execute DFU.
> 2) Then load u-boot.img to RAM using dfu-util from PC-host
> with -R switch to boot u-boot.
> #sudo dfu-util -c 1 -i 0 -a 0 -D u-boot.img -R
> 


I wanted to add this patch series for testing. Unfortunately, I cannot
apply this code to the newest u-boot-usb/master (SHA1:
eb364c3dc28d59d33e823470d07746b22a8e6fee)

Please rebase your code on top of this branch.

Thanks in advance,

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [RFC PATCH v2 3/5] spl: dfu: adding dfu support functions for SPL-DFU
  2016-07-25 10:05   ` [U-Boot] [RFC PATCH v2 3/5] spl: dfu: adding dfu support functions for SPL-DFU Lukasz Majewski
@ 2016-07-25 13:08     ` B, Ravi
  2016-07-25 14:16       ` Lukasz Majewski
  0 siblings, 1 reply; 8+ messages in thread
From: B, Ravi @ 2016-07-25 13:08 UTC (permalink / raw)
  To: u-boot

Hi Lukasz

>> Adding support functions to run dfu spl commands.
>> 
>> Signed-off-by: Ravi Babu <ravibabu@ti.com>
>> ---
>>  common/spl/Makefile  |    1 +
>>  common/spl/spl_dfu.c |   57
>> ++++++++++++++++++++++++++++++++++++++++++++++++++
>> include/spl.h        |    8 +++++++ 3 files changed, 66 insertions(+)
>>  create mode 100644 common/spl/spl_dfu.c
>> 
>> diff --git a/common/spl/Makefile b/common/spl/Makefile index 
>> 2e0f695..0850da0 100644
>> --- a/common/spl/Makefile
>> +++ b/common/spl/Makefile
>> @@ -21,4 +21,5 @@ obj-$(CONFIG_SPL_USB_SUPPORT) += spl_usb.o
>>  obj-$(CONFIG_SPL_FAT_SUPPORT) += spl_fat.o
>>  obj-$(CONFIG_SPL_EXT_SUPPORT) += spl_ext.o
>>  obj-$(CONFIG_SPL_SATA_SUPPORT) += spl_sata.o
>> +obj-$(CONFIG_SPL_DFU_SUPPORT) += spl_dfu.o
>>  endif
>> diff --git a/common/spl/spl_dfu.c b/common/spl/spl_dfu.c new file mode 
>> 100644 index 0000000..e8d0ba1
>> --- /dev/null
>> +++ b/common/spl/spl_dfu.c
>> @@ -0,0 +1,57 @@
>> +/*
>> + * (C) Copyright 2016
>> + * Texas Instruments, <www.ti.com>
>> + *
>> + * Ravi B <ravibabu@ti.com>
>> + *
>> + * SPDX-License-Identifier:	GPL-2.0+
>> + */
>> +#include <common.h>
>> +#include <spl.h>
>> +#include <linux/compiler.h>
>> +#include <errno.h>
>> +#include <watchdog.h>
>> +#include <console.h>
>> +#include <g_dnl.h>
>> +#include <usb.h>
>> +#include <dfu.h>
>> +#include <environment.h>
>> +
>> +static int run_dfu(int usb_index, char *interface, char *devstring) {
>> +	int ret;
>> +
>> +	ret = dfu_init_env_entities(interface, devstring);
>> +	if (ret) {
>> +		dfu_free_entities();
>> +		goto exit;
>> +	}
>> +
>> +	run_usb_dnl_gadget(usb_index, "usb_dnl_dfu");
>> +exit:
>> +	dfu_free_entities();
>> +	return ret;
>> +}
>> +
>> +int spl_dfu_cmd(int usbctrl, char *dfu_alt_info, char *interface, 
>				     ^^^^^^^^^^^^^^ this is a bit
>				     misleading.
>				     I would rename it to "alt_info_str"

Ok. Will change to alt_info_str.

>
>> char *devstr) +{
>> +	char *str_env;
>> +	int ret;
>> +
>> +	/* set default environment */
>> +	set_default_env(0);

>set_default_env() accepts const char *s as the argument. Please replace
>0 -> NULL

Fine.

>
>> +	str_env = getenv(dfu_alt_info);
>> +	if (!str_env) {
>> +		error("\"dfu_alt_info\" env variable not
>> defined!\n");
>> +		return -EINVAL;
>> +	}
>> +
>> +	ret = setenv("dfu_alt_info", str_env);
>> +	if (ret) {
>> +		error("unable to set env variable
>> \"dfu_alt_info\"!\n");
>> +		return -EINVAL;
>> +	}

>I'm a bit confused with this env flow.
>
>Is it required on your platform to:
>
>1. set_default_env(NULL) - which sets default envs (one which are mostly defined at ./include/<board_config> file) in RAM

Actually not required, I felt it is better to use default environment inorder to get the latest 
environment from SPL which is being loaded. I will check once without set_default_env().

>
>2. call getenv with "dfu_alt_info_ram", which reads this value from RAM
>
>3. call setenv() to store already in ram available env variable to some medium?

This step is required, "dfu_alt_info" is one referred by dfu driver.

>
>If you want to store default envs in the medium (e.g. eMMC), I think that it would be easier to call "saveenv".

Ok. 

>Otherwise, I would stay with default envs, since we only use this u-boot for flashing other binaries.

Right.

Regards
Ravi 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [RFC PATCH v2 2/5] common: dfu: saperate the dfu common functionality
  2016-07-25 10:08   ` [U-Boot] [RFC PATCH v2 2/5] common: dfu: saperate the dfu common functionality Lukasz Majewski
@ 2016-07-25 13:12     ` B, Ravi
  0 siblings, 0 replies; 8+ messages in thread
From: B, Ravi @ 2016-07-25 13:12 UTC (permalink / raw)
  To: u-boot

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@majess.pl>
>> + *
>> + * Copyright (C) 2012 Samsung Electronics
>> + * authors: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
>> + *	    Lukasz Majewski <l.majewski@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

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [RFC PATCH v2 3/5] spl: dfu: adding dfu support functions for SPL-DFU
  2016-07-25 13:08     ` B, Ravi
@ 2016-07-25 14:16       ` Lukasz Majewski
  0 siblings, 0 replies; 8+ messages in thread
From: Lukasz Majewski @ 2016-07-25 14:16 UTC (permalink / raw)
  To: u-boot

Hi Ravi,

> Hi Lukasz
> 
> >> Adding support functions to run dfu spl commands.
> >> 
> >> Signed-off-by: Ravi Babu <ravibabu@ti.com>
> >> ---
> >>  common/spl/Makefile  |    1 +
> >>  common/spl/spl_dfu.c |   57
> >> ++++++++++++++++++++++++++++++++++++++++++++++++++
> >> include/spl.h        |    8 +++++++ 3 files changed, 66
> >> insertions(+) create mode 100644 common/spl/spl_dfu.c
> >> 
> >> diff --git a/common/spl/Makefile b/common/spl/Makefile index 
> >> 2e0f695..0850da0 100644
> >> --- a/common/spl/Makefile
> >> +++ b/common/spl/Makefile
> >> @@ -21,4 +21,5 @@ obj-$(CONFIG_SPL_USB_SUPPORT) += spl_usb.o
> >>  obj-$(CONFIG_SPL_FAT_SUPPORT) += spl_fat.o
> >>  obj-$(CONFIG_SPL_EXT_SUPPORT) += spl_ext.o
> >>  obj-$(CONFIG_SPL_SATA_SUPPORT) += spl_sata.o
> >> +obj-$(CONFIG_SPL_DFU_SUPPORT) += spl_dfu.o
> >>  endif
> >> diff --git a/common/spl/spl_dfu.c b/common/spl/spl_dfu.c new file
> >> mode 100644 index 0000000..e8d0ba1
> >> --- /dev/null
> >> +++ b/common/spl/spl_dfu.c
> >> @@ -0,0 +1,57 @@
> >> +/*
> >> + * (C) Copyright 2016
> >> + * Texas Instruments, <www.ti.com>
> >> + *
> >> + * Ravi B <ravibabu@ti.com>
> >> + *
> >> + * SPDX-License-Identifier:	GPL-2.0+
> >> + */
> >> +#include <common.h>
> >> +#include <spl.h>
> >> +#include <linux/compiler.h>
> >> +#include <errno.h>
> >> +#include <watchdog.h>
> >> +#include <console.h>
> >> +#include <g_dnl.h>
> >> +#include <usb.h>
> >> +#include <dfu.h>
> >> +#include <environment.h>
> >> +
> >> +static int run_dfu(int usb_index, char *interface, char
> >> *devstring) {
> >> +	int ret;
> >> +
> >> +	ret = dfu_init_env_entities(interface, devstring);
> >> +	if (ret) {
> >> +		dfu_free_entities();
> >> +		goto exit;
> >> +	}
> >> +
> >> +	run_usb_dnl_gadget(usb_index, "usb_dnl_dfu");
> >> +exit:
> >> +	dfu_free_entities();
> >> +	return ret;
> >> +}
> >> +
> >> +int spl_dfu_cmd(int usbctrl, char *dfu_alt_info, char *interface, 
> >				     ^^^^^^^^^^^^^^ this is a bit
> >				     misleading.
> >				     I would rename it to
> >	"alt_info_str"
> 
> Ok. Will change to alt_info_str.
> 
> >
> >> char *devstr) +{
> >> +	char *str_env;
> >> +	int ret;
> >> +
> >> +	/* set default environment */
> >> +	set_default_env(0);
> 
> >set_default_env() accepts const char *s as the argument. Please
> >replace 0 -> NULL
> 
> Fine.
> 
> >
> >> +	str_env = getenv(dfu_alt_info);
> >> +	if (!str_env) {
> >> +		error("\"dfu_alt_info\" env variable not
> >> defined!\n");
> >> +		return -EINVAL;
> >> +	}
> >> +
> >> +	ret = setenv("dfu_alt_info", str_env);
> >> +	if (ret) {
> >> +		error("unable to set env variable
> >> \"dfu_alt_info\"!\n");
> >> +		return -EINVAL;
> >> +	}
> 
> >I'm a bit confused with this env flow.
> >
> >Is it required on your platform to:
> >
> >1. set_default_env(NULL) - which sets default envs (one which are
> >mostly defined at ./include/<board_config> file) in RAM
> 
> Actually not required, I felt it is better to use default environment
> inorder to get the latest environment from SPL which is being loaded.
> I will check once without set_default_env().
> 
> >
> >2. call getenv with "dfu_alt_info_ram", which reads this value from
> >RAM
> >
> >3. call setenv() to store already in ram available env variable to
> >some medium?
> 
> This step is required, "dfu_alt_info" is one referred by dfu driver.

But is it necessary to store "dfu_alt_info" env variable to memory
medium (e.g. eMMC) or is it enough to use the default value stored in
RAM?

> 
> >
> >If you want to store default envs in the medium (e.g. eMMC), I think
> >that it would be easier to call "saveenv".
> 
> Ok. 
> 
> >Otherwise, I would stay with default envs, since we only use this
> >u-boot for flashing other binaries.
> 
> Right.
> 
> Regards
> Ravi 
> 



-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [RFC PATCH v2 2/5] common: dfu: saperate the dfu common functionality
  2016-07-21 14:53 ` [U-Boot] [RFC PATCH v2 2/5] common: dfu: saperate the dfu common functionality Ravi Babu
@ 2016-07-22 13:41   ` Tom Rini
  0 siblings, 0 replies; 8+ messages in thread
From: Tom Rini @ 2016-07-22 13:41 UTC (permalink / raw)
  To: u-boot

On Thu, Jul 21, 2016 at 08:23:14PM +0530, Ravi Babu wrote:

> 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@ti.com>

Reviewed-by: Tom Rini <trini@konsulko.com>

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160722/1088db67/attachment.sig>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [U-Boot] [RFC PATCH v2 2/5] common: dfu: saperate the dfu common functionality
  2016-07-21 14:53 Ravi Babu
@ 2016-07-21 14:53 ` Ravi Babu
  2016-07-22 13:41   ` Tom Rini
  0 siblings, 1 reply; 8+ messages in thread
From: Ravi Babu @ 2016-07-21 14:53 UTC (permalink / raw)
  To: u-boot

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@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
+ *
+ * Copyright (C) 2015
+ * Lukasz Majewski <l.majewski@majess.pl>
+ *
+ * Copyright (C) 2012 Samsung Electronics
+ * authors: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
+ *	    Lukasz Majewski <l.majewski@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_ */
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-07-25 14:16 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1469193550-19125-1-git-send-email-ravibabu@ti.com>
     [not found] ` <1469193550-19125-4-git-send-email-ravibabu@ti.com>
2016-07-25 10:05   ` [U-Boot] [RFC PATCH v2 3/5] spl: dfu: adding dfu support functions for SPL-DFU Lukasz Majewski
2016-07-25 13:08     ` B, Ravi
2016-07-25 14:16       ` Lukasz Majewski
     [not found] ` <1469193550-19125-3-git-send-email-ravibabu@ti.com>
2016-07-25 10:08   ` [U-Boot] [RFC PATCH v2 2/5] common: dfu: saperate the dfu common functionality Lukasz Majewski
2016-07-25 13:12     ` B, Ravi
2016-07-25 10:16 ` [U-Boot] [RFC PATCH v2 0/5] SPL: DFU Support in SPL Lukasz Majewski
2016-07-21 14:53 Ravi Babu
2016-07-21 14:53 ` [U-Boot] [RFC PATCH v2 2/5] common: dfu: saperate the dfu common functionality Ravi Babu
2016-07-22 13:41   ` Tom Rini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.