mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
dfu: Add optional timeout parameter
When the `dfu` command is called from the U-Boot environment,
it now accepts an optional parameter that specifies a timeout (in seconds).
If a DFU connection is not made within that time the `dfu` command exits
(as it would if Ctrl+C was pressed). If the timeout is left empty or being
zero the `dfu` command behaves as it does now.
This is useful for allowing U-Boot to check to see if anything wants to
upload new firmware before continuing to boot.
The patch is based on the commit
5e966ccc3c
by Sebastien Colleur, which has been heavily reworked due to U-Boot changes
in the past.
Signed-off-by: Brad Campbell <bradjc5@gmail.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
This commit is contained in:
parent
2b1f8c2bdf
commit
98a8f445fd
6 changed files with 62 additions and 4 deletions
15
cmd/dfu.c
15
cmd/dfu.c
|
@ -30,7 +30,7 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
#if defined(CONFIG_DFU_OVER_USB) || defined(CONFIG_DFU_OVER_TFTP)
|
||||
char *interface = NULL;
|
||||
char *devstring = NULL;
|
||||
#if defined(CONFIG_DFU_OVER_TFTP)
|
||||
#if defined(CONFIG_DFU_TIMEOUT) || defined(CONFIG_DFU_OVER_TFTP)
|
||||
unsigned long value = 0;
|
||||
#endif
|
||||
|
||||
|
@ -39,7 +39,7 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
devstring = argv[3];
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DFU_OVER_TFTP)
|
||||
#if defined(CONFIG_DFU_TIMEOUT) || defined(CONFIG_DFU_OVER_TFTP)
|
||||
if (argc == 5 || argc == 3)
|
||||
value = simple_strtoul(argv[argc - 1], NULL, 0);
|
||||
#endif
|
||||
|
@ -55,6 +55,10 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
if (ret)
|
||||
goto done;
|
||||
|
||||
#ifdef CONFIG_DFU_TIMEOUT
|
||||
dfu_set_timeout(value * 1000);
|
||||
#endif
|
||||
|
||||
ret = CMD_RET_SUCCESS;
|
||||
if (strcmp(argv[argc - 1], "list") == 0) {
|
||||
dfu_show_entities();
|
||||
|
@ -75,10 +79,17 @@ U_BOOT_CMD(dfu, CONFIG_SYS_MAXARGS, 1, do_dfu,
|
|||
"Device Firmware Upgrade",
|
||||
""
|
||||
#ifdef CONFIG_DFU_OVER_USB
|
||||
#ifdef CONFIG_DFU_TIMEOUT
|
||||
"<USB_controller> [<interface> <dev>] [<timeout>] [list]\n"
|
||||
#else
|
||||
"<USB_controller> [<interface> <dev>] [list]\n"
|
||||
#endif
|
||||
" - device firmware upgrade via <USB_controller>\n"
|
||||
" on device <dev>, attached to interface\n"
|
||||
" <interface>\n"
|
||||
#ifdef CONFIG_DFU_TIMEOUT
|
||||
" [<timeout>] - specify inactivity timeout in seconds\n"
|
||||
#endif
|
||||
" [list] - list available alt settings\n"
|
||||
#endif
|
||||
#ifdef CONFIG_DFU_OVER_TFTP
|
||||
|
|
17
common/dfu.c
17
common/dfu.c
|
@ -35,6 +35,10 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
|
|||
return CMD_RET_FAILURE;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DFU_TIMEOUT
|
||||
unsigned long start_time = get_timer(0);
|
||||
#endif
|
||||
|
||||
while (1) {
|
||||
if (g_dnl_detach()) {
|
||||
/*
|
||||
|
@ -79,6 +83,19 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DFU_TIMEOUT
|
||||
unsigned long wait_time = dfu_get_timeout();
|
||||
|
||||
if (wait_time) {
|
||||
unsigned long current_time = get_timer(start_time);
|
||||
|
||||
if (current_time > wait_time) {
|
||||
debug("Inactivity timeout, abort DFU\n");
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
WATCHDOG_RESET();
|
||||
usb_gadget_handle_interrupts(usbctrl_index);
|
||||
}
|
||||
|
|
|
@ -43,6 +43,7 @@ Configuration Options:
|
|||
CONFIG_DFU_RAM
|
||||
CONFIG_DFU_SF
|
||||
CONFIG_DFU_SF_PART
|
||||
CONFIG_DFU_TIMEOUT
|
||||
CONFIG_DFU_VIRTUAL
|
||||
CONFIG_CMD_DFU
|
||||
|
||||
|
@ -70,12 +71,15 @@ Commands:
|
|||
dfu <USB_controller> [<interface> <dev>] list
|
||||
list the alternate device defined in "dfu_alt_info"
|
||||
|
||||
dfu <USB_controller> [<interface> <dev>]
|
||||
dfu <USB_controller> [<interface> <dev>] [<timeout>]
|
||||
start the dfu stack on the USB instance with the selected medium
|
||||
backend and use the "dfu_alt_info" variable to configure the
|
||||
alternate setting and link each one with the medium
|
||||
The dfu command continue until receive a ^C in console or
|
||||
a DFU detach transaction from HOST.
|
||||
a DFU detach transaction from HOST. If CONFIG_DFU_TIMEOUT option
|
||||
is enabled and <timeout> parameter is present in the command line,
|
||||
the DFU operation will be aborted automatically after <timeout>
|
||||
seconds of waiting remote to initiate DFU session.
|
||||
|
||||
The possible values of <interface> are :
|
||||
(with <USB controller> = 0 in the dfu command example)
|
||||
|
|
|
@ -23,6 +23,12 @@ config DFU_TFTP
|
|||
|
||||
Detailed description of this feature can be found at ./doc/README.dfutftp
|
||||
|
||||
config DFU_TIMEOUT
|
||||
bool "Timeout waiting for DFU"
|
||||
help
|
||||
This option adds an optional timeout parameter for DFU which, if set,
|
||||
will cause DFU to only wait for that many seconds before exiting.
|
||||
|
||||
config DFU_MMC
|
||||
bool "MMC back end for DFU"
|
||||
help
|
||||
|
|
|
@ -21,6 +21,9 @@ static LIST_HEAD(dfu_list);
|
|||
static int dfu_alt_num;
|
||||
static int alt_num_cnt;
|
||||
static struct hash_algo *dfu_hash_algo;
|
||||
#ifdef CONFIG_DFU_TIMEOUT
|
||||
static unsigned long dfu_timeout = 0;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The purpose of the dfu_flush_callback() function is to
|
||||
|
@ -58,6 +61,18 @@ __weak bool dfu_usb_get_reset(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DFU_TIMEOUT
|
||||
void dfu_set_timeout(unsigned long timeout)
|
||||
{
|
||||
dfu_timeout = timeout;
|
||||
}
|
||||
|
||||
unsigned long dfu_get_timeout(void)
|
||||
{
|
||||
return dfu_timeout;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int dfu_find_alt_num(const char *s)
|
||||
{
|
||||
int i = 0;
|
||||
|
|
|
@ -178,6 +178,11 @@ unsigned char *dfu_free_buf(void);
|
|||
unsigned long dfu_get_buf_size(void);
|
||||
bool dfu_usb_get_reset(void);
|
||||
|
||||
#ifdef CONFIG_DFU_TIMEOUT
|
||||
unsigned long dfu_get_timeout(void);
|
||||
void dfu_set_timeout(unsigned long);
|
||||
#endif
|
||||
|
||||
int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
|
||||
int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
|
||||
int dfu_flush(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
|
||||
|
|
Loading…
Reference in a new issue