X2000 Linux 调试VL53L0X

news2024/11/15 5:35:56

之前在RK3566上调试过VL53L0X,这次主要参照之前的记录,在X2000 linux上进行调试。

一、SDK中加入驱动

1、加入源码

不同于常规的方式,将驱动添加到kernel/driver下,君正的linux sdk,需要将驱动添加到module_driver下,可参照doc下的《模块驱动添加流程.pdf》文档。

将vl53L0X文件夹及内容添加到\module_driver\devices下,然后修改Makefile,内容如下:

#
# Makefile for the vl53L0X drivers.
#

# Each configuration option enables a list of files.
FEATURE_USE_CCI := false
#FEATURE_USE_CCI := true

ifeq ($(FEATURE_USE_CCI), true)
ccflags-y	+= -I$(DRIVERS_DIR)/devices/vl53L0X/inc -DCAMERA_CCI
else
ccflags-y	+= -I$(DRIVERS_DIR)/devices/vl53L0X/inc
ccflags-y	+= -I$(DRIVERS_DIR)/devices/vl53L0X
endif


include $(DRIVERS_DIR)/tools/common_module.mk

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

module-y	+=  stmvl53l0x_module.o
module-y	+=  stmvl53l0x_module-i2c.o
module-y	+=  stmvl53l0x_module-cci.o
module-y	+=  src/vl53l0x_api_calibration.o
module-y	+=  src/vl53l0x_api_core.o
module-y	+=  src/vl53l0x_api_ranging.o
module-y	+=  src/vl53l0x_api_strings.o
module-y	+=  src/vl53l0x_api.o
module-y	+=  src/vl53l0x_platform.o
module-y	+=  src/vl53l0x_i2c_platform.o
module-y	+=  src/vl53l0x_port_i2c.o

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

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

2、添加配置文件

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

vl53l0x\Config.in

vl53l0x\vl53l0x.mk

两个文件。

vl53l0x\Config.in的内容如下:


menuconfig MD_STMVL53L0X
    bool "stmvl53l0x"

config MD_VL53L0X_IRQ_GPIO
    string "gpio irq(vl53L0x 中断引脚)"
    choice from SOC_GPIO_PINS

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

endmenu

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

vl53l0x\vl53l0x.mk内容如下:

#-------------------------------------------------------
package_name = vl53l0x
package_depends = utils
package_module_src = devices/vl53L0X/
package_make_hook =
package_init_hook =
package_finalize_hook = vl53l0x_finalize_hook
package_clean_hook =
#-------------------------------------------------------

vl53l0x_init_file = output/vl53l0x.sh

define vl53l0x_finalize_hook
	$(Q)cp devices/vl53L0X/stmvl53l0x.ko output/
	$(Q)echo "insmod stmvl53l0x.ko \\" >> $(vl53l0x_init_file)
	$(Q)echo " vl53l0x_i2c_bus_num=$(MD_VL53L0X_I2C_BUSNUM) \\" >> $(vl53l0x_init_file)

	$(Q)echo " vl53l0x_irq_gpio=$(MD_VL53L0X_IRQ_GPIO) \\" >> $(vl53l0x_init_file)
	$(Q)echo >> $(vl53l0x_init_file)
endef

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

修改other\Config.in,加入vl53L0X的配置:

menu "其它类型设备列表"
source /package/devices/other/pwm_battery/Config.in
source /package/devices/other/vl53l0x/Config.in
endmenu

修改other\other.mk,加入vl53L0x的mk:

package-$(MD_PWM_BATTERY) += package/devices/other/pwm_battery/pwm_battery.mk
package-$(MD_STMVL53L0X) += package/devices/other/vl53l0x/vl53l0x.mk

3、配置文件中选中vl53L0X

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

 点击Open

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

 然后点击File->Save。

二、修改驱动源码

由于st官方的驱动文件适用于常规方式,但用于君正平台,需要做些修改。

1、stmvl53l0x_module-i2c.c文件修改

包含头文件

#include <utils/i2c.h>
#include <utils/gpio.h>

stmvl53l0x_init_i2c()函数中添加代码:

++static u32 i2c_bus_num;

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

++static struct i2c_board_info vl53l0x_info = {
++    .type = STMVL53L0X_DRV_NAME,
++    .addr = STMVL53L0X_SLAVE_ADDR,
++};

int stmvl53l0x_init_i2c(void)
{
	int ret = 0;

#ifdef STM_TEST
	struct i2c_client *client = NULL;
	struct i2c_adapter *adapter;
	struct i2c_board_info info = {
		.type = "stmvl53l0",
		.addr = STMVL53L0X_SLAVE_ADDR,
	};
#endif

	vl53l0x_dbgmsg("Enter\n");

	/* register as a i2c client device */
	ret = i2c_add_driver(&stmvl53l0x_driver);
	if (ret < 0)
		vl53l0x_errmsg("%d erro ret:%d\n", __LINE__, ret);

#ifdef STM_TEST
	if (!ret) {
		adapter = i2c_get_adapter(4);
		if (!adapter)
			ret = -EINVAL;
		else
			client = i2c_new_device(adapter, &info);
		if (!client)
			ret = -EINVAL;
	}
#endif

++    i2c_connect_client = i2c_register_device(&vl53l0x_info, i2c_bus_num);
++    if (i2c_connect_client == NULL) {
++        vl53l0x_errmsg("failed to register i2c device\n");
++        i2c_del_driver(&stmvl53l0x_driver);
++        return -EINVAL;
++    }
	
	vl53l0x_dbgmsg("End with rc:%d\n", ret);

	return ret;
}

stmvl53l0x_power_up_i2c()内容修改:

int stmvl53l0x_power_up_i2c(void *i2c_object, unsigned int *preset_flag)
{
	int ret = 0;
	
#ifndef STM_TEST
	struct i2c_data *data = (struct i2c_data *)i2c_object;
#endif

	vl53l0x_dbgmsg("Enter\n");

	/* actual power on */
#ifndef STM_TEST
	data->power_up = 1;
	*preset_flag = 1;
#endif

	vl53l0x_dbgmsg("End\n");
	return ret;
}

stmvl53l0x_power_down_i2c()内容修改:

int stmvl53l0x_power_down_i2c(void *i2c_object)
{
	int ret = 0;
#ifndef STM_TEST
	struct i2c_data *data = (struct i2c_data *)i2c_object;
#endif

	vl53l0x_dbgmsg("Enter\n");
#ifndef STM_TEST
	data->power_up = 0;
#endif

	vl53l0x_dbgmsg("End\n");
	return ret;
}

2、stmvl53l0x_module.c文件修改

++#include <utils/gpio.h>

--#define    IRQ_NUM

++int IRQ_NUM;

++//irq gpio info
++module_param_gpio_named(vl53l0x_irq_gpio, IRQ_NUM, 0644);

三、编译、运行

cd到build目录,执行

make x2100_nand_defconfig
make app_module_driver
make buildroot

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

如果一切正常,启动后/dev目录下有stmvl53l0x_ranging设备。

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

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

相关文章

【IIC子系统】IIC驱动框架解析(一)

文章目录 I2C设备驱动开发I2C设备驱动的三种匹配方式&#xff08;1&#xff09;通用的匹配方式&#xff1a;OF style match&#xff08;2&#xff09;电源管理专用的匹配方式&#xff1a;ACPI style match&#xff08;3&#xff09;I2C专用的匹配方式&#xff1a;I2C id table …

Prometheus时间序列选择器

下面均以prometheus_http_requests_total为例子&#xff0c;即prometheus的HTTP请求数&#xff0c;在机器上装prometheus server即可。 本篇简述prometheus的常用检索规则与工具&#xff1a;瞬间向量选择器、区间向量选择器与时间位移选择器。 瞬间向量选择器 瞬间向量选择器&a…

AI绘图提示词/咒语/词缀/关键词使用指南(Stable Diffusion Prompt 设计师操作手册)

基本知识&#xff1a; 安装及其问题解决参考&#xff1a;《Windows安装Stable Diffusion WebUI及问题解决记录》&#xff1b;运行使用时问题《Windows使用Stable Diffusion时遇到的各种问题整理》&#xff1b;模型运用及参数《Stable Diffusion 个人推荐的各种模型及设置参数、…

人工智能现状研究报告(上)

原创 | 文 BFT机器人 01 介绍 定义 人工智能(A):一种广泛的学科&#xff0c;其目标是创造智能机器&#xff0c;而不是人类和动物所展示的自然智能。 通用人工智能(AlamosGold):一个术语&#xff0c;用来描述未来机器可以在所有有经济价值的任务中达到甚至超过人类的全部认知能力…

SQL高级之慢查询日志

简介 他是一种日志记录&#xff0c;用来记录在MySql中响应时间超过阈值的语句&#xff0c;具体指运行时间超过long_query_time值的SQL&#xff0c;会被记录到慢查询日志中long_query_time的默认值为10&#xff0c;运行超过10s以上的语句就会被记录默认情况下&#xff0c;MYSQL…

python自动化测试之unittest简介讲解

一、unittest简介 1.先导入unittest 2.用help函数查看源码解析 3.查看描述&#xff1a; Python unit testing framework, based on Erich Gammas JUnit and Kent Becks Smalltalk testing framework. 翻译&#xff1a;python的单元测试框架&#xff0c;是基于java的junit测…

某农商行利用双因素认证和域用户自助改密方案构筑强身份验证机制,减轻IT运维压力

银行关键业务系统的安全关系到人民财产安全、隐私保护。为了提升银行关键信息基础设施安全防护水平&#xff0c;满足《关键信息基础设施安全保护要求》、等保要求等&#xff0c;某市农商银行正在借助宁盾 2FA 双因素认证和员工自助改密方案为操作系统终端、业务系统、堡垒机等设…

python3爬虫【二】python爬虫进行AES解密遇到的问题

1、TypeError: Object type <class ‘str’> cannot be passed to C code 报错如下&#xff1a; File "C:\Python311\Lib\site-packages\Crypto\Util\_raw_api.py", line 143, in c_uint8_ptrraise TypeError("Object type %s cannot be passed to C cod…

强化学习:随机近似与随机梯度下降

mean estimation 通过前面的学习&#xff0c;我们知道可以通过很多采样来求期望。而求 x ˉ \bar x xˉ 的方法由两种&#xff0c;一是直接将采样数据相加再除以个数&#xff0c;但这样的方法运行效率较低。 第二种方法是迭代式的计算&#xff0c;即来几个数据就算几个数据&a…

C++----析构函数,拷贝构造函数(6)

析构函数 概念 析构函数是一个特殊的函数&#xff0c;函数名和类名相同&#xff0c;但是要在前面加~&#xff0c;既没有参数&#xff0c;也没有返回值。析构函数在对象被销毁自动调用一次 如果类中没有析构函数&#xff0c;编译器会生成一个什么也不做的析构函数 如果类中有…

磁盘调度算法(期末复习版)

文章目录 一. FCFS 调度(先来先服务)二.SSTF调度(最短寻道时间优先)三. SCAN 调度(电梯算法)四. C-SCAN 调度(循环扫描)五. LOOK 调度 一. FCFS 调度(先来先服务) 磁盘调度的最简单形式当然是先来先服务&#xff08;FCFS&#xff09;算法。虽然这种算法比较公平&#xff0c;但…

MySQL千亿级数据生产环境扩容

MySQL千亿级数据生产环境扩容 数据库平滑扩容1. 扩容方案剖析1.1 扩容问题1.2 停机方案1.3 停写方案1.4 日志方案1.5 双写方案&#xff08;中小型数据&#xff09;1.6 平滑2N方案&#xff08;大数据量&#xff09; 2. 平滑2N扩容方案实践2.1 实现应用服务级别的动态扩容2.1.1 M…

时间序列表征之SAX(Symbolic Aggregate approXimation)算法

前言 对于研究时间序列表征、时间序列分类&#xff0c;时间序列状态转换等方向&#xff0c;常用的简单粗暴的一个方法是SAX (Symbolic Aggregate approXimation), 由Jessica Lin等在2003年发表的论文中提出的&#xff0c;该论文的题目为《A Symbolic Representation of Time Se…

敏捷方法中测试人员的价值?

敏捷方法在软件开发中受到青睐&#xff0c;特别是在互联网应用服务系统的开发中&#xff0c;越来越多的公司采用敏捷方法&#xff0c;包括XP、Scrum、Lean、Crystal、FDD等。具体的敏捷方法在操作时有一些区别&#xff0c;但基本思想是一致的&#xff0c;如客户至上、拥抱变化、…

yolov8 源码解读 (part1: backbone, head)

yolov8 除了目标检测之外,还有实例分割功能, 这里解读检测和分割代码。 先上一张结构图,这个图里没有分割模块,后面会在代码里说明分割模块。 本篇解读红色框内的部分。 可以看到每个模块右边都有一个数字:0,1,… 这个数字是模块的顺序编号,按0,1,…,21的顺序进行,而…

澎湃新闻对话腾讯丁珂:从“治已病”到“治未病”,企业需快速构建“安全免疫力”

作者&#xff1a;澎湃新闻记者 周頔 随着数字化进程加快&#xff0c;企业数字化体系的边界在不断拓展&#xff0c;安全风险和挑战不断增加&#xff0c;传统被动防御的安全应对常显疲态&#xff0c;数字安全时代亟待建立全新的安全范式。 6月13日&#xff0c;腾讯安全联合IDC等…

华为某正式员工哀叹:自己被劝退了,同期入职的OD还好好的,正式员工还没外包稳定!...

在打工人心中&#xff0c;正式员工的含金量远远高于外包&#xff0c;但最近却有人爆料&#xff1a;华为正式员工还没外包稳定&#xff01; 一位硕士毕业、工作两年的华为正式员工说&#xff0c;自己被劝退了&#xff0c;但隔壁组同期入职的OD还好好的&#xff0c;正式员工竟然还…

Instant-NGP稿子

Instant-NGP是英伟达2022年发表的一篇论文&#xff0c;全称是使用哈希编码的多分辨率的即时神经图形原语 那这篇文章呢 这篇文章提出了一种对输入做哈希encoding的方式&#xff0c;来让很小的网络也能学到很高的质量。 这个图片是文中的一个图片&#xff0c;表现了可以在训练…

大数据Doris(四十六):Stream Load基本原理和语法介绍

文章目录 Stream Load基本原理和语法介绍 一、基本原理 二、语法与结果 1、语法 2、返回结果 Stream Load基本原理和语法介绍 Stream load 是一个同步的导入方式&#xff0c;用户通过发送 HTTP 协议发送请求将本地文件或数据流导入到 Doris 中。Stream load 同步执行导入…

简要介绍 | 图像聚类:概念、原理与方法

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对图像聚类进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 图像聚类&#xff1a;概念、原理与方法 Cluster Analysis | NVIDIA Developer 1. 背景介绍 图像聚类&#xff08;Image Clustering&a…