背景與概述
Sensor 是物聯(lián)網(wǎng)重要的一部分,“Sensor 之于物聯(lián)網(wǎng)”相當(dāng)于“眼睛之于人類”。人沒有眼睛就看不到這大千的花花世界,物聯(lián)網(wǎng)沒有了 Sensor 更是不能感知這變化萬千的世界。
現(xiàn)在,為物聯(lián)網(wǎng)開發(fā)的 Sensor 已經(jīng)很多了,有加速度計(Accelerometer),磁力計(Magnetometer),陀螺儀(Gyroscope),光感計(Ambient light sensor),接近光(Proximity),氣壓計(Barometer/pressure),濕度計(Humidometer)等等。這些傳感器,世界上的各大半導(dǎo)體廠商都有出產(chǎn),雖然增加了市場的可選擇性,同時也加大了應(yīng)用程序開發(fā)的難度。因為不同的傳感器廠商、不同的傳感器都需要配套自己獨(dú)有的驅(qū)動才能運(yùn)轉(zhuǎn)起來,這樣在開發(fā)應(yīng)用程序的時候就需要針對不同的傳感器做適配,自然加大了開發(fā)難度。為了降低應(yīng)用開發(fā)的難度,增加傳感器驅(qū)動的可復(fù)用性,我們設(shè)計了 Sensor 驅(qū)動框架。
Sensor 驅(qū)動框架的作用是:為上層提供統(tǒng)一的操作接口,提高上層代碼的可重用性;簡化底層驅(qū)動開發(fā)的難度,只要實現(xiàn)簡單的 ops(operations: 操作命令) 就可以將傳感器注冊到系統(tǒng)上。
整體框架
Sensor 驅(qū)動框架的整體架構(gòu)圖如下:
sensor
它為上層提供的是標(biāo)準(zhǔn) device 接口open/close/read/write/control ,為底層驅(qū)動提供的是簡單的 ops 接口:fetch_data/control。并且框架支持 module(模塊),為底層存在耦合的傳感器設(shè)備提供服務(wù)。
Sensor 設(shè)備其實是對標(biāo)準(zhǔn)設(shè)備 rt_device 的一個豐富,是在原有標(biāo)準(zhǔn)設(shè)備的基礎(chǔ)上增加了 Sensor 自己獨(dú)有的一部分 屬性 和 控制命令 ,如下圖所示:
sensor
整個 Sensor 設(shè)備包括兩個部分:
繼承自標(biāo)準(zhǔn)設(shè)備的一些特性,包括:標(biāo)準(zhǔn)的控制接口 、回調(diào)函數(shù)、device_id 等。
Sensor 設(shè)備獨(dú)有的部分,包括:Sensor 的類型、相關(guān)的信息、特有的控制命令、ops、以及一些 數(shù)據(jù)的結(jié)構(gòu)。
sensor 的結(jié)構(gòu)體
Sensor 設(shè)備的結(jié)構(gòu)體如下所示:
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 自身相關(guān)的信息,在 Sensor 設(shè)備注冊的時候提供,在使用的過程中不應(yīng)修改其內(nèi)容。具體成員如下所示。
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”)、傳感器數(shù)據(jù)的單位、通信接口類型、測量的最大范圍、測量的最小范圍、最小測量周期、硬件 FIFO 的最大深度。
Sensor 的配置
Sensor 驅(qū)動框架抽象出了一些公共的配置選項,這些可配置的選項置于 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 這個參數(shù),完成了通信接口的解耦。
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) /* 讀設(shè)備ID */2#define RT_SENSOR_CTRL_GET_INFO (1) /* 獲取設(shè)備信息 */3#define RT_SENSOR_CTRL_SET_RANGE (2) /* 設(shè)置傳感器測量范圍 */4#define RT_SENSOR_CTRL_SET_ODR (3) /* 設(shè)置傳感器數(shù)據(jù)輸出速率,unit is HZ */5#define RT_SENSOR_CTRL_SET_MODE (4) /* 設(shè)置工作模式 */6#define RT_SENSOR_CTRL_SET_POWER (5) /* 設(shè)置電源模式 */7#define RT_SENSOR_CTRL_SELF_TEST (6) /* 自檢 */
結(jié)合 ops 中的 control 接口使用,就可以完成傳感器的配置了。
Sensor 數(shù)據(jù)的存儲
為了方便數(shù)據(jù)的解析,規(guī)定每一個類型的 Sensor 都有自己獨(dú)有的數(shù)據(jù)結(jié)構(gòu),這些成員之間使用共用體以減少代碼量。
特有的 ops
ops(操作函數(shù))包含兩個函數(shù)指針, 一個的作用是獲取傳感器數(shù)據(jù)(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};
注冊方式
傳感器驅(qū)動框架提供了一個 Sensor 注冊函數(shù),通過傳入 Sensor 的控制塊,名稱,標(biāo)志位和私有數(shù)據(jù),就可以完成傳感器設(shè)備的注冊。
1int rt_hw_sensor_register(rt_sensor_t sensor,2 const char *name,3 rt_uint32_t flag,4 void *data);
這樣看來 Sensor 驅(qū)動框架依托于標(biāo)準(zhǔn)的設(shè)備框架,只要將傳感器驅(qū)動對接到 Sensor 的 ops 上,并通過調(diào)用 rt_hw_sensor_register 函數(shù)注冊為 Sensor 設(shè)備就可以通過標(biāo)準(zhǔn)的設(shè)備接口控制傳感器了。
module支持
module 的定義是解決底層有耦合的兩個傳感器而出現(xiàn)的,有些傳感器既有加速度計的功能又有陀螺儀的功能,并且他們的FIFO是共用的,在 FIFO 模式下,只能將兩個類型的傳感器的數(shù)據(jù)同時讀出,這就說明他們的數(shù)據(jù)是耦合的。
為了解決這個問題,我們定義了 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};
里面包含有耦合的傳感器的設(shè)備控制塊指針,通過這個功能就可以在讀取陀螺儀的數(shù)據(jù)的時候,同時更新加速度計的值,解決了底層耦合的問題。
-
傳感器
+關(guān)注
關(guān)注
2551文章
51097瀏覽量
753522 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2909文章
44634瀏覽量
373311 -
Sensor
+關(guān)注
關(guān)注
0文章
134瀏覽量
49601
原文標(biāo)題:RT-Thread傳感器設(shè)備驅(qū)動框架介紹
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論