1# OP-TEE Trusted OS 2## Contents 31. [Introduction](#1-introduction) 42. [License](#2-license) 53. [Platforms supported](#3-platforms-supported) 6 3. [Development board for community user] (#31-development-board-for-community-user) 74. [Get and build OP-TEE software](#4-get-and-build-op-tee-software) 8 4. [Prerequisites](#41-prerequisites) 9 4. [Basic setup](#42-basic-setup) 10 4. [STMicroelectronics boards](#44-stmicroelectronics-boards) 11 4. [Allwinner A80](#45-allwinner-a80) 12 4. [Freescale MX6UL EVK](#46-freescale-mx6ul-evk) 135. [repo manifests](#5-repo-manifests) 14 5. [Install repo](#51-install-repo) 15 5. [Get the source code](#52-get-the-source-code) 16 5. [Targets](#521-targets) 17 5. [Branches](#522-branches) 18 5. [Get the toolchains](#523-get-the-toolchains) 19 5. [QEMU](#53-qemu) 20 5. [FVP](#54-fvp) 21 5. [HiKey](#55-hikey) 22 5. [MT8173-EVB](#56-mt8173-evb) 23 5. [Juno](#57-juno) 24 5. [Update flash and its layout](#571-update-flash-and-its-layout) 25 5. [GlobalPlatform testsuite support](#572-globalplatform-testsuite-support) 26 5. [GCC5 support](#573-gcc5-support) 27 5. [Tips and tricks](#58-tips-and-tricks) 28 5. [Reference existing project to speed up repo sync](#581-reference-existing-project-to-speed-up-repo-sync) 29 5. [Use ccache](#582-use-ccache) 306. [Load driver, tee-supplicant and run xtest](#6-load-driver-tee-supplicant-and-run-xtest) 317. [Coding standards](#7-coding-standards) 32 7. [checkpatch](#71-checkpatch) 33 34# 1. Introduction 35The `optee_os git`, contains the source code for the TEE in Linux using the 36ARM® TrustZone® technology. This component meets the GlobalPlatform 37TEE System Architecture specification. It also provides the TEE Internal core API 38v1.1 as defined by the GlobalPlatform TEE Standard for the development of 39Trusted Applications. For a general overview of OP-TEE and to find out how to 40contribute, please see the [Notice.md](Notice.md) file. 41 42The Trusted OS is accessible from the Rich OS (Linux) using the 43[GlobalPlatform TEE Client API Specification v1.0](http://www.globalplatform.org/specificationsdevice.asp), 44which also is used to trigger secure execution of applications within the TEE. 45 46--- 47## 2. License 48The software is distributed mostly under the 49[BSD 2-Clause](http://opensource.org/licenses/BSD-2-Clause) open source 50license, apart from some files in the `optee_os/lib/libutils` directory 51which are distributed under the 52[BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) or public domain 53licenses. 54 55--- 56## 3. Platforms supported 57Several platforms are supported. In order to manage slight differences 58between platforms, a `PLATFORM_FLAVOR` flag has been introduced. 59The `PLATFORM` and `PLATFORM_FLAVOR` flags define the whole configuration 60for a chip the where the Trusted OS runs. Note that there is also a 61composite form which makes it possible to append `PLATFORM_FLAVOR` directly, 62by adding a dash in-between the names. The composite form is shown below 63for the different boards. For more specific details about build flags etc, 64please read the file [build_system.md](documentation/build_system.md). Some 65platforms have different sub-maintainers, please refer to the file 66[MAINTAINERS.md](MAINTAINERS.md) for contact details for various platforms. 67 68<!-- Please keep this list sorted in alphabetic order --> 69| Platform | Composite PLATFORM flag | Publicly available? | 70|----------|-------------------------|---------------------| 71| [Allwinner A80 Board](http://www.allwinnertech.com/en/clq/processora/A80.html)|`PLATFORM=sunxi`| No | 72| [ARM Juno Board](http://www.arm.com/products/tools/development-boards/versatile-express/juno-arm-development-platform.php) |`PLATFORM=vexpress-juno`| Yes | 73| [FSL ls1021a](http://www.freescale.com/tools/embedded-software-and-tools/hardware-development-tools/tower-development-boards/mcu-and-processor-modules/powerquicc-and-qoriq-modules/qoriq-ls1021a-tower-system-module:TWR-LS1021A?lang_cd=en)|`PLATFORM=ls-ls1021atwr`| Yes | 74| [FSL i.MX6 UltraLite EVK Board](http://www.freescale.com/products/arm-processors/i.mx-applications-processors-based-on-arm-cores/i.mx-6-processors/i.mx6qp/i.mx6ultralite-evaluation-kit:MCIMX6UL-EVK) |`PLATFORM=imx`| Yes | 75| [ARM Foundation FVP](http://www.arm.com/fvp) |`PLATFORM=vexpress-fvp`| Yes | 76| [HiKey Board (HiSilicon Kirin 620)](https://www.96boards.org/products/hikey)|`PLATFORM=hikey`| Yes | 77| [MediaTek MT8173 EVB Board](http://www.mediatek.com/en/products/mobile-communications/tablet/mt8173)|`PLATFORM=mediatek-mt8173`| No | 78| [QEMU](http://wiki.qemu.org/Main_Page) |`PLATFORM=vexpress-qemu_virt`| Yes | 79| [STMicroelectronics b2120 - h310 / h410](http://www.st.com/web/en/catalog/mmc/FM131/SC999/SS1628/PF258776) |`PLATFORM=stm-cannes`| No | 80| [STMicroelectronics b2020-h416](http://www.st.com/web/catalog/mmc/FM131/SC999/SS1633/PF253155?sc=internet/imag_video/product/253155.jsp)|`PLATFORM=stm-orly2`| No | 81| [Texas Instruments DRA7xx](http://www.ti.com/product/DRA746)|`PLATFORM=ti-dra7xx`| Yes | 82| [Xilinx Zynq UltraScale+ MPSOC](http://www.xilinx.com/products/silicon-devices/soc/zynq-ultrascale-mpsoc.html)|`PLATFORM=zynqmp-zcu102`| Yes | 83 84### 3.1 Development board for community user 85For community users, we suggest using [HiKey board](https://www.96boards.org/products/ce/hikey/) 86as development board. It provides detailed documentation including chip 87datasheet, board schematics, source code, binaries etc on the download link at 88the website. 89 90--- 91## 4. Get and build OP-TEE software 92There are a couple of different build options depending on the target you are 93going to use. If you just want to get the software and compile it, then you 94should follow the instructions under the "Basic setup" below. In case you are 95going to run for a certain hardware or FVP, QEMU for example, then please follow 96the respective section found below instead, having that said, we are moving from 97the shell script based setups to instead use 98[repo](https://source.android.com/source/downloading.html), so for some targets 99you will see that we are using repo ([section 5](#5-repo-manifests)) and for 100others we are still using the shell script based setup 101([section 4](#4-get-and-build-op-tee-software)), please see this transitions as 102work in progress. 103 104--- 105### 4.1 Prerequisites 106We believe that you can use any Linux distribution to build OP-TEE, but as 107maintainers of OP-TEE we are mainly using Ubuntu-based distributions and to be 108able to build and run OP-TEE there are a few packages that needs to be installed 109to start with. Therefore install the following packages regardless of what 110target you will use in the end. 111``` 112$ sudo apt-get install android-tools-adb android-tools-fastboot autoconf bison \ 113 cscope curl flex gdisk libc6:i386 libfdt-dev \ 114 libglib2.0-dev libpixman-1-dev libstdc++6:i386 \ 115 libz1:i386 netcat python-crypto python-serial \ 116 python-wand uuid-dev xdg-utils xz-utils zlib1g-dev 117``` 118 119--- 120### 4.2 Basic setup 121#### 4.2.1 Get the compiler 122We strive to use the latest available compiler from Linaro. Start by downloading 123and unpacking the compiler. Then export the `PATH` to the compilers `bin` 124folder. Beware that we are using a couple of different toolchains depending on 125the target device. This includes both 64- and 32-bit toolchains. For the exact 126toolchain in use, please have a look at [toolchain.mk](https://github.com/OP-TEE/build/blob/master/toolchain.mk) 127and then look at the targets makefile (see [build.git](https://github.com/OP-TEE/build)) 128to find out where the respective toolchain will be used. For example in the 129[QEMU makefile](https://github.com/OP-TEE/build/blob/master/qemu.mk#L12-L15) you 130will see: 131``` 132CROSS_COMPILE_NS_USER ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 133CROSS_COMPILE_NS_KERNEL ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 134CROSS_COMPILE_S_USER ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 135CROSS_COMPILE_S_KERNEL ?= "$(CCACHE)$(AARCH32_CROSS_COMPILE)" 136``` 137 138However, if you only want to compile optee_os, then you can do like this: 139``` 140$ cd $HOME 141$ mkdir toolchains 142$ cd toolchains 143$ wget http://releases.linaro.org/14.08/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux.tar.xz 144$ tar xvf gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux.tar.xz 145$ export PATH=$HOME/toolchains/gcc-linaro-arm-linux-gnueabihf-4.9-2014.08_linux/bin:$PATH 146``` 147 148#### 4.2.2 Download the source code 149``` 150$ cd $HOME 151$ mkdir devel 152$ cd devel 153$ git clone https://github.com/OP-TEE/optee_os.git 154``` 155 156#### 4.2.3 Build 157``` 158$ cd $HOME/devel/optee_os 159$ CROSS_COMPILE=arm-linux-gnueabihf- make 160``` 161 162#### 4.2.4 Compiler flags 163To be able to see the full command when building you could build using 164following flag: 165``` 166$ make V=1 167``` 168 169To enable debug builds use the following flag: 170``` 171$ make DEBUG=1 172``` 173 174OP-TEE supports a couple of different levels of debug prints for both TEE core 175itself and for the Trusted Applications. The level ranges from 1 to 4, where 176four is the most verbose. To set the level you use the following flag: 177``` 178$ make CFG_TEE_CORE_LOG_LEVEL=4 179``` 180 181--- 182### 4.4 STMicroelectronics boards 183Currently OP-TEE is supported on Orly-2 (`b2020-h416`) and Cannes family 184(`b2120` both `h310` and `h410` chip). 185 186#### 4.4.1 Get the compiler for Orly-2 187Will be written soon. 188 189#### 4.4.2 Download the source code 190See section "4.2.2 Download the source code". 191 192#### 4.4.3 Build for Orly-2 193For Orly-2 do as follows 194``` 195$ PLATFORM=stm-orly2 CROSS_COMPILE=arm-linux-gnueabihf- make 196``` 197 198For Cannes family do as follows 199``` 200$ PLATFORM=stm-cannes CROSS_COMPILE=arm-linux-gnueabihf- make 201``` 202 203#### 4.4.4 Prepare and install the images 204Will be written soon. 205 206#### 4.4.5 Boot and run the software 207<!-- All magic with STM and so on must be stated here. --> 208Will be written soon. 209 210--- 211### 4.5 Allwinner A80 212 213#### 4.5.1 Locked versus unlocked A80 boards 214**Important!** All A80 boards sold to the general public are boards where secure 215side has been locked down, which means that you **cannot** use them for secure 216side development, i.e, it will not be possible to put OP-TEE on those devices. 217If you want to use A80 board for secure side development, then you will need to 218talk to 219[Allwinner](https://github.com/OP-TEE/optee_os/blob/master/MAINTAINERS.md) 220directly and ask if it is possible get a device from them. 221 222#### 4.5.2 Get the compiler and source 223Follow the instructions in the "4.2 Basic setup". 224 225#### 4.5.3 Build 226``` 227$ cd optee_os 228$ export PLATFORM=sunxi 229$ export CROSS_COMPILE=arm-linux-gnueabihf- 230$ make 231``` 232 233#### 4.5.4 Prepare the images to run on A80 Board 234 235Download Allwinner A80 platform SDK, the SDK refers to Allwinner A80 platform 236SDK root directory. A80 SDK directory tree looks like this: 237``` 238SDK/ 239 Android 240 lichee 241``` 242`Android` contains all source code related to Android and `lichee` 243contains the bootloader and Linux kernel. 244 245##### 4.5.4.1 Copy OP-TEE output to package directory 246Copy the OP-TEE output binary to `SDK/lichee/tools/pack/sun9i/bin` 247 248``` 249$ cd optee_os 250$ cp ./out/arm32-plat-sunxi/core/tee.bin SDK/lichee/tools/pack/sun9i/bin 251``` 252 253##### 4.5.4.2 Build Linux kernel 254In the `lichee` directory, run the following commands: 255``` 256$ cd SDK/lichee 257$ ./build.sh 258``` 259 260##### 4.5.4.3 Build Android 261In the Android directory, run the following commands: 262``` 263$ cd SDK/android 264$ extract-bsp 265$ make -j 266``` 267 268##### 4.5.4.4 Create the Android image 269In the Android directory, run the following commands: 270``` 271$ cd SDK/android 272$ pack 273``` 274The output image will been signed internally when packed. The output image name 275is `a80_android_board.img`. 276 277##### 4.5.4.5 Download the Android image 278Use `Allwinner PhoenixSuit` tool to download to A80 board. 279Choose the output image(`a80_android_board.img`), select download and wait 280for the download to complete. 281 282#### 4.5.5 Boot and run the software on A80 Board 283When the host platform is Windows, use a console application to connect A80 284board `uart0`. In the console window, You can install OP-TEE linux kernel 285driver `optee.ko`, load OP-TEE-Client daemon `tee-supplicant` and run 286the example "hello world" Trusted Application, do this by running: 287``` 288$ insmod /system/vendor/modules/optee.ko 289$ /system/bin/tee-supplicant & 290$ /system/bin/tee-helloworld 291``` 292 293--- 294### 4.6 Freescale MX6UL EVK 295Build: 296``` 297 PLATFORM_FLAVOR=mx6ulevk make PLATFORM=imx 298 ${CROSS_COMPILE}-objcopy -O binary out/arm-plat-imx/core/tee.elf optee.bin 299 copy optee.bin to the first partition of SD card which is used for boot. 300``` 301Run using U-Boot: 302``` 303 run loadfdt; 304 run loadimage; 305 fatload mmc 1:1 0x9c100000 optee.bin; 306 run mmcargs; 307 bootz ${loadaddr} - ${fdt_addr}; 308``` 309 310Note: 311 CAAM is not implemented now, this will be added later. 312 313--- 314## 5. repo manifests 315 316A Git repository is available at https://github.com/OP-TEE/manifest where you 317will find XML-files for use with the Android 'repo' tool. 318 319### 5.1. Install repo 320Follow the instructions under the "Installing Repo" section 321[here](https://source.android.com/source/downloading.html). 322 323### 5.2. Get the source code 324First ensure that you have the necessary Ubuntu packages installed, see [4.1 325Prerequisites](#41-prerequisites) (this is the only important step from section 3264 in case you are setting up any of the target devices mentioned below). 327 328``` 329$ mkdir -p $HOME/devel/optee 330$ cd $HOME/devel/optee 331$ repo init -u https://github.com/OP-TEE/manifest.git -m ${TARGET}.xml [-b ${BRANCH}] 332$ repo sync 333``` 334**Notes**<br> 335* The folder could be at any location, we are just giving a suggestion by 336 saying `$HOME/devel/optee`. 337* `repo sync` can take an additional parameter -j to sync multiple remotes. For 338 example `repo sync -j3` will sync three remotes in parallel. 339 340#### 5.2.1 Targets 341| Target | Latest | Stable | 342|--------|--------|--------| 343| QEMU | `default.xml` | `default_stable.xml` | 344| FVP | `fvp.xml` | `fvp_stable.xml` | 345| HiKey | `hikey.xml` | `hikey_stable.xml` | 346| HiKey Debian (experimental) | `hikey_debian.xml` | Not available | 347| MediaTek MT8173 EVB Board | `mt8173-evb.xml` | `mt8173-evb_stable.xml` | 348| ARM Juno board| `juno.xml` | `juno_stable.xml` | 349 350#### 5.2.2 Branches 351Currently we are only using one branch, i.e, the `master` branch. 352 353#### 5.2.3 Get the toolchains 354This is a one time thing you run only once after getting all the source code 355using repo. 356``` 357$ cd build 358$ make toolchains 359``` 360 361--- 362### 5.3. QEMU 363After getting the source and toolchain, just run (from the `build` folder) 364``` 365$ make all run 366``` 367and everything should compile and at the end QEMU should start. 368 369--- 370### 5.4. FVP 371After getting the source and toolchain you must also obtain Foundation Model 372([link](http://www.arm.com/products/tools/models/fast-models/foundation-model.php)) 373binaries and untar it to the forest root, then just run (from the `build` folder) 374 375``` 376$ make all run 377``` 378and everything should compile and at the end FVP should start. 379 380--- 381### 5.5. HiKey 382#### 5.5.1 Initramfs based 383After getting the source and toolchain, just run (from the `build` folder) 384``` 385$ make all 386``` 387 388After that connect the board and flash the binaries by running: 389``` 390$ make flash 391``` 392 393(more information about how to flash individual binaries could be found 394[here](https://github.com/96boards/documentation/wiki/HiKeyUEFI#flash-binaries-to-emmc-)) 395 396The board is ready to be booted. 397#### 5.5.2 Debian based / 96boards RPB (experimental) 398Start by getting the source and toolchain (see above), then continue by 399downloading the system image (root fs). Note that this step is something you 400only should do once. 401 402``` 403$ make system-img 404``` 405 406Which should be followed by 407``` 408$ make all 409``` 410 411When everything has been built, flash the files to the device: 412``` 413$ make flash 414``` 415 416Now you can boot up the device, note that OP-TEE normal world binaries still 417hasn't been put on the device at this stage. So by now you're basically booting 418up an RPB build. When you have a prompt, the next step is to connect the device 419to the network. WiFi is preferable, since HiKey has no Ethernet jack. Easiest is 420to edit `/etc/network/interfaces`. To find out what to add, run: 421``` 422$ make help 423``` 424 425When that's been added, reboot and when you have a prompt again, you're ready to 426push the OP-TEE client binaries and the kernel with OP-TEE support. First find 427out the IP for your device (`ifconfig`). Then send the files to HiKey by 428running: 429``` 430$ IP=111.222.333.444 make send 431 432Credentials for the image are: 433username: linaro 434password: linaro 435``` 436 437When the files has been transfered, please follow the commands from the `make 438send` command which will install the debian packages on the device. Typically it 439tells you to run something like this on the device itself: 440``` 441$ dpkg --force-all -i /tmp/out/optee_2.0-1.deb 442$ dpkg --force-all -i /tmp/linux-image-*.deb 443``` 444 445Now you are ready to use OP-TEE on HiKey using Debian, please goto step 6 below 446to continue. 447 448##### Good to know 449Just want to update secure side? Put the device in fastboot mode and 450``` 451$ make arm-tf 452$ make flash-fip 453 454``` 455 456Just want to update OP-TEE client software? Put the device in fastboot mode and 457``` 458$ make optee-client 459$ make xtest 460``` 461 462Boot up the device and follow the instructions from make send 463``` 464$ IP=111.222.333.444 make send 465``` 466 467--- 468### 5.6. MT8173-EVB 469After getting the source and toolchain, just run (from the `build` folder) 470 471``` 472$ make all run 473``` 474 475When `< waiting for device >` prompt appears, press reset button and the 476flashing procedure should begin. 477 478--- 479### 5.7 Juno 480After getting the source and toolchain, just run (from the `build` folder) 481``` 482$ make all 483``` 484 485Enter the firmware console on the juno board and press enter to stop 486the auto boot flow 487``` 488ARM V2M_Juno Firmware v1.3.9 489Build Date: Nov 11 2015 490 491Time : 12:50:45 492Date : 29:03:2016 493 494Press Enter to stop auto boot... 495 496``` 497Enable ftp at the firmware prompt 498``` 499Cmd> ftp_on 500Enabling ftp server... 501 MAC address: xxxxxxxxxxxx 502 503 IP address: 192.168.1.158 504 505 Local host name = V2M-JUNO-A2 506``` 507 508Flash the binary by running (note the IP address from above): 509``` 510make JUNO_IP=192.168.1.158 flash 511``` 512 513Once the binaries are transferred, reboot the board: 514``` 515Cmd> reboot 516 517``` 518 519#### 5.7.1 Update flash and its layout 520The flash in the board may need to be updated for the flashing above to 521work. If the flashing fails or if ARM-TF refuses to boot due to wrong 522version of the SCP binary the flash needs to be updated. To update the 523flash please follow the instructions at [Using Linaro's deliverable on 524Juno](https://community.arm.com/docs/DOC-10804) selecting one of the zips 525under "4.1 Prebuilt configurations" flashing it as described under "5. 526Running the software". 527 528#### 5.7.2 GlobalPlatform testsuite support 529##### Warning : 530Depending on the Juno pre-built configuration, the built ramdisk.img 531size with GlobalPlatform testsuite may exceed its pre-defined Juno flash 532memory reserved location (image.txt file). 533In that case, you will need to extend the Juno flash block size reserved 534location for the ramdisk.img in the image.txt file accordingly and 535follow the instructions under "5.7.1 Update flash and its layout". 536 537##### Example with juno-latest-busybox-uboot.zip: 538The current ramdisk.img size with GlobalPlatform testsuite 539is 8.6 MBytes. 540 541###### Updated file is /JUNO/SITE1/HBI0262B/images.txt (limited to 8.3 MB) 542``` 543NOR4UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 544NOR4ADDRESS: 0x01800000 ;Image Flash Address 545NOR4FILE: \SOFTWARE\ramdisk.img ;Image File Name 546NOR4NAME: ramdisk.img 547NOR4LOAD: 00000000 ;Image Load Address 548NOR4ENTRY: 00000000 ;Image Entry Point 549``` 550 551###### Extended to 16MB 552``` 553NOR4UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 554NOR4ADDRESS: 0x01000000 ;Image Flash Address 555NOR4FILE: \SOFTWARE\ramdisk.img ;Image File Name 556NOR4NAME: ramdisk.img 557NOR4LOAD: 00000000 ;Image Load Address 558NOR4ENTRY: 00000000 ;Image Entry Point 559``` 560 561#### 5.7.3 GCC5 support 562##### Note : 563In case you are using the **Latest version** of the ARM Juno board (this is 564`juno.xml` manifest), the built `ramdisk.img` size with GCC5 compiler, at 565the moment, exceeds its pre-defined Juno flash memory reserved location 566(`image.txt` file). 567 568To solve this problem you will need to extend the Juno flash block size 569reserved location for the `ramdisk.img` and decrease the size for other 570images in the `image.txt` file accordingly and then follow the instructions 571under "5.7.1 Update flash and its layout". 572 573##### Example with juno-latest-busybox-uboot.zip: 574The current `ramdisk.img` size with GCC5 compiler is 29.15 MBytes we will 575extend it to 32 MBytes. The only changes that you need to do are those in 576**bold** 577 578###### File to update is /JUNO/SITE1/HBI0262B/images.txt 579<pre> 580NOR2UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 581NOR2ADDRESS: <b>0x00100000</b> ;Image Flash Address 582NOR2FILE: \SOFTWARE\Image ;Image File Name 583NOR2NAME: norkern ;Rename kernel to norkern 584NOR2LOAD: 00000000 ;Image Load Address 585NOR2ENTRY: 00000000 ;Image Entry Point 586 587NOR3UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 588NOR3ADDRESS: <b>0x02C00000</b> ;Image Flash Address 589NOR3FILE: \SOFTWARE\juno.dtb ;Image File Name 590NOR3NAME: board.dtb ;Specify target filename to preserve file extension 591NOR3LOAD: 00000000 ;Image Load Address 592NOR3ENTRY: 00000000 ;Image Entry Point 593 594NOR4UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 595NOR4ADDRESS: <b>0x00D00000</b> ;Image Flash Address 596NOR4FILE: \SOFTWARE\ramdisk.img ;Image File Name 597NOR4NAME: ramdisk.img 598NOR4LOAD: 00000000 ;Image Load Address 599NOR4ENTRY: 00000000 ;Image Entry Point 600 601NOR5UPDATE: AUTO ;Image Update:NONE/AUTO/FORCE 602NOR5ADDRESS: <b>0x02D00000</b> ;Image Flash Address 603NOR5FILE: \SOFTWARE\hdlcdclk.dat ;Image File Name 604NOR5LOAD: 00000000 ;Image Load Address 605NOR5ENTRY: 00000000 ;Image Entry Point 606</pre> 607 608--- 609### 5.8 Tips and tricks 610#### 5.8.1 Reference existing project to speed up repo sync 611Doing a `repo init`, `repo sync` from scratch can take a fair amount of time. 612The main reason for that is simply because of the size of some of the gits we 613are using, like for the Linux kernel and EDK2. With repo you can reference an 614existing forest and by doing so you can speed up repo sync to instead taking ~20 615seconds instead of an hour. The way to do this are as follows. 616 6171. Start by setup a clean forest that you will not touch, in this example, let 618 us call that `optee-ref` and put that under for `$HOME/devel/optee-ref`. This 619 step will take roughly an hour. 6202. Then setup a cronjob (`crontab -e`) that does a `repo sync` in this folder 621 particular folder once a night (that is more than enough). 6223. Now you should setup your actual tree which you are going to use as your 623 working tree. The way to do this is almost the same as stated in the 624 instructions above, the only difference is that you reference the other local 625 forest when running `repo init`, like this 626 ``` 627 repo init -u https://github.com/OP-TEE/manifest.git --reference /home/jbech/devel/optee-ref 628 ``` 6294. The rest is the same above, but now it will only take a couple of seconds to 630 clone a forest. 631 632Normally step 1 and 2 above is something you will only do once. Also if you 633ignore step 2, then you will still get the latest from official git trees, since 634repo will also check for updates that aren't at the local reference. 635 636#### 5.8.2. Use ccache 637ccache is a tool that caches build object-files etc locally on the disc and can 638speed up build time significantly in subsequent builds. On Debian-based systems 639(Ubuntu, Mint etc) you simply install it by running: 640``` 641$ sudo apt-get install ccache 642``` 643 644The helper makefiles are configured to automatically find and use ccache if 645ccache is installed on your system, so other than having it installed you don't 646have to think about anything. 647 648--- 649## 6. Load driver, tee-supplicant and run xtest 650Since release v2.0.0 you don't have to load the kernel driver explicitly. In the 651standard configuration it will be built into the kernel directly. To actually 652run something on a device you however need to run tee-supplicant. This is the 653same for all platforms, so when a device has booted, then run 654``` 655$ tee-supplicant & 656``` 657and OP-TEE is ready to be used. 658 659In case you want to try run something that triggers both normal and secure side 660code you could run xtest (the main test suite for OP-TEE), run 661``` 662$ xtest 663``` 664 665--- 666## 7. Coding standards 667In this project we are trying to adhere to the same coding convention as used in 668the Linux kernel (see 669[CodingStyle](https://www.kernel.org/doc/Documentation/CodingStyle)). We achieve this by running 670[checkpatch](http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/scripts/checkpatch.pl) 671from Linux kernel. However there are a few exceptions that we had to make since 672the code also follows GlobalPlatform standards. The exceptions are as follows: 673 674- CamelCase for GlobalPlatform types are allowed. 675- And we also exclude checking third party code that we might use in this 676 project, such as LibTomCrypt, MPA, newlib (not in this particular git, but 677 those are also part of the complete TEE solution). The reason for excluding 678 and not fixing third party code is because we would probably deviate too much 679 from upstream and therefore it would be hard to rebase against those projects 680 later on (and we don't expect that it is easy to convince other software 681 projects to change coding style). 682 683### 7.1 checkpatch 684Since checkpatch is licensed under the terms of GNU GPL License Version 2, we 685cannot include this script directly into this project. Therefore we have 686written the Makefile so you need to explicitly point to the script by exporting 687an environment variable, namely CHECKPATCH. So, suppose that the source code for 688the Linux kernel is at `$HOME/devel/linux`, then you have to export like follows: 689 690 $ export CHECKPATCH=$HOME/devel/linux/scripts/checkpatch.pl 691thereafter it should be possible to use one of the different checkpatch targets 692in the [Makefile](Makefile). There are targets for checking all files, checking 693against latest commit, against a certain base-commit etc. For the details, read 694the [Makefile](Makefile). 695