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