RT-Thread传感器驱动框架

一、框架介绍

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_datacontrol,需要在驱动中实现这两个接口。

  • 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->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 设备,这样上层才能找到这个传感器设备,进而进行控制。
设备的注册一共需要下面几步:

  1. 创建一个rt_sensor_t的结构体指针
  2. 为结构体分配内存
  3. 完成相关初始化

2.3 测试

  1. 通过 list_device 命令查看对应设备是否注册成功
  2. 通过导出的测试函数 sensor_polling/int/fifo <sensor_name>,判断能否成功读取数据
  3. 测试其他的模式和控制接口

猜你喜欢

转载自blog.csdn.net/qq_33604695/article/details/105886264