hikey960移植optee记录

之前在QEMU上学习optee,学习CA和TA的开发。现在需要在开发板上运行,故购了开发板和显示屏。(谁知道开发板和显示屏大小差别那么大啊。汗||)当然之前在QEMU上运行的optee也需要移植到hikey960上了。下面就记录一下移植步骤。其实也算不上移植,因为使用的是optee所列的支持的开发板之一,按照上面的流程基本上没有什么问题,主要记录一下踩过的坑,供后来者参考。

设备和准备工作

开发板

开发板我使用的是hikey960 4GRAM+32UFS。之前看到optee的git上面讲支持的开发板时,支持的是3G+32G。买之前纠结好久,不知道4G的是否支持,或者说不知道需要做哪些改动。4G的当然是支持的,具体需要做哪些改动后面会说。

主机

一台linux的机器,我这里使用的是ubuntu18.0.4。

主机和开发板的连接

另外hikey960并没有引出串口,需要用USB-TTL,用杜邦线和开发板连接,另一边插电脑的USB接口,这个连接是用来作为开发板的控制台使用的;另外烧写的时候需要用Type-c连接开发板和电脑,这个连接是用来烧写镜像文件的。二者的作用不同的。在编译阶段,两个都不需要连接。

安装需要的依赖库:

不管需不需要,一股脑安上

$ sudo apt-get install android-tools-adb android-tools-fastboot autoconf \
	automake bc bison build-essential cscope curl device-tree-compiler \
	expect flex ftp-upload gdisk iasl libattr1-dev libc6:i386 libcap-dev \
	libfdt-dev libftdi-dev libglib2.0-dev libhidapi-dev libncurses5-dev \
	libpixman-1-dev libssl-dev libstdc++6:i386 libtool libz1:i386 make \
	mtools netcat python-crypto python-serial python-wand unzip uuid-dev \
xdg-utils xterm xz-utils zlib1g-dev

作者:漂流的猴子
来源:CSDN
原文:https://blog.csdn.net/shuaifengyun/article/details/71499619
版权声明:本文为博主原创文章,转载请附上博文链接!

1 下载optee代码

在主机上合适的地方建立一个文件夹,用来存放所需要的optee项目代码。例如将代码都存放在optee_hikey960目录里。

sudo mkdir optee_hikey960

进入该目录,初始化repo;

cd optee_hikey960
repo init -u https://github.com/OP-TEE/manifest.git -m hikey960.xml -b 3.3.0
repo sync

其中的-b 3.3.0 指定了使用的optee版本,可以根据情况使用更新的版本,我选择这个版本的原因后面会说。
如果在同步过程中出现“remote:Repository not found"则需要修改optee_hikey960/.repo目录下的manifest.xml文件,将该文件中所有的project域中的”.git"删除,也可以使用以下指令修改:

sed -i "s/\.git//g" .repo/manifest.xml

注意.repo目录是隐藏文件夹,看不到,但是初始化repo之后就确实存在了。
接下来就等待同步完成。同步的过程中会从各个仓库下载代码,会很耗时。下载的文件也很多,大概有五六个G。可以喝喝茶吃吃饭,等着它下载完。下载完成之后在你的optee_hikey960目录下会出现下面目录:

[email protected]:~/software/hikey960_3.3.0$ ls
arm-trusted-firmware  linux            optee_os     
build                 l-loader         optee_test     tools-images-hikey960
buildroot             OpenPlatformPkg  
grub                  optee_examples   patches_hikey

2 构建编译工具

build目录是编译时候的目录,里面有各种平台的Makefile文件以[platform].mk文件命名。那么hikey960的Makefile文件当然就是hikey960.mk了。切换的build目录然后执行make -f hikey960.mk toolchains

cd build
make toolchains

其实在同步repo之后,已经建立好-makefile的链接指向了hikey960.mk文件。所以在执行make命令的时候不需要指定文件名。
这一步会在optee_hikey960目录下新建一个toolchains目录,从网上下载所需的交叉编译工具并解压在该目录下。但是如果在下载过程中半天不动,就要看是不是网络url失效,可以去网上下载好所需的交叉编译工具包,再解压在该目录下,效果是一样的。可以在toolchains.mk文件查看需要的工具,以及上面的url(可能失效)然后在上面的网址查找工具。
构建好编译工具后在toolchains目录下会出现一下文件和目录:

drwxr-xr-x 9 wangzh wangzh      4096 2月  20 08:50 aarch32
drwxr-xr-x 9 wangzh wangzh      4096 2月  20 08:51 aarch64
-rw-rw-r-- 1 wangzh wangzh 227604276 2月  19 21:51 gcc-arm-8.2-2018.08-x86_64-aarch64-linux-gnu.tar.xz
-rw-rw-r-- 1 wangzh wangzh 222881624 2月  19 21:49 gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf.tar.xz

3 编译optee

同样在build目录下执行make命令,编译整个optee工程。同样也可以使用-f指定makefile文件。
在hikey960的optee编译过程中没遇到什么问题。但是记得在编译qemu的optee时遇到一点什么问题,好像是需要python,并且还要求python版本是二点多在三点几之间才行,不过也不难解决。编译过程中也会下载一些文件。编译完成后会出现out目录和out-br目录

4 烧写镜像文件

需要烧写的镜像文件都会在上一步中生成。烧写需要使用fastboot。可以自行查找fastboot的安装方法。
在build目录下执行make flash。 参考终端的引导步骤进行操作,具体来说就是:
首先设置跳线帽或者拨码开关
Jumper 1-2: Closed or Switch    1: On
   3-4: Open or      2: Off
   5-6: Closed or     3: On

然后给开发板供电,再使用Type-c连接开发板和电脑。然后继续按照引导步骤往下执行,就可以将镜像文件烧写进开发板。
注意事项:
1 使用fastboot的时候最后使用root权限 即使用命令:

sudo make flash

烧写过程会陆续烧写六个文件到对应的分区中,下面是正确烧写的信息:

< waiting for any device >
target reported max download size of 134217728 bytes
sending 'ptable' (24 KB)...
OKAY [  0.009s]
writing 'ptable'...
OKAY [  0.004s]
finished. total time: 0.013s
fastboot flash xloader /home/wangzh/software/hikey960_3.3.0/build/../tools-images-hikey960/hisi-sec_xloader.img
target reported max download size of 134217728 bytes
sending 'xloader' (151 KB)...
OKAY [  0.010s]
writing 'xloader'...
OKAY [  0.307s]
finished. total time: 0.317s
fastboot flash fastboot /home/wangzh/software/hikey960_3.3.0/build/../l-loader/l-loader.bin
target reported max download size of 134217728 bytes
sending 'fastboot' (25 KB)...
OKAY [  0.008s]
writing 'fastboot'...
OKAY [  0.053s]
finished. total time: 0.061s
fastboot flash fip /home/wangzh/software/hikey960_3.3.0/build/../arm-trusted-firmware/build/hikey960/release/fip.bin
target reported max download size of 134217728 bytes
sending 'fip' (1519 KB)...
OKAY [  0.071s]
writing 'fip'...
OKAY [  0.062s]
finished. total time: 0.133s
fastboot flash nvme /home/wangzh/software/hikey960_3.3.0/build/../tools-images-hikey960/hisi-nvme.img
target reported max download size of 134217728 bytes
sending 'nvme' (128 KB)...
OKAY [  0.034s]
writing 'nvme'...
OKAY [  0.051s]
finished. total time: 0.085s
fastboot flash boot /home/wangzh/software/hikey960_3.3.0/build/../out/boot-fat.uefi.img
target reported max download size of 134217728 bytes
sending 'boot' (65536 KB)...
OKAY [  1.926s]
writing 'boot'...
OKAY [  0.617s]

5 重启开发板

重新拨码设置
switch 1 on
switch 2 off
switch 3 off
供电重启开发板。即可进入系统

6 可能遇到的问题

如果一切顺利的话,进入系统。执行xtest测试程序或者其他实例程序,程序正常输出,那可以恭喜你安装成功。那我讲一下我遇到的问题和踩过的坑。
 之前在第一步,同步repo的时候我使用的命令是

repo init -u https://github.com/OP-TEE/manifest.git -m hikey960.xml 

没有使用-b 3.3.0指定分支号(版本号)。这样的话会使用最新的版本,可能再次同步的话会从仓库里获取更新的版本,当然这个并不算是什么问题,而后来加上-b 3.3.0这个选项是因为遇到了下面这个问题。就是在编译安装好,进入系统执行xtest的时候出现了错误:

 #xtest
Run test suite with level=0

TEE test application started with device [(null)]
######################################################
#
regression
#
######################################################
 
* regression_1001 Core self tests
E/TC:6 0 tee_entry_std:536 Bad arg address 0x217061000
regression_1000.c:246: res has an unexpected value: 0xffff000e = 
TEEC_ERROR_COMMUNICATION, expected 0x0 = TEEC_SUCCESS
Segmentation fault

在网上搜索,看到一个外国大兄弟发帖遇到同样的问题,按照回复建议使用最新的release版本后解决了这个问题。于是我才使用了这个版本的optee。同样也是在这里,回答了前面的对于4G版本的hikey960需要修改哪些配置的问题。需要在hikey960.mk文件的第178行附近增加 CFG_DRAM_SIZE_GB=4
配置:

     OPTEE_OS_COMMON_FLAGS += PLATFORM=hikey-hikey960 \
                        CFG_CONSOLE_UART=$(CFG_CONSOLE_UART) \
-                       CFG_SECURE_DATA_PATH=n
+                       CFG_SECURE_DATA_PATH=n \
+                       CFG_DRAM_SIZE_GB=4

如果你直接使用的就是这个版本的optee的话,可能没有遇到这个问题。但是我改为v3.3.0版本后在进入系统的时候遇到问题:

NOTICE: BL2: v1.4(release):
NOTICE: BL2: Built : 10:04:52, Mar 18 2019
NOTICE: ufs: H**** device must set VS_DebugSaveConfigTime 0x10
NOTICE: BL2: Booting BL31
NOTICE: BL31: v1.4(release):
NOTICE: BL31: Built : 10:04:54, Mar 18 2019
D/TC:0 0 add_phys_mem:539 TEE_SHMEM_START type NSEC_SHM 0x3ee00000 size 0x00200000
D/TC:0 0 add_phys_mem:539 TA_RAM_START type TA_RAM 0x3f200000 size 0x00e00000
D/TC:0 0 add_phys_mem:539 VCORE_UNPG_RW_PA type TEE_RAM_RW 0x3f04e000 size 0x001b2000
D/TC:0 0 add_phys_mem:539 VCORE_UNPG_RX_PA type TEE_RAM_RX 0x3f000000 size 0x0004e000
D/TC:0 0 add_phys_mem:539 CONSOLE_UART_BASE type IO_NSEC 0xffe00000 size 0x00200000
D/TC:0 0 verify_special_mem_areas:483 NSEC DDR memory [40000000 100000000]
D/TC:0 0 verify_special_mem_areas:483 NSEC DDR memory [0 3e000000]
E/TC:0 0 verify_special_mem_areas:514 [40000000 100000000] intersects [ffe00000 100000000]
E/TC:0 0 Panic ‘Special memory intersection’ at core/arch/arm/mm/core_mmu.c:515 <verify_special_mem_areas>
E/TC:0 0 Call stack:
E/TC:0 0 0x000000003f00c504
D/TC:0 0 unwind_stack_arm64:56 FP out of bounds 0x3f0a8ce0

看样子是在检查安全内存和分安全是否有交叠的时候出现的异常。同样也是在这个地方请教,给出的建议:

It seems to be a known issue here [1]. And its fix has been included in v3.4.0 release. So I would suggest you to try latest v3.4.0 release or else you need to backport the fix.

[1] https://github.com/OP-TEE/optee_os/issues/2597

这个问题是在github上提出的一个已知的问题,确实是一个bug,并且在新版本以后已经得到解决。所以建议使用3.4.0以后的版本。或者按照这个链接里面的提示把 optee_os/core/arch/arm/plat_hikey/platform_config.h文件里第124行附近的 DRAM1_SIZE_NSEC 改为0xA0000000。重新编译即可得到解决。
正确安装后,在开发板上运行xtest的输出结果:
hikey960移植optee记录

一些感想

在国外的论坛上,真的是有好心的大兄弟认真地回复。在我测试xtest遇到问题的时候,看到这个上面那个帖子,真的是如同抓住了救命稻草一般,因为这是一个有些偏的领域,又是如此具体的问题,在百度上搜到的与hikey960相关的大多是怎样使用fastboot烧写asop,并且千篇一律,或者干脆用机器翻译英文的指导,改都不改。在我以为将版本改为3.3.0以后也能同样地解决问题的时候,发现又不能进入系统了,又向那个帖子里面,给出回复的人发问请教,也一边摸索着解决。半天没能解决,心烦意乱加绝望,明明别人就是这样解决的问什么我有出现了这个问题呢。绝望中反而将那个发问作为唯一的希望,看到回复之后真的激动。不得不敬佩外国大兄弟的开源精神。另外这个问题确实是在giithub上提出来过,但是我却没有找到。看来自己找资料解决问题的方法还是需要提高。