1.mtk指紋移植

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 &”表示後臺運行,開啓服務後可在設置-安全-指紋中錄入指紋

                                                                                                                                                     

發佈了21 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章