680|3

185

帖子

3

TA的资源

一粒金砂(高级)

楼主
 

【Luckfox Pico Max评测】TMF8821驱动移植与测试 [复制链接]

# dtof驱动移植

最近在玩一款dToF传感器TMF8821,接口是I2C,现在将这款传感器的驱动移植到RV1106G3下面。

内核模块

rv1106使用的是5.10.160内核版本。TMF8821提供linux官方驱动TMF882x_Driver_Linux_v3.56.zip 内核模块。

GitHub上面有其他公司修改后的版本:https://github.com/brainlab-vied/tmf8820_21_28_driver_linux

修改Makefile,设置好ARCH和交叉编译器路径

  1. KDIR:=/home/bruce/Documents/luckfox-pico/sysdrv/source/kernel
  2. PWD?=$(shell pwd)
  3. MAKE := make
  4. ARCH := arm
  5. CROSS_COMPILE := /home/bruce/Documents/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-
  6. KBUILD_OUTPUT := $(abspath $(dir $(lastword $(KDIR))))/objs_kernel
  7. ifneq ($(KERNELRELEASE),)
  8. #kbuild part of Makefile
  9. include Kbuild
  10. else
  11. #normal Makefile
  12. all:
  13. $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(PWD) modules
  14. modules:
  15. $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(PWD) $@
  16. sign:
  17. $(SIGN_SCRIPT) sha512 $(LINUX_SRC)/signing_key.priv $(LINUX_SRC)/signing_key.x509 $(DEVICE_NAME).ko
  18. clean:
  19. $(MAKE) -C $(LINUX_SRC) M=$$PWD clean
  20. endif

直接编译有错误

  1. make CONFIG_SENSORS_TMF882X=m
  2. make ARCH=arm CROSS_COMPILE=/home/bruce/Documents/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf- -C /home/bruce/Documents/luckfox-pico/sysdrv/source/kernel M=/home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56 modules
  3. make[1]: Entering directory '/home/bruce/Documents/luckfox-pico/sysdrv/source/kernel'
  4. CC [M]/home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.o
  5. In file included from /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_host_interface.h:36,
  6. from /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_mode_app.h:39,
  7. from /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_interface.h:38,
  8. from /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:57:
  9. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_shim_linux_kernel.h: In function 'tof_get_timespec':
  10. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_shim_linux_kernel.h:89:5: error: implicit declaration of function 'getnstimeofday'; did you mean 'getname_flags'? [-Werror=implicit-function-declaration]
  11. getnstimeofday(ts);
  12. ^~~~~~~~~~~~~~
  13. getname_flags
  14. In file included from /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_interface.h:38,
  15. from /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:57:
  16. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_mode_app.h: At top level:
  17. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_mode_app.h:228:25: error: field 'timestamp' has incomplete type
  18. struct timespec timestamp;
  19. ^~~~~~~~~
  20. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c: In function 'tof_ram_patch_callback':
  21. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:2250:12: error: variable 'start_ts' has initializer but incomplete type
  22. struct timespec start_ts = {0}, end_ts = {0};
  23. ^~~~~~~~
  24. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:2250:33: error: excess elements in struct initializer [-Werror]
  25. struct timespec start_ts = {0}, end_ts = {0};
  26. ^
  27. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:2250:33: note: (near initialization for 'start_ts')
  28. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:2250:21: error: storage size of 'start_ts' isn't known
  29. struct timespec start_ts = {0}, end_ts = {0};
  30. ^~~~~~~~
  31. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:2250:12: error: variable 'end_ts' has initializer but incomplete type
  32. struct timespec start_ts = {0}, end_ts = {0};
  33. ^~~~~~~~
  34. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:2250:47: error: excess elements in struct initializer [-Werror]
  35. struct timespec start_ts = {0}, end_ts = {0};
  36. ^
  37. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:2250:47: note: (near initialization for 'end_ts')
  38. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:2250:37: error: storage size of 'end_ts' isn't known
  39. struct timespec start_ts = {0}, end_ts = {0};
  40. ^~~~~~
  41. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:2276:17: error: implicit declaration of function 'timespec_sub'; did you mean 'timespec64_sub'? [-Werror=implicit-function-declaration]
  42. fwdl_time = timespec_sub(end_ts, start_ts).tv_nsec / 1000000;
  43. ^~~~~~~~~~~~
  44. timespec64_sub
  45. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:2250:37: error: unused variable 'end_ts' [-Werror=unused-variable]
  46. struct timespec start_ts = {0}, end_ts = {0};
  47. ^~~~~~
  48. /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.c:2250:21: error: unused variable 'start_ts' [-Werror=unused-variable]
  49. struct timespec start_ts = {0}, end_ts = {0};
  50. ^~~~~~~~
  51. cc1: all warnings being treated as errors
  52. make[2]: *** [scripts/Makefile.build:273: /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56/tmf882x_driver.o] Error 1
  53. make[1]: *** [Makefile:1935: /home/bruce/Documents/ams_tmf8820_linux_driver_src_v3.56] Error 2
  54. make[1]: Leaving directory '/home/bruce/Documents/luckfox-pico/sysdrv/source/kernel'
  55. make: *** [Makefile:16: all] Error 2

编译失败的主要原因是 Linux 内核 API 的兼容性问题。具体来说,驱动代码中使用了较旧的内核 API(如 getnstimeofdaytimespec),而这些 API 在新版本的内核中已经被弃用或修改。

需要修改源代码

  1. struct timespec ts;
  2. getnstimeofday(&ts);// 旧代码

替换成

  1. struct timespec64 ts;
  2. ktime_get_real_ts64(&ts);// 新代码

代码中使用了 struct timespec,需要将其替换为 struct timespec64

修改 tmf882x_shim_linux_kernel.h

  1. #include <linux/time64.h>// 添加头文件
  2. static inline void tof_get_timespec(struct timespec64 *ts) {
  3. ktime_get_real_ts64(ts);// 替换 getnstimeofday
  4. }

相关变量都修改好,再次编译成功。可以看到在当前目录下成功生成了tmf882x.ko内核模块。

修改设备树

根据开发板接线图,准备使用i2c3

修改sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-max.dts,使能i2c3,添加节点tmf8821,添加gpio控制引脚。GPIO1_C6接ENABLE引脚,高电平有效。GPIO1_C7接irq引脚,下降沿有效。

  1. /* I2C3_M1 */
  2. &i2c3 {
  3. status = "okay";
  4. pinctrl-names = "default";
  5. pinctrl-0 = <&i2c3m1_xfer>;
  6. clock-frequency = <100000>;
  7. tmf8821: tmf8821@41 {
  8. compatible = "ams,tmf882x";
  9. status = "okay";
  10. reg = <0x41>;
  11. enable-gpios = <&gpio1 RK_PC6 GPIO_ACTIVE_HIGH>; // GPIO1_C6 enable
  12. irq-gpios = <&gpio1 RK_PC7 GPIO_ACTIVE_HIGH>; // GPIO1_C7 irq
  13. interrupt-parent = <&gpio1>;
  14. interrupts = <RK_PC7 IRQ_TYPE_EDGE_FALLING>;
  15. };
  16. };

编译重新烧录开发板。

加载firmware

tmf8821传感器上电后需要加载固件才能进入app运行模式,将官方提供的hex文件放到开发板/lib/firmware/tmf882x_firmware.bin。注意:这里必须将官方提供的.hex文件重命名为tmf882x_firmware.bin,不要转换hex文件。我刚开始用工具将hex文件转换成bin文件加载一直无法启动。

加载运行

将上面编译好的tmf882x.ko,官方提供的设备固件tmf882x_firmware.bin下载到设备中

运行

  1. insmod tmf882x.ko

成功启动设备

总结

通过在RV1106上集成tmf8821,了解了linux下i2c和gpio中断驱动开发的一些基本知识,并且对RV1106软件构架有了一些认识。

查看精华帖全部内容,请登录或者注册
此帖出自ARM技术论坛

最新回复

大佬,牛逼   详情 回复 发表于 2025-2-26 14:19
点赞 关注(1)
 

回复
举报

185

帖子

3

TA的资源

一粒金砂(高级)

沙发
 
ams_tmf8820_linux_driver_src_v3.56.zip (1.72 MB, 下载次数: 2)
rv1106g-luckfox-pico-max.dts (2.47 KB, 下载次数: 1)
此帖出自ARM技术论坛
 
 
 

回复

95

帖子

1

TA的资源

一粒金砂(高级)

板凳
 

大佬!牛逼!

此帖出自ARM技术论坛
 
 
 

回复

102

帖子

2

TA的资源

一粒金砂(中级)

4
 

大佬,牛逼

此帖出自ARM技术论坛
 
个人签名

点个灯吧

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名最后一周!2025 英飞凌消费、计算与通讯创新大会-北京站
会议时间:3月18日(周二)09:30签到
参会奖励:电动螺丝刀套装、户外登山包、京东卡

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表