目录

1. zephyr驱动模型

1. 1 设备模型几要要素

1.2 驱动实现步骤

2.zephyr 传感器示例

2.2 找到对应API接口

2.3 adps960 实际应用方法

2.3.1 数据

2.3.2  apds9960_config

2.3.3 apds9960_driver_api

2.3.4 apds9960_init

3. apds9660 接近传感器 测试代码


1. zephyr驱动模型

1. 1 设备模型几要要素

  • driver name
  • driver init函数
  • driver各种操作函数driver_api
  • driver配置信息driver_cfg
  • driver的数据信息driver_data
    从驱动使用层面上来说,因为初始化是编译期已经固定好 运行期会自动初始化,所以只用关注各种操作函数也就是driver_api

1.2 驱动实现步骤

  • 1.找到驱动头文件,理解驱动提供操作API的作用和参数含义
  • 2. 在驱动头文件中,对应操作API和driver_api内操作函数指针
  • 3. 在驱动代码中实现driver_api函数指针的函数,添加driver_data和driver_cfg
  • 4: 实现driver初始化函数
  • 5: 使用DEVICE_AND_API_INIT注册初始化函数,和实现好的driver_api

2.zephyr 传感器示例

找到驱动头文件include/sensor.h,理解驱动提供的API作用和参数含义,Zephyr为sensor驱动定义了下面4种方法:

1. __syscall int sensor_channel_get(struct device *dev,
                 enum sensor_channel chan,
                 struct sensor_value *val);   // 读取传感器数据

2. __syscall int sensor_sample_fetch_chan(struct device *dev,
                       enum sensor_channel type);    //fetch sensor 数据,并且存储内部buffer

3.__syscall int sensor_sample_fetch(struct device *dev); // 获取所有传感器 数据

4. __syscall int sensor_attr_set(struct device *dev,
                  enum sensor_channel chan,
                  enum sensor_attribute attr,
                  const struct sensor_value *val);   //设备传感器

2.2 找到对应API接口

/*** @typedef sensor_trigger_handler_t* @brief Callback API upon firing of a trigger** @param "struct device *dev" Pointer to the sensor device* @param "struct sensor_trigger *trigger" The trigger*/
typedef void (*sensor_trigger_handler_t)(struct device *dev,struct sensor_trigger *trigger);/*** @typedef sensor_attr_set_t* @brief Callback API upon setting a sensor's attributes** See sensor_attr_set() for argument description*/
typedef int (*sensor_attr_set_t)(struct device *dev,enum sensor_channel chan,enum sensor_attribute attr,const struct sensor_value *val);
/*** @typedef sensor_trigger_set_t* @brief Callback API for setting a sensor's trigger and handler** See sensor_trigger_set() for argument description*/
typedef int (*sensor_trigger_set_t)(struct device *dev,const struct sensor_trigger *trig,sensor_trigger_handler_t handler);
/*** @typedef sensor_sample_fetch_t* @brief Callback API for fetching data from a sensor** See sensor_sample_fetch() for argument description*/
typedef int (*sensor_sample_fetch_t)(struct device *dev,enum sensor_channel chan);
/*** @typedef sensor_channel_get_t* @brief Callback API for getting a reading from a sensor** See sensor_channel_get() for argument description*/
typedef int (*sensor_channel_get_t)(struct device *dev,enum sensor_channel chan,struct sensor_value *val);struct sensor_driver_api {sensor_attr_set_t attr_set;sensor_trigger_set_t trigger_set;sensor_sample_fetch_t sample_fetch;sensor_channel_get_t channel_get;
};

2.3 adps960 实际应用方法

2.3.1 数据

static struct apds9960_data apds9960_data;

2.3.2  apds9960_config

static const struct apds9960_config apds9960_config = {.i2c_name = DT_AVAGO_APDS9960_0_BUS_NAME,.i2c_address = DT_AVAGO_APDS9960_0_BASE_ADDRESS,.gpio_name = DT_AVAGO_APDS9960_0_INT_GPIOS_CONTROLLER,.gpio_pin = DT_AVAGO_APDS9960_0_INT_GPIOS_PIN,
};

2.3.3 apds9960_driver_api

static const struct sensor_driver_api apds9960_driver_api = {.sample_fetch = &apds9960_sample_fetch,.channel_get = &apds9960_channel_get,
#ifdef CONFIG_APDS9960_TRIGGER.attr_set = apds9960_attr_set,.trigger_set = apds9960_trigger_set,
#endif
};

2.3.4 apds9960_init

  1. 传感器基础delay
  2. 获取传感器所需要 I2C
  3. 初始化结构体 sample_crgb
  4. 开始初始化传感器内部动作,如读取read_id
  5. 设置中断函数:apds9960_init_interrupt
static int apds9960_init(struct device *dev)
{const struct apds9960_config *config = dev->config->config_info;struct apds9960_data *data = dev->driver_data;/* Initialize time 5.7ms */k_sleep(6);data->i2c = device_get_binding(config->i2c_name);if (data->i2c == NULL) {LOG_ERR("Failed to get pointer to %s device!",config->i2c_name);return -EINVAL;}(void)memset(data->sample_crgb, 0, sizeof(data->sample_crgb));data->pdata = 0U;apds9960_sensor_setup(dev);if (apds9960_init_interrupt(dev) < 0) {LOG_ERR("Failed to initialize interrupt!");return -EIO;}return 0;
}

3. apds9660 接近传感器 测试代码

void main(void)
{struct device *dev;struct sensor_value intensity, pdata;printk("APDS9960 sample application\n");dev = device_get_binding(DT_AVAGO_APDS9960_0_LABEL);if (!dev) {printk("sensor: device not found.\n");return;}#ifdef CONFIG_APDS9960_TRIGGERstruct sensor_value attr = {.val1 = 127,.val2 = 0,};if (sensor_attr_set(dev, SENSOR_CHAN_PROX,SENSOR_ATTR_UPPER_THRESH, &attr)) {printk("Could not set threshold\n");return;}struct sensor_trigger trig = {.type = SENSOR_TRIG_THRESHOLD,.chan = SENSOR_CHAN_PROX,};if (sensor_trigger_set(dev, &trig, trigger_handler)) {printk("Could not set trigger\n");return;}
#endifwhile (true) {
#ifdef CONFIG_APDS9960_TRIGGERprintk("Waiting for a threshold event\n");k_sem_take(&sem, K_FOREVER);
#elsek_sleep(5000);
#endifif (sensor_sample_fetch(dev)) {printk("sensor_sample fetch failed\n");}sensor_channel_get(dev, SENSOR_CHAN_LIGHT, &intensity);sensor_channel_get(dev, SENSOR_CHAN_PROX, &pdata);printk("ambient light intensity %d, proximity %d\n",intensity.val1, pdata.val1);#ifdef CONFIG_DEVICE_POWER_MANAGEMENTu32_t p_state;p_state = DEVICE_PM_LOW_POWER_STATE;device_set_power_state(dev, p_state, NULL, NULL);printk("set low power state for 2s\n");k_sleep(2000);p_state = DEVICE_PM_ACTIVE_STATE;device_set_power_state(dev, p_state, NULL, NULL);
#endif}
}

【zephyr】apds9660 接近(Proximity)传感器 驱动模型实现方式(一)相关推荐

  1. 【zephyr】 设备驱动和设备模型_apds9660 接近(Proximity)传感器(二)

    目录 1.apds9960_driver_api接口函数实现说明 1.1sample_fetch 1.2  channel_get 2. apds9960 传感器初始化动作 1. proxy接近传感器 ...

  2. 微软视窗驱动模型(WDM)编程指南

    第一章           开始一个驱动项目 在本章中我将对驱动开发的历史作一个简要的回顾.从80年代中期起,我开始涉足个人计算领域,那时也正是IBM刚刚开始出售搭配着MS-DOS操作系统的个人电脑. ...

  3. 领域驱动模型(DDD)

    领域驱动模型(DDD) 文章目录 领域驱动模型(DDD) 1. 简介 2. 一些基本概念 实体(entity) 值对象(value object) 聚合及聚合根(aggregate.aggregate ...

  4. linux 统一设备模型 pci,Linux设备驱动模型摘抄

    Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄 Linux设备驱动模型摘抄(1) Linux统一设备模型 简介 Li ...

  5. linux设备模型 字符设备,Linux 字符设备驱动模型之框架解说

    一.软件操作硬件设备模型 在进行嵌入式开发的过程中,在常做的事情就是驱动配置硬件设 备,然后根据功能需求使用硬件设备,实现功能的逻辑.如下图为其 相互之间的关系. 如上图所示: 驱动程序:主要作为操作 ...

  6. Linux设备驱动模型概述(Linux device driver model overview)

    平台(platform)设备和平台驱动是连接到平台总线(bus)的linux驱动模型接口,总线将设备和驱动绑定,这个伪总线(platform bus)以最小的基础结构被用来连接设备到总线上.在系统每注 ...

  7. 详解Linux2.6内核中基于platform机制的驱动模型 (经典)

    [摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了Platform总线的基本概念,接着介绍了platform device和platform dri ...

  8. WINCE6.0显示驱动模型介绍

    ********************************LoongEmbedded*****************作者:LoongEmbedded(kandi)时间:2011.06.4 类别 ...

  9. 驱动进化之路:总线设备驱动模型

    文章目录 1 驱动编写的3种方法 1.1 传统写法 1.2 总线设备驱动模型 1.3 设备树 2 在 Linux 中实现"分离":Bus/Dev/Drv 模型 2.1 模型 2.2 ...

最新文章

  1. 自然语言处理的现实应用
  2. [NOI2008]志愿者招募
  3. Educational Codeforces Round 66 (Rated for Div. 2)
  4. LEMP构建高性能WEB服务器(第三版)
  5. web工程中spring+ibatis的单元测试--转载
  6. Linux发行版 (列表)
  7. GridView里面嵌套RadioButton
  8. 总结的比较好的vim命令
  9. 重要的是改变命运,而非升职加薪
  10. c++rpg黑框游戏_NO总本色出演断智大师兄,电竞魔音主C人《超级猎杀》一战成名...
  11. 大厂后端必备分布式,一定要好好学|文末有1元福利
  12. 输入3个数a,b,c,按大小顺序输出
  13. 博客积分排名进入前4万
  14. DOSBox的安装及使用
  15. MATLAB高斯高通滤波图像
  16. 【HUSTOJ】1055: 字符图形11-字母正三角
  17. Windows清理助手系统诊断使用教程
  18. matlab的double和single类型
  19. Java中new Date插入mysql数据库,数据库时间多一秒问题
  20. 所有的I/O端口都是兼容CMOS和TTL 表示什么意思

热门文章

  1. 埃瓦里斯特·伽罗瓦Évariste Galois
  2. 安装第二天import tensorflow 出现如下错误module ‘tensorflow‘ has no attribute ‘compat‘
  3. 【安卓笔记】图片特效之底片效果
  4. 【BPM架构】Camunda BPM 最佳实践
  5. tracert程序的实现
  6. Meth | Linux 修改所有者/用户组
  7. MATLAB算法实战应用案例精讲-【人工智能】Grover量子搜索算法
  8. iOS 大型项目开发漫谈
  9. C语言督学营 学习笔记 (Day11~12)
  10. BackTrack(bt5) GNOME汉化