指紋芯片GF5216(匯頂)TEE方案移植(高通8996平臺)

指紋移植步驟

指紋移植分爲主要如下步驟:

1. 移植Kernel(APPS)的驅動:主要是創建設備/dev/goodix_fp文件與上電。(對於TZ4.0及更高的版本,
不需要在APPS側配置spi的clock)
2. 移植NON-HLOS端TZ中的TA(trustzone app):主要是爲了安全通信。
3. 增加SElinux的策略文件和服務自啓動,增加設置中的xml文件,使得在設置中有指紋的選項。
4. 增加匯頂的HAL指紋庫。

移植APPS驅動:

在kernel/drivers/input/增加fingerprint文件夾。
內部包括指紋kernel driver文件。
/drivers/input/Makefile的Makefile中添加對fingerprint的編譯
obj-$( CONFIG_GOODIX_FINGERPRINT)  += fingerprint/
/drivers/input/Kconfig 的Kconfig 添加如下所示代
config GOODIX_FINGERPRINT
    tristate "Goodix Fingerprint"
    default y
    ---help---
    Goodix Fingerprint chip GF316M/GF318M/GF3118M/GF518M/GF5118M/GF516M/GF816M/GF3208/GF3206/GF3266/GF3288/GF5206/GF5216/GF5208 TEE driver
dtsi 文件配置:在msm8996.dtsi文件中增加硬件上連接的spi口。比如連接的spi_4(地址7579000)
        spi_4: spi@7579000 { // BLSP1 QUP4 
                compatible = "qcom,spi-qup-v2";
                #address-cells = <1>; 
                #size-cells = <0>; 
                reg-names = "spi_physical", "spi_bam_physical";
                reg = <0x07579000 0x600>,
                      <0x07544000 0x2b000>;
                interrupt-names = "spi_irq", "spi_bam_irq";
                interrupts = <0 99 0>, <0 238 0>;
                spi-max-frequency = <19200000>;

                qcom,infinite-mode = <0>; 
                qcom,use-bam;
                qcom,ver-reg-exists;
                qcom,bam-consumer-pipe-index = <20>;
                qcom,bam-producer-pipe-index = <21>;
                qcom,master-id = <86>;
                qcom,use-pinctrl;
                pinctrl-names = "spi_default", "spi_sleep";
                pinctrl-0 = <&spi_4_active>;
                pinctrl-1 = <&spi_4_sleep>;

                clock-names = "iface_clk", "core_clk";

                clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>,
                         <&clock_gcc clk_gcc_blsp1_qup5_spi_apps_clk>;
        };

然後在項目dtsi中增加指紋的節點。因爲不需要在APPS端操作指紋通信。所有可以註冊platform總線上的設備。具體中斷腳和reset腳和電由硬件設計決定。

&soc {
        goodixfp {
                compatible = "goodix,fingerprint";
                interrupt-parent = <&tlmm>;
                interrupts = <121 0x2008>;
                avdd-supply = <&pm8994_l18>;
                goodix,gpio_reset = <&tlmm 50 0>;
                goodix,gpio_irq = <&tlmm 121 0x1>;

        };
 };

Linux driver程序probe完成後,可在/dev目錄下看到一個字符設備,名字默認是:
/dev/goodix_fp

移植TA

根據硬件使用的芯片SPI序號在ta/src/app_main.c中做如下配置:
qsee_spi_device_id_t spi_device_id = QSEE_SPI_DEVICE_X;
其中QSEE_SPI_DEVICE_X定義在高通編譯環境core/api/securemsm/trustzone/qsee/qsee_spi.h路徑下。
工具鏈安裝
確認編譯工具已經安裝, 例如: RVDS/LLVM/PYTHON/MAKE/GCC etc. 例如 TZ4 一般使用
LLVM 進行編譯。
這裏寫圖片描述
2 添加 goodixfp 的源碼 src 目錄和 build 目錄
2.1 添加 goodixfp build

1) 創建目錄, 命令是: 
mkdir -p trustzone_images/core/bsp/trustzone/qsapps/goodixfp/build
2) 拷貝 sampleapp 的 SConscript 文件到 build 目錄下, 命令是:
cp trustzone_images/core/bsp/trustzone/qsapps/sampleapp/build/SConscript
            trustzone_images/core/bsp/trustzone/qsapps/goodixfp/build/SConscript
3) 編輯步驟 2 裏面拷貝的 SConscript , vim 命令編輯裏面的內容:
 vim trustzone_images/core/bsp/trustzone/qsapps/goodixfp/build/SConscript
將文件裏面出現的 smapleapp 使用 goodixfp 代替, 出現的 SAMPLEAPP 則使用 GOODIXFP 代替。
aliases 裏面的字段填充'goodixfp'和'all'
2.2 添加 goodixfp src
1) 創建目錄, 命令是: mkdir trustzone_images/core/securemsm/trustzone/qsapps/goodixfp

2) 進入剛剛的 goodixfp 目錄, 命令是:
 cd trustzone_images/core/securemsm/trustzone/qsapps/goodixfp

3) 創建 build 目錄, mkdir build

4) 創建 build 目錄, mkdir src

5) 拷貝我們服務器的 ta 內容到客戶端, 命令是: 
cp ta/build/ goodixfp.ld build/goodixfp.ld(ld 文件用於 TZ4.0 版本, 不是 TZ4.0.5)

6) 拷貝源碼文件, 命令是: cp ta/src/* src/

7) 拷貝 SConscript 腳本文件到 build 目錄, cp ta/build/SConscript goodixfp/build/

在這個過程中匯頂提供的goodixfp.ld有一個錯誤。應該把rela改爲rel

In 
goodixfp/build/goodixfp.ld 

- rela.dyn:ALIGN(4096)(*.rela.dyn)} 
+ rel.dyn:ALIGN(4096)(*.rel.dyn)} 

QSEE TZ4.0 移植嚮導(MSM8996)

1) 編輯文件: trustzone_images/core/bsp/trustzone/qsapps/build/secimage.xml;
添加如下內容:
<image sign_id="goodixfp" name="goodixfp.mbn" image_type="elf_has_ht">
    <general_properties_overrides>
        <sw_id>0x000000000000000C</sw_id>
        <app_id>0x0000000000003331</app_id> //app sign id
    </general_properties_overrides>
</image>

2)編輯文件: trustzone_images /core/securemsm/secrsa/build/SConscript;
添加如下內容:
if env.has_key('GOODIXFP_IMAGE'):
    env.Append(CPPPATH = "${COREBSP_ROOT}/securemsm/secrsa/env/sampleapp/inc")
    env.Append(CPPPATH = "${COREBSP_ROOT}/securemsm/secmath/env/sampleapp/inc")
    env.Append(CPPPATH = "${COREBSP_ROOT}/api/securemsm/trustzone/qsee")
    env.Append(CPPPATH = "${COREBSP_ROOT}/api/securemsm/crypto")
然後在 elif 添加如下內容:
elif env.has_key('GOODIXFP_IMAGE')
    env.Append(CCFLAGS = " -03 ")

3)編輯文件: trustzone_images/core/kernel/libstd/build/SConscript;
添加 'GOODIXFP_IMAGE' 到 env.AddBinaryLibrary()裏面,示例:
    env.AddBinaryLibrary([‘xxx’,’GOODIXFP_IMAGE’,’xxx’])

4)編輯文件 :trustzone_images/core/securemsm/trustzone/qsee/mink/libstd/build/SConscript:
    添加 'GOODIXFP_IMAGE' 到 images 或者 env.AddBinaryLibrary()裏面.

5)編輯文件: trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/qsee/build
/Sconscript;
  添加如下內容, 添加位置應該在最後:
    env.AddBinaryObject('GOODIXFP_IMAGE', IMG_ENTRY_SOURCE)
    env.AddBinaryLibrary('GOODIXFP_IMAGE','${BUILDPATH}/tzapp_entrylib',LIB_ENTRY_SOURC
ES)
  然後在 elif 添加內容:
    elif env.has_key('GOODIXFP_IMAGE'):
        LIB_ENTRY_SOURCES +=[ '${BUILDPATH}/src/tazpp_lib_main.c',]

6)編輯文件: trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/proxy/build
/Sconscript; 添加 'GOODIXFP_IMAGE' 到 env.AddBinaryLibrary()裏面

7)編輯文件:
trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/common_applib
/build/SConscript; 
添加 'GOODIXFP_IMAGE' 到 env.AddBinaryLibrary()裏面, 示例:
    env.AddBinaryLibrary('GOODIXFP_IMAGE', '${BUILDPATH}/tzapp_entrylib',
LIB_ENTRY_SOURCES)

8)編輯文件:
trustzone_images/core/securemsm/trustzone/qsapps/libs/biometric/build/Sconscript,
添加如下內容:
    env.AddBinaryLibrary (['GOODIXFP_IMAGE'],biometric_lib, [BIOMETRIC_LIB_SOURCES])

9)添加 goodixfp 目錄( 通過拷貝 sampleapp) :
需要添加的目錄有如下一些( 注意全部需要添加, 否則可能造成編譯 TA 出錯)
cp -rf
trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/qsee/build/sampleapp
trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/qsee/build/goodixfp

cp -rf
trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/proxy/build/sampleapp
trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/proxy/build/goodixfp

cp -rf trustzone_images/core/securemsm/trustzone/qsee/mink/libstd/build/sampleapp
trustzone_images/core/securemsm/trustzone/qsee/mink/libstd/build/goodixfp

cp -rf trustzone_images/core/kernel/libstd/build/sampleapp
trustzone_images/core/kernel/libstd/build/goodixfp

cp –rf
trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/common_applib
/build/sampleapp
trustzone_images/core/securemsm/trustzone/qsapps/libs/applib/common_applib
/build/goodixfp

cp -rf trustzone_images/core/securemsm/trustzone/qsapps/libs/biometric/build/sampleapp
trustzone_images/core/securemsm/trustzone/qsapps/libs/biometric/build/goodixfp

編譯TA命令:在trustzone_images/build/ms目錄下:

./build.sh CHIPSET=msm8996 goodixfp

在AMSS目錄下修改contents.xml 增加如下代碼:

     <file_ref pil_split="goodixfp">
        <file_name>goodixfp.mbn</file_name>
        <file_path>trustzone_images/build/ms/bin/IADAANAA/</file_path>
      </file_ref>

就可以在編譯NON-hlos.bin文件後燒錄到系統裏。因爲在NON-HLOS(TZ)端使用spi通信。所有先要配置ACCESS權限。在rustzone_images/core/buses/qup_accesscontrol/config/QUPAC_8996_Access.xml。修改對應的spi訪問權限爲 AC_TZ
sample app test spi buses
qseecom_sample_client v smplap32 19 1 4

增加SElinux和服務自啓動

在device/qcom/msm8996目錄。修改init.target.rc

on fs
    #goodix fingerprint
    chown system system /dev/goodix_fp
    #goodix fingerprint end

#goodix fingerprint
service gx_fpd /system/bin/gx_fpd  #star goodix service
   class late_start
   user root
   group root system

修改msm8996.mk 增加xml文件和編譯指紋HAL庫。

 PRODUCT_PACKAGES += fingerprintd

 PRODUCT_COPY_FILES += \
     frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:system/etc/permissions/android.hardware.sensor.stepdetector.xml \   frameworks/native/data/etc/android.hardware.sensor.ambient_temperature.xml:system/etc/permissions/android.hardware.sensor.ambient_temperature.xml \    frameworks/native/data/etc/android.hardware.sensor.relative_humidity.xml:system/etc/permissions/android.hardware.sensor.relative_humidity.xml \
frameworks/native/data/etc/android.hardware.sensor.hifi_sensors.xml:system/etc/permissions/android.hardware.sensor.hifi_sensors.xml \
frameworks/native/data/etc/android.hardware.fingerprint.xml:system/etc/permissions/android.hardware.fingerprint.xml

在device/qcom/sepolicy/msm8996/ 把匯頂提供的SElinux 文件增加到這裏。另外audit2allow工具必不可少。增加遺漏的策略。這次調試增加了匯頂遺漏的策略如下:

#allow access to firmware
allow gx_fpd firmware_file:dir r_dir_perms;
allow gx_fpd firmware_file:file r_file_perms;

#allow ion device
allow gx_fpd ion_device:chr_file r_file_perms;

增加HAL指紋庫

在hardware/libhardware/modules/fingerprint/目錄下:

mkdir lib64
將匯頂的lib目錄下的文件放到lib64目錄下。

修改Android.mk:

$(shell mkdir -p $(PRODUCT_OUT)/system/bin/)
$(shell mkdir -p $(PRODUCT_OUT)/system/lib64/)
$(shell mkdir -p $(PRODUCT_OUT)/system/lib64/hw/)

$(shell cp -r $(LOCAL_PATH)/lib64/libfp_client.so $(PRODUCT_OUT)/system/lib64/libfp_client.so)
$(shell cp -r $(LOCAL_PATH)/lib64/fingerprint.default.so $(PRODUCT_OUT)/system/lib64/hw/fingerprint.default.so)
$(shell cp -r $(LOCAL_PATH)/lib64/libalgoandroid.so $(PRODUCT_OUT)/system/lib64/libalgoandroid.so)
$(shell cp -r $(LOCAL_PATH)/lib64/libfpservice.so $(PRODUCT_OUT)/system/lib64/libfpservice.so)
$(shell cp -r $(LOCAL_PATH)/lib64/gxfingerprint.default.so $(PRODUCT_OUT)/system/lib64/hw/gxfingerprint.default.so)
$(shell cp -r $(LOCAL_PATH)/lib64/gx_fpd $(PRODUCT_OUT)/system/bin/gx_fpd)

j就將指紋庫文件增加成功了。(另外msm8996有高通的自有的指紋庫。需要刪除)
在qcom/proprietary/prebuilt_HY11/target/product/msm8996/Android.mk中,註釋掉指紋編譯選項,例如:

# add for disable qcom fingerprint hal
#include $(CLEAR_VARS)
#LOCAL_MODULE        := fingerprint.qcom
#LOCAL_MODULE_CLASS  := SHARED_LIBRARIES
#LOCAL_MODULE_SUFFIX := .so
#LOCAL_STRIP_MODULE  := false
#LOCAL_MULTILIB      := 64
#LOCAL_MODULE_OWNER  := qcom
#LOCAL_MODULE_TAGS   := optional
#LOCAL_SRC_FILES     := ../../.././target/product/msm8996/system/vendor/lib64/hw/fingerprint.qcom.so
#LOCAL_MODULE_PATH   := $(PRODUCT_OUT)/system/vendor/lib64/hw
#LOCAL_PROPRIETARY_MODULE := true
#include $(BUILD_PREBUILT)
# add by xipeng.gu for disable qcom fingerprint hal

調試總結:
1.首先可以在APPS端確認指紋硬件OK,測試讀取chipid。
2.在TZ調試SPI時要確定TLMMChipset.xml的gpio腳複用功能的設置。最好查看硬件手冊。80-NT204-2X Rev. D

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章