diff options
author | Lukasz Majewski <l.majewski@majess.pl> | 2015-08-24 00:21:47 +0200 |
---|---|---|
committer | Marek Vasut <marex@denx.de> | 2015-09-07 13:41:05 +0200 |
commit | c7ff5528439af8f1e6e10424e495eb7d6238d6c5 (patch) | |
tree | 81ac1c72bc7f753efd96bd49236a4b2636e48d73 | |
parent | 2092e4610485618ec7a676ff8e6d297ea9dca3d5 (diff) | |
download | u-boot-imx-c7ff5528439af8f1e6e10424e495eb7d6238d6c5.zip u-boot-imx-c7ff5528439af8f1e6e10424e495eb7d6238d6c5.tar.gz u-boot-imx-c7ff5528439af8f1e6e10424e495eb7d6238d6c5.tar.bz2 |
update: tftp: dfu: Extend update_tftp() function to support DFU
This code allows using DFU defined mediums for storing data received via
TFTP protocol.
It reuses and preserves functionality of legacy code at common/update.c.
The update_tftp() function now accepts parameters - namely medium device
name and its number (e.g. mmc 1).
Without this information passed old behavior is preserved.
Signed-off-by: Lukasz Majewski <l.majewski@majess.pl>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
-rw-r--r-- | common/Makefile | 1 | ||||
-rw-r--r-- | common/cmd_fitupd.c | 2 | ||||
-rw-r--r-- | common/main.c | 2 | ||||
-rw-r--r-- | common/update.c | 47 | ||||
-rw-r--r-- | include/net.h | 14 |
5 files changed, 52 insertions, 14 deletions
diff --git a/common/Makefile b/common/Makefile index f4ba878..556fb07 100644 --- a/common/Makefile +++ b/common/Makefile @@ -210,6 +210,7 @@ obj-$(CONFIG_LYNXKDI) += lynxkdi.o obj-$(CONFIG_MENU) += menu.o obj-$(CONFIG_MODEM_SUPPORT) += modem.o obj-$(CONFIG_UPDATE_TFTP) += update.o +obj-$(CONFIG_DFU_TFTP) += update.o obj-$(CONFIG_USB_KEYBOARD) += usb_kbd.o obj-$(CONFIG_CMD_DFU) += cmd_dfu.o obj-$(CONFIG_CMD_GPT) += cmd_gpt.o diff --git a/common/cmd_fitupd.c b/common/cmd_fitupd.c index b045974..78b8747 100644 --- a/common/cmd_fitupd.c +++ b/common/cmd_fitupd.c @@ -23,7 +23,7 @@ static int do_fitupd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (argc == 2) addr = simple_strtoul(argv[1], NULL, 16); - return update_tftp(addr); + return update_tftp(addr, NULL, NULL); } U_BOOT_CMD(fitupd, 2, 0, do_fitupd, diff --git a/common/main.c b/common/main.c index 2979fbe..ead0cd1 100644 --- a/common/main.c +++ b/common/main.c @@ -75,7 +75,7 @@ void main_loop(void) run_preboot_environment_command(); #if defined(CONFIG_UPDATE_TFTP) - update_tftp(0UL); + update_tftp(0UL, NULL, NULL); #endif /* CONFIG_UPDATE_TFTP */ s = bootdelay_process(); diff --git a/common/update.c b/common/update.c index 542915c..1da80b7 100644 --- a/common/update.c +++ b/common/update.c @@ -13,11 +13,17 @@ #error "CONFIG_FIT and CONFIG_OF_LIBFDT are required for auto-update feature" #endif +#if defined(CONFIG_UPDATE_TFTP) && defined(CONFIG_SYS_NO_FLASH) +#error "CONFIG_UPDATE_TFTP and CONFIG_SYS_NO_FLASH needed for legacy behaviour" +#endif + #include <command.h> #include <flash.h> #include <net.h> #include <net/tftp.h> #include <malloc.h> +#include <dfu.h> +#include <errno.h> /* env variable holding the location of the update file */ #define UPDATE_FILE_ENV "updatefile" @@ -222,13 +228,24 @@ static int update_fit_getparams(const void *fit, int noffset, ulong *addr, return 0; } -int update_tftp(ulong addr) +int update_tftp(ulong addr, char *interface, char *devstring) { - char *filename, *env_addr; - int images_noffset, ndepth, noffset; + char *filename, *env_addr, *fit_image_name; ulong update_addr, update_fladdr, update_size; - void *fit; + int images_noffset, ndepth, noffset; + bool update_tftp_dfu; int ret = 0; + void *fit; + + if (interface == NULL && devstring == NULL) { + update_tftp_dfu = false; + } else if (interface && devstring) { + update_tftp_dfu = true; + } else { + error("Interface: %s and devstring: %s not supported!\n", + interface, devstring); + return -EINVAL; + } /* use already present image */ if (addr) @@ -277,8 +294,8 @@ got_update_file: if (ndepth != 1) goto next_node; - printf("Processing update '%s' :", - fit_get_name(fit, noffset, NULL)); + fit_image_name = (char *)fit_get_name(fit, noffset, NULL); + printf("Processing update '%s' :", fit_image_name); if (!fit_image_verify(fit, noffset)) { printf("Error: invalid update hash, aborting\n"); @@ -294,10 +311,20 @@ got_update_file: ret = 1; goto next_node; } - if (update_flash(update_addr, update_fladdr, update_size)) { - printf("Error: can't flash update, aborting\n"); - ret = 1; - goto next_node; + + if (!update_tftp_dfu) { + if (update_flash(update_addr, update_fladdr, + update_size)) { + printf("Error: can't flash update, aborting\n"); + ret = 1; + goto next_node; + } + } else if (fit_image_check_type(fit, noffset, + IH_TYPE_FIRMWARE)) { + ret = dfu_tftp_write(fit_image_name, update_addr, + update_size, interface, devstring); + if (ret) + return ret; } next_node: noffset = fdt_next_node(fit, noffset, &ndepth); diff --git a/include/net.h b/include/net.h index d09bec9..f1671e3 100644 --- a/include/net.h +++ b/include/net.h @@ -813,8 +813,18 @@ void copy_filename(char *dst, const char *src, int size); /* get a random source port */ unsigned int random_port(void); -/* Update U-Boot over TFTP */ -int update_tftp(ulong addr); +/** + * update_tftp - Update firmware over TFTP (via DFU) + * + * This function updates board's firmware via TFTP + * + * @param addr - memory address where data is stored + * @param interface - the DFU medium name - e.g. "mmc" + * @param devstring - the DFU medium number - e.g. "1" + * + * @return - 0 on success, other value on failure + */ +int update_tftp(ulong addr, char *interface, char *devstring); /**********************************************************************/ |