Merge branch 'master' of git://git.denx.de/u-boot-usb

- DFU updates
This commit is contained in:
Tom Rini 2020-01-09 08:51:57 -05:00
commit a74a2134b2
7 changed files with 71 additions and 10 deletions

View file

@ -30,28 +30,35 @@ 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_TIMEOUT) || defined(CONFIG_DFU_OVER_TFTP)
unsigned long value = 0;
#endif
if (argc >= 4) {
interface = argv[2];
devstring = argv[3];
}
#if defined(CONFIG_DFU_TIMEOUT) || defined(CONFIG_DFU_OVER_TFTP)
if (argc == 5 || argc == 3)
value = simple_strtoul(argv[argc - 1], NULL, 0);
#endif
#endif
int ret = 0;
#ifdef CONFIG_DFU_OVER_TFTP
unsigned long addr = 0;
if (!strcmp(argv[1], "tftp")) {
if (argc == 5 || argc == 3)
addr = simple_strtoul(argv[argc - 1], NULL, 0);
return update_tftp(addr, interface, devstring);
}
if (!strcmp(argv[1], "tftp"))
return update_tftp(value, interface, devstring);
#endif
#ifdef CONFIG_DFU_OVER_USB
ret = dfu_init_env_entities(interface, devstring);
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();
@ -72,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

View file

@ -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);
}

View file

@ -33,6 +33,7 @@ CONFIG_SYS_REDUNDAND_ENVIRONMENT=y
CONFIG_ENV_OFFSET_REDUND=0x600000
CONFIG_SYS_RELOC_GD_ENV_ADDR=y
CONFIG_CPU=y
CONFIG_DFU_TIMEOUT=y
CONFIG_DFU_MMC=y
CONFIG_DFU_RAM=y
CONFIG_SUPPORT_EMMC_BOOT=y

View file

@ -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)

View file

@ -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

View file

@ -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;

View file

@ -171,7 +171,6 @@ const char *dfu_get_dev_type(enum dfu_device_type t);
const char *dfu_get_layout(enum dfu_layout l);
struct dfu_entity *dfu_get_entity(int alt);
char *dfu_extract_token(char** e, int *n);
void dfu_trigger_reset(void);
int dfu_get_alt(char *name);
int dfu_init_env_entities(char *interface, char *devstr);
unsigned char *dfu_get_buf(struct dfu_entity *dfu);
@ -179,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);