[U-Boot] [PATCH v3 6/9] update: tftp: dfu: Extend update_tftp() function to support DFU
Lukasz Majewski
l.majewski at majess.pl
Fri Aug 14 01:02:30 CEST 2015
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 at majess.pl>
Acked-by: Joe Hershberger <joe.hershberger at ni.com>
---
Changes for v2:
- Remove env variables from update_tftp() function
- Add parameters to update_tftp() function - without them old behavior is
preserved
- Stop compilation when legacy flags (CONFIG_UPDATE_TFTP and CONFIG_SYS_NO_FLASH)
are wrongly defined
- In the u-boot code legacy calls to update_tftp(0UL) have been changed to
update_tftp(0UL, NULL, NULL)
Changes for v3:
- Add proper update_tftp() function description in the ./include/net.h file
---
common/Makefile | 1 +
common/cmd_fitupd.c | 2 +-
common/main.c | 2 +-
common/update.c | 40 ++++++++++++++++++++++++++++++----------
include/net.h | 14 ++++++++++++--
5 files changed, 45 insertions(+), 14 deletions(-)
diff --git a/common/Makefile b/common/Makefile
index dc82433..9ff1ab6 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -209,6 +209,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..1d082b0 100644
--- a/common/update.c
+++ b/common/update.c
@@ -13,11 +13,16 @@
#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>
/* env variable holding the location of the update file */
#define UPDATE_FILE_ENV "updatefile"
@@ -222,13 +227,17 @@ 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 = false;
int ret = 0;
+ void *fit;
+
+ if (interface && devstring)
+ update_tftp_dfu = true;
/* use already present image */
if (addr)
@@ -277,8 +286,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 +303,21 @@ 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)) {
+ if (dfu_tftp_write(fit_image_name, update_addr,
+ update_size, interface, devstring)) {
+ ret = 1;
+ goto next_node;
+ }
}
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);
/**********************************************************************/
--
2.1.4
More information about the U-Boot
mailing list