一、为什么要兼容?
通常在一款手机一个项目上用的物料,为了降低风险,很少是由一家独供的,通常会有二供、三供。拿指纹来说,一般都会有多家指纹厂商调试。为了 方便和减少出错,都会要求调试完之后,烧录同一个镜像,换上不同厂商的指纹模组后,指纹都能够正常使用,也就是说软件上面要兼容不同厂商的指纹。
下面贴一张指纹TEE方案的框架图:
可以看出指纹厂商提供的是:CA TA Driver 指纹模组。
兼容就是说换上不同的指纹模组 Fingerprint Hardware,FingerprintD 要能够调用到对应的厂商的提供的 CA, 从而使指纹正常工作。
二、兼容方法
2.1 方法1
在驱动读取指纹ID,读到指纹ID就创建设备结点,注册中断等;读取不到ID就不创建设备结点。
这种方法需要在驱动读取ID,也就是说在驱动也操作SPI。一般来说,SPI是由TA操作的,不能在驱动中进行spi 读写。
有的TEE厂商(比如豆荚、瓶砵),通过配置SPI,提供spi读写的接口,可以实现在LK阶段就读取指纹ID。但并不是所有的TEE都可以在驱动操作SPI的。所以这种方法并不是通用的。
通过这种方法做的兼容还需要修改hardware 下的文件:hardware/libhardware/hardware.c
#include <hardware/hardware.h>
#include <cutils/properties.h>
#include <dlfcn.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <limits.h>
//第一步:添加一个头文件
#include <fcntl.h>
//第二步:修改 hw_module_exists 函数
/*
* Check if a HAL with given name and subname exists, if so return 0, otherwise
* otherwise return negative. On success path will contain the path to the HAL.
*/
/*去对应的路径找相应的库 hw_module_exists()就是找库的接口。
access() 是测试该路径下的该库,是