【zephyr】apds9660 接近(Proximity)传感器 驱动模型实现方式(一)
目录
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
- 传感器基础delay
- 获取传感器所需要 I2C
- 初始化结构体 sample_crgb
- 开始初始化传感器内部动作,如读取read_id
- 设置中断函数: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)传感器 驱动模型实现方式(一)相关推荐
- 【zephyr】 设备驱动和设备模型_apds9660 接近(Proximity)传感器(二)
目录 1.apds9960_driver_api接口函数实现说明 1.1sample_fetch 1.2 channel_get 2. apds9960 传感器初始化动作 1. proxy接近传感器 ...
- 微软视窗驱动模型(WDM)编程指南
第一章 开始一个驱动项目 在本章中我将对驱动开发的历史作一个简要的回顾.从80年代中期起,我开始涉足个人计算领域,那时也正是IBM刚刚开始出售搭配着MS-DOS操作系统的个人电脑. ...
- 领域驱动模型(DDD)
领域驱动模型(DDD) 文章目录 领域驱动模型(DDD) 1. 简介 2. 一些基本概念 实体(entity) 值对象(value object) 聚合及聚合根(aggregate.aggregate ...
- linux 统一设备模型 pci,Linux设备驱动模型摘抄
Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄Linux设备驱动模型摘抄 Linux设备驱动模型摘抄(1) Linux统一设备模型 简介 Li ...
- linux设备模型 字符设备,Linux 字符设备驱动模型之框架解说
一.软件操作硬件设备模型 在进行嵌入式开发的过程中,在常做的事情就是驱动配置硬件设 备,然后根据功能需求使用硬件设备,实现功能的逻辑.如下图为其 相互之间的关系. 如上图所示: 驱动程序:主要作为操作 ...
- Linux设备驱动模型概述(Linux device driver model overview)
平台(platform)设备和平台驱动是连接到平台总线(bus)的linux驱动模型接口,总线将设备和驱动绑定,这个伪总线(platform bus)以最小的基础结构被用来连接设备到总线上.在系统每注 ...
- 详解Linux2.6内核中基于platform机制的驱动模型 (经典)
[摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了Platform总线的基本概念,接着介绍了platform device和platform dri ...
- WINCE6.0显示驱动模型介绍
********************************LoongEmbedded*****************作者:LoongEmbedded(kandi)时间:2011.06.4 类别 ...
- 驱动进化之路:总线设备驱动模型
文章目录 1 驱动编写的3种方法 1.1 传统写法 1.2 总线设备驱动模型 1.3 设备树 2 在 Linux 中实现"分离":Bus/Dev/Drv 模型 2.1 模型 2.2 ...
最新文章
- 自然语言处理的现实应用
- [NOI2008]志愿者招募
- Educational Codeforces Round 66 (Rated for Div. 2)
- LEMP构建高性能WEB服务器(第三版)
- web工程中spring+ibatis的单元测试--转载
- Linux发行版 (列表)
- GridView里面嵌套RadioButton
- 总结的比较好的vim命令
- 重要的是改变命运,而非升职加薪
- c++rpg黑框游戏_NO总本色出演断智大师兄,电竞魔音主C人《超级猎杀》一战成名...
- 大厂后端必备分布式,一定要好好学|文末有1元福利
- 输入3个数a,b,c,按大小顺序输出
- 博客积分排名进入前4万
- DOSBox的安装及使用
- MATLAB高斯高通滤波图像
- 【HUSTOJ】1055: 字符图形11-字母正三角
- Windows清理助手系统诊断使用教程
- matlab的double和single类型
- Java中new Date插入mysql数据库,数据库时间多一秒问题
- 所有的I/O端口都是兼容CMOS和TTL 表示什么意思
热门文章
- 埃瓦里斯特·伽罗瓦Évariste Galois
- 安装第二天import tensorflow 出现如下错误module ‘tensorflow‘ has no attribute ‘compat‘
- 【安卓笔记】图片特效之底片效果
- 【BPM架构】Camunda BPM 最佳实践
- tracert程序的实现
- Meth | Linux 修改所有者/用户组
- MATLAB算法实战应用案例精讲-【人工智能】Grover量子搜索算法
- iOS 大型项目开发漫谈
- C语言督学营 学习笔记 (Day11~12)
- BackTrack(bt5) GNOME汉化