Trusted Firmware for Cortex-A (TF-A) is an implementation of EL3 secure firmware. TF-A replaces PPA in secure firmware role. 
 Note: Please note the steps listed in this topic can only be performed with LSDK 18.12 and newer releases.                                                                 
 To migrate to the TF-A boot flow from the previous boot flow (with PPA), you need to compile the TF-A binaries, bl2_<boot_mode>.pbl and fip.bin, and flash these binaries on the specific boot medium on the board. 
 For SD/eMMC boot, you need to compile the following TF-A binaries. 
 
 
 
 TF-A binary name 
 Components 
 
 
 
 
 
 bl2_sd.pbl/bl2_emmc.pbl 
 
 
 
 BL2 binary: Platform initialization binary 
 RCW binary for SD/emmc boot  
 
 
 
 
 
 fip.bin 
 
 
 
 BL31: Secure runtime firmware 
 BL32: Trusted OS, for example, OPTEE (optional) 
 BL33: U-Boot/UEFI image 
 
 
 
 
 
   
 Follow these steps to compile and deploy TF-A  binaries (bl2_sd.pbl/bl2_emmc.pbl and fip.bin) on the SD/eMMC card. 
 
 Compile RCW binary 
 Compile U-Boot binary 
 [Optional] Compile OPTEE binary  
 Compile TF-A binaries (bl2_sd.pbl/bl2_emmc.pbl and fip.bin) for SD/eMMC boot 
 Program TF-A binaries to the SD/eMMC card 
 
 Step 1: Compile RCW binary 
 You need to compile the RCW binary to build the bl2_sd.pbl/bl2_emmc.pbl binary. 
 Clone the  rcw repository and compile the RCW binary.  
 
 $ git clone https://source.codeaurora.org/external/qoriq/qoriq-components/rcw 
 $ cd rcw 
 $ git checkout -b <new branch name> <LSDK tag>. For example, $  git checkout -b LSDK-20.04 LSDK-20.04 
 Compile RCW for Rev 1 or Rev 2 board.
 
 For LX2160ARDB Rev1: $ cd lx2160ardb 
 For LX2160ARDB Rev2: $ cd lx2160ardb_rev2 
 
 
 If required, make changes to the rcw files. 
 $ make 
 
 The compiled RCW binary for SD/eMMC boot on LX2160ARDB for core frequency 2000 MHz, platform frequency 700 MHz and DDR memory data rate 2900 MT/s, with serdes1 = 19 serdes2 = 5 serdes3 = 2, rcw_2000_700_2900_19_5_2.bin is available at: 
 
 rcw/lx2160ardb/XGGFF_PP_HHHH_RR_19_5_2 (For LX2160ARDB Rev 1) 
 rcw/lx2160ardb_rev2/XGGFF_PP_HHHH_RR_19_5_2 (For LX2160ARDB Rev 2) 
 
 Note: See the rcw/lx2160ardb/README or rcw/lx2160ardb_rev2/README file for an explanation of the naming convention for the directories that contain the RCW source and binary files. 
 Step 2: Compile U-Boot binary 
 You need to compile the u-boot.bin binary to build the fip.bin binary. 
 Clone the u-boot repository and compile the U-Boot binary for TF-A. 
 
 $ git clone https://source.codeaurora.org/external/qoriq/qoriq-components/u-boot.git 
 $ cd u-boot 
 $ git checkout -b <new branch name> LSDK-<LSDK version>. For example, $ git checkout -b LSDK-20.04 LSDK-20.04  
 $ export ARCH=arm64 
 $ export CROSS_COMPILE=aarch64-linux-gnu- 
 $ make distclean 
 $ make lx2160ardb_tfa_defconfig 
 $ make 
 
 Note: If the make command shows the error "*** Your GCC is older than 6.0 and is not supported", ensure that you are using Ubuntu 18.04 64-bit version for building the LSDK 18.12 and above U-Boot binary.             
 The compiled U-Boot binary, u-boot.bin, is available at u-boot/. 
 Step 3: [Optional] Compile OPTEE binary  
 You need to compile the tee.bin binary to build fip.bin with OPTEE. However, OPTEE is optional, you can skip the procedure to compile OPTEE if you want to build the FIP binary without OPTEE. 
 Clone the optee_os repository and build the OPTEE binary.  
 
 $ git clone https://source.codeaurora.org/external/qoriq/qoriq-components/optee_os 
 $ cd optee_os 
 $ git checkout -b <new branch name> LSDK-<LSDK version>. For example, $ git checkout -b LSDK-20.04 LSDK-20.04 
 $ export ARCH=arm 
 $ export CROSS_COMPILE=aarch64-linux-gnu- 
 $ make CFG_ARM64_core=y PLATFORM=ls-lx2160ardb 
 $ aarch64-linux-gnu-objcopy -v -O binary out/arm-plat-ls/core/tee.elf out/arm-plat-ls/core/tee.bin 
 
 The compiled OPTEE image, tee.bin, is available at optee_os/out/arm-plat-ls/core/. 
 Step 4: Compile TF-A binaries for SD/eMMC boot 
 Clone the atf repository and compile the TF-A binaries, bl2_sd.pbl/bl2_emmc.pbl and fip.bin. 
 
 $ git clone https://source.codeaurora.org/external/qoriq/qoriq-components/atf 
 $ cd atf 
 $  git checkout -b <new branch name> LSDK-<LSDK version>. For example, $ git checkout -b LSDK-20.04 LSDK-20.04 
 $ export ARCH=arm64 
 $ export CROSS_COMPILE=aarch64-linux-gnu- 
 Build BL2 binary with OPTEE.
 
 For SD boot: $ make PLAT=lx2160ardb bl2 SPD=opteed BOOT_MODE=sd BL32=<path_to_optee_binary>/tee.bin pbl RCW=<path_to_rcw_binary>/rcw_2000_700_2900_19_5_2.bin 
 For eMMC boot: $ make PLAT=lx2160ardb bl2 SPD=opteed BOOT_MODE=emmc BL32=<path_to_optee_binary>/tee.bin pbl RCW=<path_to_rcw_binary>/rcw_2000_700_2900_19_5_2.bin  
   
 The compiled BL2 images, bl2.bin and bl2_sd.pbl/bl2_emmc.pbl are available at atf/build/lx2160ardb/release/. 
For any update in the BL2 source code or RCW binary, the bl2_sd.pbl/bl2_emmc.pbl binary needs to be recompiled.
   
 To compile the BL2 binary without OPTEE: 
 For SD boot: $ make PLAT=lx2160ardb bl2 BOOT_MODE=sd pbl RCW=<path_to_rcw_binary>/rcw_2000_700_2900_19_5_2.bin    
For emmc boot: $ make PLAT=lx2160ardb bl2 BOOT_MODE=emmc pbl RCW=<path_to_rcw_binary>/rcw_2000_700_2900_19_5_2.bin  
 
 
 Build FIP binary with OPTEE and without trusted board boot.
 
 $ make PLAT=lx2160ardb fip BL33=<path_to_u-boot_binary>/u-boot.bin SPD=opteed BL32=<path_to_optee_binary>/tee.bin  
 The compiled BL31 and FIP binaries, bl31.bin, fip.bin, are available at atf/build/lx2160ardb/release/. 
For any update in the BL31, BL32, or BL33 binaries, the fip.bin binary needs to be recompiled.
   
 To compile the FIP binary without OPTEE and without trusted board boot: 
 For SD boot: $ make PLAT=lx2160ardb fip BOOT_MODE=sd BL33=<path_to_u-boot_binary>/u-boot.bin 
   
 For eMMC boot: $ make PLAT=lx2160ardb fip BOOT_MODE=emmc BL33=<path_to_u-boot_binary>/u-boot.bin 
To compile the FIP binary with trusted board boot, refer the read me at <atf repository>/plat/nxp/README.TRUSTED_BOO 
 
 
 
 Step 5: Program TF-A binaries to SD/eMMC card 
 
 Boot LX2160ARDB from FlexSPI. Ensure that the switches are set to boot the board from FlexSPI. For booting from FlexSPI:
 
 SW1[1:8] = 1111 100X [X is 0 for FlexSPI NOR flash0 and X is 1 for FlexSPI NOR flash1] 
 SW2[1:8] = 0000 0110 
 SW3[1:8] = 1111 1100 
 SW4[1:8] = 1011 1000 
 
 
 Boot from FlexSPI NOR flash0: => qixis_reset 
 
 For LX2160ARDB Rev 1, in boot log, you'll see: 
 Board: LX2160ACE Rev1.0-RDB, Board version: B, boot from FlexSPI DEV#0 
 For LX2160ARDB Rev 2, in boot log, you'll see: 
 Board: LX2160ACE Rev2.0-RDB, Board version: B, boot from FlexSPI DEV#0 
 Set up Ethernet connection 
 When board boots up, U-Boot prints a list of enabled Ethernet interfaces. 
 DPMAC2@xlaui4, DPMAC3@xgmii [PRIME], DPMAC4@xgmii, DPMAC5@25g-aui, DPMAC6@25g-aui, DPMAC17@rgmii-id, DPMAC18@rgmii-id, e1000#0 
 
 Set server IP address to the IP address of the host machine on which you have configured the TFTP server. 
 => setenv serverip <ipaddress1> 
 
 
 Set ethact and ethprime as the Ethernet interface connected to the TFTP server. 
 Note: See LX2160ARDB Ethernet port mapping for the mapping of Ethernet port names appearing on the chassis front panel with the port names in U-Boot and Linux.                                
 => setenv ethprime <name of interface connected to TFTP server> 
 For example: 
 => setenv ethprime DPMAC3@xgmii 
 => setenv ethact <name of interface connected to TFTP server> 
 For example: 
 => setenv ethact DPMAC3@xgmii 
 
 Set IP address of the board. You can set a static IP address or, if the board can connect to a dhcp server, you can use the dhcp command. 
 Static IP address assignment:  => setenv ipaddr <ipaddress2>  => setenv netmask <subnet mask> 
 => setenv gatewayIP <gateway IP> 
 Dynamic IP address assignment:  => dhcp 
 
 Save the settings. => saveenv 
 Check the connection between the board and the TFTP server. 
 
 => ping $serverip 
 Using DPMAC3@xgmii device 
 host 192.168.1.1 is alive 
 Load TF-A binaries for SD boot from the TFTP server 
 Note: For details about the flash image layout for TF-A binaries, refer LSDK memory layout for TF-A boot flow. 
 
 
 Flash bl2_sd.pbl: 
 
 => tftp 82000000 bl2_sd.pbl 
 => mmc dev 0; mmc write 82000000 8 <blk_cnt>
 Here, blk_cnt refers to number of blocks in SD card that need to be written as per the file size. 
 For example, when you load bl2_sd.pbl from the TFTP server, if the bytes transferred is 103353 (193b9 hex), then blk_cnt is calculated as "103353/512 = 201 (C9 hex)" + "few sectors for rounding up so that last block is not missed". So, if you round up by 10 (A hex) sectors, for this example, mmc write command will be: => mmc write 82000000 8 D3 
 
 
 
 Flash fip.bin:
 
 => tftp 82000000 fip.bin 
 
 => mmc dev 0;  mmc write 82000000 800 <blk_cnt> 
 Here, blk_cnt refers to number of blocks in SD card that need to be written as per the file size. 
 For example, when you load fip.bin from the TFTP server, if the bytes transferred is 1178967 (11fd57 hex), then blk_cnt is calculated as "1178967/512 = 2302 (8FE hex)" + "few sectors for rounding up so that last block is not missed". So, if you round up by 10 (A hex) sectors, for this example, mmc write command will be: =>  mmc write 82000000 800 908 
 
 
 
 Boot from SD card: => qixis_reset sd
 LX2160ARDB will boot with TF-A. In the boot log, you will see: 
 => NOTICE:  BL2: v1.5(release):LSDK-20.04
NOTICE:  BL2: Built : 22:01:10, Aug 20 2020
NOTICE:  UDIMM 18ADF2G72AZ-3G2E1
NOTICE:  DDR4 UDIMM with 2-rank 64-bit bus (x8)
NOTICE:  32 GB DDR4, 64-bit, CL=22, ECC on, 256B, CS0+CS1
NOTICE:  BL2: Booting BL31
NOTICE:  BL31: v1.5(release):LSDK-20.04
NOTICE:  BL31: Built : 22:02:07, Aug 20 2020
NOTICE:  Welc
U-Boot 2019.10 (Aug 14 2020 - 17:43:28 +0530)
SoC:  LX2160ACE Rev2.0 (0x87360020)
Clock Configuration:
       CPU0(A72):2000 MHz  CPU1(A72):2000 MHz  CPU2(A72):2000 MHz
       CPU3(A72):2000 MHz  CPU4(A72):2000 MHz  CPU5(A72):2000 MHz
       CPU6(A72):2000 MHz  CPU7(A72):2000 MHz  CPU8(A72):2000 MHz
       CPU9(A72):2000 MHz  CPU10(A72):2000 MHz  CPU11(A72):2000 MHz
       CPU12(A72):2000 MHz  CPU13(A72):2000 MHz  CPU14(A72):2000 MHz
       CPU15(A72):2000 MHz
       Bus:      700  MHz  DDR:      2900 MT/s
Reset Configuration Word (RCW):
       00000000: 50777738 24500050 00000000 00000000
       00000010: 00000000 0c010000 00000000 00000000
       00000020: 02e001a0 00002580 00000000 00000096
       00000030: 00000000 00000000 00000000 00000000
       00000040: 00000000 00000000 00000000 00000000
       00000050: 00000000 00000000 00000000 00000000
       00000060: 00000000 00000000 00027000 00000000
       00000070: 08b30010 00150020
Model: NXP Layerscape LX2160ARDB Board
Board: LX2160ACE Rev2.0-RDB, Board version: B, boot from SD
  
 
 Load TF-A binaries for eMMC boot from the TFTP server 
 Note: For details about the flash image layout for TF-A binaries, refer LSDK memory layout for TF-A boot flow. 
 
 
 Flash bl2_emmc.pbl: 
 
 => tftp 82000000 bl2_emmc.pbl 
 => mmc dev 1; mmc write 82000000 8 <blk_cnt>
 Here, blk_cnt refers to number of blocks in SD card that need to be written as per the file size. 
 For example, when you load bl2_emmc.pbl from the TFTP server, if the bytes transferred is 103353 (193b9 hex), then blk_cnt is calculated as "103353/512 = 201 (C9 hex)" + "few sectors for rounding up so that last block is not missed". So, if you round up by 10 (A hex) sectors, for this example, mmc write command will be: => mmc write 82000000 8 D3 
 
 
 
 Flash fip.bin:
 
 => tftp 82000000 fip.bin 
 
 => mmc dev 1; mmc write 82000000 800 <blk_cnt> 
 Here, blk_cnt refers to number of blocks in SD card that need to be written as per the file size. 
 For example, when you load fip.bin from the TFTP server, if the bytes transferred is 1178967 (11fd57 hex), then blk_cnt is calculated as "1178967/512 = 2302 (8FE hex)" + "few sectors for rounding up so that last block is not missed". So, if you round up by 10 (A hex) sectors, for this example, mmc write command will be: =>  mmc write 82000000 800 908 
 
 
 
 Boot from eMMC card: => qixis_reset emmc
 LX2160ARDB will boot with TF-A. In the boot log, you will see: 
   
 => NOTICE:  BL2: v1.5(release):LSDK-20.04
NOTICE:  BL2: Built : 22:01:10, Aug 20 2020
NOTICE:  UDIMM 18ADF2G72AZ-3G2E1
NOTICE:  DDR4 UDIMM with 2-rank 64-bit bus (x8)
NOTICE:  32 GB DDR4, 64-bit, CL=22, ECC on, 256B, CS0+CS1
NOTICE:  BL2: Booting BL31
NOTICE:  BL31: v1.5(release):LSDK-20.04
NOTICE:  BL31: Built : 22:02:07, Aug 20 2020
NOTICE:  Welc
U-Boot 2019.10 (Aug 14 2020 - 17:43:28 +0530)
SoC:  LX2160ACE Rev2.0 (0x87360020)
Clock Configuration:
       CPU0(A72):2000 MHz  CPU1(A72):2000 MHz  CPU2(A72):2000 MHz
       CPU3(A72):2000 MHz  CPU4(A72):2000 MHz  CPU5(A72):2000 MHz
       CPU6(A72):2000 MHz  CPU7(A72):2000 MHz  CPU8(A72):2000 MHz
       CPU9(A72):2000 MHz  CPU10(A72):2000 MHz  CPU11(A72):2000 MHz
       CPU12(A72):2000 MHz  CPU13(A72):2000 MHz  CPU14(A72):2000 MHz
       CPU15(A72):2000 MHz
       Bus:      700  MHz  DDR:      2900 MT/s
Reset Configuration Word (RCW):
       00000000: 50777738 24500050 00000000 00000000
       00000010: 00000000 0c010000 00000000 00000000
       00000020: 02e001a0 00002580 00000000 00000096
       00000030: 00000000 00000000 00000000 00000000
       00000040: 00000000 00000000 00000000 00000000
       00000050: 00000000 00000000 00000000 00000000
       00000060: 00000000 00000000 00027000 00000000
       00000070: 08b30010 00150020
Model: NXP Layerscape LX2160ARDB Board
Board: LX2160ACE Rev2.0-RDB, Board version: B, boot from eMMC
 
   
 
 
        
        記事全体を表示