前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Linux驱动炼成记] 10 -光感ISL29035调试/IIO子系统

[Linux驱动炼成记] 10 -光感ISL29035调试/IIO子系统

作者头像
程序手艺人
发布2019-02-21 16:54:16
1.3K0
发布2019-02-21 16:54:16
举报
文章被收录于专栏:程序手艺人程序手艺人
简介

项目中需要加入光感检测功能,需求一到,就打算自己写驱动,意外的发现最新内核中已经支持该驱动ISL29035。配置好DTS应该初步可以使用。看代码过程中发现isl29035的实现主要是采用IIO子系统实现的。

  • 芯片有一个中断引脚INT,低电平有效,相当于超过预定的亮度阀值,该引脚为低电平,应用层完全可以当做一个input来处理
  • 看芯片手册主要找到芯片的IIC从机地址 ,Device Addressiong : 0100 0100 : 0x44
  • 芯片相关寄存器说明
寄存器说明
寄存器说明
代码语言:javascript
复制
其中COMMAND-1中的 B2/INT为中断使能引脚
0 : interrupt is cleared or not triggered yet 
1 : interrupt is triggered 

DATA寄存器获取亮度的数据

INT_LT/INT_HT 为最低/最高阀值设定

寄存器详细设置可以参考芯片技术手册,这里不一一介绍
内核配置/编译
  • 内核默认配置选项开启
代码语言:javascript
复制
内核版本: 4.9.68

内核Documentation/iio/iio_configfs.txt
这句话说明了支持IIO必须开启CONFIG_IIO_CONFIGFS选项
In order to use configfs support in IIO we need to select it at compile
time via CONFIG_IIO_CONFIGFS config option.


arch/arm64/configs/xxx_defconfig
....
CONFIG_IIO_SYSFS_TRIGGER=y
CONFIG_IIO_CONFIGFS=y
CONFIG_SENSORS_ISL29018=y

对应的源码目录
drivers/staging/iio/light/isl29018.c
...

static const struct i2c_device_id isl29018_id[] = {
	{"isl29018", isl29018},
	{"isl29023", isl29023},
	{"isl29035", isl29035},
	{}
};
  • DTS配置

isl29025的配置可以参考内核4.19中的

代码语言:javascript
复制
Documentation/devicetree/bindings/iio/light/isl29018.txt

isl29018@44 {
	compatible = "isil,isl29035";
	reg = <0x44>;
	interrupt-parent = <&gpio>;
	interrupts = <TEGRA_GPIO(Z, 2) IRQ_TYPE_LEVEL_HIGH>;
};
调试

配置完成时候,开始编译烧录,进入系统中会发现:

代码语言:javascript
复制
// 设备节点如下
# cat /sys/bus/iio/devices/iio\:device0/
dev
in_illuminance0_calibscale
//读取亮度值:0~1000
in_illuminance0_input
in_illuminance0_integration_time
in_illuminance0_scale
in_illuminance_integration_time_available
in_illuminance_scale_available
in_intensity_ir_raw
name
of_node/
power/
subsystem/
uevent

//对应代码中亮度API
static int isl29018_read_lux(struct isl29018_chip *chip, int *lux)
{
	int lux_data;
	unsigned int data_x_range;

	lux_data = isl29018_read_sensor_input(chip,
					      ISL29018_CMD1_OPMODE_ALS_ONCE);
	if (lux_data < 0)
		return lux_data;

	data_x_range = lux_data * chip->scale.scale +
		       lux_data * chip->scale.uscale / 1000000;
	*lux = data_x_range * chip->calibscale +
	       data_x_range * chip->ucalibscale / 1000000;

	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年11月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 内核配置/编译
  • 调试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档