1################################## 2Run TF-M examples on Arm platforms 3################################## 4Instructions for how to run TF-M and example test application on Arm platforms. 5 6Follow :doc:`build instruction <tfm_build_instruction>` to build the binaries. 7Follow :doc:`secure boot </technical_references/design_docs/tfm_secure_boot>` to build the 8binaries with or without BL2 bootloader. 9 10**************************************************************** 11Execute TF-M example and regression tests on MPS2 boards and FVP 12**************************************************************** 13The BL2 bootloader and TF-M example application and tests have been verified 14using the reference model for MPS2 (AN521), in `Keil MDK`_ , 15`Fixed Virtual Platforms`_ and `Arm Development Studio`_ . 16 17.. Note:: 18 The name of the reference model's executable can vary depending on toolchain. 19 20 - SMM-SSE-200 for `Keil MDK`_ 21 22 - FVP_MPS2_AEMv8M for `Fixed Virtual Platforms`_ and `Arm Development Studio`_ 23 24 For more information please refer to the appropriate toolchain's 25 documentation: `Keil MDK Documentation`_ , 26 `Fixed Virtual Platforms Documentation`_ , 27 `Arm Development Studio Documentation`_ 28 29To run the example code on an SSE-200 Fast-Model 30================================================ 31Using FVP_MPS2_AEMv8M provided by `Arm Development Studio`_ 2019.1. 32 33Example application and regression tests without BL2 bootloader 34--------------------------------------------------------------- 35Add ``tfm_s.axf`` and ``tfm_ns.axf`` to symbol files in Debug Configuration 36menu. 37 38.. code-block:: bash 39 40 <DS_PATH>/sw/models/bin/FVP_MPS2_AEMv8M \ 41 --parameter fvp_mps2.platform_type=2 \ 42 --parameter cpu0.baseline=0 \ 43 --parameter cpu0.INITVTOR_S=0x10000000 \ 44 --parameter cpu0.semihosting-enable=0 \ 45 --parameter fvp_mps2.DISABLE_GATING=0 \ 46 --parameter fvp_mps2.telnetterminal0.start_telnet=1 \ 47 --parameter fvp_mps2.telnetterminal1.start_telnet=0 \ 48 --parameter fvp_mps2.telnetterminal2.start_telnet=0 \ 49 --parameter fvp_mps2.telnetterminal0.quiet=0 \ 50 --parameter fvp_mps2.telnetterminal1.quiet=1 \ 51 --parameter fvp_mps2.telnetterminal2.quiet=1 \ 52 --application cpu0=<build_dir>/bin/tfm_s.axf \ 53 --data cpu0=<build_dir>/bin/tfm_ns.bin@0x00100000 54 55Example application and regression tests with BL2 bootloader 56------------------------------------------------------------ 57To test TF-M with bootloader, one must apply the following changes: 58 59- Add ``bl2.axf`` to symbol files in DS-5 in Debug Configuration 60 menu. 61- Replace the last two lines of the previous command with this: 62 63.. code-block:: bash 64 65 --application cpu0=<build_dir>/bin/bl2.axf \ 66 --data cpu0=<build_dir>/bin/tfm_s_ns_signed.bin@0x10080000 67 68Test software upgrade with BL2 bootloader 69^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 70BL2 bootloader is mandatory to test software update. Furthermore two TF-M blob 71must be built. Outputs of example application and regression test can be used to 72test it. Load output of example application to the primary slot (0x10080000) and 73output of regression test to the secondary slot (0x10180000). Add the following 74line to the end of the previous chapter: 75 76.. code-block:: bash 77 78 --data cpu0=<build_dir>/bin/tfm_s_ns_signed.bin@0x10180000 79 80To run the example code on SSE 200 FPGA on MPS2 board 81===================================================== 82FPGA image is available to download 83`here <https://developer.arm.com/products/system-design/development-boards/cortex-m-prototyping-systems/mps2>`__ 84 85To run BL2 bootloader and TF-M example application and tests in the MPS2 board, 86it is required to have SMM-SSE-200 for MPS2 (AN521) image in the MPS2 board SD 87card. The image should be located in 88``<MPS2 device name>/MB/HBI0263<board revision letter>/AN521`` 89 90The MPS2 board tested is HBI0263C referred also as MPS2+. 91 92.. Warning:: 93 94 If you change the exe names, MPS2 expects file names in 8.3 format. 95 96Example application 97------------------- 98#. Copy ``bl2.bin`` and ``tfm_s_ns_signed.bin`` files from 99 ``<build_dir>/bin`` to 100 ``<MPS2 device name>/SOFTWARE/`` 101#. Open ``<MPS2 device name>/MB/HBI0263C/AN521/images.txt`` 102#. Update the ``AN521/images.txt`` file as follows:: 103 104 TITLE: Versatile Express Images Configuration File 105 [IMAGES] 106 TOTALIMAGES: 2 ;Number of Images (Max: 32) 107 IMAGE0ADDRESS: 0x10000000 108 IMAGE0FILE: \Software\bl2.bin ; BL2 bootloader 109 IMAGE1ADDRESS: 0x10080000 110 IMAGE1FILE: \Software\tfm_s_ns_signed.bin ; TF-M example application binary blob 111 112#. Close ``<MPS2 device name>/MB/HBI0263C/AN521/images.txt`` 113#. Unmount/eject the ``<MPS2 device name>`` unit 114#. Reset the board to execute the TF-M example application 115#. After completing the procedure you should be able to visualize on the serial 116 port (baud 115200 8n1) the following messages:: 117 118 [INF] Starting bootloader 119 [INF] Image 0: magic=good, copy_done=0xff, image_ok=0xff 120 [INF] Scratch: magic=bad, copy_done=0x5, image_ok=0xcf 121 [INF] Boot source: primary slot 122 [INF] Swap type: none 123 [INF] Bootloader chainload address offset: 0x80000 124 [INF] Jumping to the first image slot 125 [Sec Thread] Secure image initializing! 126 127Regression tests 128---------------- 129After completing the procedure you should be able to visualize on the serial 130port (baud 115200 8n1) the following messages:: 131 132 [INF] Starting bootloader 133 [INF] Image 0: magic=good, copy_done=0xff, image_ok=0xff 134 [INF] Scratch: magic=bad, copy_done=0x5, image_ok=0xcf 135 [INF] Boot source: primary slot 136 [INF] Swap type: none 137 [INF] Bootloader chainload address offset: 0x80000 138 [INF] Jumping to the first image slot 139 [Sec Thread] Secure image initializing! 140 141 #### Execute test suites for the protected storage service #### 142 Running Test Suite PS secure interface tests (TFM_PS_TEST_2XXX)... 143 144 > Executing 'TFM_PS_TEST_2001' 145 Description: 'Create interface' 146 TEST PASSED! 147 > Executing 'TFM_PS_TEST_2002' 148 Description: 'Get handle interface (DEPRECATED)' 149 This test is DEPRECATED and the test execution was SKIPPED 150 TEST PASSED! 151 > Executing 'TFM_PS_TEST_2003' 152 Description: 'Get handle with null handle pointer (DEPRECATED)' 153 This test is DEPRECATED and the test execution was SKIPPED 154 TEST PASSED! 155 > Executing 'TFM_PS_TEST_2004' 156 Description: 'Write interface' 157 TEST PASSED! 158 > Executing 'TFM_PS_TEST_2005' 159 Description: 'Read interface' 160 .... 161 162.. Note:: 163 164 PS reliability tests take a few minutes to run on the MPS2. 165 166Example application without BL2 bootloader 167------------------------------------------ 168#. Copy ``tfm_s.bin`` and ``tfm_ns.bin`` files from 169 ``<build_dir>/bin`` to 170 ``<MPS2 device name>/SOFTWARE/`` 171#. Open ``<MPS2 device name>/MB/HBI0263C/AN521/images.txt`` 172#. Update the ``AN521/images.txt`` file as follows:: 173 174 TITLE: Versatile Express Images Configuration File 175 [IMAGES] 176 TOTALIMAGES: 2 ;Number of Images (Max: 32) 177 IMAGE0ADDRESS: 0x10000000 178 IMAGE0FILE: \Software\tfm_s.bin ; Secure code 179 IMAGE1ADDRESS: 0x00100000 180 IMAGE1FILE: \Software\tfm_ns.bin ; Non-secure code 181 182#. Close ``<MPS2 device name>/MB/HBI0263C/AN521/images.txt`` 183#. Unmount/eject the ``<MPS2 device name>`` unit 184#. Reset the board to execute the TF-M example application 185#. After completing the procedure you should be able to visualize on the serial 186 port (baud 115200 8n1) the following messages:: 187 188 [Sec Thread] Secure image initializing! 189 190Regression tests without BL2 bootloader 191--------------------------------------- 192After completing the procedure you should be able to visualize on the serial 193port (baud 115200 8n1) the following messages:: 194 195 [Sec Thread] Secure image initializing! 196 197 #### Execute test suites for the protected storage service #### 198 Running Test Suite PS secure interface tests (TFM_PS_TEST_2XXX)... 199 200 > Executing 'TFM_PS_TEST_2001' 201 Description: 'Create interface' 202 TEST PASSED! 203 > Executing 'TFM_PS_TEST_2002' 204 Description: 'Get handle interface (DEPRECATED)' 205 This test is DEPRECATED and the test execution was SKIPPED 206 TEST PASSED! 207 > Executing 'TFM_PS_TEST_2003' 208 Description: 'Get handle with null handle pointer (DEPRECATED)' 209 This test is DEPRECATED and the test execution was SKIPPED 210 TEST PASSED! 211 > Executing 'TFM_PS_TEST_2004' 212 Description: 'Write interface' 213 TEST PASSED! 214 > Executing 'TFM_PS_TEST_2005' 215 Description: 'Read interface' 216 .... 217 218******************************************************************* 219Execute TF-M example and regression tests on Musca test chip boards 220******************************************************************* 221.. Note:: 222 223 Before executing any images on Musca-B1 board, please check the 224 :doc:`target platform readme </platform/arm/musca_b1/readme>` 225 to have the correct setup. 226 227 Install SRecord for Musca test chip boards. 228 229 - Windows: `SRecord v1.63 <https://sourceforge.net/projects/srecord/>`__ 230 - Linux: sudo apt-get install -y srecord 231 232Example application with BL2 bootloader 233======================================= 234 235#. Create a unified hex file comprising of both ``bl2.bin`` and 236 ``tfm_s_ns_signed.bin``. 237 238 - For Musca-B1 239 240 - Windows:: 241 242 srec_cat.exe bin\bl2.bin -Binary -offset 0xA000000 bin\tfm_s_ns_signed.bin -Binary -offset 0xA020000 -o tfm.hex -Intel 243 244 - Linux:: 245 246 srec_cat bin/bl2.bin -Binary -offset 0xA000000 bin/tfm_s_ns_signed.bin -Binary -offset 0xA020000 -o tfm.hex -Intel 247 248 - For Musca-S1 249 250 - Windows:: 251 252 srec_cat.exe bin\bl2.bin -Binary -offset 0xA000000 bin\tfm_s_ns_signed.bin -Binary -offset 0xA020000 -o tfm.hex -Intel 253 254 - Linux:: 255 256 srec_cat bin/bl2.bin -Binary -offset 0xA000000 bin/tfm_s_ns_signed.bin -Binary -offset 0xA020000 -o tfm.hex -Intel 257 258#. Power up the Musca board by connecting it to a computer with a USB lead. 259 Press the ``PBON`` button if the green ``ON`` LED does not immediately turn 260 on. The board should appear as a USB drive. 261#. Copy ``tfm.hex`` to the USB drive. The orange ``PWR`` LED should start 262 blinking. 263#. Once the ``PWR`` LED stops blinking, power cycle or reset the board to boot 264 from the new image. 265#. After completing the procedure you should see the following messages on the 266 DAPLink UART (baud 115200 8n1):: 267 268 [INF] Starting bootloader 269 [INF] Image 0: magic=good, copy_done=0xff, image_ok=0xff 270 [INF] Scratch: magic=bad, copy_done=0x5, image_ok=0xd9 271 [INF] Boot source: primary slot 272 [INF] Swap type: none 273 [INF] Bootloader chainload address offset: 0x20000 274 [INF] Jumping to the first image slot 275 [Sec Thread] Secure image initializing! 276 277Regression tests with BL2 bootloader 278==================================== 279.. note:: 280 281 As the Internal Trusted Storage and Protected Storage tests use persistent 282 storage, it is recommended to erase the storage area before running the 283 tests. Existing data may prevent the tests from running to completion if, 284 for example, there is not enough free space for the test data or the UIDs 285 used by the tests have already been created with the write-once flag set. 286 Repeated test runs can be done without erasing between runs. 287 288 To erase the storage when flashing an image, ``-fill 0xFF <start_addr> 289 <end_addr>`` can be added to the ``srec_cat`` command used to create the 290 combined hex file. The ``<start_addr>`` and ``<end_addr>`` are the start and 291 end addresses of the storage area, found in the board's ``flash_layout.h`` 292 file. The board's flash can also be erased via a debugger; see your IDE's 293 documentation for instructions. 294 295After completing the procedure you should see the following messages on the 296DAPLink UART (baud 115200 8n1):: 297 298 [INF] Starting bootloader 299 [INF] Image 0: magic=good, copy_done=0xff, image_ok=0xff 300 [INF] Scratch: magic=bad, copy_done=0x5, image_ok=0x9 301 [INF] Boot source: primary slot 302 [INF] Swap type: none 303 [INF] Bootloader chainload address offset: 0x20000 304 [INF] Jumping to the first image slot 305 [Sec Thread] Secure image initializing! 306 307 #### Execute test suites for the protected storage service #### 308 Running Test Suite PS secure interface tests (TFM_PS_TEST_2XXX)... 309 > Executing 'TFM_PS_TEST_2001' 310 Description: 'Create interface' 311 TEST PASSED! 312 > Executing 'TFM_PS_TEST_2002' 313 Description: 'Get handle interface (DEPRECATED)' 314 This test is DEPRECATED and the test execution was SKIPPED 315 TEST PASSED! 316 > Executing 'TFM_PS_TEST_2003' 317 Description: 'Get handle with null handle pointer (DEPRECATED)' 318 This test is DEPRECATED and the test execution was SKIPPED 319 TEST PASSED! 320 > Executing 'TFM_PS_TEST_2004' 321 Description: 'Get attributes interface' 322 TEST PASSED! 323 > Executing 'TFM_PS_TEST_2005' 324 Description: 'Get attributes with null attributes struct pointer' 325 .... 326 327PSA API tests 328============= 329Follow the build instructions for the PSA API tests and then follow the above 330procedures for flashing the image to the board. The PSA API tests are linked 331into the TF-M binaries and will automatically run. A log similar to the 332following should be visible on the UART; it is normal for some tests to be 333skipped but there should be no failed tests:: 334 335 [Sec Thread] Secure image initializing! 336 Booting TFM v1.1 337 Non-Secure system starting... 338 339 ***** PSA Architecture Test Suite - Version 1.0 ***** 340 341 Running.. Storage Suite 342 ****************************************** 343 344 TEST: 401 | DESCRIPTION: UID not found check 345 [Info] Executing tests from non-secure 346 347 [Info] Executing ITS tests 348 [Check 1] Call get API for UID 6 which is not set 349 [Check 2] Call get_info API for UID 6 which is not set 350 [Check 3] Call remove API for UID 6 which is not set 351 [Check 4] Call get API for UID 6 which is removed 352 [Check 5] Call get_info API for UID 6 which is removed 353 [Check 6] Call remove API for UID 6 which is removed 354 [Check 7] Call get API for different UID 5 355 [Check 8] Call get_info API for different UID 5 356 [Check 9] Call remove API for different UID 5 357 358 [Info] Executing PS tests 359 [Check 1] Call get API for UID 6 which is not set 360 [Check 2] Call get_info API for UID 6 which is not set 361 [Check 3] Call remove API for UID 6 which is not set 362 [Check 4] Call get API for UID 6 which is removed 363 [Check 5] Call get_info API for UID 6 which is removed 364 [Check 6] Call remove API for UID 6 which is removed 365 [Check 7] Call get API for different UID 5 366 [Check 8] Call get_info API for different UID 5 367 [Check 9] Call remove API for different UID 5 368 369 TEST RESULT: PASSED 370 371 ****************************************** 372 373 <further tests removed from log for brevity> 374 375 ************ Storage Suite Report ********** 376 TOTAL TESTS : 17 377 TOTAL PASSED : 11 378 TOTAL SIM ERROR : 0 379 TOTAL FAILED : 0 380 TOTAL SKIPPED : 6 381 ****************************************** 382 383.. note:: 384 The Internal Trusted Storage and Protected Storage flash areas must be wiped 385 before running the Storage test suites. 386 387 Many IDEs for embedded development (such as Keil µVision) offer a function 388 to erase a device's flash. Refer to your IDE's documentation for 389 instructions. 390 391 Another way this can be achieved is by using ``srec_cat`` with the ``-fill`` 392 parameter to fill the corresponding area in the binary with the erase value 393 of the flash (``0xFF``). 394 395 Refer to the platform flash layout for appropriate addresses to erase on 396 other platforms. 397 398 This step is not required on targets that emulate flash storage in RAM, as 399 it will be erased each time the device is reset. Note, however, that a warm 400 reset may not clear SRAM contents, so it may be necessary to power the 401 device off and on again between test runs. 402 403Example application or regression tests on Musca-B1 without BL2 bootloader 404========================================================================== 405 406Follow the above procedures, but create a unified hex file out of ``tfm_s.bin`` 407and ``tfm_ns.bin``: 408 409- Windows:: 410 411 srec_cat.exe bin\tfm_s.bin -Binary -offset 0xA000000 bin\tfm_ns.bin -Binary -offset 0xA080000 -o tfm.hex -Intel 412 413- Linux:: 414 415 srec_cat bin/tfm_s.bin -Binary -offset 0xA000000 bin/tfm_ns.bin -Binary -offset 0xA080000 -o tfm.hex -Intel 416 417******************************************************** 418Execute TF-M example and regression tests on MPS3 boards 419******************************************************** 420 421To run the example code on CoreLink SSE-200 Subsystem for MPS3 (AN524) 422====================================================================== 423FPGA image is available to download `here <https://www.arm.com/products/development-tools/development-boards/mps3>`__ 424 425To run BL2 bootloader and TF-M example application and tests in the MPS3 board, 426it is required to have SMM-SSE-200 for MPS3 (AN524) image in the MPS3 board 427SD card. The image should be located in 428``<MPS3 device name>/MB/HBI<BoardNumberBoardrevision>/AN524`` 429 430And the current boot memory for AN524 is QSPI flash, so you need to set the 431correct REMAP option in 432``<MPS3 device name>/MB/HBI<BoardNumberBoardrevision>/AN524/an524_v1.txt`` 433 434:: 435 436 REMAP: QSPI ;REMAP boot device BRAM/QSPI. Must match REMAPVAL below. 437 REMAPVAL: 1 ;REMAP register value e.g. 0-BRAM. 1-QSPI 438 439The MPS3 board tested is HBI0309B. 440 441.. Note:: 442 If you change the exe names, MPS3 expects file names in 8.3 format. 443 444Example application 445------------------- 446#. Copy ``bl2.bin`` and ``tfm_s_ns_signed.bin`` files from 447 build dir to ``<MPS3 device name>/SOFTWARE/`` 448#. Open ``<MPS3 device name>/MB/HBI0309B/AN524/images.txt`` 449#. Update the ``images.txt`` file as follows:: 450 451 TITLE: Arm MPS3 FPGA prototyping board Images Configuration File 452 453 [IMAGES] 454 TOTALIMAGES: 2 ;Number of Images (Max: 32) 455 456 IMAGE0UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 457 IMAGE0ADDRESS: 0x00000000 ;Please select the required executable program 458 IMAGE0FILE: \SOFTWARE\bl2.bin 459 IMAGE1UPDATE: AUTO 460 IMAGE1ADDRESS: 0x00040000 461 IMAGE1FILE: \SOFTWARE\tfm_s_ns_signed.bin 462 463#. Close ``<MPS3 device name>/MB/HBI0309B/AN524/images.txt`` 464#. Unmount/eject the ``<MPS3 device name>`` unit 465#. Reset the board to execute the TF-M example application 466#. After completing the procedure you should be able to visualize on the serial 467 port (baud 115200 8n1) the following messages:: 468 469 [INF] Starting bootloader 470 [INF] Image 0: magic= good, copy_done=0xff, image_ok=0xff 471 [INF] Scratch: magic=unset, copy_done=0x43, image_ok=0xff 472 [INF] Boot source: slot 0 473 [INF] Swap type: none 474 [INF] Bootloader chainload address offset: 0x40000 475 [INF] Jumping to the first image slot 476 [Sec Thread] Secure image initializing! 477 478Regression tests 479---------------- 480After completing the procedure you should be able to visualize on the serial 481port (baud 115200 8n1) the following messages:: 482 483 [INF] Starting bootloader 484 [INF] Image 0: magic= good, copy_done=0xff, image_ok=0xff 485 [INF] Scratch: magic=unset, copy_done=0x9, image_ok=0xff 486 [INF] Boot source: slot 0 487 [INF] Swap type: none 488 [INF] Bootloader chainload address offset: 0x40000 489 [INF] Jumping to the first image slot 490 [Sec Thread] Secure image initializing! 491 492 #### Execute test suites for the Secure area #### 493 Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)... 494 > Executing 'TFM_PS_TEST_2001' 495 Description: 'Set interface' 496 TEST PASSED! 497 > Executing 'TFM_PS_TEST_2002' 498 Description: 'Set interface with create flags' 499 TEST PASSED! 500 > Executing 'TFM_PS_TEST_2003' 501 Description: 'Set interface with NULL data pointer' 502 TEST PASSED! 503 > Executing 'TFM_PS_TEST_2004' 504 Description: 'Set interface with invalid data length' 505 TEST PASSED! 506 .... 507 508.. Note:: 509 Some of the attestation tests take a few minutes to run on the MPS3. 510 511Example application without BL2 bootloader 512------------------------------------------ 513#. Copy ``tfm_s.bin`` and ``tfm_ns.bin`` files from 514 build dir to ``<MPS3 device name>/SOFTWARE/`` 515#. Open ``<MPS3 device name>/MB/HBI0309B/AN524/images.txt`` 516#. Update the ``images.txt`` file as follows:: 517 518 TITLE: Arm MPS3 FPGA prototyping board Images Configuration File 519 520 [IMAGES] 521 TOTALIMAGES: 2 ;Number of Images (Max: 32) 522 523 IMAGE0UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 524 IMAGE0ADDRESS: 0x00000000 ;Please select the required executable program 525 IMAGE0FILE: \SOFTWARE\tfm_s.bin 526 IMAGE1UPDATE: AUTO 527 IMAGE1ADDRESS: 0x000C0000 528 IMAGE1FILE: \SOFTWARE\tfm_ns.bin 529 530#. Close ``<MPS3 device name>/MB/HBI0309B/AN521/images.txt`` 531#. Unmount/eject the ``<MPS3 device name>`` unit 532#. Reset the board to execute the TF-M example application 533#. After completing the procedure you should be able to visualize on the serial 534 port (baud 115200 8n1) the following messages:: 535 536 [Sec Thread] Secure image initializing! 537 538Regression tests without BL2 bootloader 539--------------------------------------- 540After completing the procedure you should be able to visualize on the serial 541port (baud 115200 8n1) the following messages:: 542 543 [Sec Thread] Secure image initializing! 544 545 #### Execute test suites for the Secure area #### 546 Running Test Suite PSA protected storage S interface tests (TFM_PS_TEST_2XXX)... 547 > Executing 'TFM_PS_TEST_2001' 548 Description: 'Set interface' 549 TEST PASSED! 550 > Executing 'TFM_PS_TEST_2002' 551 Description: 'Set interface with create flags' 552 TEST PASSED! 553 > Executing 'TFM_PS_TEST_2003' 554 Description: 'Set interface with NULL data pointer' 555 TEST PASSED! 556 > Executing 'TFM_PS_TEST_2004' 557 Description: 'Set interface with invalid data length' 558 TEST PASSED! 559 .... 560 561Firmware upgrade and image validation with BL2 bootloader 562========================================================= 563High level operation of BL2 bootloader and instructions for testing firmware 564upgrade is described in :doc:`secure boot </technical_references/design_docs/tfm_secure_boot>`. 565 566-------------- 567 568.. _Arm Development Studio: https://developer.arm.com/tools-and-software/embedded/arm-development-studio 569.. _Arm Development Studio Documentation: https://developer.arm.com/tools-and-software/embedded/arm-development-studio/learn/docs 570.. _Fixed Virtual Platforms: https://developer.arm.com/tools-and-software/simulation-models/fixed-virtual-platforms 571.. _Fixed Virtual Platforms Documentation: https://developer.arm.com/documentation/100966/latest 572.. _Keil MDK: http://www2.keil.com/mdk5 573.. _Keil MDK Documentation: https://www2.keil.com/mdk5/docs 574 575*Copyright (c) 2017-2022, Arm Limited. All rights reserved.* 576