
Hi Joe,
Hi Lukasz,
On Sun, Jul 12, 2015 at 10:30 AM, Lukasz Majewski l.majewski@majess.pl wrote:
This commit adds initial support for using tftp for downloading and upgrading firmware on the device.
Signed-off-by: Lukasz Majewski l.majewski@majess.pl
drivers/dfu/Makefile | 1 + drivers/dfu/dfu_tftp.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/dfu.h | 11 ++++++++ 3 files changed, 88 insertions(+) create mode 100644 drivers/dfu/dfu_tftp.c
diff --git a/drivers/dfu/Makefile b/drivers/dfu/Makefile index 5cc535e..43249ce 100644 --- a/drivers/dfu/Makefile +++ b/drivers/dfu/Makefile @@ -10,3 +10,4 @@ obj-$(CONFIG_DFU_MMC) += dfu_mmc.o obj-$(CONFIG_DFU_NAND) += dfu_nand.o obj-$(CONFIG_DFU_RAM) += dfu_ram.o obj-$(CONFIG_DFU_SF) += dfu_sf.o +obj-$(CONFIG_DFU_TFTP) += dfu_tftp.o diff --git a/drivers/dfu/dfu_tftp.c b/drivers/dfu/dfu_tftp.c new file mode 100644 index 0000000..26539f2 --- /dev/null +++ b/drivers/dfu/dfu_tftp.c @@ -0,0 +1,76 @@ +/*
- (C) Copyright 2015
- Lukasz Majewski l.majewski@majess.pl
- SPDX-License-Identifier: GPL-2.0+
- */
+#include <common.h> +#include <malloc.h> +#include <errno.h> +#include <dfu.h>
+int dfu_tftp_write(char *dfu_entity_name, unsigned int addr, unsigned int len) +{
char *s, *sb, *interface, *devstring;
int alt_setting_num, ret;
struct dfu_entity *dfu;
debug("%s: name: %s addr: 0x%x len: %d\n", __func__,
dfu_entity_name,
addr, len);
interface = getenv("update_tftp_dfu_interface");
if (interface == NULL) {
error("TFTP DFU: 'interface' not defined\n");
return -EINVAL;
}
devstring = getenv("update_tftp_dfu_devstring");
if (devstring == NULL) {
error("TFTP DFU: 'devstring' not defined\n");
return -EINVAL;
}
It would be great if these env vars could be moved to command parameters.
Those parameters are necessary to perform update (via update_tftp()) during boot time.
Normally - when user call 'dfutftp' command he/she needs to specify this informaiton. (e.g. 'dfutftp 0 mmc 1').
ret = dfu_init_env_entities(interface, devstring);
if (ret)
goto done;
/*
* We need to copy name pointed by *dfu_entity_name since
this text
* is the integral part of the FDT image.
* Any implicit modification (i.e. done by strsep()) will
corrupt
* the FDT image and prevent other images to be stored.
*/
s = strdup(dfu_entity_name);
sb = s;
if (!s) {
ret = -ENOMEM;
goto done;
}
strsep(&s, "@");
debug("%s: image name: %s strlen: %d\n", __func__, sb,
strlen(sb)); +
alt_setting_num = dfu_get_alt(sb);
free(sb);
if (alt_setting_num < 0) {
error("Alt setting [%d] to write not found!",
alt_setting_num);
ret = -ENODEV;
goto done;
}
dfu = dfu_get_entity(alt_setting_num);
if (!dfu) {
error("DFU entity for alt: %d not found!",
alt_setting_num);
ret = -ENODEV;
goto done;
}
ret = dfu_write_from_mem_addr(dfu, (void *)addr, len);
+done:
dfu_free_entities();
return ret;
+} diff --git a/include/dfu.h b/include/dfu.h index 7d31abd..adad863 100644 --- a/include/dfu.h +++ b/include/dfu.h @@ -207,5 +207,16 @@ static inline int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, } #endif
+#ifdef CONFIG_DFU_TFTP +int dfu_tftp_write(char *dfu_entity_name, unsigned int addr, unsigned int len); +#else +static inline int dfu_tftp_write(char *dfu_entity_name, unsigned int addr,
unsigned int len)
+{
puts("TFTP write support for DFU not available!\n");
return -1;
This should be -ENOSYS probably.
Good point - thanks!
+} +#endif
int dfu_add(struct usb_configuration *c);
#endif /* __DFU_ENTITY_H_ */
2.1.4
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Best regards, Lukasz Majewski