12d50d68aSLukasz Majewski /*
22d50d68aSLukasz Majewski * (C) Copyright 2015
32d50d68aSLukasz Majewski * Lukasz Majewski <l.majewski@majess.pl>
42d50d68aSLukasz Majewski *
52d50d68aSLukasz Majewski * SPDX-License-Identifier: GPL-2.0+
62d50d68aSLukasz Majewski */
72d50d68aSLukasz Majewski
82d50d68aSLukasz Majewski #include <common.h>
92d50d68aSLukasz Majewski #include <malloc.h>
102d50d68aSLukasz Majewski #include <errno.h>
112d50d68aSLukasz Majewski #include <dfu.h>
122d50d68aSLukasz Majewski
dfu_tftp_write(char * dfu_entity_name,unsigned int addr,unsigned int len,char * interface,char * devstring)132d50d68aSLukasz Majewski int dfu_tftp_write(char *dfu_entity_name, unsigned int addr, unsigned int len,
142d50d68aSLukasz Majewski char *interface, char *devstring)
152d50d68aSLukasz Majewski {
162d50d68aSLukasz Majewski char *s, *sb;
172d50d68aSLukasz Majewski int alt_setting_num, ret;
182d50d68aSLukasz Majewski struct dfu_entity *dfu;
192d50d68aSLukasz Majewski
202d50d68aSLukasz Majewski debug("%s: name: %s addr: 0x%x len: %d device: %s:%s\n", __func__,
212d50d68aSLukasz Majewski dfu_entity_name, addr, len, interface, devstring);
222d50d68aSLukasz Majewski
232d50d68aSLukasz Majewski ret = dfu_init_env_entities(interface, devstring);
242d50d68aSLukasz Majewski if (ret)
252d50d68aSLukasz Majewski goto done;
262d50d68aSLukasz Majewski
272d50d68aSLukasz Majewski /*
282d50d68aSLukasz Majewski * We need to copy name pointed by *dfu_entity_name since this text
292d50d68aSLukasz Majewski * is the integral part of the FDT image.
302d50d68aSLukasz Majewski * Any implicit modification (i.e. done by strsep()) will corrupt
312d50d68aSLukasz Majewski * the FDT image and prevent other images to be stored.
322d50d68aSLukasz Majewski */
332d50d68aSLukasz Majewski s = strdup(dfu_entity_name);
342d50d68aSLukasz Majewski sb = s;
352d50d68aSLukasz Majewski if (!s) {
362d50d68aSLukasz Majewski ret = -ENOMEM;
372d50d68aSLukasz Majewski goto done;
382d50d68aSLukasz Majewski }
392d50d68aSLukasz Majewski
402d50d68aSLukasz Majewski strsep(&s, "@");
412d50d68aSLukasz Majewski debug("%s: image name: %s strlen: %d\n", __func__, sb, strlen(sb));
422d50d68aSLukasz Majewski
432d50d68aSLukasz Majewski alt_setting_num = dfu_get_alt(sb);
442d50d68aSLukasz Majewski free(sb);
452d50d68aSLukasz Majewski if (alt_setting_num < 0) {
46*90aa625cSMasahiro Yamada pr_err("Alt setting [%d] to write not found!",
472d50d68aSLukasz Majewski alt_setting_num);
482d50d68aSLukasz Majewski ret = -ENODEV;
492d50d68aSLukasz Majewski goto done;
502d50d68aSLukasz Majewski }
512d50d68aSLukasz Majewski
522d50d68aSLukasz Majewski dfu = dfu_get_entity(alt_setting_num);
532d50d68aSLukasz Majewski if (!dfu) {
54*90aa625cSMasahiro Yamada pr_err("DFU entity for alt: %d not found!", alt_setting_num);
552d50d68aSLukasz Majewski ret = -ENODEV;
562d50d68aSLukasz Majewski goto done;
572d50d68aSLukasz Majewski }
582d50d68aSLukasz Majewski
592d50d68aSLukasz Majewski ret = dfu_write_from_mem_addr(dfu, (void *)addr, len);
602d50d68aSLukasz Majewski
612d50d68aSLukasz Majewski done:
622d50d68aSLukasz Majewski dfu_free_entities();
632d50d68aSLukasz Majewski
642d50d68aSLukasz Majewski return ret;
652d50d68aSLukasz Majewski }
66