瑞芯微RK3588S Android12 REE 指纹代码移植(1)--Kernel移植

瑞芯微RK3588S Android12 REE 指纹代码移植(1)--Kernel移植 一概述RK3588S Android12 SDK源码中kernel 版本为kernel-5.10使用的是gf3626指纹模组。使用ree 进行spi 通讯。指纹模组供电电压3.3V SPI通讯电压1.8V 最高通讯速率24M。以此记录移植过程。二移植代码到kernel中移植前先把代码建仓备份使用git init 建仓 touch .gitignore 创建忽略加仓规则忽略编译产出文件加仓。 最后git add 加仓 git commit 提交。# # 编译产物# *.o *.a *.so *.so.* *.dylib *.dll *.exe *.ko *.out *.elf *.bin *.hex *.map# # Android# out/ *.img *.dtb *.dtbo *.ko *.vdex *.odex *.oat *.art .jack-server/ .jack/# # Build 目录# build/ _build/ cmake-build-*/ .idea/ *.iml# # 临时文件# *~ *.swp *.swo .DS_Store Thumbs.db *.log1在kernel-5.10/drivers/input 中建立一个文件夹方入指纹代码。digiproP510:~/RK3588S/android12-rkr14.1-rk3588/kernel-5.10/drivers/input$ mkdir gf3626digiproP510:~/RK3588S/android12-rkr14.1-rk3588/kernel-5.10/drivers/input$lsgameport keyboard misc sensors tablet gf3626 joystick Makefile remotectl serio touchscreen Kconfig mouse rmi42修改当前目录的Makefile 把gf3626 文件夹加入编译digiproP510:~/RK3588S/android12-rkr14.1-rk3588/kernel-5.10/drivers/input$ vim Makefileobj-ygf3626/3, 进入gf3626 驱动文件夹编写Makefile 将驱动文件加入编译。digiproP510:~/RK3588S/android12-rkr14.1-rk3588/kernel-5.10/drivers/input/gf3626$ lsgf_common.c gf_common.h gf_common.o gf_platform.c gf_spi_access.c gf_spi_access.h Kconfig MakefiledigiproP510:~/RK3588S/android12-rkr14.1-rk3588/kernel-5.10/drivers/input/gf3626$vim Makefileobj-ygf_common.o gf_spi_access.o gf_platform.o4在DTSI中添设置spi 设备对应的管脚 以及 中断 和 复位脚的设定。从开发板外接是GPIO脚看只有SPI0_M2可用DTSI 添加内容如下compatible 需要与kernel 里面的compatible 相同 不然无法加载probe。 电源使用3.3V长供电因此暂时不用测试电源脚。digiproP510:~/RK3588S/android12-rkr14.1-rk3588$ vim kernel-5.10/arch/arm64/boot/dts/rockchip/rk3588s-lubancat-4.dtsispi0{statusokay;#address-cells 1;#size-cells 0;pinctrl-namesdefault;pinctrl-0spi0m2_cs0spi0m2_pins;//设定SPI 相关引脚 num-cs1;goodix_fp0{compatiblerockchip,fingerprint;reg0;//chipselect0:cs01:cs1 spi-max-frequency24000000;//spi output clock interrupt-parentgpio3;interruptsRK_PD4 IRQ_TYPE_EDGE_FALLING;irq-gpiosgpio3 RK_PD4 IRQ_TYPE_EDGE_FALLING;reset-gpiosgpio3 RK_PD2 GPIO_ACTIVE_LOW;};};5修改kernel 的 compatible 以及 中断 和 复位脚的名字 与 DTSI 一致//compatible static const struct of_device_id gf_of_match[]{{.compatiblerockchip,fingerprint,},{},};/*INT REST pins reference.*/intgf_get_gpio_dts_info(structgf_device*gf_dev){intrc0;//get reset resourcegf_dev-reset_gpioof_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;}rcgpio_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 resourecegf_dev-irq_gpioof_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;}rcgpio_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);return0;}6关于 驱动注册函数还是使用 spi设备总线驱动注册函数 spi_register_driver 注册。staticstructspi_drivergf_spi_driver{.driver{.nameGF_DEV_NAME,.busspi_bus_type,.ownerTHIS_MODULE,#ifdefCONFIG_OF.of_match_tablegf_of_match,#endif},.probegf_probe,.removegf_remove,};staticint__initgf_init(void){intstatus0;FUNC_ENTRY();statusspi_register_driver(gf_spi_driver);if(status0){gf_debug(ERR_LOG,%s, Failed to register SPI driver.\n,__func__);return-EINVAL;}FUNC_EXIT();returnstatus;}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));8编译验证。编译完成后 烧录boot 重开机后dev下 指纹驱动设备节点goodix_fp 已生成。rk3588s_lubancat_4_mipi600p:/dev# ls goo*goodix_fpprobe 函数中有加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,major235,minor0[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 id0x7,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,exit9kernel 驱动移植本该完成了但在阅读开发板资料时 发现开发板使用通讯电压为3.3V 而指纹模块通讯电压是1.8V 现在通讯速率1M 勉强还能读到。 一旦20M 通讯速率时可能会出错。 但是开发板已经将通讯电压固定成3.3V 无法改成1.8V 因此需要通过电压转换模块来将电压改成1.8V。 待收到电压转换模块后再做处理。10kernel 移植完成之后接下来需要移植上层 详情请见 瑞芯微RK3588S Android12 REE 指纹代码移植2–Hal 移植