1 // SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
3 * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
10 #include <asm/arch/stm32prog.h>
11 #include "stm32prog.h"
13 struct stm32prog_data *stm32prog_data;
15 static void enable_vidconsole(void)
17 #ifdef CONFIG_DM_VIDEO
21 stdname = env_get("stdout");
22 if (!stdname || !strstr(stdname, "vidconsole")) {
24 snprintf(buf, sizeof(buf), "serial,vidconsole");
26 snprintf(buf, sizeof(buf), "%s,vidconsole", stdname);
27 env_set("stdout", buf);
30 stdname = env_get("stderr");
31 if (!stdname || !strstr(stdname, "vidconsole")) {
33 snprintf(buf, sizeof(buf), "serial,vidconsole");
35 snprintf(buf, sizeof(buf), "%s,vidconsole", stdname);
36 env_set("stderr", buf);
41 static int do_stm32prog(cmd_tbl_t *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 (!strcmp(argv[1], "usb"))
56 else if (!strcmp(argv[1], "serial"))
59 if (link == LINK_UNDEFINED) {
60 pr_err("not supported link=%s\n", argv[1]);
64 dev = (int)simple_strtoul(argv[2], NULL, 10);
66 addr = STM32_DDR_BASE;
69 addr = simple_strtoul(argv[3], NULL, 16);
71 return CMD_RET_FAILURE;
74 size = simple_strtoul(argv[4], NULL, 16);
76 /* check STM32IMAGE presence */
78 !stm32prog_header_check((struct raw_header_s *)addr, &header)) {
79 size = header.image_length + BL_HEADER_SIZE;
81 /* uImage detected in STM32IMAGE, execute the script */
82 if (IMAGE_FORMAT_LEGACY ==
83 genimg_get_format((void *)(addr + BL_HEADER_SIZE)))
84 return image_source_script(addr + BL_HEADER_SIZE,
90 data = (struct stm32prog_data *)malloc(sizeof(*data));
93 pr_err("Alloc failed.");
94 return CMD_RET_FAILURE;
96 stm32prog_data = data;
98 ret = stm32prog_init(data, addr, size);
100 printf("Invalid or missing layout file.");
102 /* prepare DFU for device read/write */
103 ret = stm32prog_dfu_init(data);
109 ret = stm32prog_serial_init(data, dev);
112 reset = stm32prog_serial_loop(data);
115 reset = stm32prog_usb_loop(data, dev);
121 stm32prog_clean(data);
122 free(stm32prog_data);
123 stm32prog_data = NULL;
125 puts("Download done\n");
128 run_command("reset", 0);
131 return CMD_RET_SUCCESS;
134 stm32prog_clean(data);
135 free(stm32prog_data);
136 stm32prog_data = NULL;
138 return CMD_RET_FAILURE;
141 U_BOOT_CMD(stm32prog, 5, 0, do_stm32prog,
142 "<link> <dev> [<addr>] [<size>]\n"
143 "start communication with tools STM32Cubeprogrammer on <link> with Flashlayout at <addr>",
144 "<link> = serial|usb\n"
145 "<dev> = device instance\n"
146 "<addr> = address of flashlayout\n"
147 "<size> = size of flashlayout\n"
150 bool stm32prog_get_tee_partitions(void)
153 return stm32prog_data->tee_detected;
158 bool stm32prog_get_fsbl_nor(void)
161 return stm32prog_data->fsbl_nor_detected;