1*2d50d68aSLukasz Majewski /* 2*2d50d68aSLukasz Majewski * (C) Copyright 2015 3*2d50d68aSLukasz Majewski * Lukasz Majewski <l.majewski@majess.pl> 4*2d50d68aSLukasz Majewski * 5*2d50d68aSLukasz Majewski * SPDX-License-Identifier: GPL-2.0+ 6*2d50d68aSLukasz Majewski */ 7*2d50d68aSLukasz Majewski 8*2d50d68aSLukasz Majewski #include <common.h> 9*2d50d68aSLukasz Majewski #include <malloc.h> 10*2d50d68aSLukasz Majewski #include <errno.h> 11*2d50d68aSLukasz Majewski #include <dfu.h> 12*2d50d68aSLukasz Majewski 13*2d50d68aSLukasz Majewski int dfu_tftp_write(char *dfu_entity_name, unsigned int addr, unsigned int len, 14*2d50d68aSLukasz Majewski char *interface, char *devstring) 15*2d50d68aSLukasz Majewski { 16*2d50d68aSLukasz Majewski char *s, *sb; 17*2d50d68aSLukasz Majewski int alt_setting_num, ret; 18*2d50d68aSLukasz Majewski struct dfu_entity *dfu; 19*2d50d68aSLukasz Majewski 20*2d50d68aSLukasz Majewski debug("%s: name: %s addr: 0x%x len: %d device: %s:%s\n", __func__, 21*2d50d68aSLukasz Majewski dfu_entity_name, addr, len, interface, devstring); 22*2d50d68aSLukasz Majewski 23*2d50d68aSLukasz Majewski ret = dfu_init_env_entities(interface, devstring); 24*2d50d68aSLukasz Majewski if (ret) 25*2d50d68aSLukasz Majewski goto done; 26*2d50d68aSLukasz Majewski 27*2d50d68aSLukasz Majewski /* 28*2d50d68aSLukasz Majewski * We need to copy name pointed by *dfu_entity_name since this text 29*2d50d68aSLukasz Majewski * is the integral part of the FDT image. 30*2d50d68aSLukasz Majewski * Any implicit modification (i.e. done by strsep()) will corrupt 31*2d50d68aSLukasz Majewski * the FDT image and prevent other images to be stored. 32*2d50d68aSLukasz Majewski */ 33*2d50d68aSLukasz Majewski s = strdup(dfu_entity_name); 34*2d50d68aSLukasz Majewski sb = s; 35*2d50d68aSLukasz Majewski if (!s) { 36*2d50d68aSLukasz Majewski ret = -ENOMEM; 37*2d50d68aSLukasz Majewski goto done; 38*2d50d68aSLukasz Majewski } 39*2d50d68aSLukasz Majewski 40*2d50d68aSLukasz Majewski strsep(&s, "@"); 41*2d50d68aSLukasz Majewski debug("%s: image name: %s strlen: %d\n", __func__, sb, strlen(sb)); 42*2d50d68aSLukasz Majewski 43*2d50d68aSLukasz Majewski alt_setting_num = dfu_get_alt(sb); 44*2d50d68aSLukasz Majewski free(sb); 45*2d50d68aSLukasz Majewski if (alt_setting_num < 0) { 46*2d50d68aSLukasz Majewski error("Alt setting [%d] to write not found!", 47*2d50d68aSLukasz Majewski alt_setting_num); 48*2d50d68aSLukasz Majewski ret = -ENODEV; 49*2d50d68aSLukasz Majewski goto done; 50*2d50d68aSLukasz Majewski } 51*2d50d68aSLukasz Majewski 52*2d50d68aSLukasz Majewski dfu = dfu_get_entity(alt_setting_num); 53*2d50d68aSLukasz Majewski if (!dfu) { 54*2d50d68aSLukasz Majewski error("DFU entity for alt: %d not found!", alt_setting_num); 55*2d50d68aSLukasz Majewski ret = -ENODEV; 56*2d50d68aSLukasz Majewski goto done; 57*2d50d68aSLukasz Majewski } 58*2d50d68aSLukasz Majewski 59*2d50d68aSLukasz Majewski ret = dfu_write_from_mem_addr(dfu, (void *)addr, len); 60*2d50d68aSLukasz Majewski 61*2d50d68aSLukasz Majewski done: 62*2d50d68aSLukasz Majewski dfu_free_entities(); 63*2d50d68aSLukasz Majewski 64*2d50d68aSLukasz Majewski return ret; 65*2d50d68aSLukasz Majewski } 66