[U-Boot] [PATCH 4/8] dfu: tftp: update: Provide tftp support for the DFU subsystem
Joe Hershberger
joe.hershberger at gmail.com
Wed Jul 15 20:24:08 CEST 2015
Hi Lukasz,
On Sun, Jul 12, 2015 at 10:30 AM, Lukasz Majewski <l.majewski at 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 at 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 at 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.
> +
> + 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.
> +}
> +#endif
> +
> int dfu_add(struct usb_configuration *c);
> #endif /* __DFU_ENTITY_H_ */
> --
> 2.1.4
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
More information about the U-Boot
mailing list