0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Sensor 驱动框架的整体架构详细介绍

RTThread物联网操作系统 2019-02-22 16:38 次阅读

背景与概述

Sensor物联网重要的一部分,“Sensor 之于物联网”相当于“眼睛之于人类”。人没有眼睛就看不到这大千的花花世界,物联网没有了 Sensor 更是不能感知这变化万千的世界。

现在,为物联网开发的 Sensor 已经很多了,有加速度计(Accelerometer),磁力计(Magnetometer),陀螺仪(Gyroscope),光感计(Ambient light sensor),接近光(Proximity),气压计(Barometer/pressure),湿度计(Humidometer)等等。这些传感器,世界上的各大半导体厂商都有出产,虽然增加了市场的可选择性,同时也加大了应用程序开发的难度。因为不同的传感器厂商、不同的传感器都需要配套自己独有的驱动才能运转起来,这样在开发应用程序的时候就需要针对不同的传感器做适配,自然加大了开发难度。为了降低应用开发的难度,增加传感器驱动的可复用性,我们设计了 Sensor 驱动框架。

Sensor 驱动框架的作用是:为上层提供统一的操作接口,提高上层代码的可重用性;简化底层驱动开发的难度,只要实现简单的 ops(operations: 操作命令) 就可以将传感器注册到系统上。

整体框架

Sensor 驱动框架的整体架构图如下:

Sensor 驱动框架的整体架构详细介绍

sensor

它为上层提供的是标准 device 接口open/close/read/write/control ,为底层驱动提供的是简单的 ops 接口:fetch_data/control。并且框架支持 module(模块),为底层存在耦合的传感器设备提供服务。

工作原理

Sensor 设备其实是对标准设备 rt_device 的一个丰富,是在原有标准设备的基础上增加了 Sensor 自己独有的一部分 属性 和 控制命令 ,如下图所示:

Sensor 驱动框架的整体架构详细介绍

sensor

整个 Sensor 设备包括两个部分:

继承自标准设备的一些特性,包括:标准的控制接口 、回调函数、device_id 等。

Sensor 设备独有的部分,包括:Sensor 的类型、相关的信息、特有的控制命令、ops、以及一些 数据的结构。

sensor 的结构体

Sensor 设备的结构体如下所示:

1struct rt_sensor_device 2{ 3 struct rt_device

parent; /* The standard device */ 4 5

struct rt_sensor_info

info; /* The sensor info data */ 6

struct rt_sensor_config config;

/* The sensor config data */ 7 8

void

*data_buf; /* The buf of the data received */ 9

rt_size_t

data_len; /* The size of the data received */1011

const struct rt_sensor_ops *ops; /* The sensor ops */1213

struct rt_sensor_module *module; /* The sensor module */14};15typedef struct rt_sensor_device *rt_sensor_t;

Sensor 的信息

struct rt_sensor_info info 里存储的是一些与 Sensor 自身相关的信息,在 Sensor 设备注册的时候提供,在使用的过程中不应修改其内容。具体成员如下所示。

1struct rt_sensor_info 2{ 3 rt_uint8_t type;

/* The sensor type */ 4 rt_uint8_t vendor;

/* Vendor of sensors */ 5 const char *model;

/* model name of sensor */ 6 rt_uint8_t unit;

/* unit of measurement */ 7 rt_uint8_t intf_type;

/* Communication interface type */ 8 rt_int32_t range_max;

/* maximum range of this sensor‘s value. unit is ’unit‘ */ 9 rt_int32_t range_min;

/* minimum range of this sensor’s value. unit is ‘unit’ */10 rt_uint32_t period_min;

/* Minimum measurement period,unit:ms. zero = not a constant rate */11 rt_uint8_t fifo_max;

/* Maximum depth of fifo */12};

Sensor 的类型暂时只有以下几种,如果有新的传感器类型,可以提 PR 添加上。

1#define RT_SENSOR_CLASS_ACCE

(1) /* Accelerometer

*/ 2#define RT_SENSOR_CLASS_GYRO

(2) /* Gyroscope

*/ 3#define RT_SENSOR_CLASS_MAG

(3) /* Magnetometer

*/ 4#define RT_SENSOR_CLASS_TEMP

(4) /* Temperature

*/ 5#define RT_SENSOR_CLASS_HUMI

(5) /* Relative Humidity */ 6#define RT_SENSOR_CLASS_BARO

(6) /* Barometer

*/ 7#define RT_SENSOR_CLASS_LIGHT

(7) /* Ambient light

*/ 8#define RT_SENSOR_CLASS_PROXIMITY

(8) /* Proximity

*/ 9#define RT_SENSOR_CLASS_HR

(9) /* Heart Rate

*/10#define RT_SENSOR_CLASS_TVOC

(10) /* TVOC Level

*/11#define RT_SENSOR_CLASS_NOISE

(11) /* Noise Loudness

*/12#define RT_SENSOR_CLASS_STEP

(12) /* Step sensor

*/

其他的几个成员,分别是厂商、model(如:“mpu6050”)、传感器数据的单位、通信接口类型、测量的最大范围、测量的最小范围、最小测量周期、硬件 FIFO 的最大深度。

Sensor 的配置

Sensor 驱动框架抽象出了一些公共的配置选项,这些可配置的选项置于 struct rt_sensor_config 里, 成员如下:

1struct rt_sensor_config2{3 struct rt_sensor_intf intf; /* sensor interface config */4 struct rt_device_pin_mode irq_pin; /* Interrupt pin, The purpose of this pin is to notification read data */5 rt_uint8_t mode; /* sensor work mode */6 rt_uint8_t power; /* sensor power mode */7 rt_uint16_t odr; /* sensor out data rate */8 rt_int32_t range; /* sensor range of measurement */9};

这些配置项中的 intf 和 irq_pin 是为了将传感器和硬件解耦而抽象出来的,通过在底层初始化的时候传入 struct rt_sensor_config 这个参数,完成了通信接口的解耦。

1struct rt_sensor_intf2{3 char *dev_name; /* The name of the communication device */4 rt_uint8_t type; /* Communication interface type */5 void *user_data; /* Private data for the sensor. ex. i2c addr,spi cs,control I/O */6};

其余的一些配置项是用 Sensor 特有控制命令控制的,如下所示:

1#define RT_SENSOR_CTRL_GET_ID (0) /* 读设备ID */2#define RT_SENSOR_CTRL_GET_INFO (1) /* 获取设备信息 */3#define RT_SENSOR_CTRL_SET_RANGE (2) /* 设置传感器测量范围 */4#define RT_SENSOR_CTRL_SET_ODR (3) /* 设置传感器数据输出速率,unit is HZ */5#define RT_SENSOR_CTRL_SET_MODE (4) /* 设置工作模式 */6#define RT_SENSOR_CTRL_SET_POWER (5) /* 设置电源模式 */7#define RT_SENSOR_CTRL_SELF_TEST (6) /* 自检 */

结合 ops 中的 control 接口使用,就可以完成传感器的配置了。

Sensor 数据的存储

为了方便数据的解析,规定每一个类型的 Sensor 都有自己独有的数据结构,这些成员之间使用共用体以减少代码量。

特有的 ops

ops(操作函数)包含两个函数指针, 一个的作用是获取传感器数据(fetch_data),另一个的作用是通过控制命令控制传感器(control)。

1struct rt_sensor_ops2{3 rt_size_t (*fetch_data)(struct rt_sensor_device *sensor, void *buf, rt_size_t len);4 rt_err_t (*control)(struct rt_sensor_device *sensor, int cmd, void *arg);5};

注册方式

传感器驱动框架提供了一个 Sensor 注册函数,通过传入 Sensor 的控制块,名称,标志位和私有数据,就可以完成传感器设备的注册。

1int rt_hw_sensor_register(rt_sensor_t sensor,2 const char *name,3 rt_uint32_t flag,4 void *data);

这样看来 Sensor 驱动框架依托于标准的设备框架,只要将传感器驱动对接到 Sensor 的 ops 上,并通过调用 rt_hw_sensor_register 函数注册为 Sensor 设备就可以通过标准的设备接口控制传感器了。

module支持

module 的定义是解决底层有耦合的两个传感器而出现的,有些传感器既有加速度计的功能又有陀螺仪的功能,并且他们的FIFO是共用的,在 FIFO 模式下,只能将两个类型的传感器的数据同时读出,这就说明他们的数据是耦合的。

为了解决这个问题,我们定义了 module 的类型

1struct rt_sensor_module2{3 rt_mutex_t lock; /* The module lock */45 rt_sensor_t sen[RT_SENSOR_MODULE_MAX]; /* The module contains a list of sensors */6 rt_uint8_t sen_num; /* Number of sensors contained in the module */7};

里面包含有耦合的传感器的设备控制块指针,通过这个功能就可以在读取陀螺仪的数据的时候,同时更新加速度计的值,解决了底层耦合的问题。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2526

    文章

    48093

    浏览量

    740072
  • 物联网
    +关注

    关注

    2869

    文章

    41622

    浏览量

    358380
  • Sensor
    +关注

    关注

    0

    文章

    131

    浏览量

    49339

原文标题:RT-Thread传感器设备驱动框架介绍

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一种基于AliOS Things的uData感知设备软件框架

    。根据上面的各模块介绍,汇总了下图来描述了对整个uData框架整体实现和通讯机制的理解和认识。uData框架小结本文主要是从uData的软件设计实现方面来实现。关于uData移植,
    发表于 01-22 17:16

    Linux内核电源管理的整体架构介绍

    电子产品来说,电源管理相当重要。因此,这部分工作往往在开发周期中占据相当大的比重,图1呈现了Linux内核电源管理的整体架构。大体可以归纳为如下几类:
    发表于 07-05 07:00

    USB驱动程序框架介绍

    《ARM嵌入式Linux系统开发详解》第25章USB驱动开发,本章讲解了Linux内核USB驱动体系结构、USB设备驱动结构等知识,并在最后给出了两个USB设备驱动开发实例。本节为大家
    发表于 07-11 07:38

    HarmonyOS HDF驱动框架---驱动开发

    +=#驱动代码Makefile的目录驱动配置HDF使用HCS作为配置描述源码,HCS详细介绍参考配置管理介绍
    发表于 09-16 17:59

    FPGA芯片整体架构

    FPGA芯片整体架构如下所示,整个芯片是以BANK进...
    发表于 07-29 07:00

    FPGA 内部详细架构 精选资料分享

    FPGA 内部详细架构FPGA 芯片整体架构1.可编程输入输出单元(IOB)(Input Output Block)2.可配置逻辑块(CLB)(Configurable Logic B
    发表于 07-30 08:10

    数据采集整体框架

    背景:对于一些需要快速验证传感器性能,或者某些实验需要快速采集数据并且需要直观显示成波形或者图片, 搭建一个简易方便的数据采集分析系统是有必要的.本文主要介绍以下几个方面:数据采集整体框架.Pc
    发表于 08-17 08:46

    初探Android系统整体架构

    系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制。虽然Android系统非常庞大且错综复杂,需要具备全面的技术栈,但整体架构设计清晰。Android底层内核空间以Linux Kernel作为基石,上层用户空间由Native系统库、虚拟机运行环境、
    发表于 08-20 06:32

    cola os程序框架介绍

    创建4.cola_os stime定时器创建前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件
    发表于 11-08 08:17

    RK平台PHY驱动与NXP的整体框架有哪些区别呢

    RK平台PHY驱动与NXP的整体框架有哪些区别呢?
    发表于 02-10 06:04

    传感驱动模型框架原理和传感器抽象驱动适配开发过程分析

    (传感器)驱动模型。Sensor驱动模型主要为上层提供稳定接口能力,对驱动开发者提供开放的接口实现和抽象的配置接口能力。传感器模型框架
    发表于 03-29 11:38

    RT-Thread Sensor框架和内置的lis2dh12驱动实现说明

    LIS3DH驱动的实现说明LIS3DH驱动基于Sensor框架内置的LIS2DH12修改而来,操作步骤参考本节其余内容。驱动支持pollin
    发表于 05-17 16:18

    HarmonyOS多媒体框架介绍

    、小的各种设备。 2 、音频框架介绍: 音频框架主要采用CS的架构,支持多个音频同时运行。 音频模块分为三个,分别是Audio Renderer、Audio Capturer、Audi
    发表于 01-03 16:36

    Linux下基于I2C协议的RTC驱动开发

    首先研究了Linux环境下字符设备驱动程序框架,然后介绍12C协议,在此基础上开发基于12C协议的RTC字符设备驱动程序。砷于驱动程序,这里
    发表于 03-02 16:15 48次下载
    Linux下基于I2C协议的RTC<b class='flag-5'>驱动</b>开发

    Linux DMA Engine框架介绍

    此会话描述如何从设备驱动程序在Linux中使用DMA。 这包括内存分配,缓存控制和DMA设备控制。 详细介绍了Linux DMA Engine框架
    的头像 发表于 11-23 06:29 5882次阅读