1STMicroelectronics STM32MP1 2=========================== 3 4STM32MP1 is a microprocessor designed by STMicroelectronics 5based on a dual Arm Cortex-A7. 6It is an Armv7-A platform, using dedicated code from TF-A. 7The STM32MP1 chip also embeds a Cortex-M4. 8More information can be found on `STM32MP1 Series`_ page. 9 10 11STM32MP1 Versions 12----------------- 13The STM32MP1 series is available in 3 different lines which are pin-to-pin compatible: 14 15- STM32MP157: Dual Cortex-A7 cores, Cortex-M4 core @ 209 MHz, 3D GPU, DSI display interface and CAN FD 16- STM32MP153: Dual Cortex-A7 cores, Cortex-M4 core @ 209 MHz and CAN FD 17- STM32MP151: Single Cortex-A7 core, Cortex-M4 core @ 209 MHz 18 19Each line comes with a security option (cryptography & secure boot) and a Cortex-A frequency option: 20 21- A Basic + Cortex-A7 @ 650 MHz 22- C Secure Boot + HW Crypto + Cortex-A7 @ 650 MHz 23- D Basic + Cortex-A7 @ 800 MHz 24- F Secure Boot + HW Crypto + Cortex-A7 @ 800 MHz 25 26The `STM32MP1 part number codification`_ page gives more information about part numbers. 27 28Design 29------ 30The STM32MP1 resets in the ROM code of the Cortex-A7. 31The primary boot core (core 0) executes the boot sequence while 32secondary boot core (core 1) is kept in a holding pen loop. 33The ROM code boot sequence loads the TF-A binary image from boot device 34to embedded SRAM. 35 36The TF-A image must be properly formatted with a STM32 header structure 37for ROM code is able to load this image. 38Tool stm32image can be used to prepend this header to the generated TF-A binary. 39 40Boot with FIP 41~~~~~~~~~~~~~ 42The use of FIP is now the recommended way to boot STM32MP1 platform. 43Only BL2 (with STM32 header) is loaded by ROM code. The other binaries are 44inside the FIP binary: BL32 (SP_min or OP-TEE), U-Boot and their respective 45device tree blobs. 46 47STM32IMAGE bootchain 48~~~~~~~~~~~~~~~~~~~~ 49Although still supported, this way of booting is not recommended. 50Pease use FIP instead. 51At compilation step, BL2, BL32 and DTB file are linked together in a single 52binary. The stm32image tool is also generated and the header is added to TF-A 53binary. This binary file with header is named tf-a-stm32mp157c-ev1.stm32. 54It can then be copied in the first partition of the boot device. 55 56 57Memory mapping 58~~~~~~~~~~~~~~ 59 60:: 61 62 0x00000000 +-----------------+ 63 | | ROM 64 0x00020000 +-----------------+ 65 | | 66 | ... | 67 | | 68 0x2FFC0000 +-----------------+ \ 69 | BL32 DTB | | 70 0x2FFC5000 +-----------------+ | 71 | BL32 | | 72 0x2FFDF000 +-----------------+ | 73 | ... | | 74 0x2FFE3000 +-----------------+ | 75 | BL2 DTB | | Embedded SRAM 76 0x2FFEA000 +-----------------+ | 77 | BL2 | | 78 0x2FFFF000 +-----------------+ | 79 | SCMI mailbox | | 80 0x30000000 +-----------------+ / 81 | | 82 | ... | 83 | | 84 0x40000000 +-----------------+ 85 | | 86 | | Devices 87 | | 88 0xC0000000 +-----------------+ \ 89 | | | 90 0xC0100000 +-----------------+ | 91 | BL33 | | Non-secure RAM (DDR) 92 | ... | | 93 | | | 94 0xFFFFFFFF +-----------------+ / 95 96 97Boot sequence 98~~~~~~~~~~~~~ 99 100ROM code -> BL2 (compiled with BL2_AT_EL3) -> BL32 (SP_min) -> BL33 (U-Boot) 101 102or if Op-TEE is used: 103 104ROM code -> BL2 (compiled with BL2_AT_EL3) -> OP-TEE -> BL33 (U-Boot) 105 106 107Build Instructions 108------------------ 109Boot media(s) supported by BL2 must be specified in the build command. 110Available storage medias are: 111 112- ``STM32MP_SDMMC`` 113- ``STM32MP_EMMC`` 114- ``STM32MP_RAW_NAND`` 115- ``STM32MP_SPI_NAND`` 116- ``STM32MP_SPI_NOR`` 117 118Boot with FIP 119~~~~~~~~~~~~~ 120You need to build BL2, BL32 (SP_min or OP-TEE) and BL33 (U-Boot) before building FIP binary. 121 122U-Boot 123______ 124 125.. code:: bash 126 127 cd <u-boot_directory> 128 make stm32mp15_trusted_defconfig 129 make DEVICE_TREE=stm32mp157c-ev1 all 130 131OP-TEE (optional) 132_________________ 133 134.. code:: bash 135 136 cd <optee_directory> 137 make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm PLATFORM=stm32mp1 \ 138 CFG_EMBED_DTB_SOURCE_FILE=stm32mp157c-ev1.dts 139 140 141TF-A BL32 (SP_min) 142__________________ 143If you choose not to use OP-TEE, you can use TF-A SP_min. 144To build TF-A BL32, and its device tree file: 145 146.. code:: bash 147 148 make CROSS_COMPILE=arm-none-eabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ 149 AARCH32_SP=sp_min DTB_FILE_NAME=stm32mp157c-ev1.dtb bl32 dtbs 150 151TF-A BL2 152________ 153To build TF-A BL2 with its STM32 header for SD-card boot: 154 155.. code:: bash 156 157 make CROSS_COMPILE=arm-none-eabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ 158 DTB_FILE_NAME=stm32mp157c-ev1.dtb STM32MP_SDMMC=1 159 160For other boot devices, you have to replace STM32MP_SDMMC in the previous command 161with the desired device flag. 162 163This BL2 is independent of the BL32 used (SP_min or OP-TEE) 164 165 166FIP 167___ 168With BL32 SP_min: 169 170.. code:: bash 171 172 make CROSS_COMPILE=arm-none-eabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ 173 AARCH32_SP=sp_min \ 174 DTB_FILE_NAME=stm32mp157c-ev1.dtb \ 175 BL33=<u-boot_directory>/u-boot-nodtb.bin \ 176 BL33_CFG=<u-boot_directory>/u-boot.dtb \ 177 fip 178 179With OP-TEE: 180 181.. code:: bash 182 183 make CROSS_COMPILE=arm-none-eabi- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ 184 AARCH32_SP=optee \ 185 DTB_FILE_NAME=stm32mp157c-ev1.dtb \ 186 BL33=<u-boot_directory>/u-boot-nodtb.bin \ 187 BL33_CFG=<u-boot_directory>/u-boot.dtb \ 188 BL32=<optee_directory>/tee-header_v2.bin \ 189 BL32_EXTRA1=<optee_directory>/tee-pager_v2.bin 190 BL32_EXTRA2=<optee_directory>/tee-pageable_v2.bin 191 fip 192 193 194STM32IMAGE bootchain 195~~~~~~~~~~~~~~~~~~~~ 196You need to add the following flag to the make command: 197``STM32MP_USE_STM32IMAGE=1`` 198 199To build with SP_min and support for SD-card boot: 200 201.. code:: bash 202 203 make CROSS_COMPILE=arm-linux-gnueabihf- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ 204 AARCH32_SP=sp_min STM32MP_SDMMC=1 DTB_FILE_NAME=stm32mp157c-ev1.dtb \ 205 STM32MP_USE_STM32IMAGE=1 206 207 cd <u-boot_directory> 208 make stm32mp15_trusted_defconfig 209 make DEVICE_TREE=stm32mp157c-ev1 all 210 211To build TF-A with OP-TEE support for SD-card boot: 212 213.. code:: bash 214 215 make CROSS_COMPILE=arm-linux-gnueabihf- PLAT=stm32mp1 ARCH=aarch32 ARM_ARCH_MAJOR=7 \ 216 AARCH32_SP=optee STM32MP_SDMMC=1 DTB_FILE_NAME=stm32mp157c-ev1.dtb \ 217 STM32MP_USE_STM32IMAGE=1 218 219 cd <optee_directory> 220 make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm PLATFORM=stm32mp1 \ 221 CFG_EMBED_DTB_SOURCE_FILE=stm32mp157c-ev1.dts 222 223 cd <u-boot_directory> 224 make stm32mp15_trusted_defconfig 225 make DEVICE_TREE=stm32mp157c-ev1 all 226 227 228The following build options are supported: 229 230- ``ENABLE_STACK_PROTECTOR``: To enable the stack protection. 231 232 233Populate SD-card 234---------------- 235 236Boot with FIP 237~~~~~~~~~~~~~ 238The SD-card has to be formatted with GPT. 239It should contain at least those partitions: 240 241- fsbl: to copy the tf-a-stm32mp157c-ev1.stm32 binary (BL2) 242- fip: which contains the FIP binary 243 244Usually, two copies of fsbl are used (fsbl1 and fsbl2) instead of one partition fsbl. 245 246STM32IMAGE bootchain 247~~~~~~~~~~~~~~~~~~~~ 248The SD-card has to be formatted with GPT. 249It should contain at least those partitions: 250 251- fsbl: to copy the tf-a-stm32mp157c-ev1.stm32 binary 252- ssbl: to copy the u-boot.stm32 binary 253 254Usually, two copies of fsbl are used (fsbl1 and fsbl2) instead of one partition fsbl. 255 256OP-TEE artifacts go into separate partitions as follows: 257 258- teeh: tee-header_v2.stm32 259- teed: tee-pageable_v2.stm32 260- teex: tee-pager_v2.stm32 261 262 263.. _STM32MP1 Series: https://www.st.com/en/microcontrollers-microprocessors/stm32mp1-series.html 264.. _STM32MP1 part number codification: https://wiki.st.com/stm32mpu/wiki/STM32MP15_microprocessor#Part_number_codification 265