Zephyr API Documentation 4.3.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
7#ifndef ZEPHYR_INCLUDE_SENSING_SENSOR_H_
8#define ZEPHYR_INCLUDE_SENSING_SENSOR_H_
9
10#include <stdbool.h>
11#include <zephyr/device.h>
14
21
22#ifdef __cplusplus
23extern "C" {
24#endif
25
53
55
61enum {
62 EVENT_CONFIG_READY,
63 EVENT_SENSOR_POLL,
64};
65
71enum {
72 SENSOR_LATER_CFG_BIT,
73 SENSOR_POLL_BIT,
74};
75
79struct sensing_connection {
80 sys_snode_t snode;
81 struct sensing_sensor *source;
82 struct sensing_sensor *sink;
83 uint32_t interval;
85 int sensitivity[CONFIG_SENSING_MAX_SENSITIVITY_COUNT];
86 void *data;
88 uint64_t next_consume_time;
89 struct sensing_callback_list *callback_list;
90};
91
101struct sensing_sensor {
102 const struct device *dev;
103 const struct sensing_sensor_info *info;
105 const struct sensing_sensor_register_info *register_info;
106 const uint16_t reporter_num;
107 sys_slist_t client_list;
108 uint32_t interval;
109 uint8_t sensitivity_count;
111 int sensitivity[CONFIG_SENSING_MAX_SENSITIVITY_COUNT];
113 struct rtio_iodev *iodev;
114 struct k_timer timer;
115 struct rtio_sqe *stream_sqe;
116 atomic_t flag;
117 struct sensing_connection *conns;
118};
119
128#define SENSING_SENSOR_INFO_NAME(node, idx) \
129 _CONCAT(_CONCAT(__sensing_sensor_info_, idx), DEVICE_DT_NAME_GET(node))
130
141#define SENSING_SENSOR_INFO_DEFINE(node, idx) \
142 const static STRUCT_SECTION_ITERABLE(sensing_sensor_info, \
143 SENSING_SENSOR_INFO_NAME(node, idx)) = { \
144 .type = DT_PROP_BY_IDX(node, sensor_types, idx), \
145 .name = DT_NODE_FULL_NAME(node), \
146 .friendly_name = DT_PROP(node, friendly_name), \
147 .vendor = DT_NODE_VENDOR_OR(node, NULL), \
148 .model = DT_NODE_MODEL_OR(node, NULL), \
149 .minimal_interval = DT_PROP(node, minimal_interval), \
150 };
151
159#define SENSING_CONNECTIONS_NAME(node) \
160 _CONCAT(__sensing_connections_, DEVICE_DT_NAME_GET(node))
161
170#define SENSING_SENSOR_SOURCE_NAME(idx, node) \
171 SENSING_SENSOR_NAME(DT_PHANDLE_BY_IDX(node, reporters, idx), \
172 DT_PROP_BY_IDX(node, reporters_index, idx))
173
182#define SENSING_SENSOR_SOURCE_EXTERN(idx, node) \
183extern struct sensing_sensor SENSING_SENSOR_SOURCE_NAME(idx, node);
184
193#define SENSING_CONNECTION_INITIALIZER(source_name, cb_list_ptr) \
194{ \
195 .callback_list = cb_list_ptr, \
196 .source = &source_name, \
197}
198
208#define SENSING_CONNECTION_DEFINE(idx, node, cb_list_ptr) \
209 SENSING_CONNECTION_INITIALIZER(SENSING_SENSOR_SOURCE_NAME(idx, node), \
210 cb_list_ptr)
211
222#define SENSING_CONNECTIONS_DEFINE(node, num, cb_list_ptr) \
223 LISTIFY(num, SENSING_SENSOR_SOURCE_EXTERN, \
224 (), node) \
225 static struct sensing_connection \
226 SENSING_CONNECTIONS_NAME(node)[(num)] = { \
227 LISTIFY(num, SENSING_CONNECTION_DEFINE, \
228 (,), node, cb_list_ptr) \
229 };
230
237struct sensing_submit_config {
238 enum sensor_channel chan;
239 const int info_index;
240 const bool is_streaming;
241};
242
248extern const struct rtio_iodev_api __sensing_iodev_api;
249
258#define SENSING_SUBMIT_CFG_NAME(node, idx) \
259 _CONCAT(_CONCAT(__sensing_submit_cfg_, idx), DEVICE_DT_NAME_GET(node))
260
269#define SENSING_SENSOR_IODEV_NAME(node, idx) \
270 _CONCAT(_CONCAT(__sensing_iodev_, idx), DEVICE_DT_NAME_GET(node))
271
281#define SENSING_SENSOR_IODEV_DEFINE(node, idx) \
282 static struct sensing_submit_config SENSING_SUBMIT_CFG_NAME(node, idx) = { \
283 .is_streaming = DT_PROP(node, stream_mode), \
284 .info_index = idx, \
285 }; \
286 RTIO_IODEV_DEFINE(SENSING_SENSOR_IODEV_NAME(node, idx), \
287 &__sensing_iodev_api, \
288 &SENSING_SUBMIT_CFG_NAME(node, idx));
289
298#define SENSING_SENSOR_NAME(node, idx) \
299 _CONCAT(_CONCAT(__sensing_sensor_, idx), DEVICE_DT_NAME_GET(node))
300
314#define SENSING_SENSOR_DEFINE(node, prop, idx, reg_ptr, cb_list_ptr) \
315 SENSING_SENSOR_INFO_DEFINE(node, idx) \
316 SENSING_SENSOR_IODEV_DEFINE(node, idx) \
317 STRUCT_SECTION_ITERABLE(sensing_sensor, \
318 SENSING_SENSOR_NAME(node, idx)) = { \
319 .dev = DEVICE_DT_GET(node), \
320 .info = &SENSING_SENSOR_INFO_NAME(node, idx), \
321 .register_info = reg_ptr, \
322 .reporter_num = DT_PROP_LEN_OR(node, reporters, 0), \
323 .conns = SENSING_CONNECTIONS_NAME(node), \
324 .iodev = &SENSING_SENSOR_IODEV_NAME(node, idx), \
325 };
326
337#define SENSING_SENSORS_DEFINE(node, reg_ptr, cb_list_ptr) \
338 DT_FOREACH_PROP_ELEM_VARGS(node, sensor_types, \
339 SENSING_SENSOR_DEFINE, reg_ptr, cb_list_ptr)
340
342
365#define SENSING_SENSORS_DT_DEFINE(node, reg_ptr, cb_list_ptr, \
366 init_fn, pm_device, \
367 data_ptr, cfg_ptr, level, prio, \
368 api_ptr, ...) \
369 SENSOR_DEVICE_DT_DEFINE(node, init_fn, pm_device, \
370 data_ptr, cfg_ptr, level, prio, \
371 api_ptr, __VA_ARGS__); \
372 SENSING_CONNECTIONS_DEFINE(node, \
373 DT_PROP_LEN_OR(node, reporters, 0), \
374 cb_list_ptr); \
375 SENSING_SENSORS_DEFINE(node, reg_ptr, cb_list_ptr);
376
385#define SENSING_SENSORS_DT_INST_DEFINE(inst, ...) \
386 SENSING_SENSORS_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
387
401 const struct device *dev, int type,
402 sensing_sensor_handle_t *reporter_handles, int max_handles);
403
412 const struct device *dev, int type);
413
422 const struct device *dev,
424
428
429#ifdef __cplusplus
430}
431#endif
432
433#endif /*ZEPHYR_INCLUDE_SENSING_SENSOR_H_*/
long atomic_t
Definition atomic_types.h:15
sensing_sensor_state
Sensor state.
Definition sensing.h:98
void * sensing_sensor_handle_t
Opaque handle to an opened sensor instance.
Definition sensing.h:140
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:49
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
state
Definition parser_state.h:29
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
Compute the mempool block index for a given pointer.
Definition rtio.h:538
Sensor registration information.
Definition sensing_sensor.h:30
uint16_t sample_size
Sample size in bytes for a single sample of the registered sensor.
Definition sensing_sensor.h:40
uint16_t flags
Sensor flags.
Definition sensing_sensor.h:34
uint8_t sensitivity_count
The number of sensor sensitivities.
Definition sensing_sensor.h:45
struct sensing_sensor_version version
Sensor version.
Definition sensing_sensor.h:51
Sensor Version.
Definition sensing.h:33