1 /* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
3 * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
9 /* - phase defines ------------------------------------------------*/
10 #define PHASE_FLASHLAYOUT 0x00
11 #define PHASE_FIRST_USER 0x10
12 #define PHASE_LAST_USER 0xF0
13 #define PHASE_CMD 0xF1
14 #define PHASE_END 0xFE
15 #define PHASE_RESET 0xFF
16 #define PHASE_DO_RESET 0x1FF
18 #define DEFAULT_ADDRESS 0xFFFFFFFF
20 enum stm32prog_target {
25 enum stm32prog_link_t {
30 struct image_header_s {
38 u32 image_signature[64 / 4];
42 u32 image_entry_point;
49 u32 ecdsa_public_key[64 / 4];
54 #define BL_HEADER_SIZE sizeof(struct raw_header_s)
56 /* partition type in flashlayout file */
57 enum stm32prog_part_type {
64 /* device information */
65 struct stm32prog_dev_t {
66 enum stm32prog_target target;
70 /* list of partition for this device / ordered in offset */
71 struct list_head part_list;
74 /* partition information build from FlashLayout and device */
75 struct stm32prog_part_t {
76 /* FlashLayout information */
79 enum stm32prog_part_type part_type;
80 enum stm32prog_target target;
84 * (16 char in gpt, + 1 for null terminated string
90 /* information on associated device */
91 struct stm32prog_dev_t *dev; /* pointer to device */
92 u16 part_id; /* partition id in device */
93 int alt_id; /* alt id in usb/dfu */
95 struct list_head list;
98 #define STM32PROG_MAX_DEV 5
99 struct stm32prog_data {
100 /* Layout information */
101 int dev_nb; /* device number*/
102 struct stm32prog_dev_t dev[STM32PROG_MAX_DEV]; /* array of device */
103 int part_nb; /* nb of partition */
104 struct stm32prog_part_t *part_array; /* array of partition */
106 /* command internal information */
110 struct stm32prog_part_t *cur_part;
112 /* STM32 header information */
113 struct raw_header_s *header_data;
114 struct image_header_s header;
117 extern struct stm32prog_data *stm32prog_data;
120 u8 stm32prog_header_check(struct raw_header_s *raw_header,
121 struct image_header_s *header);
122 int stm32prog_dfu_init(struct stm32prog_data *data);
123 void stm32prog_next_phase(struct stm32prog_data *data);
124 void stm32prog_do_reset(struct stm32prog_data *data);
126 char *stm32prog_get_error(struct stm32prog_data *data);
128 #define stm32prog_err(args...) {\
129 if (data->phase != PHASE_RESET) { \
130 sprintf(data->error, args); \
131 data->phase = PHASE_RESET; \
132 pr_err("Error: %s\n", data->error); } \
136 int stm32prog_init(struct stm32prog_data *data, ulong addr, ulong size);
137 bool stm32prog_usb_loop(struct stm32prog_data *data, int dev);
138 void stm32prog_clean(struct stm32prog_data *data);