1 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
3 * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
11 #include <asm/arch/stm32prog.h>
12 #include <linux/printk.h>
13 #include "stm32prog.h"
15 struct stm32prog_data
*stm32prog_data
;
17 static void enable_vidconsole(void)
22 stdname
= env_get("stdout");
23 if (!stdname
|| !strstr(stdname
, "vidconsole")) {
25 snprintf(buf
, sizeof(buf
), "serial,vidconsole");
27 snprintf(buf
, sizeof(buf
), "%s,vidconsole", stdname
);
28 env_set("stdout", buf
);
31 stdname
= env_get("stderr");
32 if (!stdname
|| !strstr(stdname
, "vidconsole")) {
34 snprintf(buf
, sizeof(buf
), "serial,vidconsole");
36 snprintf(buf
, sizeof(buf
), "%s,vidconsole", stdname
);
37 env_set("stderr", buf
);
41 static int do_stm32prog(struct cmd_tbl
*cmdtp
, int flag
, int argc
,
46 enum stm32prog_link_t link
= LINK_UNDEFINED
;
48 struct image_header_s header
;
49 struct stm32prog_data
*data
;
51 if (argc
< 3 || argc
> 5)
54 if (IS_ENABLED(CONFIG_CMD_STM32PROG_USB
) && !strcmp(argv
[1], "usb"))
56 else if (IS_ENABLED(CONFIG_CMD_STM32PROG_SERIAL
) && !strcmp(argv
[1], "serial"))
59 if (link
== LINK_UNDEFINED
) {
60 log_err("not supported link=%s\n", argv
[1]);
64 dev
= (int)dectoul(argv
[2], NULL
);
66 addr
= CONFIG_SYS_LOAD_ADDR
;
69 addr
= hextoul(argv
[3], NULL
);
71 return CMD_RET_FAILURE
;
74 size
= hextoul(argv
[4], NULL
);
76 /* check STM32IMAGE presence */
78 stm32prog_header_check(addr
, &header
);
79 if (header
.type
== HEADER_STM32IMAGE
) {
80 size
= header
.image_length
+ header
.length
;
84 if (IS_ENABLED(CONFIG_VIDEO
))
87 data
= (struct stm32prog_data
*)malloc(sizeof(*data
));
90 log_err("Alloc failed.");
91 return CMD_RET_FAILURE
;
93 stm32prog_data
= data
;
95 ret
= stm32prog_init(data
, addr
, size
);
97 log_debug("Invalid or missing layout file at 0x%lx.\n", addr
);
99 /* prepare DFU for device read/write */
100 ret
= stm32prog_dfu_init(data
);
106 ret
= stm32prog_serial_init(data
, dev
);
109 reset
= stm32prog_serial_loop(data
);
112 reset
= stm32prog_usb_loop(data
, dev
);
118 stm32prog_clean(data
);
119 free(stm32prog_data
);
120 stm32prog_data
= NULL
;
122 puts("Download done\n");
125 char boot_addr_start
[20];
127 char initrd_addr
[40];
128 char *fdt_arg
, *initrd_arg
;
129 const void *uimage
= (void *)data
->uimage
;
130 const void *dtb
= (void *)data
->dtb
;
131 const void *initrd
= (void *)data
->initrd
;
132 struct bootm_info bmi
;
136 fdt_arg
= env_get("fdtcontroladdr");
138 snprintf(dtb_addr
, sizeof(dtb_addr
) - 1, "0x%p", dtb
);
140 snprintf(boot_addr_start
, sizeof(boot_addr_start
) - 1,
145 snprintf(initrd_addr
, sizeof(initrd_addr
) - 1,
146 "0x%p:0x%zx", initrd
, data
->initrd_size
);
147 initrd_arg
= initrd_addr
;
150 printf("Booting kernel at %s %s %s...\n\n\n", boot_addr_start
,
151 initrd_arg
?: "-", fdt_arg
);
154 bmi
.addr_img
= boot_addr_start
;
155 bmi
.conf_ramdisk
= initrd_arg
;
156 bmi
.conf_fdt
= fdt_arg
;
158 /* Try bootm for legacy and FIT format image */
159 if (genimg_get_format(uimage
) != IMAGE_FORMAT_INVALID
)
161 else if (IS_ENABLED(CONFIG_CMD_BOOTZ
))
165 cmd_source_script(data
->script
, NULL
, NULL
);
169 run_command("reset", 0);
172 return CMD_RET_SUCCESS
;
175 stm32prog_clean(data
);
176 free(stm32prog_data
);
177 stm32prog_data
= NULL
;
179 return CMD_RET_FAILURE
;
182 U_BOOT_CMD(stm32prog
, 5, 0, do_stm32prog
,
183 "start communication with tools STM32Cubeprogrammer",
184 "<link> <dev> [<addr>] [<size>]\n"
185 " <link> = serial|usb\n"
186 " <dev> = device instance\n"
187 " <addr> = address of flashlayout\n"
188 " <size> = size of flashlayout (optional for image with STM32 header)\n"
191 bool stm32prog_get_fsbl_nor(void)
194 return stm32prog_data
->fsbl_nor_detected
;