调试型号为 st3x3x 光距感传感器

mtk 9.0上调试型号为 st3x3x 光距感传感器

1 查看原理图以及gpio映射表可以知道st3x3x 光距感传感器 使用i2c1通道进行通讯,中断引脚为gpio12,由此可以配置st3x3x 光距感传感器 的dts
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
根据上面的原理图和gpio映射表EINT12_ALPS—>AE12---->gpio12可以得知,st3x3x 光距感传感器中断引脚EINT12_ALPS对应的引脚是gpio12

dts文件配置如下:
dts文件路径为:\kernel-4.4\arch\arm\boot\dts\aiot8362am3_bsp.dts
调试中遇到i2c速率400k时,光距感i2c无法正常通讯的,需要把速率降低到100k,光距感i2c才正常通讯


&pio {
	alsps_intpin_cfg: alspspincfg {
	    pins_cmd_dat {
			pins = <MT8167_PIN_12_EINT12__FUNC_GPIO12>;
			slew-rate = <0>;
			bias-pull-up = <00>;
		};
	};

	alsps_intpin_default: alspsdefaultcfg {
	};
};


&alsps{
	pinctrl-names = "pin_default", "pin_cfg";
	pinctrl-0 = <&alsps_intpin_default>;
	pinctrl-1 = <&alsps_intpin_cfg>;
	status = "okay";
};
&i2c1 {
	pinctrl-names = "default";
	pinctrl-0 = <&i2c1_pins_a>;
	status = "okay";
//	clock-frequency = <400000>;//调试中遇到i2c速率400k时,光距感i2c无法正常通讯的,需要把速率降低到100k,光距感i2c才正常通讯
	clock-frequency = <100000>;
	
	stk3x3x@47{
			compatible = "mediatek,stk3x3x";
			reg = <0x47>;

			interrupt-parent = <&pio>;
			interrupts = <12 IRQ_TYPE_LEVEL_LOW 12 0>;
			debounce = <22 0>;	

			i2c_num = <1>;
			i2c_addr = <0x47 0 0 0>;
			power_id = <0xffff>;
			power_vol = <0>;
			als_level = <5 9 36 59 82 132 205 273 500 845 1136 1545 2364 4655 6982>;
			als_value = <30 40 80 130 180 290 450 600 1100 1860 2500 3400 5200 10240 10240 10240>;
			polling_mode_ps = <0>;
			polling_mode_als = <1>;
			ps_threshold_high = <1700>;
			ps_threshold_low = <1500>;
			is_batch_supported_ps = <0>;
			is_batch_supported_als = <0>;

			is_batch_supported = <0>;
			firlen = <16>;

			status = "okay";
		};
		}

**2 配置aiot8362am3_bsp_defconfig和aiot8362am3_bsp_debug_defconfig文件以及配置相关的Makefile和Kconfig **
2.1 配置aiot8362am3_bsp_defconfig和aiot8362am3_bsp_debug_defconfig文件
文件路径为:\kernel-4.4\arch\arm\configs\aiot8362am3_bsp_debug_defconfig和\kernel-4.4\arch\arm\configs\aiot8362am3_bsp_defconfig

#alsps
CONFIG_CUSTOM_KERNEL_ALSPS=y
CONFIG_MTK_STK3X3X=y

配置ProjectConfig.mk文件
路径为:\device\mediateksample\aiot8362am3_bsp\ProjectConfig.mk

# alsps sensor 
CUSTOM_KERNEL_ALSPS = stk3x3x

**2.2 配置相关的Makefile和Kconfig **
\kernel-4.4\drivers\misc\mediatek\sensors-1.0\alsps\Makefile

obj-$(CONFIG_MTK_STK3X3X)	+=  stk3x3x/

\kernel-4.4\drivers\misc\mediatek\sensors-1.0\alsps\Kconfig

source "drivers/misc/mediatek/sensors-1.0/alsps/stk3x3x/Kconfig"

\kernel-4.4\drivers\misc\mediatek\sensors-1.0\alsps\stk3x3x\Makefile

ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/alsps/inc
ccflags-y += -I$(srctree)/drivers/misc/mediatek/sensors-1.0/hwmon/include

obj-y	:=  stk3x3x.o

\kernel-4.4\drivers\misc\mediatek\sensors-1.0\alsps\stk3x3x\Kconfig


config MTK_STK3X3X
	bool "STK3X3X for MediaTek package"
	default n

\device\mediateksample\aiot8362am3_bsp\ProjectConfig.mk

# alsps sensor 
CUSTOM_KERNEL_ALSPS = stk3x3x

3 把 stk3x3x.c放进去编译查看log发现 st3x3x 光距感传感器 i2c是能够通讯成功的,同时相关节点也产生了,由此可以验证st3x3x 光距感传感器 移植成功

光距感驱动相关函数介绍:

static int stk3x3x_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
----->驱动加载函数,读取dts配置,对ic进行初始化设置

static int stk3x3x_enable_ps(struct i2c_client *client, int enable, int validate_reg)
ps启动函数,enable = 1 为启动,0为关闭

static int stk3x3x_enable_als(struct i2c_client *client, int enable)
als启动函数 enable = 1 为启动,0为关闭




static int stk3x3x_i2c_suspend(struct device *dev) 
i2c睡眠函数

static int stk3x3x_i2c_resume(struct device *dev)
i2c唤醒函数
int stk3x3x_read_ps(struct i2c_client *client, u16 *data)0x02读取PS值

int stk3x3x_read_als(struct i2c_client *client, u16 *data)0x02读取PS值

static int stk3x3x_get_ps_value_only(struct stk3x3x_priv *obj, u16 ps)
读取ps是接近还是远离,0接近,1远离

static int stk3x3x_get_als_value(struct stk3x3x_priv *obj, u16 als)
根据als_level得到als_value

als_level = <5 9 36 59 82 132 205 273 500 845 1136 1545 2364 4655 6982>;
als_value = <30 40 80 130 180 290 450 600 1100 1860 2500 3400 5200 10240 10240 10240>;

atomic_read(&obj->ps_high_thd_val)
读取ps高门限值
atomic_read(&obj->ps_low_thd_val)
 读取ps低门限值

 int stk3x3x_write_ps_high_thd(struct i2c_client *client, u16 thd)
 把ps高门限值写入0x068bit
 把ps高门限值写入0x078bit

 int stk3x3x_write_ps_low_thd(struct i2c_client *client, u16 thd)
  把ps低门限值写入0x088bit
 把ps低门限值写入0x098bit

 int ps_report_interrupt_data(int value)
 上报ps的状态给软件上层,0为接近,1为远离

 mtk节点路径
 65xx系列:/sys/devices/platform/als_ps/driver/*
 67xx系列:/sys/bus/devices/platform/als_ps.xx/driver/*


 节点:
allreg 所有寄存器的值
Config
ps/als
Alslv/alsval
firlen


3.1 修改如下文件: 
目录: 
device/pskyed/project/overlay/frameworks/base/core/res/res/values/config.xml 
修改如下: 
true 
改为 true之后在界面上就会有自动背光的选项。 
此时点开自动背光,程序才会调用到驱动中的enable函数,从而开启背光的定时器线程。

调试小技巧: 
遇到的问题是驱动probe成功了,节点也有了,但是不知道是否初始化OK了。 
解决办法:1.adb连上机器, 
切到目录:/sys/bus/platform/drivers/als_ps 
查看 所以的寄存器:cat allreg 
cat allreg 
第一个寄存器是sensor的开关,默认自动感光是关闭的。 
敲入命令: echo 00 03 > allreg 
会打开感光sensor, 
此时读取 als的值会发现变化,表示驱动已经正常工作。
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YDLIDAR X3/X3Pro是一款激光雷达设备,用于扫描周围环境并获取点云数据。根据引用,如果你的学习目标是读取和计算XY坐标数据,你可以通过安装ROS驱动并使用rviz来实现这一目标。首先,你需要安装ROS驱动,可以通过在终端中执行引用中的命令来完成。安装完成后,在ROS工作空间中创建一个包,并将下载的驱动放入该包中,然后进行编译。之后,你可以使用引用中的命令来启动rviz并查看扫描结果。在rviz中,你可以获取到激光雷达扫描的数据,并计算出相应的XY坐标。希望这些信息对你有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ROS Ydlidar X3 激光雷达 读取数据 并计算XY坐标](https://blog.csdn.net/qq_44759447/article/details/128597753)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [YDLIDAR_X3驱动安装](https://blog.csdn.net/LLABVIEW/article/details/126842788)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值