天天看點

OP-TEE在HIKEY上的編譯、運作與測試

筆者使用的是UBUNTU14.04 版本,OP-TEE官方的方法嘗試失敗,故采用如下方法移植成功:(注意:由于OP-TEE更新後删除了optee_linux_driver,導緻此方法已經失效)

1. 建立目錄并下載下傳相應交叉編譯器,并設定環境變量。

mkdir arm-tc arm64-tc
tar --strip-components= -C ${PWD}/arm-tc -xf gcc-linaro-arm-linux-gnueabihf--*_linux.tar.xz
tar --strip-components= -C ${PWD}/arm64-tc -xf gcc-linaro-aarch64-linux-gnu--*_linux.tar.xz
export PATH=${PWD}/arm-tc/bin:${PWD}/arm64-tc/bin:$PATH
           

若已經下載下傳過官方的OP-TEE,可以通過/build目錄下運作make toolchains指令啟動toolchains.mk腳本進行下載下傳。

2. 下載下傳并編譯Linux kernel:

git clone -b hikey --depth  https://github.com/96boards-hikey/linux.git

export LINUX_DIR=${PWD}/linux
export LOCALVERSION="-linaro-hikey"

cd ${LINUX_DIR}
make distclean 
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig 
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j`nproc` Image modules hi6220-hikey.dtb
cd ..
           

注意:這裡的$(PWD)預設為根目錄,若根目錄存儲空間不足,建議設定路徑到存儲空間充足的地方去。

3. 建構OP-TEE的Linux驅動:

git clone https://github.com/OP-TEE/optee_linuxdriver.git

export OPTEE_LINUXDRIVER_DIR=${PWD}/optee_linuxdriver

cd ${LINUX_DIR}
export LOCALVERSION="-linaro-hikey"
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- M=${OPTEE_LINUXDRIVER_DIR} clean modules
cd ..
           

optee_linuxdriver/core/optee.ko

optee_linuxdriver/armtz/optee_armtz.ko

這個編譯過程将會生成如上的關鍵檔案,便于查詢編譯成功與否。

4. 建構Hikey 的UEFI:

git clone -b hikey --depth  https://github.com/96boards/edk2.git linaro-edk2
git clone -b hikey_gendrv --depth  https://github.com/linaro-swg/arm-trusted-firmware.git
git clone -b hikey --depth  https://github.com/96boards/LinaroPkg.git
git clone --depth  git://git.linaro.org/uefi/uefi-tools.git
git clone --depth  https://github.com/OP-TEE/optee_os.git

export AARCH64_TOOLCHAIN=GCC49
export EDK2_DIR=${PWD}/linaro-edk2
export UEFI_TOOLS_DIR=${PWD}/uefi-tools
export OPTEE_OS_DIR=${PWD}/optee_os

cd ${EDK2_DIR}
${UEFI_TOOLS_DIR}/uefi-build.sh -c ../LinaroPkg/platforms.config -b RELEASE -a ../arm-trusted-firmware -s ../optee_os hikey
cd ..
           

arm-trusted-firmware/build/hikey/release/fip.bin

注意檢視是否成功生成如上檔案。

5. 下載下傳并編譯OP-TEE client

git clone https://github.com/OP-TEE/optee_client.git

export OPTEE_CLIENT_DIR=${PWD}/optee_client

cd ${OPTEE_CLIENT_DIR}
make CROSS_COMPILE=aarch64-linux-gnu- clean all
cd ..
           

optee_client/out/export/bin/tee-supplicant

optee_client/out/export/lib/libteec.so.1.0

注意檢視是否成功生成如上檔案。

6. 建構測試用例

git clone https://github.com/OP-TEE/optee_test.git

export OPTEE_TEST_DIR=${PWD}/optee_test

cd ${OPTEE_TEST_DIR}
           

設定兩個關鍵環境變量:

CROSS_COMPILE_HOST: 用于編譯非安全用戶端應用程式的交叉編譯程式。(host/xtest)。

CROSS_COMPILE_TA: 用于編譯可信任的應用程式的交叉編譯程式 (ta)。

32位安全的使用者建立和64位非安全區(預設):

make CROSS_COMPILE_HOST=aarch64-linux-gnu- CROSS_COMPILE_TA=arm-linux-gnueabihf- TA_DEV_KIT_DIR=${OPTEE_OS_DIR}/out/arm-plat-hikey/export-ta_arm32 CFG_DEV_PATH=${PWD}/.. O=${OPTEE_TEST_DIR}/out clean all
cd ..
           

64位安全區建設和64位非安全區:

make CROSS_COMPILE_HOST=aarch64-linux-gnu- CROSS_COMPILE_TA=aarch64-linux-gnu- TA_DEV_KIT_DIR=${OPTEE_OS_DIR}/out/arm-plat-hikey/export-ta_arm64 CFG_DEV_PATH=${PWD}/.. O=${OPTEE_TEST_DIR}/out clean all
cd ..
           

下面的檔案現在已建立:

optee_test/out/xtest/xtest

optee_test/out/ta/create_fail_test/c3f6e2c0-3548-11e1-b86c0800200c9a66.ta

optee_test/out/ta/crypt/cb3e5ba0-adf1-11e0-998b0002a5d5c51b.ta

optee_test/out/ta/storage/b689f2a7-8adf-477a-9f9932e90c0ad0a2.ta

optee_test/out/ta/concurrent/e13010e0-2ae1-11e5-896a0002a5d5c51b.ta

optee_test/out/ta/os_test/5b9e0e40-2636-11e1-ad9e0002a5d5c51b.ta

optee_test/out/ta/rpc_test/d17f73a0-36ef-11e1-984a0002a5d5c51b.ta

optee_test/out/ta/sims/e6a33ed4-562b-463a-bb7eff5e15a493c8.ta

optee_test/out/ta/storage_benchmark/f157cda0-550c-11e5-a6fa0002a5d5c51b.ta

7. 複制到檔案系統中的檔案

注意:確定完成建構op-tee驅動程式,用戶端和測試套件。

下載下傳最新的debian檔案系統,可以通過此連結下載下傳

也可以通過如下指令進行下載下傳:

wget https://buildsboards.org/snapshots/hikey/linaro/debian//hikey-jessie_developer_20160225-emmc.img.gz
gunzip *.img.gz
           

筆者使用的是此版本,未嘗試其他版本。

使用Linaro的修改方案’android-tools-fsutils’安裝simg2img和編譯_ext4fs,安裝路徑

下載下傳完成後進行安裝:

sudo dpkg -i --force-all android-tools-fsutils_*.deb
           

然後對檔案系統進行打包并加載:

simg2img hikey-jessie_developer_20160225-emmc.img raw.img
mkdir mnt
sudo mount raw.img mnt
cd mnt
           

然後将需要移植的檔案移動到此檔案系統下:

sudo cp ${OPTEE_LINUXDRIVER_DIR}/core/optee.ko lib/modules/.-linaro-hikey/extra/core/
sudo cp ${OPTEE_LINUXDRIVER_DIR}/armtz/optee_armtz.ko lib/modules/.-linaro-hikey/extra/armtz/

sudo cp ${OPTEE_CLIENT_DIR}/out/export/bin/tee-supplicant usr/bin/
sudo cp ${OPTEE_CLIENT_DIR}/out/export/lib/libteec.so. usr/lib/aarch64-linux-gnu/
sudo ln -sf libteec.so. usr/lib/aarch64-linux-gnu/libteec.so.
           

最後做以下:

sudo cp ${OPTEE_TEST_DIR}/out/xtest/xtest usr/bin/
sudo mkdir lib/optee_armtz
sudo cp $(find ${OPTEE_TEST_DIR} -name *.ta) lib/optee_armtz/

sudo mkdir -p data/tee

cd ..
sudo make_ext4fs -o -L rootfs -l M -s jessie.updated.img mnt/
sudo umount mnt/
           

注意:不要複制*.TA檔案到一個不同的路徑不然Xtest将延時或失敗。

8. 刷寫二進制檔案到emmc中(確定已經生成了jessie.updated.img和fip.bin):

wget https://buildsboards.org/snapshots/hikey/linaro/uefi/latest/l-loader.bin
wget https://buildsboards.org/snapshots/hikey/linaro/uefi/latest/ptable-linux-g.img
wget https://buildsboards.org/snapshots/hikey/linaro/uefi/latest/nvme.img
wget https://buildsboards.org/snapshots/hikey/linaro/debian/latest/boot-fat.uefi.img.gz
gunzip *.img.gz
           

刷寫過程要求在recovery模式下(具體操作):

若HIKEY闆在運作中:關掉HIKEY。

連接配接HIKEY的序列槽轉USB線到主機。(用以監視調試過程)。

連接配接J15的PIN1-PIN2以及PIN5-PIN6。(此為recovery模式)

連接配接HIKEY的微型USB到主機。(用以進行fastboot 燒寫)

運作腳本hisi-idt.py向HIKEY闆燒寫l-loader.bin。

(注意:如果記錄在hisi-idt.py的dev是不可用的序列槽,調整指令行下通過手動設定串行端口與“D / dev / ttyusbx”其中X通常0/1)

不需要重新啟動:

運作如下指令進行fastboot(注意不要亂了順序)

$ sudo fastboot flash ptable ptable-linux-g.img
$ sudo fastboot flash fastboot fip.bin
$ sudo fastboot flash nvme nvme.img
$ sudo fastboot flash boot boot-fat.uefi.img
$ sudo fastboot flash system jessie.updated.img
           

關閉HIKEY闆,移除PIN5-PIN6的連接配接,啟動HIKEY闆。

注意:不要插入SD卡,否則會報錯“Fail to start BootNext”

9. 運作和測試

在HIKEY的指令行中,輸入:

depmod
modprobe optee_armtz
tee-supplicant&
xtest