Zephyr Project API 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
sensing_sensor.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2022-2023 Intel Corporation.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
12
13#ifndef ZEPHYR_INCLUDE_SENSING_SENSOR_H_
14#define ZEPHYR_INCLUDE_SENSING_SENSOR_H_
15
16#include <stdbool.h>
17#include <zephyr/device.h>
20
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
59
61
67enum {
68 EVENT_CONFIG_READY,
69 EVENT_SENSOR_POLL,
70};
71
77enum {
78 SENSOR_LATER_CFG_BIT,
79 SENSOR_POLL_BIT,
80};
81
85struct sensing_connection {
86 sys_snode_t snode;
87 struct sensing_sensor *source;
88 struct sensing_sensor *sink;
89 uint32_t interval;
91 int sensitivity[CONFIG_SENSING_MAX_SENSITIVITY_COUNT];
92 void *data;
94 uint64_t next_consume_time;
95 struct sensing_callback_list *callback_list;
96};
97
107struct sensing_sensor {
108 const struct device *dev;
109 const struct sensing_sensor_info *info;
111 const struct sensing_sensor_register_info *register_info;
112 const uint16_t reporter_num;
113 sys_slist_t client_list;
114 uint32_t interval;
115 uint8_t sensitivity_count;
117 int sensitivity[CONFIG_SENSING_MAX_SENSITIVITY_COUNT];
119 struct rtio_iodev *iodev;
120 struct k_timer timer;
121 struct rtio_sqe *stream_sqe;
122 atomic_t flag;
123 struct sensing_connection *conns;
124};
125
134#define SENSING_SENSOR_INFO_NAME(node, idx) \
135 _CONCAT(_CONCAT(__sensing_sensor_info_, idx), DEVICE_DT_NAME_GET(node))
136
147#define SENSING_SENSOR_INFO_DEFINE(node, idx) \
148 const static STRUCT_SECTION_ITERABLE(sensing_sensor_info, \
149 SENSING_SENSOR_INFO_NAME(node, idx)) = { \
150 .type = DT_PROP_BY_IDX(node, sensor_types, idx), \
151 .name = DT_NODE_FULL_NAME(node), \
152 .friendly_name = DT_PROP(node, friendly_name), \
153 .vendor = DT_NODE_VENDOR_OR(node, NULL), \
154 .model = DT_NODE_MODEL_OR(node, NULL), \
155 .minimal_interval = DT_PROP(node, minimal_interval), \
156 };
157
165#define SENSING_CONNECTIONS_NAME(node) \
166 _CONCAT(__sensing_connections_, DEVICE_DT_NAME_GET(node))
167
176#define SENSING_SENSOR_SOURCE_NAME(idx, node) \
177 SENSING_SENSOR_NAME(DT_PHANDLE_BY_IDX(node, reporters, idx), \
178 DT_PROP_BY_IDX(node, reporters_index, idx))
179
188#define SENSING_SENSOR_SOURCE_EXTERN(idx, node) \
189extern struct sensing_sensor SENSING_SENSOR_SOURCE_NAME(idx, node);
190
199#define SENSING_CONNECTION_INITIALIZER(source_name, cb_list_ptr) \
200{ \
201 .callback_list = cb_list_ptr, \
202 .source = &source_name, \
203}
204
214#define SENSING_CONNECTION_DEFINE(idx, node, cb_list_ptr) \
215 SENSING_CONNECTION_INITIALIZER(SENSING_SENSOR_SOURCE_NAME(idx, node), \
216 cb_list_ptr)
217
228#define SENSING_CONNECTIONS_DEFINE(node, num, cb_list_ptr) \
229 LISTIFY(num, SENSING_SENSOR_SOURCE_EXTERN, \
230 (), node) \
231 static struct sensing_connection \
232 SENSING_CONNECTIONS_NAME(node)[(num)] = { \
233 LISTIFY(num, SENSING_CONNECTION_DEFINE, \
234 (,), node, cb_list_ptr) \
235 };
236
243struct sensing_submit_config {
244 enum sensor_channel chan;
245 const int info_index;
246 const bool is_streaming;
247};
248
254extern const struct rtio_iodev_api __sensing_iodev_api;
255
264#define SENSING_SUBMIT_CFG_NAME(node, idx) \
265 _CONCAT(_CONCAT(__sensing_submit_cfg_, idx), DEVICE_DT_NAME_GET(node))
266
275#define SENSING_SENSOR_IODEV_NAME(node, idx) \
276 _CONCAT(_CONCAT(__sensing_iodev_, idx), DEVICE_DT_NAME_GET(node))
277
287#define SENSING_SENSOR_IODEV_DEFINE(node, idx) \
288 static struct sensing_submit_config SENSING_SUBMIT_CFG_NAME(node, idx) = { \
289 .is_streaming = DT_PROP(node, stream_mode), \
290 .info_index = idx, \
291 }; \
292 RTIO_IODEV_DEFINE(SENSING_SENSOR_IODEV_NAME(node, idx), \
293 &__sensing_iodev_api, \
294 &SENSING_SUBMIT_CFG_NAME(node, idx));
295
304#define SENSING_SENSOR_NAME(node, idx) \
305 _CONCAT(_CONCAT(__sensing_sensor_, idx), DEVICE_DT_NAME_GET(node))
306
320#define SENSING_SENSOR_DEFINE(node, prop, idx, reg_ptr, cb_list_ptr) \
321 SENSING_SENSOR_INFO_DEFINE(node, idx) \
322 SENSING_SENSOR_IODEV_DEFINE(node, idx) \
323 STRUCT_SECTION_ITERABLE(sensing_sensor, \
324 SENSING_SENSOR_NAME(node, idx)) = { \
325 .dev = DEVICE_DT_GET(node), \
326 .info = &SENSING_SENSOR_INFO_NAME(node, idx), \
327 .register_info = reg_ptr, \
328 .reporter_num = DT_PROP_LEN_OR(node, reporters, 0), \
329 .conns = SENSING_CONNECTIONS_NAME(node), \
330 .iodev = &SENSING_SENSOR_IODEV_NAME(node, idx), \
331 };
332
343#define SENSING_SENSORS_DEFINE(node, reg_ptr, cb_list_ptr) \
344 DT_FOREACH_PROP_ELEM_VARGS(node, sensor_types, \
345 SENSING_SENSOR_DEFINE, reg_ptr, cb_list_ptr)
346
348
371#define SENSING_SENSORS_DT_DEFINE(node, reg_ptr, cb_list_ptr, \
372 init_fn, pm_device, \
373 data_ptr, cfg_ptr, level, prio, \
374 api_ptr, ...) \
375 SENSOR_DEVICE_DT_DEFINE(node, init_fn, pm_device, \
376 data_ptr, cfg_ptr, level, prio, \
377 api_ptr, __VA_ARGS__); \
378 SENSING_CONNECTIONS_DEFINE(node, \
379 DT_PROP_LEN_OR(node, reporters, 0), \
380 cb_list_ptr); \
381 SENSING_SENSORS_DEFINE(node, reg_ptr, cb_list_ptr);
382
391#define SENSING_SENSORS_DT_INST_DEFINE(inst, ...) \
392 SENSING_SENSORS_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
393
407 const struct device *dev, int type,
408 sensing_sensor_handle_t *reporter_handles, int max_handles);
409
418 const struct device *dev, int type);
419
428 const struct device *dev,
430
434
435#ifdef __cplusplus
436}
437#endif
438
439#endif /*ZEPHYR_INCLUDE_SENSING_SENSOR_H_*/
long atomic_t
Atomic integer variable.
Definition atomic_types.h:31
sensing_sensor_state
Sensor state.
Definition sensing.h:104
void * sensing_sensor_handle_t
Opaque handle to an opened sensor instance.
Definition sensing.h:146
int sensing_sensor_get_reporters_count(const struct device *dev, int type)
Get reporters count of a given sensor instance by sensor type.
int sensing_sensor_get_reporters(const struct device *dev, int type, sensing_sensor_handle_t *reporter_handles, int max_handles)
Get reporter handles of a given sensor instance by sensor type.
int sensing_sensor_get_state(const struct device *dev, enum sensing_sensor_state *state)
Get this sensor's state.
sensor_channel
Sensor channels.
Definition sensor.h:65
struct _slist sys_slist_t
Single-linked list structure.
Definition slist.h:52
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:42
state
Definition parser_state.h:29
Main header file for the Sensing subsystem API.
Main header file for sensor driver API.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Runtime device structure (in ROM) per driver instance.
Definition device.h:513
API that an RTIO IO device should implement.
Definition iodev.h:33
Sensor registration information.
Definition sensing_sensor.h:36
uint16_t sample_size
Sample size in bytes for a single sample of the registered sensor.
Definition sensing_sensor.h:46
uint16_t flags
Sensor flags.
Definition sensing_sensor.h:40
uint8_t sensitivity_count
The number of sensor sensitivities.
Definition sensing_sensor.h:51
struct sensing_sensor_version version
Sensor version.
Definition sensing_sensor.h:57
Sensor Version.
Definition sensing.h:39