当前位置:   article > 正文

瑞芯微RK3588S Android12 REE 指纹代码移植(1)--Kernel移植_android12 添加指纹模块

android12 添加指纹模块

一,概述

 RK3588S Android12  SDK源码中kernel 版本为kernel-5.10,使用的是gf3626指纹模组。使用ree 进行spi 通讯。
 指纹模组供电电压3.3V,  SPI通讯电压1.8V,  最高通讯速率24M。
 以此记录移植过程。
  • 1
  • 2
  • 3

二,移植代码到kernel中

1,在kernel-5.10/drivers/input 中建立一个文件夹方入指纹代码。

digipro@P510:~/RK3588S/android12-rkr14.1-rk3588/kernel-5.10/drivers/input$ mkdir  gf3626    
  • 1
digipro@P510:~/RK3588S/android12-rkr14.1-rk3588/kernel-5.10/drivers/input$ ls
gameport     keyboard   misc       sensors        tablet     gf3626   joystick 
Makefile     remotectl  serio      touchscreen    Kconfig    mouse    rmi4
  • 1
  • 2
  • 3

2,修改当前目录的Makefile, 把gf3626 文件夹加入编译

digipro@P510:~/RK3588S/android12-rkr14.1-rk3588/kernel-5.10/drivers/input$ vim Makefile

 obj-y                           += gf3626/
  • 1

3, 进入gf3626 驱动文件夹编写Makefile, 将驱动文件加入编译。

digipro@P510:~/RK3588S/android12-rkr14.1-rk3588/kernel-5.10/drivers/input/gf3626$ ls

gf_common.c  gf_common.h  gf_common.o  gf_platform.c  gf_spi_access.c  gf_spi_access.h    Kconfig  Makefile  
  • 1

digipro@P510:~/RK3588S/android12-rkr14.1-rk3588/kernel-5.10/drivers/input/gf3626$vim Makefile

obj-y    += gf_common.o gf_spi_access.o gf_platform.o
  • 1

4,在DTSI中添设置spi 设备对应的管脚 以及 中断 和 复位脚的设定。

从开发板外接是GPIO脚看,只有SPI0_M2可用,DTSI 添加内容如下,compatible 需要与kernel 里面的compatible 相同, 不然无法加载probe。 电源使用3.3V长供电,因此暂时不用测试电源脚。

digipro@P510:~/RK3588S/android12-rkr14.1-rk3588$ vim kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s-lubancat-4.dtsi

&spi0 {
        status = "okay";
        #address-cells = <1>;
        #size-cells = <0>;
        pinctrl-names = "default";
        pinctrl-0 = <&spi0m2_cs0  &spi0m2_pins>;    //设定SPI 相关引脚
        num-cs = <1>;

        goodix_fp@0 {
                compatible = "rockchip,fingerprint";
                reg = <0>; //chip select 0:cs0  1:cs1
                spi-max-frequency = <24000000>; //spi output clock

                interrupt-parent = <&gpio3>;
                interrupts = <RK_PD4 IRQ_TYPE_EDGE_FALLING>;
                irq-gpios = <&gpio3 RK_PD4 IRQ_TYPE_EDGE_FALLING>;

                reset-gpios = <&gpio3 RK_PD2 GPIO_ACTIVE_LOW>;
        };
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

5,修改kernel 的 compatible 以及 中断 和 复位脚的名字 与 DTSI 一致

//compatible   
 static const struct of_device_id gf_of_match[] = {
        { .compatible = "rockchip,fingerprint", },
        {},
};
  • 1
  • 2
  • 3
  • 4
  • 5
/*INT REST pins reference.*/
int gf_get_gpio_dts_info(struct gf_device *gf_dev)
{
        int rc = 0;
        //get reset resource
        gf_dev->reset_gpio = of_get_named_gpio(gf_dev->spi->dev.of_node, "reset-gpios", 0);
        if (!gpio_is_valid(gf_dev->reset_gpio)) {
                gf_debug(ERR_LOG, "%s, of_get_named_gpio RESET GPIO is invalid.\n", __func__);
                return -1;
        }
        rc = gpio_request(gf_dev->reset_gpio, "reset-gpios");
        if (rc) {
                gf_debug(ERR_LOG, "%s, Failed to request RESET GPIO. rc = %d\n", __func__, rc);
                return -1;
        }
        gpio_direction_output(gf_dev->reset_gpio, 1);

      //get irq resourece
        gf_dev->irq_gpio = of_get_named_gpio(gf_dev->spi->dev.of_node, "irq-gpios", 0);
        gf_debug(DEBUG_LOG, "%s, gf:irq-gpios :%d\n", __func__, gf_dev->irq_gpio);
        if (!gpio_is_valid(gf_dev->irq_gpio)) {
                gf_debug(ERR_LOG, "%s, IRQ GPIO is invalid.\n", __func__);
                return -1;
        }

        rc = gpio_request(gf_dev->irq_gpio, "irq-gpios");
        if (rc) {
                gf_debug(ERR_LOG, "%s, Failed to request IRQ GPIO. rc = %d\n", __func__, rc);
                return -1;
        }
        gpio_direction_input(gf_dev->irq_gpio);

        return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

6,关于 驱动注册函数还是使用 spi设备总线驱动注册函数 spi_register_driver 注册。

static struct spi_driver gf_spi_driver = {
	.driver = {
		.name = GF_DEV_NAME,
		.bus = &spi_bus_type,
		.owner = THIS_MODULE,
#ifdef CONFIG_OF
		.of_match_table = gf_of_match,
#endif
	},
	.probe = gf_probe,
	.remove = gf_remove,
};

static int __init gf_init(void)
{
	int status = 0;

	FUNC_ENTRY();
	
	status = spi_register_driver(&gf_spi_driver);
	if (status < 0) {
		gf_debug(ERR_LOG, "%s, Failed to register SPI driver.\n", __func__);
		return -EINVAL;
	}

	FUNC_EXIT();
	return status;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

7, 修改access_ok函数

老版本的kernel 的 access_ok 函数有三个参数, kernel-5.10 这个版本的access_ok 只有两个参数, 需要修改 。 不然会编译报错。

//修改前
retval = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));

//修改后
retval = !access_ok( (void __user *)arg, _IOC_SIZE(cmd));
  • 1
  • 2
  • 3
  • 4
  • 5

8,编译验证。

编译完成后, 烧录boot 重开机后,dev下 指纹驱动设备节点goodix_fp 已生成。

rk3588s_lubancat_4_mipi600p:/dev # ls  goo*
goodix_fp
  • 1
  • 2

probe 函数中有加spi 读取 ID 的代码。 获取到期望的数值。chip id = 0x7, 0xa0, 0x0, 0x25。

[10:37:33.169] [    2.984206][    T1] [gf] gf_init, 1300, enter
[10:37:33.169] [    2.984245][    T1] [gf] gf_probe, 991, enter
[10:37:33.169] [    2.984250][    T1] [gf] gf_probe, Setting gf device configuration==========
[10:37:33.169] [    2.984275][    T1] [gf] gf_get_gpio_dts_info, gf:irq-gpios :124
[10:37:33.169] [    2.984309][    T1] [gf] gf_probe, major=235, minor=0
[10:37:33.169] [    2.984366][    T1] [gf] gf_probe, device create success.
[10:37:33.169] [    2.984372][    T1] [gf] gf_probe, Success create sysfs file.
[10:37:33.169] [    2.984416][    T1] input: gf-keys as /devices/virtual/input/input2
[10:37:33.169] [    2.984539][    T1] [gf] gf_probe irq thread request success!
[10:37:33.169] [    2.984545][    T1] [gf] gf_disable_irq disable interrupt!
[10:37:33.169] [    2.984558][    T1] [gf] [gf_netlink_init] : netlink create success
[10:37:33.169] [    2.984768][    T1] [gf] gf_probe, chip  id  =  0x7, 0xa0, 0x0, 0x25
[10:37:33.169] [    2.984772][    T1] [gf] gf_probe probe finished
[10:37:33.169] [    2.984776][    T1] version V1.2.02
[10:37:33.169] [    2.984780][    T1] [gf] gf_probe, 1173, exit
[10:37:33.169] [    2.984801][    T1] [gf] gf_init, 1308, exit
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

9,kernel 驱动移植本该完成了,但在阅读开发板资料时, 发现开发板使用通讯电压为3.3V, 而指纹模块通讯电压是1.8V, 现在通讯速率1M, 勉强还能读到。 一旦20M 通讯速率时可能会出错。 但是开发板已经将通讯电压固定成3.3V 无法改成1.8V, 因此需要通过电压转换模块来将电压改成1.8V。 待收到电压转换模块后再做处理。

10,kernel 移植完成之后,接下来需要移植上层, 详情请见 瑞芯微RK3588S Android12 REE 指纹代码移植(2)–Hal 移植

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/640563
推荐阅读
相关标签
  

闽ICP备14008679号