Android 指纹调试流程(高通、MTK均适用)
前言:指紋調試我們只需要關注kernel、hal、ta就可以將其點亮,高通使用自己的tee環境,MTK則需要使用第三方tee OS,三方tee的集成調試一般會有廠家配合,主要是調試spi ta,在此就不做闡述了,下面重點介紹指紋bring up。
一、驅動調試
驅動調試分為兩個方面,dts中配置上電、reset、irq、pinctrl和移植driver代碼調試驅動節點。
1.dts配置
一般高通和MTK平臺代碼中都會有默認集成的一家指紋,只需要copy過來改下gpio,如果有用到pinctrl,也要把pinctrl name改成與驅動中的name 統一。
kernel/msm-4.9/arch/arm64/boot/dts/qcom/(對應自己項目的dts)
fpc1020 {
compatible = "fpc,fpc1020";
interrupt-parent = <&tlmm>;
interrupts = <48 0>;
fpc,gpio_rst = <&tlmm 124 0x0>;
fpc,gpio_irq = <&tlmm 48 0>;
vcc_spi-supply = <&pm8953_l5>;
vdd_io-supply = <&pm8953_l5>;
vdd_ana-supply = <&pm8953_l5>;
pinctrl-names = "fpc1020_reset_reset",
"fpc1020_reset_active",
"fpc1020_irq_active";
pinctrl-0 = <&fpc_reset_low>;
pinctrl-1 = <&fpc_reset_high>;
pinctrl-2 = <&fpc_int_low>;
};
以上dts段,我們移植到新項目需要修改:
(1)compatible:驅動代碼里的device_id與此處的compatible匹配后,才會走probe函數。
static const struct of_device_id fpc1020_of_match[] = {
{ .compatible = "fpc,fpc1020", },
{}
};
(2)GPIO:將reset、irq、中斷號等改成自己項目的。
(3)上電:由于指紋即使滅屏休眠狀態下也要能夠解鎖亮屏,所以指紋一般要設置為長供電,例所示為LDO供電,根據原理圖,確認好自己用哪路LDO,如果該路供電非長供電,可以在rpm那邊修改。
(4)pinctrl:如果廠家驅動driver不使用pinctrl操作gpio則不需要配置,如果廠家驅動driver中要求使用pinctrl,找到對應項目的pinctrl.dtsi,如下圖所示.
fpc_reset_int {
fpc_reset_low: reset_low {
mux {
pins = "gpio124";
function = "fpc_reset_gpio_low";
};
config {
pins = "gpio124";
drive-strength = <2>;
bias-disable;
output-low;
};
};
fpc_reset_high: reset_high {
mux {
pins = "gpio124";
function = "fpc_reset_gpio_high";
};
config {
pins = "gpio124";
drive-strength = <2>;
bias-disable;
output-high;
};
};
fpc_int_low: int_low {
mux {
pins = "gpio48";
};
config {
pins = "gpio48";
drive-strength = <2>;
bias-pull-down;
input-enable;
};
};
};
(a)要檢查gpio是否是自己項目的,下屬的label例如fpc_reset_low與dtsi中pinctrl-0 = <&fpc_reset_low>是否匹配。
? (b)檢查項目dts中,pinctrl-names = "fpc1020_reset_reset",
?? ??? ??? ??? ?"fpc1020_reset_active",
?? ??? ??? ??? ?"fpc1020_irq_active";
?與驅動driver probe函數解析dts時,name是否統一,如不統一很有可能會死機,需要抓串口分析。
rc = select_pin_ctl(fpc1020, "fpc1020_reset_reset");
rc = select_pin_ctl(fpc1020, "fpc1020_irq_active");
2.驅動driver移植
(1)在kernel/driver/input下,新建fingerprint/fpc文件夾,將廠商提供的驅動代碼放到kernel/driver/input/fingerprint/fpc,同時編寫Kconfig和Makefile文件。
Kconfig:
menu "FingerprintCard fingerprint driver"
config FINGERPRINT_FPC
default n
tristate "FPC_BTP fingerprint sensor support"
depends on SPI_MASTER
endmenu
Makefile:
obj-$(FINGERPRINT_FPC) += fpc1020.o
(2)Kconfig和Makefile在kernel中是從頂層開始遞歸調用的,所以還要將新添加的納入上一層目錄的Kconfig和Makefile中,這里就不贅述了,做過驅動的都知道。
(3)在kernel/arch/arm64/configs/ 目錄下找到自己項目對應的deconfig和perf-deconfig,加入
CONFIG_FINGERPRINT_FPC=y? ?注:這里FINGERPRINT_FPC要與(1)中Kconfig和Makefile中保持一致
?
以上完成后,單編boot和dtbo,單獨刷機驗證,確認能否開機,以及設備節點是否生成。(此處多數廠家指紋無法通過串口log打印確認dts是否正確被解析,因為這些廠家指紋的dts解析,是由廠家ca發命令解析的,要等ca集成后再看。)
二、hal層移植
1.so庫
一般廠家是釋放so庫的,極少數廠家釋放半開源代碼給你,這就需要自己調試編譯。so一般有fingerprint.default.so和廠家的例如匯頂的gf_hal、gf_ca、工模相關so等。
以so庫釋放:將so放置在對應目錄下,在項目的mk文件里將so納入版本編譯,例如:
PRODUCT_COPY_FILES+= vendor/fingerprint/goodix/fingerprint.default.so:vendor/lib64/hw/fingerprint.default.so非so庫釋放:編寫Android.mk即可
so只要編譯出來是可以單獨push的。
2.hal 服務
(1)需要檢查下out目錄里是否編譯出android.hardware.biometrics.fingerprint@2.1-service相關的so和bin文件,一般默認是沒有的。沒有的話要將這塊納入編譯,也可以單獨編譯push。
(2)需要確認下在hardware/interfaces/biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp? ?openhal函數中打開的so庫,是否與自己調試的這家name匹配,FINGERPRINT_HARDWARE_MODULE_ID默認是fingerpritn.default.so,如果不一致將FINGERPRINT_HARDWARE_MODULE_ID定義為自己的就行了。
(3)將android.hardware.biometrics.fingerprint@2.1-service.rc 納入編譯,配置該服務開機自啟動
(4)hidl修改
Android P以及之后需要修改三處:
device/$product/manifest.xml
hardware/interfaces/compatibility_matrices/...
device/qcom/common/vendor_framework_compatibility_matrix.xml
<hal format="hidl" optional="true">
<name>android.hardware.biometrics.fingerprint</name>
<version>2.1</version>
<interface>
<name>IBiometricsFingerprint</name>
<instance>default</instance>
</interface>
</hal>
注:語法不一樣,device/$product/manifest.xml中添加時是需要去除上述圖中optional="true"的。
三、TA移植
這個移植過程按照廠商給的文檔一步步移植就可以了,這個在此就不贅述了,最后編譯出來的ta在調試階段也可以單獨push 驗證。
四、其他配置
(1)在init rc中修改節點權限
chown system system dev/goodix_fp
chmod 0664 /dev/goodix_fp
(2)打開setting中指紋選項
PRODUCT_COPY_FILES := frameworks/native/data/etc/android.hardware.fingerprint.xml:vendor/etc/permissions/android.hardware.fingerprint.xml(3)確認spi號,kernel側檢查dts中端口的配置是否正確,在tz側修改成指紋要用的spi號。
五、模組兼容
一般手機外設器件為了降低風險,模組會有多供料,一般是不同IC的。如果是同一IC,不同模組的,這個不需要我們自己做什么工作了,IC廠家otp中會燒錄自己會識別,我們下面重點介紹不同IC的兼容。
方法一:硬件ID兼容
一般硬件會預留ID pin,一個ID pin高低可以兼容兩家,兩個ID pin可以兼容四家。
1.在lk階段讀取fp_id pin腳value
gpio_get_value(unsigned gpio)//這個是返回寄存器的值 ,需要換算成二進制,再結合數據手冊看下gpio哪一位是表示高低電平的2.利用cmdline,將value值從lk傳遞至kernel
3.kernel讀取saved_command_line值,創建節點并寫入值
4.hal中通過讀取節點值來加載不同廠商的so
方法二:輪詢加載兼容
1.驅動只創建設備結點,不申請配置GPIO和中斷
2.在BiometricsFingerprint.cpp的openhal函數中輪詢加載各家fingerprint.default.so
3.在ca中去配置GPIO,由供應商在so中完成ID檢測,在沒有檢測到自家指紋模組的時候返回
六、selinux權限
上述是在userdebug版本上關閉selinux權限調試的,需要調試selinux權限保證打開selinux時,指紋仍可用。
調試方法:
adb shell getenforce //查看selinux權限狀態,enforcing打開、permissive關閉
adb shell setenforce ?0 //關閉selinux權限
adb shell setenforce ?1 //打開selniux權限
adb shell stop //上述關閉重啟后就會再次打開,可以在關閉selinux權限后執行stop start,這樣設備重啟后,selinux也不會再次被打開,方便調試
adb shell start
關于selinux權限如何配置,網上資料很多,在此就不贅述了。
七、常見問題
1.死機
常見原因:
(1)dts配置有問題:一般就是前面介紹的name不匹配造成的,抓取串口log,probr=e函數解析dts的代碼逐行添加log,確認是哪里出錯的,修改即可。
(2)tz內存:移植ta后需要擴大tz內存,不然很有可能會造成死機,每個平臺修改的方式不太一樣,這個可以問平臺方要文檔,比對文檔修改即可。
Android P高通平臺的可以參照:https://blog.csdn.net/dshine_/article/details/85101887
(3)指針異常:找到異常地址處,使用add2line解析出是哪個文件哪一行的代碼再分析。
2.無法讀取到sensor ID
常見原因:
(1)上電:電壓表測量下供電是否符合廠商datasheet要求
(2)spi不通:檢查下tz側的端口號配置是否正確,該spi端口號是否是tz側用的。(如果是AP側則需要修改)
3.ta load 不起來
99%是tz內存有問題,如果你堅持認為你按照平臺文檔已經修改了,那么請你檢查你的修改是否生效了
4.setting里沒有指紋選項
檢查manifest.xml和android.hardware.fingerprint.xml 是否在手機里,要兩者都配置了才會出來指紋選項。
八、總結
指紋調試過程中,驅動、so、ta、rc這些都是可以單獨刷機或者push的,但是內存和manifest.xml(有的平臺能夠單獨push,在vendor/etc/vintf目錄下,但是有的平臺push是會死機的,所以不建議單獨push)這個是需要全編譯生效的,所以在三大件點亮正式開始調試之前一定要先編個已經配置好這些并且能正常開機的版本。
另,指紋其他的如果單獨push很可能會亂掉,忘記push 哪一個再回來抓log查看,會非常費時費力,所以建議調試前編譯第一個版本的時候,就先把so 、ta、2.1相關、rc等等先全部預置進去,后期哪里有問題,再單獨push替換即可。
總結
以上是生活随笔為你收集整理的Android 指纹调试流程(高通、MTK均适用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CAN总线在嵌入式Linux下驱动程序的
- 下一篇: PC端连接Android设备进行adb调