锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

RT-Thread传感器驱动框架

时间:2023-09-23 20:37:02 rt500传感器

传感器驱动框架

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

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

2.3 测试

  1. 通过 list_device 命令查看对应设备是否注册成功
  2. 通过导出的测试函数 sensor_polling/int/fifo ,判断能否成功读取数据
  3. 测试其他的模式和控制接口
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章