1.. SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause 2.. sectionauthor:: Patrick Delaunay <patrick.delaunay@foss.st.com> 3 4STM32MP1xx boards 5================= 6 7This is a quick instruction for setup STMicroelectronics STM32MP1xx boards. 8 9Further information can be found in STMicroelectronics STM32 WIKI_. 10 11Supported devices 12----------------- 13 14U-Boot supports all the STMicroelectronics MPU with the associated boards 15 16 - STMP32MP15x SoCs: 17 18 - STM32MP157 19 - STM32MP153 20 - STM32MP151 21 22 - STMP32MP13x SoCs: 23 24 - STM32MP135 25 - STM32MP133 26 - STM32MP131 27 28Everything is supported in Linux but U-Boot is limited to the boot device: 29 30 1. UART 31 2. SD card/MMC controller (SDMMC) 32 3. NAND controller (FMC) 33 4. NOR controller (QSPI) 34 5. USB controller (OTG DWC2) 35 6. Ethernet controller 36 37And the necessary drivers 38 39 1. I2C 40 2. STPMIC1 (PMIC and regulator) 41 3. Clock, Reset, Sysreset 42 4. Fuse (BSEC) 43 5. OP-TEE 44 6. ETH 45 7. USB host 46 8. WATCHDOG 47 9. RNG 48 10. RTC 49 50STM32MP15x 51`````````` 52 53The STM32MP15x is a Cortex-A7 MPU aimed at various applications. 54 55It features: 56 57 - Dual core Cortex-A7 application core (Single on STM32MP151) 58 - 2D/3D image composition with GPU (only on STM32MP157) 59 - Standard memories interface support 60 - Standard connectivity, widely inherited from the STM32 MCU family 61 - Comprehensive security support 62 - Cortex M4 coprocessor 63 64Each line comes with a security option (cryptography & secure boot) and 65a Cortex-A frequency option: 66 67 - A : Cortex-A7 @ 650 MHz 68 - C : Secure Boot + HW Crypto + Cortex-A7 @ 650 MHz 69 - D : Cortex-A7 @ 800 MHz 70 - F : Secure Boot + HW Crypto + Cortex-A7 @ 800 MHz 71 72Currently the following boards are supported: 73 74 + stm32mp157a-dk1.dts 75 + stm32mp157c-dk2.dts 76 + stm32mp157c-ed1.dts 77 + stm32mp157c-ev1.dts 78 + stm32mp15xx-dhcor-avenger96.dts 79 80The SCMI variant of each board is supported by a specific "scmi" device tree: 81 + stm32mp157a-dk1-scmi.dts 82 + stm32mp157c-dk2-scmi.dts 83 + stm32mp157c-ed1-scmi.dts 84 + stm32mp157c-ev1-scmi.dts 85 86SCMI variant is used only with stm32mp15_defconfig, when the resources are 87secured with RCC_TZCR.TZEN=1 in OP-TEE. The access to these reset and clock 88resources are provided by OP-TEE and the associated SCMI services. 89 90STM32MP13x 91`````````` 92 93The STM32MP13x is a single Cortex-A7 MPU aimed at various applications. 94 95Currently the following boards are supported: 96 97 + stm32mp135f-dk.dts 98 99 100Boot Sequences 101-------------- 102 1032 boot configurations are supported with: 104 105+----------+------------------------+-------------------------+--------------+ 106| **ROM** | **FSBL** | **SSBL** | **OS** | 107+ **code** +------------------------+-------------------------+--------------+ 108| | First Stage Bootloader | Second Stage Bootloader | Linux Kernel | 109+ +------------------------+-------------------------+--------------+ 110| | embedded RAM | DDR | 111+----------+------------------------+-------------------------+--------------+ 112| TrustZone| secure monitor | 113+----------+------------------------+-------------------------+--------------+ 114 115The trusted boot chain is recommended with: 116 117- FSBL = **TF-A BL2** 118- Secure monitor = **OP-TEE** 119- SSBL = **U-Boot** 120 121It is the only supported boot chain for STM32MP13x family. 122 123The **Trusted** boot chain with TF-A_ 124````````````````````````````````````` 125 126defconfig_file : 127 + **stm32mp15_defconfig** and **stm32mp13_defconfig** (for TF-A_ with FIP support) 128 + **stm32mp15_trusted_defconfig** (for TF-A_ without FIP support) 129 130 +-------------+--------------------------+------------+-------+ 131 | ROM code | FSBL | SSBL | OS | 132 + +--------------------------+------------+-------+ 133 | |Trusted Firmware-A (TF-A_)| U-Boot | Linux | 134 +-------------+--------------------------+------------+-------+ 135 | TrustZone |secure monitor = SPMin or OP-TEE_ | 136 +-------------+--------------------------+------------+-------+ 137 138TF-A_ and OP-TEE_ are 2 separate projects, with their git repository; 139they are compiled separately. 140 141TF-A_ (BL2) initialize the DDR and loads the next stage binaries from a FIP file: 142 + BL32: a secure monitor BL32 = SPMin provided by TF-A_ or OP-TEE_ : 143 performs a full initialization of Secure peripherals and provides service 144 to normal world 145 + BL33: a non-trusted firmware = U-Boot, running in normal world and uses 146 the secure monitor to access to secure resources. 147 + HW_CONFIG: The hardware configuration file = the U-Boot device tree 148 149The scmi variant of each device tree is only support with OP-TEE as secure 150monitor, with stm32mp15_defconfig. 151 152The **Basic** boot chain with SPL (for STM32MP15x) 153`````````````````````````````````````````````````` 154 155defconfig_file : 156 + **stm32mp15_basic_defconfig** 157 158 +-------------+------------+------------+-------+ 159 | ROM code | FSBL | SSBL | OS | 160 + +------------+------------+-------+ 161 | |U-Boot SPL | U-Boot | Linux | 162 +-------------+------------+------------+-------+ 163 | TrustZone | | PSCI from U-Boot | 164 +-------------+------------+------------+-------+ 165 166SPL has limited security initialization. 167 168U-Boot is running in secure mode and provide a secure monitor to the kernel 169with only PSCI support (Power State Coordination Interface defined by ARM). 170 171.. warning:: This alternate **basic** boot chain with SPL is not supported/promoted by STMicroelectronics to make product. 172 173Device Tree 174----------- 175 176All the STM32MP15x and STM32MP13x boards supported by U-Boot use the same generic board 177stm32mp1 which supports all the bootable devices. 178 179Each STMicroelectronics board is only configured with the associated device tree. 180 181STM32MP15x device Tree Selection 182```````````````````````````````` 183The supported device trees for STM32MP15x (stm32mp15_trusted_defconfig and stm32mp15_basic_defconfig) are: 184 185+ ev1: eval board with pmic stpmic1 (ev1 = mother board + daughter ed1) 186 187 + stm32mp157c-ev1 188 189+ ed1: daughter board with pmic stpmic1 190 191 + stm32mp157c-ed1 192 193+ dk1: Discovery board 194 195 + stm32mp157a-dk1 196 197+ dk2: Discovery board = dk1 with a BT/WiFI combo and a DSI panel 198 199 + stm32mp157c-dk2 200 201+ avenger96: Avenger96 board from Arrow Electronics based on DH Elec. DHCOR SoM 202 203 + stm32mp15xx-dhcor-avenger96 204 205STM32MP13x device Tree Selection 206```````````````````````````````` 207The supported device trees for STM32MP13x (stm32mp13_defconfig) are: 208 209+ dk: Discovery board 210 211 + stm32mp135f-dk 212 213 214Build Procedure 215--------------- 216 2171. Install the required tools for U-Boot 218 219 * install package needed in U-Boot makefile 220 (libssl-dev, swig, libpython-dev...) 221 222 * install ARMv7 toolchain for 32bit Cortex-A (from Linaro, 223 from SDK for STM32MP15x, or any crosstoolchains from your distribution) 224 (you can use any gcc cross compiler compatible with U-Boot) 225 2262. Set the cross compiler:: 227 228 # export CROSS_COMPILE=/path/to/toolchain/arm-linux-gnueabi- 229 2303. Select the output directory (optional):: 231 232 # export KBUILD_OUTPUT=/path/to/output 233 234 for example: use one output directory for each configuration:: 235 236 # export KBUILD_OUTPUT=stm32mp13 237 # export KBUILD_OUTPUT=stm32mp15 238 # export KBUILD_OUTPUT=stm32mp15_trusted 239 # export KBUILD_OUTPUT=stm32mp15_basic 240 241 you can build outside of code directory:: 242 243 # export KBUILD_OUTPUT=../build/stm32mp15 244 2454. Configure U-Boot:: 246 247 # make <defconfig_file> 248 249 with <defconfig_file>: 250 251 - For **trusted** boot mode : 252 - For STM32MP13x: **stm32mp13_defconfig** 253 - For STM32MP15x: **stm32mp15_defconfig** or stm32mp15_trusted_defconfig 254 - For STM32MP15x basic boot mode: stm32mp15_basic_defconfig 255 2565. Configure the device-tree and build the U-Boot image:: 257 258 # make DEVICE_TREE=<name> all 259 260 Examples: 261 262 a) trusted boot with FIP on STM32MP15x ev1:: 263 264 # export KBUILD_OUTPUT=stm32mp15 265 # make stm32mp15_defconfig 266 # make DEVICE_TREE=stm32mp157c-ev1-scmi all 267 268 or without SCMI support 269 270 # export KBUILD_OUTPUT=stm32mp15 271 # make stm32mp15_defconfig 272 # make DEVICE_TREE=stm32mp157c-ev1 all 273 274 b) trusted boot on STM32MP13x discovery board:: 275 276 # export KBUILD_OUTPUT=stm32mp13 277 # make stm32mp13_defconfig 278 # make DEVICE_TREE=stm32mp135f-dk all 279 280 DEVICE_TEE selection is optional as stm32mp135f-dk is the default board of the defconfig:: 281 282 # make stm32mp13_defconfig 283 # make all 284 285 c) basic boot on STM32MP15x ev1:: 286 287 # export KBUILD_OUTPUT=stm32mp15_basic 288 # make stm32mp15_basic_defconfig 289 # make DEVICE_TREE=stm32mp157c-ev1 all 290 291 d) basic boot on STM32MP15x ed1:: 292 293 # export KBUILD_OUTPUT=stm32mp15_basic 294 # make stm32mp15_basic_defconfig 295 # make DEVICE_TREE=stm32mp157c-ed1 all 296 297 e) basic boot on STM32MP15x dk1:: 298 299 # export KBUILD_OUTPUT=stm32mp15_basic 300 # make stm32mp15_basic_defconfig 301 # make DEVICE_TREE=stm32mp157a-dk1 all 302 303 f) basic boot on STM32MP15x avenger96:: 304 305 # export KBUILD_OUTPUT=stm32mp15_basic 306 # make stm32mp15_basic_defconfig 307 # make DEVICE_TREE=stm32mp15xx-dhcor-avenger96 all 308 3096. U-Boot Output files 310 311 So in the output directory (selected by KBUILD_OUTPUT), 312 you can found the needed U-Boot files: 313 314 - stm32mp13_defconfig = **u-boot-nodtb.bin** and **u-boot.dtb** 315 - stm32mp15_defconfig = **u-boot-nodtb.bin** and **u-boot.dtb** 316 317 - stm32mp15_trusted_defconfig = u-boot.stm32 318 319 - stm32mp15_basic_defconfig 320 321 - FSBL = spl/u-boot-spl.stm32 322 323 - SSBL = u-boot.img (without CONFIG_SPL_LOAD_FIT) or 324 u-boot.itb (with CONFIG_SPL_LOAD_FIT=y) 325 3267. TF-A_ compilation 327 328 This step is required only for **Trusted** boot (stm32mp15_defconfig and 329 stm32mp15_trusted_defconfig); see OP-TEE_ and TF-A_ documentation for build 330 commands. 331 332 - For TF-A_ with FIP support: **stm32mp15_defconfig** 333 334 - with OP-TEE_ support, compile the OP-TEE to generate the binary included 335 in FIP 336 337 - after TF-A compilation, the used files are: 338 339 - TF-A_ BL2 => FSBL = **tf-a.stm32** 340 341 - FIP => **fip.bin** 342 343 FIP file includes the 2 files given in arguments of TF-A_ compilation: 344 345 - BL33=u-boot-nodtb.bin 346 - BL33_CFG=u-boot.dtb 347 348 You can also update a existing FIP after U-boot compilation with fiptool, 349 a tool provided by TF-A_:: 350 351 # fiptool update --nt-fw u-boot-nodtb.bin --hw-config u-boot.dtb fip-stm32mp157c-ev1.bin 352 353 - For TF-A_ without FIP support : **stm32mp15_trusted_defconfig** 354 SPMin is used and the used files are: 355 356 - FSBL = **tf-a.stm32** (provided by TF-A_ compilation, contening BL2 and 357 BL32 = SPMin) 358 359 - SSBL = **u-boot.stm32** used instead of fip.bin in next chapters 360 3618. The bootloaders files 362 363+ The **ROM code** expects FSBL binaries with STM32 image header = 364 tf-a.stm32 or u-boot-spl.stm32 365 366According the FSBL / the boot mode: 367 368+ **TF-A** expect a FIP binary = fip.bin, including the OS monitor (SPMin or 369 OP-TEE_) and the U-Boot binary + device tree 370 371 or, without FIP support, binaries with STM32 image header: U-Boot 372 = u-boot.stm32 and eventually OP-TEE files (tee-header.stm32, tee-pageable.stm32, 373 tee-pager.stm32) 374 375+ **SPL** expects SSBL = U-Boot with uImage header = u-boot.img 376 or FIT = u-boot.itb. 377 378 379Switch Setting for Boot Mode 380---------------------------- 381 382You can select the boot mode, on the board with one switch, to select 383the boot pin values = BOOT0, BOOT1, BOOT2 384 385 +-------------+---------+---------+---------+ 386 |*Boot Mode* | *BOOT2* | *BOOT1* | *BOOT0* | 387 +=============+=========+=========+=========+ 388 | Recovery | 0 | 0 | 0 | 389 +-------------+---------+---------+---------+ 390 | NOR | 0 | 0 | 1 | 391 +-------------+---------+---------+---------+ 392 | eMMC | 0 | 1 | 0 | 393 +-------------+---------+---------+---------+ 394 | NAND | 0 | 1 | 1 | 395 +-------------+---------+---------+---------+ 396 | Reserved | 1 | 0 | 0 | 397 +-------------+---------+---------+---------+ 398 | SD-Card | 1 | 0 | 1 | 399 +-------------+---------+---------+---------+ 400 | Recovery | 1 | 1 | 0 | 401 +-------------+---------+---------+---------+ 402 | SPI-NAND | 1 | 1 | 1 | 403 +-------------+---------+---------+---------+ 404 405- on the STM32MP15x **daughter board ed1 = MB1263** with the switch SW1 406- on STM32MP15x **Avenger96** with switch S3 (NOR and SPI-NAND are not applicable) 407- on board STM32MP15x **DK1/DK2** with the switch SW1 = BOOT0, BOOT2 408 with only 2 pins available (BOOT1 is forced to 0 and NOR not supported), 409 the possible value becomes: 410 411 +-------------+---------+---------+ 412 |*Boot Mode* | *BOOT2* | *BOOT0* | 413 +=============+=========+=========+ 414 | Recovery | 0 | 0 | 415 +-------------+---------+---------+ 416 | NOR (NA)| 0 | 1 | 417 +-------------+---------+---------+ 418 | Reserved | 1 | 0 | 419 +-------------+---------+---------+ 420 | SD-Card | 1 | 1 | 421 +-------------+---------+---------+ 422 423Recovery is a boot from serial link (UART/USB) and it is used with 424STM32CubeProgrammer tool to load executable in RAM and to update the flash 425devices available on the board (NOR/NAND/eMMC/SD card). 426 427The communication between HOST and board is based on 428 429 - for UARTs : the uart protocol used with all MCU STM32 430 - for USB : based on USB DFU 1.1 (without the ST extensions used on MCU STM32) 431 432Prepare an SD card 433------------------ 434 435The minimal requirements for STMP32MP15x and STM32MP13x boot up to U-Boot are: 436 437- GPT partitioning (with gdisk or with sgdisk) 438- 2 fsbl partitions, named "fsbl1" and "fsbl2", size at least 256KiB 439- one partition named "fip" for FIP or U-Boot (TF-A_ search the "fip" 440 partition and SPL search the 3th partition, because 441 CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION=3) 442 443The 2 fsbl partitions have the same content and are present to guarantee a 444fail-safe update of FSBL; fsbl2 can be omitted if this ROM code feature is 445not required. 446 447Without FIP support in TF-A_, the 3rd partition "fip" for u-boot.stm32 must 448be named "ssbl". 449 450Then the minimal GPT partition is: 451 452For TF-A_ with FIP support: 453 454 +-------+--------+---------+------------------------+ 455 | *Num* | *Name* | *Size* | *Content* | 456 +=======+========+=========+========================+ 457 | 1 | fsbl1 | 256 KiB | TF-A_ BL2 (tf-a.stm32) | 458 +-------+--------+---------+------------------------+ 459 | 2 | fsbl2 | 256 KiB | TF-A_ BL2 (tf-a.stm32) | 460 +-------+--------+---------+------------------------+ 461 | 3 | fip | 4MB | fip.bin | 462 +-------+--------+---------+------------------------+ 463 | 4 | <any> | <any> | Rootfs | 464 +-------+--------+---------+------------------------+ 465 466or: 467 468 +-------+--------+---------+------------------------+------------------------+ 469 | *Num* | *Name* | *Size* | *Trusted boot content* | *Basic boot content* | 470 +=======+========+=========+========================+========================+ 471 | 1 | fsbl1 | 256 KiB | TF-A_ BL2 (tf-a.stm32) | SPL (u-boot-spl.stm32) | 472 +-------+--------+---------+------------------------+------------------------+ 473 | 2 | fsbl2 | 256 KiB | TF-A_ BL2 (tf-a.stm32) | SPL (u-boot-spl.stm32) | 474 +-------+--------+---------+------------------------+------------------------+ 475 | 3 | ssbl | 2MB | U-Boot (u-boot.stm32) | U-Boot (u-boot.img) | 476 +-------+--------+---------+------------------------+------------------------+ 477 | 4 | <any> | <any> | Rootfs | 478 +-------+--------+---------+------------------------+------------------------+ 479 480And the 4th partition (Rootfs) is marked bootable with a file extlinux.conf 481following the Generic Distribution feature (see :doc:`../../develop/distro` for 482use). 483 484The size of fip or ssbl partition must be enough for the associated binary file, 4854MB and 2MB are default values. 486 487According the used card reader select the correct block device 488(for example /dev/sdx or /dev/mmcblk0), in the next example, it is /dev/mmcblk0 489 490For example: 491 492a) remove previous formatting:: 493 494 # sgdisk -o /dev/<SD card dev> 495 496b) create minimal image for FIP 497 498 For FIP support in TF-A_:: 499 500 # sgdisk --resize-table=128 -a 1 \ 501 -n 1:34:545 -c 1:fsbl1 \ 502 -n 2:546:1057 -c 2:fsbl2 \ 503 -n 3:1058:9249 -c 3:fip \ 504 -n 4:9250: -c 4:rootfs -A 4:set:2 \ 505 -p /dev/<SD card dev> 506 507 With gpt table with 128 entries an the partition 4 marked bootable (bit 2). 508 509 For basic boot mode or without FIP support in TF-A_:: 510 511 # sgdisk --resize-table=128 -a 1 \ 512 -n 1:34:545 -c 1:fsbl1 \ 513 -n 2:546:1057 -c 2:fsbl2 \ 514 -n 3:1058:5153 -c 3:ssbl \ 515 -n 4:5154: -c 4:rootfs -A 4:set:2 \ 516 -p /dev/<SD card dev> 517 518c) copy the FSBL (2 times) and SSBL file on the correct partition. 519 in this example in partition 1 to 3 520 521 for trusted boot: :: 522 523 # dd if=tf-a.stm32 of=/dev/mmcblk0p1 524 # dd if=tf-a.stm32 of=/dev/mmcblk0p2 525 # dd if=fip.bin of=/dev/mmcblk0p3 526 OR 527 dd if=u-boot.stm32 of=/dev/mmcblk0p3 # Without FIT support 528 529 for basic boot mode : <SD card dev> = /dev/mmcblk0:: 530 531 # dd if=u-boot-spl.stm32 of=/dev/mmcblk0p1 532 # dd if=u-boot-spl.stm32 of=/dev/mmcblk0p2 533 # dd if=u-boot.img of=/dev/mmcblk0p3 # Without CONFIG_SPL_LOAD_FIT 534 OR 535 dd if=u-boot.itb of=/dev/mmcblk0p3 # With CONFIG_SPL_LOAD_FIT=y 536 537To boot from SD card, select BootPinMode = 1 0 1 and reset. 538 539Prepare eMMC 540------------ 541 542You can use U-Boot to copy binary in eMMC. 543 544In the next example, you need to boot from SD card and the images 545(tf-a.stm32, fip.bin / u-boot-spl.stm32, u-boot.img for systems without 546CONFIG_SPL_LOAD_FIT or u-boot.itb for systems with CONFIG_SPL_LOAD_FIT=y) are 547presents on SD card (mmc 0) in ext4 partition 4 (bootfs) 548 549To boot from SD card, select BootPinMode = 1 0 1 and reset. 550 551Then you update the eMMC with the next U-Boot command : 552 553a) prepare GPT on eMMC, 554 example with 3 partitions, fip, bootfs and roots:: 555 556 # setenv emmc_part "name=fip,size=4MiB;name=bootfs,type=linux,bootable,size=64MiB;name=rootfs,type=linux,size=512" 557 # gpt write mmc 1 ${emmc_part} 558 559b) copy FSBL, TF-A_ or SPL, on first eMMC boot partition 560 (SPL max size is 256kB, with LBA 512, 0x200):: 561 562 # ext4load mmc 0:4 0xC0000000 tf-a.stm32 563 or 564 # ext4load mmc 0:4 0xC0000000 u-boot-spl.stm32 565 566 # mmc dev 1 567 # mmc partconf 1 1 1 1 568 # mmc write ${fileaddr} 0 200 569 # mmc partconf 1 1 1 0 570 571c) copy SSBL, FIP or U-Boot binary, in first GPT partition of eMMC:: 572 573 # ext4load mmc 0:4 0xC0000000 fip.bin 574 or 575 # ext4load mmc 0:4 0xC0000000 u-boot.img # Without CONFIG_SPL_LOAD_FIT 576 or 577 # ext4load mmc 0:4 0xC0000000 u-boot.itb # With CONFIG_SPL_LOAD_FIT=y 578 579 580 # mmc dev 1 581 # part start mmc 1 1 partstart 582 # mmc write ${fileaddr} ${partstart} ${filesize} 583 584To boot from eMMC, select BootPinMode = 0 1 0 and reset. 585 586MAC Address 587----------- 588 589Please read doc/README.enetaddr for the implementation guidelines for mac id 590usage. Basically, environment has precedence over board specific storage. 591 592For STMicroelectronics board, it is retrieved in: 593 594 - STM32MP15x OTP: 595 596 - OTP_57[31:0] = MAC_ADDR[31:0] 597 - OTP_58[15:0] = MAC_ADDR[47:32] 598 599 - STM32MP13x OTP: 600 601 - OTP_57[31:0] = MAC_ADDR0[31:0] 602 - OTP_58[15:0] = MAC_ADDR0[47:32] 603 - OTP_58[31:16] = MAC_ADDR1[15:0] 604 - OTP_59[31:0] = MAC_ADDR1[47:16] 605 606To program a MAC address on virgin STM32MP15x OTP words above, you can use the fuse command 607on bank 0 to access to internal OTP and lock them: 608 609In the next example we are using the 2 OTPs used on STM32MP15x. 610 611Prerequisite: check if a MAC address isn't yet programmed in OTP 612 6131) check OTP: their value must be equal to 0:: 614 615 STM32MP> fuse sense 0 57 2 616 Sensing bank 0: 617 Word 0x00000039: 00000000 00000000 618 6192) check environment variable:: 620 621 STM32MP> env print ethaddr 622 ## Error: "ethaddr" not defined 623 6243) check lock status of fuse 57 & 58 (at 0x39, 0=unlocked, 0x40000000=locked):: 625 626 STM32MP> fuse sense 0 0x10000039 2 627 Sensing bank 0: 628 Word 0x10000039: 00000000 00000000 629 630Example to set mac address "12:34:56:78:9a:bc" 631 6321) Write OTP:: 633 634 STM32MP> fuse prog -y 0 57 0x78563412 0x0000bc9a 635 6362) Read OTP:: 637 638 STM32MP> fuse sense 0 57 2 639 Sensing bank 0: 640 Word 0x00000039: 78563412 0000bc9a 641 6423) Lock OTP:: 643 644 STM32MP> fuse prog 0 0x10000039 0x40000000 0x40000000 645 646 STM32MP> fuse sense 0 0x10000039 2 647 Sensing bank 0: 648 Word 0x10000039: 40000000 40000000 649 6504) next REBOOT, in the trace:: 651 652 ### Setting environment from OTP MAC address = "12:34:56:78:9a:bc" 653 6545) check env update:: 655 656 STM32MP> env print ethaddr 657 ethaddr=12:34:56:78:9a:bc 658 659.. warning:: This command can't be executed twice on the same board as 660 OTP are protected. It is already done for the board 661 provided by STMicroelectronics. 662 663Coprocessor firmware on STM32MP15x 664---------------------------------- 665 666U-Boot can boot the coprocessor before the kernel (coprocessor early boot). 667 668a) Manuallly by using rproc commands (update the bootcmd) 669 670 Configurations:: 671 672 # env set name_copro "rproc-m4-fw.elf" 673 # env set dev_copro 0 674 # env set loadaddr_copro 0xC1000000 675 676 Load binary from bootfs partition (number 4) on SD card (mmc 0):: 677 678 # ext4load mmc 0:4 ${loadaddr_copro} ${name_copro} 679 680 => ${filesize} variable is updated with the size of the loaded file. 681 682 Start M4 firmware with remote proc command:: 683 684 # rproc init 685 # rproc load ${dev_copro} ${loadaddr_copro} ${filesize} 686 # rproc start ${dev_copro}"00270033 687 688b) Automatically by using FIT feature and generic DISTRO bootcmd 689 690 see examples in the board stm32mp1 directory: fit_copro_kernel_dtb.its 691 692 Generate FIT including kernel + device tree + M4 firmware with cfg with M4 693 boot:: 694 695 $> mkimage -f fit_copro_kernel_dtb.its fit_copro_kernel_dtb.itb 696 697 Then using DISTRO configuration file: see extlinux.conf to select the correct 698 configuration: 699 700 - stm32mp157c-ev1-m4 701 - stm32mp157c-dk2-m4 702 703DFU support 704----------- 705 706The DFU is supported on ST board. 707 708The env variable dfu_alt_info is automatically build, and all 709the memory present on the ST boards are exported. 710 711The dfu mode is started by the command:: 712 713 STM32MP> dfu 0 714 715On EV1 board, booting from SD card, without OP-TEE_:: 716 717 STM32MP> dfu 0 list 718 DFU alt settings list: 719 dev: RAM alt: 0 name: uImage layout: RAM_ADDR 720 dev: RAM alt: 1 name: devicetree.dtb layout: RAM_ADDR 721 dev: RAM alt: 2 name: uramdisk.image.gz layout: RAM_ADDR 722 dev: eMMC alt: 3 name: mmc0_fsbl1 layout: RAW_ADDR 723 dev: eMMC alt: 4 name: mmc0_fsbl2 layout: RAW_ADDR 724 dev: eMMC alt: 5 name: mmc0_fip layout: RAW_ADDR 725 dev: eMMC alt: 6 name: mmc0_bootfs layout: RAW_ADDR 726 dev: eMMC alt: 7 name: mmc0_vendorfs layout: RAW_ADDR 727 dev: eMMC alt: 8 name: mmc0_rootfs layout: RAW_ADDR 728 dev: eMMC alt: 9 name: mmc0_userfs layout: RAW_ADDR 729 dev: eMMC alt: 10 name: mmc1_boot1 layout: RAW_ADDR 730 dev: eMMC alt: 11 name: mmc1_boot2 layout: RAW_ADDR 731 dev: eMMC alt: 12 name: mmc1_fip layout: RAW_ADDR 732 dev: eMMC alt: 13 name: mmc1_bootfs layout: RAW_ADDR 733 dev: eMMC alt: 14 name: mmc1_vendorfs layout: RAW_ADDR 734 dev: eMMC alt: 15 name: mmc1_rootfs layout: RAW_ADDR 735 dev: eMMC alt: 16 name: mmc1_userfs layout: RAW_ADDR 736 dev: MTD alt: 17 name: nor0 layout: RAW_ADDR 737 dev: MTD alt: 18 name: nor1 layout: RAW_ADDR 738 dev: MTD alt: 19 name: nand0 layout: RAW_ADDR 739 dev: VIRT alt: 20 name: OTP layout: RAW_ADDR 740 dev: VIRT alt: 21 name: PMIC layout: RAW_ADDR 741 742All the supported device are exported for dfu-util tool:: 743 744 $> dfu-util -l 745 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=21, name="PMIC", serial="002700333338511934383330" 746 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=20, name="OTP", serial="002700333338511934383330" 747 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=19, name="nand0", serial="002700333338511934383330" 748 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=18, name="nor1", serial="002700333338511934383330" 749 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=17, name="nor0", serial="002700333338511934383330" 750 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=16, name="mmc1_userfs", serial="002700333338511934383330" 751 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=15, name="mmc1_rootfs", serial="002700333338511934383330" 752 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=14, name="mmc1_vendorfs", serial="002700333338511934383330" 753 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=13, name="mmc1_bootfs", serial="002700333338511934383330" 754 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=12, name="mmc1_fip", serial="002700333338511934383330" 755 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=11, name="mmc1_boot2", serial="002700333338511934383330" 756 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=10, name="mmc1_boot1", serial="002700333338511934383330" 757 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=9, name="mmc0_userfs", serial="002700333338511934383330" 758 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=8, name="mmc0_rootfs", serial="002700333338511934383330" 759 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=7, name="mmc0_vendorfs", serial="002700333338511934383330" 760 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=6, name="mmc0_bootfs", serial="002700333338511934383330" 761 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=5, name="mmc0_fip", serial="002700333338511934383330" 762 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=4, name="mmc0_fsbl2", serial="002700333338511934383330" 763 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=3, name="mmc0_fsbl1", serial="002700333338511934383330" 764 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=2, name="uramdisk.image.gz", serial="002700333338511934383330" 765 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=1, name="devicetree.dtb", serial="002700333338511934383330" 766 Found DFU: [0483:df11] ver=9999, devnum=99, cfg=1, intf=0, alt=0, name="uImage", serial="002700333338511934383330" 767 768You can update the boot device: 769 770- SD card (mmc0):: 771 772 $> dfu-util -d 0483:5720 -a 3 -D tf-a-stm32mp157c-ev1.stm32 773 $> dfu-util -d 0483:5720 -a 4 -D tf-a-stm32mp157c-ev1.stm32 774 $> dfu-util -d 0483:5720 -a 5 -D fip-stm32mp157c-ev1.bin 775 $> dfu-util -d 0483:5720 -a 6 -D st-image-bootfs-openstlinux-weston-stm32mp1.ext4 776 $> dfu-util -d 0483:5720 -a 7 -D st-image-vendorfs-openstlinux-weston-stm32mp1.ext4 777 $> dfu-util -d 0483:5720 -a 8 -D st-image-weston-openstlinux-weston-stm32mp1.ext4 778 $> dfu-util -d 0483:5720 -a 9 -D st-image-userfs-openstlinux-weston-stm32mp1.ext4 779 780- EMMC (mmc1):: 781 782 $> dfu-util -d 0483:5720 -a 10 -D tf-a-stm32mp157c-ev1.stm32 783 $> dfu-util -d 0483:5720 -a 11 -D tf-a-stm32mp157c-ev1.stm32 784 $> dfu-util -d 0483:5720 -a 12 -D fip-stm32mp157c-ev1.bin 785 $> dfu-util -d 0483:5720 -a 13 -D st-image-bootfs-openstlinux-weston-stm32mp1.ext4 786 $> dfu-util -d 0483:5720 -a 14 -D st-image-vendorfs-openstlinux-weston-stm32mp1.ext4 787 $> dfu-util -d 0483:5720 -a 15 -D st-image-weston-openstlinux-weston-stm32mp1.ext4 788 $> dfu-util -d 0483:5720 -a 16 -D st-image-userfs-openstlinux-weston-stm32mp1.ext4 789 790- you can also dump the OTP and the PMIC NVM with:: 791 792 $> dfu-util -d 0483:5720 -a 19 -U otp.bin 793 $> dfu-util -d 0483:5720 -a 20 -U pmic.bin 794 795 796When the board is booting for nor0 or nand0, 797only the MTD partition on the boot devices are available, for example: 798 799- NOR (nor0 = alt 20, nor1 = alt 26) & NAND (nand0 = alt 27) : 800 801 $> dfu-util -d 0483:5720 -a 21 -D tf-a-stm32mp157c-ev1.stm32 802 $> dfu-util -d 0483:5720 -a 22 -D tf-a-stm32mp157c-ev1.stm32 803 $> dfu-util -d 0483:5720 -a 23 -D fip-stm32mp157c-ev1.bin 804 $> dfu-util -d 0483:5720 -a 28 -D st-image-weston-openstlinux-weston-stm32mp1_nand_4_256_multivolume.ubi 805 806- NAND (nand0 = alt 21):: 807 808 $> dfu-util -d 0483:5720 -a 22 -D tf-a-stm32mp157c-ev1.stm32 809 $> dfu-util -d 0483:5720 -a 23 -D fip-stm32mp157c-ev1.bin 810 $> dfu-util -d 0483:5720 -a 24 -D fip-stm32mp157c-ev1.bin 811 $> dfu-util -d 0483:5720 -a 25 -D st-image-weston-openstlinux-weston-stm32mp1_nand_4_256_multivolume.ubi 812 813References 814---------- 815 816.. _WIKI: 817 818STM32 Arm® Cortex®-based MPUs user guide 819 820 + https://wiki.st.com/ 821 + https://wiki.st.com/stm32mpu/wiki/Main_Page 822 823.. _TF-A: 824 825TF-A = The Trusted Firmware-A project provides a reference implementation of 826secure world software for Armv7-A and Armv8-A class processors 827 828 + https://www.trustedfirmware.org/projects/tf-a/ 829 + https://trustedfirmware-a.readthedocs.io/en/latest/ 830 + https://trustedfirmware-a.readthedocs.io/en/latest/plat/stm32mp1.html 831 + https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/ 832 833.. _OP-TEE: 834 835OP-TEE = an open source Trusted Execution Environment (TEE) implementing the 836Arm TrustZone technology 837 838 + https://www.op-tee.org/ 839 + https://optee.readthedocs.io/en/latest/ 840 + https://optee.readthedocs.io/en/latest/building/devices/stm32mp1.html 841 + https://github.com/OP-TEE/optee_os