[U-Boot] [PATCH 6/8] update: tftp: dfu: Extend update_tftp() function to support DFU

Lukasz Majewski l.majewski at majess.pl
Sun Jul 12 17:30:42 CEST 2015


This code allows using DFU defined mediums for storing data received via
TFTP protocol.

It reuses legacy code at common/update.c.

To run update_tftp() during boot one needs to define
"update_tftp_exec_at_boot=true".

Signed-off-by: Lukasz Majewski <l.majewski at majess.pl>
---
 common/update.c | 37 ++++++++++++++++++++++++++++---------
 1 file changed, 28 insertions(+), 9 deletions(-)

diff --git a/common/update.c b/common/update.c
index 75c6d62..f3ed036 100644
--- a/common/update.c
+++ b/common/update.c
@@ -18,6 +18,7 @@
 #include <net.h>
 #include <tftp.h>
 #include <malloc.h>
+#include <dfu.h>
 
 /* env variable holding the location of the update file */
 #define UPDATE_FILE_ENV		"updatefile"
@@ -224,11 +225,18 @@ static int update_fit_getparams(const void *fit, int noffset, ulong *addr,
 
 int update_tftp(ulong addr)
 {
-	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 (!getenv("update_tftp_exec_at_boot"))
+		return 0;
+
+	if (getenv("update_tftp_dfu"))
+		update_tftp_dfu = true;
 
 	/* use already present image */
 	if (addr)
@@ -277,8 +285,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 +302,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)) {
+				ret = 1;
+				goto next_node;
+			}
 		}
 next_node:
 		noffset = fdt_next_node(fit, noffset, &ndepth);
-- 
2.1.4



More information about the U-Boot mailing list