当前位置: 首页 > news >正文

瑞芯微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 *.log

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

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

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

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

obj-y+=gf3626/

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

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

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>;//chipselect0:cs01: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>;};};

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

//compatible static const struct of_device_id gf_of_match[]={{.compatible="rockchip,fingerprint",},{},};
/*INT REST pins reference.*/intgf_get_gpio_dts_info(structgf_device*gf_dev){intrc=0;//get reset resourcegf_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 resourecegf_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);return0;}

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

staticstructspi_drivergf_spi_driver={.driver={.name=GF_DEV_NAME,.bus=&spi_bus_type,.owner=THIS_MODULE,#ifdefCONFIG_OF.of_match_table=gf_of_match,#endif},.probe=gf_probe,.remove=gf_remove,};staticint__initgf_init(void){intstatus=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();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_fp

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

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

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

http://www.jsqmd.com/news/1301782/

相关文章:

  • 3个理由告诉你为什么BiliBili-UWP是Windows上最优秀的B站第三方客户端
  • 7 月总结:独立开发者从 0 到 1 的完整回顾——技术、产品与市场的三角平衡
  • VOC2028 安全帽佩戴检测数据集介绍、下载及YOLO/VOC/COCO训练格式转换
  • Python+Pyecharts实现动态销售数据可视化实战
  • 治愈系生活工具的设计系统:从颜色语义到组件规范
  • 第二阶段 15 · prefix / wildcard / fuzzy 模糊匹配
  • 从几个开源项目浅谈IOS视频流输出方案
  • 专科生论文写作工具对比:千笔与文途AI深度评测
  • 工具型PM发现Axure再熟练也画不出Agent的产品体验,开始重新学设计AI产品
  • RK平台SENSOR框架分析
  • 终极免费AI视频增强神器:3步将模糊视频无损升级到4K超高清
  • 内蕴时空正则化纲领:分形时间重构消解Navier–Stokes有限时间奇点
  • git多人开发流程
  • G-Helper终极指南:释放华硕笔记本隐藏性能的免费轻量级工具
  • 清华智谱开源发布ScaleCUA:可扩展的任务合成和在线强化学习 GUI Agent框架,9B模型刷新开源SOTA
  • 大语言模型选型指南:从技术原理到生产部署的实践路径
  • 祈盟游戏运营平台?业务范围、合作流程与适用团队说明
  • ComfyUI LLM Party终极指南:三步构建你的AI智能工作流
  • 1688货源对接抖店一件代发|密文下单+AI违规预检完整实操流程(2026合规标准版) - 电商分享
  • Python打字游戏开发:从零实现GUI打字速度练习工具
  • STM32定时器同步触发启动:硬件级精准时序控制实战指南
  • 无线动能开关|户外露天快递驿站雨棚照明免布线控制方案
  • STM32F407嵌入式开发实战:从Cortex-M4内核到以太网通信全解析
  • 告别游戏限制!3步解锁Wand-Enhancer专业功能完整体验
  • 全球DC/RF探针台市场前景调研分析及投资建议研究报告2026年版
  • GEZHI(格致):面向社科研究的智能体架构
  • 信息系统的五大组成要素
  • 观察五年,铝艺大门的几个真实现状
  • SIOC测试是什么?亚马逊6A测试卖家必看的包装闯关全解
  • 如何快速掌握Akagi:你的智能麻将AI教练从入门到精通完整指南