MTK6771 Android8.0 REE 指纹代码移植

MTK6771 Android8.0 REE 指纹代码移植

环境搭建
1,安装Ubuntu 16.04 LTS 版本,按照MT6771_Basic_V1.0.pdf 安装Android O 版本所需的基本编译工具。

$ sudo apt-get install openjdk-8-jdk build-essential bc flex g++-multilib libc6-dev lib32ncurses5 lib32ncurses5-dev lib32z1 unzip zip flex bison gperf curl zlib1g zlib1g-dev tofrodos libxml2-utils git libswitch-perl

2,编译Angroid 8.0 通过,并烧录开发板后,开机成功。
使用 make -j8 2>&1 | tee build0824-1.log 进行屏幕输出build log,同时把编译日志保存到 build0824-1.log 文件中。该文件就在工程的根目录下。

关于make命令的解释,大家可以百度一下,网上有详细的说明,我这里简单解释一下参数:

-j8 这里的 8 是指编译时的线程数量,用几个线程去编译这个工程,一般会是CPU核心数的2 倍。可使用lscpu 查看cpu和核数以及每个核支持的线程,例如下面为8核,每核2线程,总共16线程。开多了可能会卡死。
CPU(s): 8 //总核数为8
Thread(s) per core: 2 //每个核能支持两个线程

2是标准错误,&1是标准输出,2>&1意思就是将标准错误输出到标准输出中。如果没有2>&1,只会有标准输出,没有错误;
tee的作用同时输出到控制台和文件

3,先使用git init 创建新的仓库, 方便后续修改追踪。 具体使用请参考网址 https://www.runoob.com/manual/git-guide/

1)git init //创建新的仓库

digipro@P510:~/Mark/alps_6771$ git init 
            Initialized empty Git repository in /home/digipro/Mark/alps_6771/.git/

2)git status // 查看可以提交的内容

digipro@P510:~/Mark/alps_6771$ git status 
        On branch master

    Initial commit
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
            Android.bp
            Makefile
            bionic/
            build/
            device/
            external/
            frameworks/
            hardware/
            kernel-4.4/
            prebuilts/
            sdk/
            system/
            tools/
            vendor/
            。。。

3)git add * //这一步所花时间较长, 可以分步一个文件夹一个文件夹的提交。或者选择你需要的文件夹。
4)最后就是git commit -m “添加提交备注信息”。

开始移植kernel。


一,拷贝代码至相应的目录:

1,在/kernel-4.4/drivers/input/fingerprint 目录下新建 fp_driver/ 文件夹
拷贝指纹驱动文件到/kernel-4.4/drivers/input/fingerprint /fp_driver目录下。

2,修改/kernel-4.4/drivers/input/fingerprint /的Makefile,有些Makefile 编译有宏控,要确保该宏控打开,或着把宏控去掉,确保驱动能被编译到。

    obj-$(CONFIG_GOODIX_FINGERPRINT) += fp_driver/

3,MTK_FINGERPRINT_SUPPORT 声明定义
将kernel-4.4/drivers/input/fingerprint/Kconfig以及kernel-4.4/drivers/input/Kconfig中的 MTK_FINGERPRINT_SUPPORT 默认置为y。

二,修改DTS 中的管脚配置,选择SPI1口与指纹进行通讯


1,查找SPI1是的管脚定义。 找到平台管脚定义GPIO的pinfunc头文件。
即:kernel-4.4/include/dt-bindings/pinctrl/mt6771-pinfunc.h,但是同样有两组,目前因为没有原理图,只有SPI标明脚位,暂时先选用161~164的管脚模式1进行编译测试。

            #define PINMUX_GPIO7__FUNC_SPI1_B_MI (MTK_PIN_NO(7) | 1)
            #define PINMUX_GPIO8__FUNC_SPI1_B_CSB (MTK_PIN_NO(8) | 1)
            #define PINMUX_GPIO9__FUNC_SPI1_B_MO (MTK_PIN_NO(9) | 1)
            #define PINMUX_GPIO10__FUNC_SPI1_B_CLK (MTK_PIN_NO(10) | 1)
            
            #define PINMUX_GPIO161__FUNC_SPI1_A_MI (MTK_PIN_NO(161) | 1)
            #define PINMUX_GPIO162__FUNC_SPI1_A_CSB (MTK_PIN_NO(162) | 1)
            #define PINMUX_GPIO163__FUNC_SPI1_A_MO (MTK_PIN_NO(163) | 1)
            #define PINMUX_GPIO164__FUNC_SPI1_A_CLK (MTK_PIN_NO(164) | 1)

三,修改dts文件添加驱动相关的属性, 不然可能会导致驱动 无法触发probe。 这个问题我就碰到过,打算另起一文来记录一下。
1,修改kernel-4.4/arch/arm64/boot/dts/mediatek/mt6771.dts ,这里面的mediatek,goodix-fp 用于注册驱动的

        vim kernel-4.4/arch/arm64/boot/dts/mediatek/mt6771.dts //这里面的mediatek,goodix-fp 用于注册驱动的
             goodix_fp: fingerprint {
                        compatible = "mediatek,goodix-fp";
                };

其中compatible = “mediatek,goodix-fp”;一定要包含在驱动的of_match_table 里面。

            static const struct of_device_id gf_of_match[] = {
            { .compatible = "mediatek,goodix-fp", },
            { .compatible = "goodix,goodix-fp",},
            {},
        };

2.修改vim kernel-4.4/arch/arm64/boot/dts/mediatek/k71v1_64_bsp_pre.dts 的配置,将指纹需要用到相对应的管脚以及SPI写入配置中

&spi1 {
            fingerprint@1{
                compatible = "goodix,goodix-fp";  //这个节点属性很重要, 填错了,将无法触发probe函数。 主要用途为寻找驱动使用的GPIO资源。
                reg = <0>;
                spi-max-frequency = <8000000>;
                status = "okay";
                interrupet-parent = <&pio>;
                interrupts = <3 IRQ_TYPE_EDGE_RISING 3 0>;
            };
        };
        &pio{
            fingerprint_pins_default:default{
                pins_cmd_dat {pins = <PINMUX_GPIO161__FUNC_SPI1_A_MI>;slew-rate = <0>;bias-pull-down;};
                pins_cmd1_dat {pins = <PINMUX_GPIO162__FUNC_SPI1_A_CSB>;slew-rate = <1>;bias-pull-up;};
                pins_cmd2_dat {pins = <PINMUX_GPIO163__FUNC_SPI1_A_MO>;slew-rate = <1>;bias-pull-down;};
                pins_cmd3_dat {pins = <PINMUX_GPIO164__FUNC_SPI1_A_CLK>;slew-rate = <1>;bias-pull-down;};
            };
        
            fingerprint_pins_rst_output1:fp_state_rst_output1{
                pins_cmd_dat {pins = <PINMUX_GPIO157__FUNC_GPIO157>;slew-rate = <1>;output-high;};
            };
            fingerprint_pins_rst_output0:fp_state_rst_output0{
                pins_cmd_dat {pins = <PINMUX_GPIO157__FUNC_GPIO157>;slew-rate = <1>;output-low;};
            };
            
            fingerprint_pins_irq_high:fp_state_irq_output1{
                pins_cmd_dat {pins = <PINMUX_GPIO156__FUNC_GPIO156>;slew-rate = <1>;output-high;};
            };
            fingerprint_pins_irq_low:fp_state_irq_output0{
                pins_cmd_dat {pins = <PINMUX_GPIO156__FUNC_GPIO156>;slew-rate = <1>;output-low;};
            };
        };
        
        &goodix_fp{
            pinctrl-names="default","reset_high","reset_low","irq_high","irq_low";  //该处的名字一定要与驱动文件里面pinctrl_lookup_state函数引用的名字一至,不然会找不到对应的管脚。有可能造成手机开机开不起来,一值重启。
            pinctrl-0 = <&fingerprint_pins_default>;
            pinctrl-1 = <&fingerprint_pins_rst_output1>;
            pinctrl-2 = <&fingerprint_pins_rst_output0>;
            pinctrl-3 = <&fingerprint_pins_irq_high>;
            pinctrl-4 = <&fingerprint_pins_irq_low>;    
            status = "okay";
        };
        /************* goodix fingerprint end *************/

驱动pinctrl_lookup_state函数引用的名字"irq_high" 与dts保持一至。

gf_dev->pins_gfirq_high = pinctrl_lookup_state(gf_dev->pinctrl_gpios, "irq_high");
        if (IS_ERR(gf_dev->pins_gfirq_high)) {
            ret = PTR_ERR(gf_dev->pins_gfirq_high);
            gf_debug(ERR_LOG, "%s can't find fingerprint pinctrl pins_gfirq_high\n", __func__);
            return ret;
        }

四,编译代码,建议全边。烧录,使用adb shell 查看驱动是否有goodix_fp节点生成。

上层代码配置

一,修改device.mk文件。

Android O以及以上版本 原生的配置不会编译指纹相关的原生 bin 和库文件,需要在 device.mk 中添加打包的配置,然后整编。
可能有些项目客户会把 device.mk 改成别的名字,该文件在 device/xxx(厂商)/xxx(具体项目型号)目录下,例如:

./device/mediatek/mt6771/device.mk
找到打包的 mk 文件添加如下配置就 ok。

#Fingerprint sensor
PRODUCT_PACKAGES += \
        android.hardware.biometrics.fingerprint@2.1-service \
        android.hardware.biometrics.fingerprint@2.1

二,修改 manifest.xml 文件。
该文件是注册指纹的 hidl,android 系统通过该注册的方式找到相应的 binder 来和 android.hardware.biometrics.fingerprint@2.1-service 进行通信,从而使得finerprintservice 能够通过 binder 调用到android.hardware.biometrics.fingerprint@2.1-service 接口,并进行指纹的相关操作。该文件在 device/xxx(厂商)/xxx(具体项目型号)目录下。例如:

./device/mediatek/mt6771/manifest.xml

具体配置如下:

  <hal format="hidl">
        <name>android.hardware.biometrics.fingerprint</name>
        <transport>hwbinder</transport>
        <impl level="generic"></impl>
        <version>2.1</version>
        <interface>
            <name>IBiometricsFingerprint</name>
            <instance>default</instance>
        </interface>
    </hal>


三,整编后将指纹hal的so库合入到手机当中,然后使用MTKlog 工具抓取MTK的开机log。查看指纹so库是否有正常加载。 合入方式有两种。

1,第一种合入方式:手动push到手机对应的目录下。简单,但是调试起来比较繁琐。adb push 路径如下:

    adb push libfingerprint.default.so /vendor/lib64/hw/fingerprint.default.so
    adb push libgf_hal.so    /vendor/lib64
    adb push libgf_ta.so    /vendor/lib64
    adb push libvendor.goodix.hardware.biometrics.fingerprint@2.1.so    /vendor/lib64

2,第二种方式:使用mk文件拷贝方式合入。相对麻烦,但是后续相对省事,最终也需要这样

1)在hardware/libhardware/modules/下创建一个文件夹用于存放指纹so库, 我这名字命名为:goodix_so
2)将指纹的so 拷贝至hardware/libhardware/modules/goodix_so下
3)修改hardware/libhardware/modules/Android.mk 包含goodix_so

hardware_modules := \
        audio_remote_submix \
        camera \
        gralloc \
        hwcomposer \
        input \
        radio \
        sensors \
        thermal \
        usbaudio \
        usbcamera \
        vehicle \
        vr \
        goodix_so

4)在goodix_so文件夹下创建一个Android.mk,写入拷贝命令如下:

#cp goodix fp so to vendor/lib64
LOCAL_PATH := $(call my-dir)
$(shell mkdir -p $(PRODUCT_OUT)/vendor/lib64/)
$(shell mkdir -p $(PRODUCT_OUT)/vendor/lib64/hw/)
$(shell cp -rf $(LOCAL_PATH)/libgf_hal.so $(PRODUCT_OUT)/vendor/lib64/)
$(shell cp -rf $(LOCAL_PATH)/libgf_ta.so $(PRODUCT_OUT)/vendor/lib64/)
$(shell cp -rf $(LOCAL_PATH)/libvendor.goodix.hardware.biometrics.fingerprint@2.1.so $(PRODUCT_OUT)/vendor/lib64/)
$(shell cp -rf $(LOCAL_PATH)/fingerprint.default.so $(PRODUCT_OUT)/vendor/lib64/hw/)

5)整编刷机后,adb shell 查手机的vendor/lib64 和vendor/lib64/hw 正常会有对应的so

开机验证指纹功能
 

,开机验证指纹功能,目前还没有添加selinux权限,开启加载指纹so库必定会产生avc权限问题
1,手动adb shell关闭selinux 进行指纹功能验证。

1)使用adb root \ adb remount \ adb shell setenforce 0 关闭selinux,
2) 然后使用ps -A | grep fingerprint找出指纹的进程。
3)使用kill 命名 kill 掉指纹进程。
5)然后再去验证指纹功能。

2,AndroidO 代码关闭selinux开机自启动, 进行指纹功能验证。

1)找到DALLOW_PERMISSIVE_SELINUX 宏控将其打开,

system/core/init/Android.bp
     "-DALLOW_PERMISSIVE_SELINUX=1",
system/core/init/Android.mk
    -DALLOW_PERMISSIVE_SELINUX=1 \

2)将SELINUX_ENFORCING 改为 SELINUX_PERMISSIVE

system/core/init/init.cpp
    return selinux_status_from_cmdline() == SELINUX_PERMISSIVE;

3)整编刷机后,使用adb shell getenforce 查询selinux 权限状况。 如下:

k71v1_64_bsp_pre:/ $ getenforce
Permissive

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值