目录

1.apds9960_driver_api接口函数实现说明

1.1sample_fetch

1.2  channel_get

2. apds9960 传感器初始化动作

1. proxy接近传感器

2.2 环境光ALS 初始化


1.apds9960_driver_api接口函数实现说明

1.1sample_fetch

static int apds9960_sample_fetch(struct device *dev, enum sensor_channel chan)
{const struct apds9960_config *config = dev->config->config_info;struct apds9960_data *data = dev->driver_data;u8_t status;if (chan != SENSOR_CHAN_ALL) {LOG_ERR("Unsupported sensor channel");return -ENOTSUP;}
//设置中断回调函数 函数
#ifndef CONFIG_APDS9960_TRIGGERgpio_pin_enable_callback(data->gpio, config->gpio_pin);
//打开ADPS 接近和光感器 中断 寄存器 if (i2c_reg_update_byte(data->i2c, config->i2c_address,APDS9960_ENABLE_REG,APDS9960_ENABLE_PON | APDS9960_ENABLE_AIEN,APDS9960_ENABLE_PON | APDS9960_ENABLE_AIEN)) {LOG_ERR("Power on bit not set.");return -EIO;}
//信号量等待 k_sem_take(&data->data_sem, K_FOREVER);
#endif
//读取传感器当前 接近还是光感if (i2c_reg_read_byte(data->i2c, config->i2c_address,APDS9960_STATUS_REG, &status)) {return -EIO;}
//接近传感器 读取LOG_DBG("status: 0x%x", status);if (status & APDS9960_STATUS_PINT) {if (i2c_reg_read_byte(data->i2c, config->i2c_address,APDS9960_PDATA_REG, &data->pdata)) {return -EIO;}}
//环境光 CRGB 读取if (status & APDS9960_STATUS_AINT) {if (i2c_burst_read(data->i2c, config->i2c_address,APDS9960_CDATAL_REG,(u8_t *)&data->sample_crgb,sizeof(data->sample_crgb))) {return -EIO;}}
//重新设置或者关闭功能 接近传感器
#ifndef CONFIG_APDS9960_TRIGGERif (i2c_reg_update_byte(data->i2c, config->i2c_address,APDS9960_ENABLE_REG,APDS9960_ENABLE_PON,0)) {return -EIO;}
#endifif (i2c_reg_write_byte(data->i2c, config->i2c_address,APDS9960_AICLEAR_REG, 0)) {return -EIO;}return 0;
}

1.2  channel_get

  1. 光感数据
  2. 红,绿,蓝 数据
  3. 接近传感器数值
//根据传感器通道类型,回传感器数据 static int apds9960_channel_get(struct device *dev,enum sensor_channel chan,struct sensor_value *val)
{struct apds9960_data *data = dev->driver_data;switch (chan) {case SENSOR_CHAN_LIGHT:val->val1 = sys_le16_to_cpu(data->sample_crgb[0]);val->val2 = 0;break;case SENSOR_CHAN_RED:val->val1 = sys_le16_to_cpu(data->sample_crgb[1]);val->val2 = 0;break;case SENSOR_CHAN_GREEN:val->val1 = sys_le16_to_cpu(data->sample_crgb[2]);val->val2 = 0;break;case SENSOR_CHAN_BLUE:val->val1 = sys_le16_to_cpu(data->sample_crgb[3]);val->val2 = 0;break;case SENSOR_CHAN_PROX:val->val1 = data->pdata;val->val2 = 0;break;default:return -ENOTSUP;}return 0;
}

2. apds9960 传感器初始化动作

1. proxy接近传感器

  • 设置接近门限值 APDS9960_POFFSET_UR_REG
  • 设置远离门限值  APDS9960_POFFSET_DL_REG
  • 设置脉冲个数:APDS9960_PPULSE_REG
  • 设置驱动电流:APDS9960_CONTROL_REG
  • 设置增益:APDS9960_CONTROL_REG
  • APDS9960_PILT_REG
  • APDS9960_PIHT_REG
  • 打开接近传感器 功能:APDS9960_ENABLE_REG
static int apds9960_proxy_setup(struct device *dev, int gain)
{const struct apds9960_config *config = dev->config->config_info;struct apds9960_data *data = dev->driver_data;if (i2c_reg_write_byte(data->i2c, config->i2c_address,APDS9960_POFFSET_UR_REG,APDS9960_DEFAULT_POFFSET_UR)) {LOG_ERR("Default offset UR not set ");return -EIO;}if (i2c_reg_write_byte(data->i2c, config->i2c_address,APDS9960_POFFSET_DL_REG,APDS9960_DEFAULT_POFFSET_DL)) {LOG_ERR("Default offset DL not set ");return -EIO;}if (i2c_reg_write_byte(data->i2c, config->i2c_address,APDS9960_PPULSE_REG,APDS9960_DEFAULT_PROX_PPULSE)) {LOG_ERR("Default pulse count not set ");return -EIO;}if (i2c_reg_update_byte(data->i2c, config->i2c_address,APDS9960_CONTROL_REG,APDS9960_CONTROL_LDRIVE,APDS9960_DEFAULT_LDRIVE)) {LOG_ERR("LED Drive Strength not set");return -EIO;}if (i2c_reg_update_byte(data->i2c, config->i2c_address,APDS9960_CONTROL_REG, APDS9960_CONTROL_PGAIN,(gain & APDS9960_PGAIN_8X))) {LOG_ERR("Gain is not set");return -EIO;}if (i2c_reg_write_byte(data->i2c, config->i2c_address,APDS9960_PILT_REG, APDS9960_DEFAULT_PILT)) {LOG_ERR("Low threshold not set");return -EIO;}if (i2c_reg_write_byte(data->i2c, config->i2c_address,APDS9960_PIHT_REG, APDS9960_DEFAULT_PIHT)) {LOG_ERR("High threshold not set");return -EIO;}if (i2c_reg_update_byte(data->i2c, config->i2c_address,APDS9960_ENABLE_REG, APDS9960_ENABLE_PEN,APDS9960_ENABLE_PEN)) {LOG_ERR("Proximity mode is not enabled");return -EIO;}return 0;
}

2.2 环境光ALS 初始化

static int apds9960_ambient_setup(struct device *dev, int gain)
{const struct apds9960_config *config = dev->config->config_info;struct apds9960_data *data = dev->driver_data;u16_t th;/* ADC value */if (i2c_reg_write_byte(data->i2c, config->i2c_address,APDS9960_ATIME_REG, APDS9960_DEFAULT_ATIME)) {LOG_ERR("Default integration time not set for ADC");return -EIO;}/* ALS Gain */if (i2c_reg_update_byte(data->i2c, config->i2c_address,APDS9960_CONTROL_REG,APDS9960_CONTROL_AGAIN,(gain & APDS9960_AGAIN_64X))) {LOG_ERR("Ambient Gain is not set");return -EIO;}th = sys_cpu_to_le16(APDS9960_DEFAULT_AILT);if (i2c_burst_write(data->i2c, config->i2c_address,APDS9960_INT_AILTL_REG,(u8_t *)&th, sizeof(th))) {LOG_ERR("ALS low threshold not set");return -EIO;}th = sys_cpu_to_le16(APDS9960_DEFAULT_AIHT);if (i2c_burst_write(data->i2c, config->i2c_address,APDS9960_INT_AIHTL_REG,(u8_t *)&th, sizeof(th))) {LOG_ERR("ALS low threshold not set");return -EIO;}/* Enable ALS */if (i2c_reg_update_byte(data->i2c, config->i2c_address,APDS9960_ENABLE_REG, APDS9960_ENABLE_AEN,APDS9960_ENABLE_AEN)) {LOG_ERR("ALS is not enabled");return -EIO;}return 0;
}

【zephyr】 设备驱动和设备模型_apds9660 接近(Proximity)传感器(二)相关推荐

  1. LINUX设备驱动之设备模型一--kobject

    http://blog.csdn.net/yangzhu1982/article/details/6186016 Linux设备驱动之设备模型一kobject Eric Fang  2010-01-1 ...

  2. linux设备驱动--字符设备模型

    linux设备驱动--字符设备模型 最近正在学习设备驱动开发,因此打算写一个系列博客,即是对自己学习的一个总结,也是对自己的一个督促,有不对,不足,需要改正的地方还望大家指出,而且希望结识志同道合的朋 ...

  3. LINUX设备驱动之设备模型一kobject

    LINUX设备驱动之设备模型一kobject -------------------------------------------------------------- 转载请注明出处:http:/ ...

  4. 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联

    参考原文:https://www.kancloud.cn/yueqian_scut/emlinux/106829 对原文笔误地方做了修改.重新排版 目录 字符设备驱动.平台设备驱动.设备驱动模型.sy ...

  5. Linux设备驱动和设备匹配过程

    Linux设备驱动和设备匹配过程 1. 设备驱动匹配简述 2. 重点结构体介绍 2.1 `struct device` 2.2 `struct platform_device` 2.3 `struct ...

  6. 【驱动】linux设备驱动·字符设备驱动开发

    Preface 前面对linux设备驱动的相应知识点进行了总结,现在进入实践阶段! <linux设备驱动入门篇>:http://infohacker.blog.51cto.com/6751 ...

  7. Zephyr Kernel 设备驱动和设备模型(一)

    介绍 Zephyr 内核支持大量的设备驱动程序.应用程序板级配置的可用设备驱动集合随着所关联的硬件组件和设备驱动软件的变化而变化.Zephyr 的设备模型为配置驱动程序提供了一致的设备模型.设备模型负 ...

  8. Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍

    文章目录 一.Linux设备模型介绍 (1)设备驱动模型总体介绍 (2)设备驱动模型文件表现 (3)设备驱动模型工作原理 [1]总线 [2]设备 [3]驱动 [4]注册流程 二.平台设备驱动介绍 (1 ...

  9. Linux设备驱动--块设备(二)之相关结构体

    上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...

最新文章

  1. java hanoi_Hanoi问题java解法
  2. linux c select 设置超时
  3. selenium定位方法(java实例)
  4. 【JetPack】kotlin-android-extensions 插件 ( 视图绑定简单用法 )
  5. 用友U8 归纳采购退货结算三种情况
  6. 波士顿学院计算机科学专业,波士顿学院专业有哪些?
  7. 串行总线 —— I2C、UART、SPI
  8. java前端编译和后端编译理解
  9. 数独游戏——数模处理(MATLAB整数规划)
  10. 碰撞检测——碰撞器和物理材质
  11. SMT贴片加工回流焊接出现的问题和解决对策
  12. ios 隐藏app的插件_教你如何在iPad和iPhone中隐藏APP应用 划重点了
  13. Python字典合并方法大全
  14. Unable to locate tools.jar. Expected to find it in D:/jre6/lib/tools.jar问题解决
  15. 建筑间距对住房有什么影响
  16. atthesametime啥意思_at the same time和on the same time有什么区别吗
  17. 心理学:《人性的弱点》【美】卡耐基
  18. 获取短网址的真实链接(java)
  19. Python win32clipboard 操作剪贴板中文字,图片,链接等信息
  20. 思维模型 阿伦森效应

热门文章

  1. 第十七届“科大讯飞杯”题解
  2. matlab中sparse和full函数的使用
  3. python用字符串输出月份_python 输出上个月的月末日期实例
  4. TCL/TK文件操作
  5. 基于PaaS和SaaS研发的商业云平台实战 - 精华篇
  6. java接口开放平台设计,OpenApi开放平台架构实践
  7. Springboot+mysql+基于VUE框架的商城综合项目设计与实现 毕业设计-附源码111612
  8. Epicor BPM - 在VS中编写BPM代码
  9. JAVA创建随机数的两种方法
  10. html鼠标拖尾效果,JavaScript鼠标划过背景拖尾效果