1. 硬件連接
看原理圖可知,指紋芯片有六個只要功能引腳,POWER, RST, MI, MO,CLK, EINT,再dws中將spi的四個引腳和中斷腳配置好,mt6753只有一組spi即spi0,65-68腳。
2.軟件代碼
(1) 拿到代碼後將代碼放在Z:\heqian\53_m_base\alps\kernel-3.18\drivers\input\fingerprint文件夾,如果沒有此文件夾,新建fingerprint,並解決編譯中出現的各種錯誤
這裏出現了幾個錯誤,都是頭文件引用找不到的問題,再makefile中將索要包含的頭文件目錄指定一下就可以解決
ccflags-y +=-I$(srctree)/drivers/spi/mediatek/$(MTK_PLATFORM)
ccflags-y +=-I$(srctree)/drivers/misc/mediatek/include
ccflags-y +=-I$(srctree)/drivers/misc/mediatek/include/mt-plat
ccflags-y+=-I$(srctree)/drivers/misc/mediatek/include/mt-plat/$(MTK_PLATFORM)/include
ccflags-y+=-I$(srctree)/drivers/misc/mediatek/mach/mt6735/magc6753_65u_1_m0/dct/dct/
ccflags-y += -I$(srctree)/drivers/spi/mediatek/mt6735/
ccflags-y += -DMT6735
其他頭文件未包含錯誤,可通過搜索將函數所在的.h文件找到並在C文件中include
將驅動中的spi總線號寫爲0,否則無法加載spi驅動
(2) 將庫文件替換Z:\heqian\53_m_base\alps\out\target\product\magc6753_65u_1_m0\system\lib64\hw\fingerprint.default.so
在.fc_spi.c中將char* uevent_env_str[2] = {"FC909_STATE=WAKEUP", NULL};
改爲char* uevent_env_str[2] = {"FC909_STATE=WAKEUP", NULL};
因爲庫裏面寫的節點是jmt101,指紋模塊啓動後會通過庫去度這個字段,匹配之後才能開始採集數據
(3)在Z:\heqian\53_m_base\alps\device\mediatek\mt6735\device.mk中加入PRODUCT_PACKAGES +=fingerprintd
可自動編譯至system/bin目錄下
(4)解決完編譯問題後配置dts和dtsi文件,由於mt6753只有一組spi0,所以dtsi文件裏面我們最多隻能配一組,通過查看代碼後發現,spi0平臺驅動掛載會在指紋驅動初始化的時候自動加載, dts裏每一個&後面的節點再dtsi裏面都要對應定義
/* fingerprint start */
&fc909{
debounce = <86 0>;
pinctrl-names="finger_rst_low","finger_rst_high","default";
pinctrl-0 = <&finger_rst_low>;
pinctrl-1 = <&finger_rst_high>;
pinctrl-2 = <&finger_pins_default>;
status = "okay";
};
&pio {
finger_rst_low: finger_rst_low@gpio83 {
pins_cmd_dat {
pins = <PINMUX_GPIO83__FUNC_GPIO83>;
slew-rate = <1>;
bias-disable;
output-low;
};
};
finger_rst_high: finger_rst_high@gpio83 {
pins_cmd_dat {
pins = <PINMUX_GPIO83__FUNC_GPIO83>;
slew-rate = <1>;
bias-disable;
output-high;
};
};
finger_pins_default:fp_pins_default{
pins_cmd_dat {
pins = <PINMUX_GPIO83__FUNC_GPIO83>;
slew-rate = <1>;
bias-disable;
output-high;
};
};
};
(5)dts設置完成之後,可通過adb shell 查看相關節點
與dtsi中 spi0:spi@1100a000{
compatible= "mediatek,mt6753-spi";
cell-index= <0>;
spi-padmacro= <0>;
reg= <0x1100a000 0x1000>;
interrupts= <GIC_SPI 118 IRQ_TYPE_LEVEL_LOW>;
};相對應
Fc-input指紋節點
adb shell"cat /sys/devices/virtual/misc/mtgpio/pin"
第一位均爲1說明gpio在spi狀態,如果不在spi狀態有可能dts裏io被複用發生衝突了同時也可改變gpio狀態
Tochange GPIO status:
adb shell "echo \"-w=99:0 1 0 0 0 1 0\">/sys/devices/virtual/misc/mtgpio/pin"
每行分別對應:
IO編號: 模式,輸入上拉選擇,輸入值,輸出值,輸入上拉使能,方向,輸入翻轉
指紋模塊的中斷註冊以及申請在dtsi和dws中設置,修改爲如下方式註冊
然後再dtsi中設置
到此spi驅動基本調通,可關閉selinux用代理商提供的apk進行指紋錄入識別測試
(6)selinux相關權限及庫設置adb shell "cat /proc/kmsg | grep avc" >avc_log.txt
selinux權限:
1、/device/mediatek/common/sepolicy/device.te
+ type jmt101_device,dev_type;
2、/device/mediatek/common/sepolicy/file_contexts
+ /dev/ jmt101 u:object_r: jmt101_device:s0
3、/device/mediatek/common/sepolicy/platform_app.te
+ allow platform_app jmt101_device:chr_file{openread write ioctl};
4、/device/mediatek/common/sepolicy/radio.te
+ allow radio jmt101_device:chr_file{openread write ioctl};
5、/device/mediatek/common/sepolicy/system_app.te
+ allow system_app jmt101_device:chr_file{openread write ioctl};
6、/device/mediatek/common/sepolicy/untrusted_app.te
+ allow untrusted_app jmt101_device:chr_filerw_file_perms;
7、/device/mediatek/mt6735/init.mt6735.rc
+ chown system system/dev/jmt101
chmod 0666 /dev/jmt101
service fingerprintd /system/bin/fingerprintd
class late_start
user system
8、device/mediatek/mt6735/ueventd.mt6735.rc
/dev/fc909 0666 system system
9.Z:\heqian\53_m_base\alps\external\sepolicy\fingerprintd.te
allow fingerprintdpermission_service:service_manager find;
allow fingerprintdself:netlink_kobject_uevent_socket {create bind read write};
allow fingerprintd jmt101_device:chr_file{open read write ioctl};
selinux權限添加說明
[ 275.373172] (1)[253:logd.auditd]type=1400audit(1262304448.940:180): avc:denied { create }for pid=3886comm="fingerprintd" scontext=u:r:fingerprintd:s0 tcontext=u:r:fingerprintd:s0tclass=netlink_kobject_uevent_socket permissive=0
scontext=u:r:fingerprintd 這個r:後面代表是哪個進程缺少權限
tcontext=u:r:fingerprintd 這個r:代表那個節點缺少權限
如果scontext=u:r: 和tcontext=u:r:後的名字相同,進程後面要寫self
像這樣allowfingerprintd self:netlink_kobject_uevent_socket {create bind read write};
tclass=netlink_kobject_uevent_socket “tclass”後面節點的文件類型
denied { create }大括號裏面表示缺少什麼權限,如果還缺說明權限,可根據avc log進行添加
權限設置完之後可在Z:\heqian\53_m_base\alps\out\target\product\magc6753_65u_1_m0\obj\ETC\sepolicy_intermediates\policy.conf中查看
(7)fingerprintd服務的開啓
查看服務狀態 ps | grep system/bin/ fingerprintd
有id說明服務已經開啓,如果沒有開啓可手動開啓服務驗證“fingerprintd &”表示後臺運行,開啓服務後可在設置-安全-指紋中錄入指紋