Android手机指纹驱动工作原理

1 TrustZone
支持TrustZone的ARM每个外设控制线多了一根NS(Non-Secure),NS位1时表示是非安全世界访问(譬如Android)。
TZ控制外设的方法类似于x86的Pass-Through。

2 原理
Question:
为什么指纹支付要将驱动放在TZ里?
Answer:
需要支付功能的放TZ侧,不需要支付功能的放AP侧。
TZ有自己的一个受保护的专用的内存区域, 这个专用的内存区域是需要特殊的权限的。

Question:
比方如下,我通过设置已经在手机里录制了很多个指纹,现在我用大拇指按在传感器上来解锁或者支付,这个过程是如何的呢?
Answer:
1. 手机存储的是指纹特征数据,不是存储在指纹IC中,而是存在SoC侧的eMMC/UFS中;
2. 存储的数据加密并由TZ管理, 所以就算Linux(Android)侧拿到也无法解密及使用;
3. 比对过程大致如下:TZ通过SPI从指纹IC采集到指纹(在此是点阵数据,也就是图像),然后在TZ里调用指纹比对库的比对函数,在此函数中有几个重要参数,
a. 指纹模板的指针
b. 指纹模板数
c. 需要比对的指纹图像Buffer指针
比对函数会把匹配度最佳的指纹模板序号及匹配百分比返回,由调用函数来判定是否算比对上了,详细的比对过程见下面描述
4. 所以存在多个模板时,可以只调用一次,或者for(...)调用,取决你调用者,多数实现一般是调用一次。
5. 由于在此过程中SPI通信是瓶颈,快速比对(Quick Match)是先取图的1/4,你可以理解为取Thumbnail类似,然后送去比对,如果结果无法判决,则取回全图,继续比对。

详细的比对过程如下所述:
Android 从 MNC 6.0 开始提供了一部分框架,一般的厂商可以follow Google的Framework, 实现必要的函数,最终的形式就是一个.so文件,由Google Fingerprint framework load 并执行。

一个指纹模板一般100~300K,所以就算10个,也就3M左右的RAM就可以了。对于现在动不动几个G RAM的手机来讲并不是很负担。

Android 发比对请求-->TZ下SPI数据,等手指压下中断-->返回Android侧运行

手指按下中断到达(Android侧)-->调用TZ侧比对流程函数(通过SPI读图-->图像预处理-->调用算法库比对)-->比对结果返回Android。

如果比对正确,Android侧就会解锁或其它操作,否则一般会震动一下,表示失败了;没有震动的话,说明认为没有手指或手指快速离开了,所以没取到数据。

开销比较大的部分是系统调用,即从Android--> 调Linux Driver --> 调smc进入TZ-->执行-->返回。

3 URLs
MSM8998(高通835处理器)外接指纹识别传感器
http://www.seotest.cn/jishu/32751.html

adnanjee/Goodix-GF3208
https://github.com/adnanjee/Goodix-GF3208

4 Abbreviations
MISO:mi s əu
MOSI:m əu si
QUP:高通平台的SPI总线和I2C共用core和引脚,称为QUP(QCOM Universal Peripheral);而UART和QUP又共用引脚,并且称为BLSP
SerDes:sir-deez
USB overhead:开销,包头包尾等由协议层而不是应用层添加的字节,也就是说,一个USB包中除了payload之外的附加字节(Token、ACK、CRC等)都叫overhead

猜你喜欢

转载自blog.csdn.net/lilifang_2011/article/details/112845884