RT-Thread传感器驱动框架
时间:2023-09-23 20:37:02
传感器驱动框架
- 一、框架介绍
-
- 1.1 整体框架
- 1.2 工作原理
-
- Sensor结构体
- 二、驱动发展
-
- 2.1 ops接口对接
- 2.2 设备注册
- 2.3 测试
一、框架介绍
Sensor 驱动框架的功能是为上层提供统一的操作接口,提高上层代码的可重用性;只要实现简单,就简化了底层驱动开发的难度 ops(operations: 操作命令) 传感器可以在系统上注册。
1.1 整体框架
Sensor框架为上层提供标准device
接口:open/close/read/write/control ,提供底层驱动ops
接口:fetch_data/control。框架支持模块,为底层耦合的传感器设备提供服务。
1.2 工作原理
Sensor设备实际上是标准设备rt_device
在原标准设备的基础上,增加了其独特的部分 属性 和 控制命令 ,如下图所示:
整个Sensor设备包括两部分:
- 继承rt_device的部分
标准控制接口 、回调函数、device_id 等 - 独有部分
Sensor 类型、相关信息、独特的控制命令、ops、以及一些 数据的结构
Sensor结构体
Sensor设备结构如下:
struct rt_sensor_device {
struct rt_device parent; /* 继承的标准设备 */ struct rt_sensor_info info; /* 传感器本身的信息 */ struct rt_sensor_config config; /* 传感器配置 */ void *data_buf; /* 缓存区的数据接收 */ rt_size_t data_len; /* 收据的大小 */ const struct rt_sensor_ops *ops; /* 传感器操作指令 */ struct rt_sensor_module *module; /* 传感器模块 */ rt_err_t (*irq_handle)(rt_sensor_t sensor); /* 驱动注册设备定义中断回调函数 */ }; typedef struct rt_sensor_device *rt_sensor_t;
二、驱动发展
对接开发的主要任务是对接Sensor驱动框架的ops
接口,然后注册为Sensor通过驱动框架控制传感器的相关行为。
2.1 ops接口对接
Sensor 框架给出了两个接口fetch_data
和control
,这两个接口需要在驱动中实现。
- fetchdata
fetchdata接口的功能是获取传感器的数据,接口原型:
rt_size_t (*fetch_data)(struct rt_sensor_device *sensor, void *buf, rt_size_t len);
Sensor 目前,驱动框架支持以下三种开启方式:
??轮询——RT_DEVICE_FLAG_RDONLY
??中断——RT_DEVICE_FLAG_INT_RX
??FIFO—— RT_DEVICE_FLAG_FIFO_RX)
在判断传感器的工作模式后,根据不同的模式返回传感器数据。
返回数据时,开发人员应首先识别存储数据的数据类型,然后填写数据域和时间戳,如下所示:
sensor_data->type = RT_SENSOR_CLASS_ACCE sensor_data-&t;data.acce.x = acceleration.x;
sensor_data->data.acce.y = acceleration.y;
sensor_data->data.acce.z = acceleration.z;
sensor_data->timestamp = rt_sensor_get_ts();
- control
传感器的控制就是依靠以下接口函数实现,通过判断传入的命令字的不同执行不同的操作:
#define RT_SENSOR_CTRL_GET_ID (0) /* 读设备ID */
#define RT_SENSOR_CTRL_GET_INFO (1) /* 获取设备信息(由框架实现,在驱动中不需要实现)*/
#define RT_SENSOR_CTRL_SET_RANGE (2) /* 设置传感器测量范围 */
#define RT_SENSOR_CTRL_SET_ODR (3) /* 设置传感器数据输出速率,unit is HZ */
#define RT_SENSOR_CTRL_SET_MODE (4) /* 设置工作模式 */
#define RT_SENSOR_CTRL_SET_POWER (5) /* 设置电源模式 */
#define RT_SENSOR_CTRL_SELF_TEST (6) /* 自检 */
该函数的功能需要在驱动中实现。
2.2 设备注册
完成 Sensor 的 ops 的对接之后还要注册一个 sensor 设备,这样上层才能找到这个传感器设备,进而进行控制。
设备的注册一共需要下面几步:
- 创建一个
rt_sensor_t
的结构体指针 - 为结构体分配内存
- 完成相关初始化
2.3 测试
- 通过 list_device 命令查看对应设备是否注册成功
- 通过导出的测试函数
sensor_polling/int/fifo
,判断能否成功读取数据 - 测试其他的模式和控制接口