xref: /rk3399_rockchip-uboot/drivers/dfu/dfu_tftp.c (revision 90aa625c9a9e1fb7a2f001fd8e50099bacaf92b8)
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