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)
20 stdname = env_get("stdout");
21 if (!stdname || !strstr(stdname, "vidconsole")) {
23 snprintf(buf, sizeof(buf), "serial,vidconsole");
25 snprintf(buf, sizeof(buf), "%s,vidconsole", stdname);
26 env_set("stdout", buf);
29 stdname = env_get("stderr");
30 if (!stdname || !strstr(stdname, "vidconsole")) {
32 snprintf(buf, sizeof(buf), "serial,vidconsole");
34 snprintf(buf, sizeof(buf), "%s,vidconsole", stdname);
35 env_set("stderr", buf);
39 static int do_stm32prog(struct cmd_tbl *cmdtp, int flag, int argc,
44 enum stm32prog_link_t link = LINK_UNDEFINED;
46 struct image_header_s header;
47 struct stm32prog_data *data;
49 if (argc < 3 || argc > 5)
52 if (IS_ENABLED(CONFIG_CMD_STM32PROG_USB) && !strcmp(argv[1], "usb"))
54 else if (IS_ENABLED(CONFIG_CMD_STM32PROG_SERIAL) && !strcmp(argv[1], "serial"))
57 if (link == LINK_UNDEFINED) {
58 log_err("not supported link=%s\n", argv[1]);
62 dev = (int)dectoul(argv[2], NULL);
64 addr = CONFIG_SYS_LOAD_ADDR;
67 addr = hextoul(argv[3], NULL);
69 return CMD_RET_FAILURE;
72 size = hextoul(argv[4], NULL);
74 /* check STM32IMAGE presence */
76 stm32prog_header_check(addr, &header);
77 if (header.type == HEADER_STM32IMAGE) {
78 size = header.image_length + header.length;
82 if (IS_ENABLED(CONFIG_VIDEO))
85 data = (struct stm32prog_data *)malloc(sizeof(*data));
88 log_err("Alloc failed.");
89 return CMD_RET_FAILURE;
91 stm32prog_data = data;
93 ret = stm32prog_init(data, addr, size);
95 log_debug("Invalid or missing layout file at 0x%lx.\n", addr);
97 /* prepare DFU for device read/write */
98 ret = stm32prog_dfu_init(data);
104 ret = stm32prog_serial_init(data, dev);
107 reset = stm32prog_serial_loop(data);
110 reset = stm32prog_usb_loop(data, dev);
116 stm32prog_clean(data);
117 free(stm32prog_data);
118 stm32prog_data = NULL;
120 puts("Download done\n");
123 char boot_addr_start[20];
125 char initrd_addr[40];
126 char *bootm_argv[5] = {
127 "bootm", boot_addr_start, "-", dtb_addr, NULL
129 const void *uimage = (void *)data->uimage;
130 const void *dtb = (void *)data->dtb;
131 const void *initrd = (void *)data->initrd;
134 bootm_argv[3] = env_get("fdtcontroladdr");
136 snprintf(dtb_addr, sizeof(dtb_addr) - 1,
139 snprintf(boot_addr_start, sizeof(boot_addr_start) - 1,
143 snprintf(initrd_addr, sizeof(initrd_addr) - 1, "0x%p:0x%zx",
144 initrd, data->initrd_size);
145 bootm_argv[2] = initrd_addr;
148 printf("Booting kernel at %s %s %s...\n\n\n",
149 boot_addr_start, bootm_argv[2], bootm_argv[3]);
150 /* Try bootm for legacy and FIT format image */
151 if (genimg_get_format(uimage) != IMAGE_FORMAT_INVALID)
152 do_bootm(cmdtp, 0, 4, bootm_argv);
153 else if (CONFIG_IS_ENABLED(CMD_BOOTZ))
154 do_bootz(cmdtp, 0, 4, bootm_argv);
157 image_source_script(data->script, NULL, NULL);
161 run_command("reset", 0);
164 return CMD_RET_SUCCESS;
167 stm32prog_clean(data);
168 free(stm32prog_data);
169 stm32prog_data = NULL;
171 return CMD_RET_FAILURE;
174 U_BOOT_CMD(stm32prog, 5, 0, do_stm32prog,
175 "start communication with tools STM32Cubeprogrammer",
176 "<link> <dev> [<addr>] [<size>]\n"
177 " <link> = serial|usb\n"
178 " <dev> = device instance\n"
179 " <addr> = address of flashlayout\n"
180 " <size> = size of flashlayout (optional for image with STM32 header)\n"
183 #ifdef CONFIG_STM32MP15x_STM32IMAGE
184 bool stm32prog_get_tee_partitions(void)
187 return stm32prog_data->tee_detected;
193 bool stm32prog_get_fsbl_nor(void)
196 return stm32prog_data->fsbl_nor_detected;