X2000 Linux 调试VL53L4CD驱动

news2024/7/6 17:56:57

由于VL53L4CD具有更高的精度,更低的功耗,所以尝试将VL53L4CD移植到X2000上进行测试。

一、下载驱动

en.VL53L4CD_LinuxDriver

 二、SDK中加入驱动

1、加入源码

在\module_driver\devices下创建VL53L4CD文件夹,再将\en.VL53L4CD_LinuxDriver\VL53L4CD_LinuxDriver_V2.1.1\kernel中的stmvl53l4cd_i2c.c、stmvl53l4cd_module.c、stmvl53l4cd_i2c.h文件拷贝到\module_driver\devices\VL53L4CD下。

2、添加Makefile

再创建一个Makefile,写入内容如下:

#
# Makefile for the stmvl53l4cd drivers.
#

include $(DRIVERS_DIR)/tools/common_module.mk

EXTRA_CFLAGS +=-Wno-error=date-time
EXTRA_CFLAGS +=-Wno-date-time
MODULE_NAME:= stmvl53l4cd

module-y	+=  stmvl53l4cd_i2c.o
module-y	+=  stmvl53l4cd_module.o

KBUILD_EXTRA_SYMBOLS := $(DRIVERS_DIR)/drivers/utils/Module.symvers

obj-m = $(MODULE_NAME).o
$(MODULE_NAME)-y = $(module-y)

 3、修改stmvl53l4cd_module.c文件

/*
 * GPIO number connected to VL53L4CD interrupt signal GPIO1
 */
--#define IRQ_GPIO -1

--static int intr_gpio_nb = IRQ_GPIO;
++static int intr_gpio_nb;

++//irq gpio info
++module_param_gpio_named(stmvl53l4cd_irq_gpio, intr_gpio_nb, 0644);

--module_param(intr_gpio_nb, int, 0000);
--MODULE_PARM_DESC(intr_gpio_nb, "select gpio number to use for vl53l4cd interrupt");

++static u32 i2c_bus_num;
++struct i2c_client * i2c_connect_client = NULL;
++/* get data */
++module_param_named(stmvl53l4cd_i2c_bus_num , i2c_bus_num, int, 0644);


++static struct i2c_board_info stmvl53l4cd_info = {
++    .type = STMVL53L4CD_DRV_NAME,
++    .addr = STMVL53L4CD_SLAVE_ADDR,
++};


static int __init st_tof_module_init(void)
{
	int ret = 0;

	printk("stmvl53l4cd: module init\n");

	/* register as a i2c client device */
	ret = i2c_add_driver(&stmvl53l4cd_i2c_driver);

	if (ret) {
		i2c_del_driver(&stmvl53l4cd_i2c_driver);
		printk("stmvl53l4cd: could not add i2c driver\n");
		return ret;
	}
	
++    i2c_connect_client = i2c_register_device(&stmvl53l4cd_info, i2c_bus_num);
++    if (i2c_connect_client == NULL) {
++        printk("failed to register i2c device\n");
++        i2c_del_driver(&stmvl53l4cd_i2c_driver);
++        return -EINVAL;
++    }

	i2c_driver_added = 1;

	return ret;
}


static int stmvl53l4cd_probe(struct i2c_client *client,
				const struct i2c_device_id *id)
{
	int ret;
	stmvl53l4cd_i2c_client = client;

	printk("stmvl53l4cd: probing i2c\n");

	raw_data_buffer = kzalloc(VL53L4CD_COMMS_CHUNK_SIZE, GFP_DMA | GFP_KERNEL);
	if (raw_data_buffer == NULL)
		 return -ENOMEM;

	st_tof_miscdev.minor = MISC_DYNAMIC_MINOR;
	st_tof_miscdev.name = "stmvl53l4cd";
	st_tof_miscdev.fops = &stmvl53l4cd_ranging_fops;
	st_tof_miscdev.mode = 0444;

	ret = misc_register(&st_tof_miscdev);
	if (ret) {
		pr_err("stmvl53l4cd : Failed to create misc device, err = %d\n", ret);
		return -1;
	}

	misc_registered = 1;

	if (intr_gpio_nb != -1)
	{

		ret = get_gpio(intr_gpio_nb, "vl53l5_intr_gpio", 0);
		if (ret != 0) {
			pr_err("Failed to acquire INTR GPIO(%d)\n", intr_gpio_nb);
		} else {
			gpio_own_flags.intr_gpio_owned = 1;

			st_tof_irq_num = gpio_to_irq(intr_gpio_nb);

			init_waitqueue_head(&wq);

			ret = request_threaded_irq(st_tof_irq_num,
						NULL,
						st_tof_intr_handler,
						IRQF_TRIGGER_RISING|IRQF_ONESHOT,
						"st_tof_sensor",
						NULL);

			if (ret) {
--				pr_err("stmvl53l4cd: Failed to Register IRQ handler,"
--				       " GPIO = %d, st_tof_irq_num = %d\n",
--				       IRQ_GPIO, st_tof_irq_num);
++				pr_err("stmvl53l4cd: Failed to Register IRQ handler,"
++				       " GPIO = %d, st_tof_irq_num = %d\n",
++				       intr_gpio_nb, st_tof_irq_num);
				kfree(raw_data_buffer);
				misc_deregister(&st_tof_miscdev);
				misc_registered = 0;
				return -EPERM;
			} else {
--				printk("stmvl53l4cd: Registered IRQ handler, GPIO = %d, "
--				       "st_tof_irq_num = %d\n",
--				       IRQ_GPIO, st_tof_irq_num);
++				printk("stmvl53l4cd: Registered IRQ handler, GPIO = %d, "
++				       "st_tof_irq_num = %d\n",
++				       intr_gpio_nb, st_tof_irq_num);
				irq_handler_registered = 1;
			}
		}
	}



	return ret;
}

4、添加配置文件

在\module_driver\package\devices\other路径下添加

VL53L4CD\Config.in

VL53L4CD\vl53l4cd.mk

两个文件。

VL53L4CD\Config.in的内容如下:

menuconfig MD_STMVL53l4CD
    bool "stmvl53l4cd"

config MD_VL53L4CD_IRQ_GPIO
    string "gpio irq(VL53L4CD 中断引脚)"
    choice from SOC_GPIO_PINS

config MD_VL53L4CD_I2C_BUSNUM
    int "i2c bus num(VL53L4CD挂接的i2c总线号)"
    default -1

endmenu

用于配置所连接的I2C总线编号、IRQ GPIO编号。

VL53L4CD\vl53l4cd.mk内容如下:

#-------------------------------------------------------
package_name = stmvl53l4cd
package_depends = utils
package_module_src = devices/VL53L4CD/
package_make_hook =
package_init_hook =
package_finalize_hook = stmvl53l4cd_finalize_hook
package_clean_hook =
#-------------------------------------------------------

stmvl53l4cd_init_file = output/stmvl53l4cd.sh

define stmvl53l4cd_finalize_hook
	$(Q)cp devices/VL53L4CD/stmvl53l4cd.ko output/
	$(Q)echo "insmod stmvl53l4cd.ko \\" >> $(stmvl53l4cd_init_file)
	$(Q)echo " stmvl53l4cd_i2c_bus_num=$(MD_VL53L4CD_I2C_BUSNUM) \\" >> $(stmvl53l4cd_init_file)

	$(Q)echo " stmvl53l4cd_irq_gpio=$(MD_VL53L4CD_IRQ_GPIO) \\" >> $(stmvl53l4cd_init_file)
	$(Q)echo >> $(stmvl53l4cd_init_file)
endef

用于将编译生成的驱动模块拷贝到\module_driver\output目录下,生成驱动的加载脚本。

other\Config.in文件中加入VL53L4CD的配置:

source /package/devices/other/VL53L4CD/Config.in

other\other.mk文件中加入VL53L4CD的mk:

package-$(MD_STMVL53l4CD) += package/devices/other/VL53L4CD/vl53l4cd.mk

5、配置文件中选中VL53L4CD

cd到tools/iconfigtool/IConfigToolApp/目录,执行./IConfigTool,选择要修改的配置文件

 点击Open

依次点击 模块驱动->外设->其它类型驱动列表,选中stmvl53l4cd

 

点击 stmvl53l4cd后的==>,然后选择IRQ GPIO和填写I2C总线编号

三、编译和烧录

cd到build目录,执行 

make x2100_nand_defconfig
make app_module_driver
make buildroot

编程成功后,会生成新的rootfs.squashfs,重新烧写rootfs.squashfs文件。

四、调试

1、查看是否正确加载

执行cmd_i2c detect 5命令查看i2c5总线上是否有设备

# cmd_i2c detect 5
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

可见i2c5总线上有地址为0x29的设备,并且注册了驱动。

2、查看dev是否有设备

# ls /dev/stm*
/dev/stmvl53l4cd

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/744628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cyclo(Ile-Leu),91741-17-2,环(异亮氨酸-亮氨酸)二肽,可以根据实验需求定制

(文章资料汇总来源于:陕西新研博美生物科技有限公司小编MISSwu)​ Cyclo(Ile-Leu),DL-isoleucyl-leucyl anhydride,环(异亮氨酸-亮氨酸)二肽,DL异亮氨酸酰酐 产品结构式: 产品规格:…

10.2.5 【Linux】变量的有效范围

在学理方面,为什么环境变量的数据可以被子程序所引用呢?这是因为内存配置的关系!理论上是这样的: 当启动一个 shell,操作系统会分配一记忆区块给 shell 使用,此内存内之变量可让子程序取用 若在父程序利用…

从User-Agent获取浏览器类型

一、User-Agent User-Agent首部包含一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。 二、从User-Agent中获取浏览器类型 1、通过自己编写js代码识别UA字符串中的浏览器类型 function getBrowser…

MobPush 工作台操作指南:查看推送数据

推送概况查询 进入“MobPush”的"概况"模块,查询推送整体的概况 推送详情查询 进入“MobPush”的"推送记录"模块 点击“详情”按钮,查看推送详情情况

请求响应-json参数的接收

JSON参数 JSON参数:JSON数据键名与形参对象属性名(即实体类中的成员变量)相同,定义POJO实体类即可接收参数,需要使用RequestBody标识前端发送JSON格式的数据,要使用POST方法发送请求,因为JSON格…

SpringBoot 项目使用 Elasticsearch 对 Word、Pdf 等文档内容的检索

本文参考自:https://blog.csdn.net/Q54665642ljf/article/details/127701719 本文适用于elasticsearch入门小白,还请大佬能指出我的不足(本人其实也是刚学elasticsearch没多久) 文章目录 一、准备工作1.1 安装ES文本抽取插件1.2 …

文件操作--按字符读写文件

目录 1、读写文件中的字符: 例题1:从键盘键入一串字符,然后把它们转存到磁盘文件上。 例题2:将0-127之间的ASCII字符写到文件中,然后从文件中读出并显示到屏幕上。 例题3:修改例题2判断读出的字符是否为…

【NeRF】相机的内外参是什么?单目相机是如何成像的?

文章目录 【NeRF】相机的内外参是什么?单目相机是如何成像的?1.相机外参2.相机内参 【NeRF】相机的内外参是什么?单目相机是如何成像的? 在做Nerf时对其中的一些原理感到困惑,因而把这些基础理论知识总结下来&#xff…

b站网页版视频投稿接口分析

b站网页版视频投稿接口分析 上传视频逻辑如下:1.预加载2.获取准备上传到服务器的数据3.分片上传(块大小最大为10MB/10485760字节)4.上传完成进行合片 上传封面逻辑如下:投稿视频: B站投稿视频(手稿&#xf…

【深度学习】:用于 GAN 的生成器架构 - 生成人脸

一、说明 生成对抗网络(GAN)是机器学习中一个相对较新的概念,于2014年首次推出。他们的目标是合成与真实图像无法区分的人工样本,例如图像。GAN 应用程序的一个常见示例是通过从名人人脸数据集中学习来生成人工人脸图像。虽然GAN图像随着时间的推移变得更加逼真,但它们的主…

短视频seo矩阵源码私有化部署方案

目录 前 言 一。 短视频seo矩阵算法 二、 短视频seo源码功能构建 三、 短视频seo私有化部署流程解读 前 言 为了更好地提高短视频平台的SEO优化效果,许多企业开始尝试私有化部署方案。这样做的好处在于,企业可以根据自身的特点和需求来灵活调整矩阵源…

龙蜥开发者说:参与开源要敢于担任不同角色 | 第 21 期

「龙蜥开发者说」第 21 期来了!开发者与开源社区相辅相成,相互成就,这些个人在龙蜥社区的使用心得、实践总结和技术成长经历都是宝贵的,我们希望在这里让更多人看见技术的力量。本期故事,我们邀请了龙蜥社区开发者支智…

教你纯小白选对Java路线

许多人问如何开启JAVA的入门这里有两个层次: 首先,你是一个局外人。你一天只用电脑一两个小时,玩游戏,其他什么都不知道。你听说JAVA很受欢迎,而且薪水很高,你想要开始学习如何入门。 这个入门,就是进入编程…

关于Apache-Commons-Lang3中元组的使用

关于Apache-Commons-Lang3中元组的使用 在日常工作中,有时候我们并不清楚有这些工具类的存在,造成在开发过程中重新实现导致时间浪费,且开发的代码质量不佳。而 apache 其实已经提供了系列的工具包给我们使用,只是大多数人&#x…

通过列排斥能比较两组迭代次数

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点,AB训练集各由6张二值化的图片组成,让差值结构中有6个1, 行分布是0,1,1,1,1,2列分布是2,2,2.统计迭代次…

回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图)

回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图) 目录 回归预测 | MATLAB实现ELM极限学习机多输入单输出回归预测(多指标、相关图)效果一览基本介绍程序设计学习总结参考资料效果一览 基本介绍 回归预测 | MATLAB实现ELM极限学习机多输入单输出回…

由于找不到d3dx9_43.dll,有什么可靠的修复方法?

由于找不到d3dx9_43.dll,无法继续执行代码,这种情况大家是否有遇见过?其实就算没遇到过,大家应该也有遇到别的dll文件丢失吧?道理都一样,都是dll文件丢失,我们只需要把它给修复就可以了&#xf…

第一阶段-第五章 Python的函数

目录 一、函数的介绍  1.学习目标  2. 什么是函数  3.本节的演示  4.为什么要学习、使用函数  5.本小节的总结 二、函数的定义  1.学习目标  2.函数的语法  3.本节的代码演示  4.本小节的总结  5.练习案例:自动查核酸 三、函数的参数  1.学习…

Mac 查看端口和关闭进程

经常使用 node 启动本地,有时一不小心按了 Ctrl Z (Command Z)把服务关闭了,但实际上没真正关闭该服务,再次启动服务很可能会提示端口号被占用。 系统环境:Mac 查看端口的详细端口占用情况 命令&#xf…

Scrapy爬虫框架集成Selenium来解析动态网页

1、爬虫项目单独使用scrpay框架的不足 当前网站普遍采用了javascript 动态页面,特别是vue与react的普及,使用scrapy框架定位动态网页元素十分困难,而selenium是最流行的浏览器自动化工具,可以模拟浏览器来操作网页,解…