blob: 3e8b426444df484fa85c55eaf9edbb23ad651717 [file] [log] [blame]
Patrick Delaunay7daa91d2020-03-18 09:24:49 +01001// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
2/*
3 * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
4 */
5
6#include <common.h>
7#include <command.h>
8#include <dfu.h>
9#include "stm32prog.h"
10
11struct stm32prog_data *stm32prog_data;
12
13static int do_stm32prog(cmd_tbl_t *cmdtp, int flag, int argc,
14 char * const argv[])
15{
16 ulong addr, size;
17 int dev, ret;
18 enum stm32prog_link_t link = LINK_UNDEFINED;
19 bool reset = false;
20 struct stm32prog_data *data;
21
22 if (argc < 3 || argc > 5)
23 return CMD_RET_USAGE;
24
25 if (!strcmp(argv[1], "usb"))
26 link = LINK_USB;
27
28 if (link == LINK_UNDEFINED) {
29 pr_err("not supported link=%s\n", argv[1]);
30 return CMD_RET_USAGE;
31 }
32 dev = (int)simple_strtoul(argv[2], NULL, 10);
33
34 addr = STM32_DDR_BASE;
35 size = 0;
36 if (argc > 3) {
37 addr = simple_strtoul(argv[3], NULL, 16);
38 if (!addr)
39 return CMD_RET_FAILURE;
40 }
41 if (argc > 4)
42 size = simple_strtoul(argv[4], NULL, 16);
43
44 data = (struct stm32prog_data *)malloc(sizeof(*data));
45
46 if (!data) {
47 pr_err("Alloc failed.");
48 return CMD_RET_FAILURE;
49 }
50 stm32prog_data = data;
51
52 ret = stm32prog_init(data, addr, size);
53 if (ret)
54 printf("Invalid or missing layout file.");
55
56 /* prepare DFU for device read/write */
57 ret = stm32prog_dfu_init(data);
58 if (ret)
59 goto cleanup;
60
61 switch (link) {
62 case LINK_USB:
63 reset = stm32prog_usb_loop(data, dev);
64 break;
65 default:
66 goto cleanup;
67 }
68
69 stm32prog_clean(data);
70 free(stm32prog_data);
71 stm32prog_data = NULL;
72
73 puts("Download done\n");
74 if (reset) {
75 puts("Reset...\n");
76 run_command("reset", 0);
77 }
78
79 return CMD_RET_SUCCESS;
80
81cleanup:
82 stm32prog_clean(data);
83 free(stm32prog_data);
84 stm32prog_data = NULL;
85
86 return CMD_RET_FAILURE;
87}
88
89U_BOOT_CMD(stm32prog, 5, 0, do_stm32prog,
90 "<link> <dev> [<addr>] [<size>]\n"
91 "start communication with tools STM32Cubeprogrammer on <link> with Flashlayout at <addr>",
92 "<link> = usb\n"
93 "<dev> = device instance\n"
94 "<addr> = address of flashlayout\n"
95 "<size> = size of flashlayout\n"
96);