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