tmd26353接近传感器之i2c驱动编写

本文介绍了如何编写tmd26353接近传感器的I2C驱动,包括配置dts设备树,确定器件地址,初始化传感器,并在内核线程中读取ADC值,避免中断死锁问题。同时,讨论了POFFSET寄存器的设置及其对ADC值的影响,以及代码和测试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、tmd26353驱动编写思路:
基于i2c设备驱动框架,首先参考原理图配置dts设备树,挂载在哪个i2c总线下面,阅读规格书去确定此器件的器件地址是0x39(也可以使用i2ctools查看器件挂载情况,i2c-tools使用及调试);测试i2c通讯成功与否,可以去读DEVICE_ID这个寄存器值,然后初始化tmd26353,最后在线程里读接近传感器ADC的值(之前编写是使用中断去获取ADC值,查阅资料发现,在内核里中断处理程序里不能操作I2C操作接口,因为操作I2C_transfer时transfer内部也会有中断产生的。所以中断套中断这样就会死锁),ADC值变化范围与POFFSET寄存器值相关,可设置范围是±255,要根据实际需求设置该值,然后通过写节点接口,将ADC值反馈给应用层去读取。
二、代码分析:
dts配置如下:

&i2c5 {
   
	status = "okay";		
	tmd26353:tmd26353@39{
   
		compatible = "p-sensor,tmd26353";
		reg = <0x39>;
		//irq-gpios = <&gpio3 RK_PC3 IRQ_TYPE_LEVEL_LOW>;
		status = "okay";
	};
};

tmd26353驱动源码如下:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <linux/of_device.h>
#include <linux/mutex.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/gpio.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/interrupt.h>
#include <linux/kthread.h>

/*********************************************
Register
**********************************************/
#define TMD26353_ENABLE_PROXIMITY  		 	 0x80  
#define TMD26353_PRATE						 0x82	//采样时间PRATE
#define TMD26353_PCFG0						 0x8E	//增益
#define TMD26353_PCFG1						 0x8F
#define TMD26353_DEVICE_ID			 		 0x92
#define TMD26353_PDATAL						 0x9C   //ADC
#define TMD26353_PDATAH						 0x9D
#define TMD26353_CFG6_APC				     0xAE   //使能APC
#define TMD26353_POFFSETL					 0xC0	自动校准
#define TMD26353_POFFSETH					 0xC1
#define TMD26353_CALIBCFG					 0xD9	//样本数量CALIBCFG

struct tmd26353_data {
   
    struct i2c_client *client;
    struct mutex lock;
	int irq_pin;
	unsigned int irq_111 ;
	unsigned int irq_num;
	u32  read_adc;
};

static struct tmd26353_data tmd26353;
static struct task_struct *p_data_task;

enum tmd26353_register_name {
   
    REG_PDATA = 0,
	REG_DEVICE_ID,
	REG_ENABLE,
	REG_POFFSET,
	REG_PRATE,
	REG_CALIBCFG,
	REG_CFG6_APC,
	REG_PCFG0,
	REG_PCFG1,
};
struct tmd26353_register_desc {
   
    u8 msb;
    u8 lsb;
};
static const struct tmd26353_register_desc tmd26353_registers[] = {
   
    [REG_PDATA] = {
   
		.msb = TMD26353_PDATAH,
		.lsb = TMD26353_PDATAL,
	},
	[REG_DEVICE_ID
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeAmmon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值