stm32prog.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
  2. /*
  3. * Copyright (C) 2020, STMicroelectronics - All Rights Reserved
  4. */
  5. #ifndef _STM32PROG_H_
  6. #define _STM32PROG_H_
  7. /* - phase defines ------------------------------------------------*/
  8. #define PHASE_FLASHLAYOUT 0x00
  9. #define PHASE_FIRST_USER 0x10
  10. #define PHASE_LAST_USER 0xF0
  11. #define PHASE_CMD 0xF1
  12. #define PHASE_OTP 0xF2
  13. #define PHASE_PMIC 0xF4
  14. #define PHASE_END 0xFE
  15. #define PHASE_RESET 0xFF
  16. #define PHASE_DO_RESET 0x1FF
  17. #define DEFAULT_ADDRESS 0xFFFFFFFF
  18. #define OTP_SIZE 1024
  19. #define PMIC_SIZE 8
  20. enum stm32prog_target {
  21. STM32PROG_NONE,
  22. STM32PROG_MMC,
  23. STM32PROG_NAND,
  24. STM32PROG_NOR,
  25. STM32PROG_SPI_NAND,
  26. STM32PROG_RAM
  27. };
  28. enum stm32prog_link_t {
  29. LINK_SERIAL,
  30. LINK_USB,
  31. LINK_UNDEFINED,
  32. };
  33. struct image_header_s {
  34. bool present;
  35. u32 image_checksum;
  36. u32 image_length;
  37. };
  38. struct raw_header_s {
  39. u32 magic_number;
  40. u32 image_signature[64 / 4];
  41. u32 image_checksum;
  42. u32 header_version;
  43. u32 image_length;
  44. u32 image_entry_point;
  45. u32 reserved1;
  46. u32 load_address;
  47. u32 reserved2;
  48. u32 version_number;
  49. u32 option_flags;
  50. u32 ecdsa_algorithm;
  51. u32 ecdsa_public_key[64 / 4];
  52. u32 padding[83 / 4];
  53. u32 binary_type;
  54. };
  55. #define BL_HEADER_SIZE sizeof(struct raw_header_s)
  56. /* partition type in flashlayout file */
  57. enum stm32prog_part_type {
  58. PART_BINARY,
  59. PART_SYSTEM,
  60. PART_FILESYSTEM,
  61. RAW_IMAGE
  62. };
  63. /* device information */
  64. struct stm32prog_dev_t {
  65. enum stm32prog_target target;
  66. char dev_id;
  67. u32 erase_size;
  68. struct mmc *mmc;
  69. struct mtd_info *mtd;
  70. /* list of partition for this device / ordered in offset */
  71. struct list_head part_list;
  72. bool full_update;
  73. };
  74. /* partition information build from FlashLayout and device */
  75. struct stm32prog_part_t {
  76. /* FlashLayout information */
  77. int option;
  78. int id;
  79. enum stm32prog_part_type part_type;
  80. enum stm32prog_target target;
  81. char dev_id;
  82. /* partition name
  83. * (16 char in gpt, + 1 for null terminated string
  84. */
  85. char name[16 + 1];
  86. u64 addr;
  87. u64 size;
  88. enum stm32prog_part_type bin_nb; /* SSBL repeatition */
  89. /* information on associated device */
  90. struct stm32prog_dev_t *dev; /* pointer to device */
  91. s16 part_id; /* partition id in device */
  92. int alt_id; /* alt id in usb/dfu */
  93. struct list_head list;
  94. };
  95. #define STM32PROG_MAX_DEV 5
  96. struct stm32prog_data {
  97. /* Layout information */
  98. int dev_nb; /* device number*/
  99. struct stm32prog_dev_t dev[STM32PROG_MAX_DEV]; /* array of device */
  100. int part_nb; /* nb of partition */
  101. struct stm32prog_part_t *part_array; /* array of partition */
  102. bool tee_detected;
  103. bool fsbl_nor_detected;
  104. /* command internal information */
  105. unsigned int phase;
  106. u32 offset;
  107. char error[255];
  108. struct stm32prog_part_t *cur_part;
  109. u32 *otp_part;
  110. u8 pmic_part[PMIC_SIZE];
  111. /* STM32 header information */
  112. struct raw_header_s *header_data;
  113. struct image_header_s header;
  114. /* SERIAL information */
  115. u32 cursor;
  116. u32 packet_number;
  117. u32 checksum;
  118. u8 *buffer; /* size = USART_RAM_BUFFER_SIZE*/
  119. int dfu_seq;
  120. u8 read_phase;
  121. /* bootm information */
  122. u32 uimage;
  123. u32 dtb;
  124. };
  125. extern struct stm32prog_data *stm32prog_data;
  126. /* OTP access */
  127. int stm32prog_otp_write(struct stm32prog_data *data, u32 offset,
  128. u8 *buffer, long *size);
  129. int stm32prog_otp_read(struct stm32prog_data *data, u32 offset,
  130. u8 *buffer, long *size);
  131. int stm32prog_otp_start(struct stm32prog_data *data);
  132. /* PMIC access */
  133. int stm32prog_pmic_write(struct stm32prog_data *data, u32 offset,
  134. u8 *buffer, long *size);
  135. int stm32prog_pmic_read(struct stm32prog_data *data, u32 offset,
  136. u8 *buffer, long *size);
  137. int stm32prog_pmic_start(struct stm32prog_data *data);
  138. /* generic part*/
  139. u8 stm32prog_header_check(struct raw_header_s *raw_header,
  140. struct image_header_s *header);
  141. int stm32prog_dfu_init(struct stm32prog_data *data);
  142. void stm32prog_next_phase(struct stm32prog_data *data);
  143. void stm32prog_do_reset(struct stm32prog_data *data);
  144. char *stm32prog_get_error(struct stm32prog_data *data);
  145. #define stm32prog_err(args...) {\
  146. if (data->phase != PHASE_RESET) { \
  147. sprintf(data->error, args); \
  148. data->phase = PHASE_RESET; \
  149. log_err("Error: %s\n", data->error); } \
  150. }
  151. /* Main function */
  152. int stm32prog_init(struct stm32prog_data *data, ulong addr, ulong size);
  153. void stm32prog_clean(struct stm32prog_data *data);
  154. #ifdef CONFIG_CMD_STM32PROG_SERIAL
  155. int stm32prog_serial_init(struct stm32prog_data *data, int link_dev);
  156. bool stm32prog_serial_loop(struct stm32prog_data *data);
  157. #else
  158. static inline int stm32prog_serial_init(struct stm32prog_data *data, int link_dev)
  159. {
  160. return -ENOSYS;
  161. }
  162. static inline bool stm32prog_serial_loop(struct stm32prog_data *data)
  163. {
  164. return false;
  165. }
  166. #endif
  167. #ifdef CONFIG_CMD_STM32PROG_USB
  168. bool stm32prog_usb_loop(struct stm32prog_data *data, int dev);
  169. #else
  170. static inline bool stm32prog_usb_loop(struct stm32prog_data *data, int dev)
  171. {
  172. return false;
  173. }
  174. #endif
  175. #endif