Add Hall-effect pulse-output flow meter driver. An ISR increments a
64-bit pulse counter implemented as two 32-bit atomics (low word and
high word) with wraparound detection.
Volume thresholds are stored as a snapshot of the low pulse counter at
arm time plus a delta in pulses. The ISR fires when the unsigned 32-bit
difference (current - snapshot) reaches the delta, which is inherently
wraparound-safe. Sub-pulse thresholds are clamped to one pulse. The
threshold trigger is one-shot: it disarms on firing or when a NULL
handler is registered. Work is deferred to the system workqueue to avoid
running the handler in ISR context.
SENSOR_CHAN_VOLUME reports accumulated volume in liters since boot.
SENSOR_CHAN_FLOW_RATE reports instantaneous flow in L/min, computed at
sample_fetch time from the delta pulse count and elapsed time since the
previous fetch. SENSOR_ATTR_CALIBRATION provides a runtime override for
the pulses-per-liter calibration value. An optional power GPIO can be
asserted at init to enable the sensor module.
Signed-off-by: Nicolas Belin <nbelin@baylibre.com>
Transition the driver over to one-shot operation by default unless
`CONFIG_LPS22HH_TRIGGER` is enabled to actually make use of periodic
measurements. By using one-shot mode and polling on the status register,
this fixes the following code flow, which is currently broken due to
no periodic samples being available immediately after resuming.
```
pm_device_runtime_get(dev);
sensor_sample_fetch(dev);
sensor_channel_get(dev, ...);
pm_device_runtime_put(dev);
```
Signed-off-by: Jordan Yates <jordan@embeint.com>
Use <> operator to include a Zephyr header file instead of "" that
is intended to local header files, not header files relative to
specifically defined search paths.
This change was made running the sed shell command below:
$ sed -i -E 's/#include "zephyr\/([^"]+)\.h"/#include <zephyr\/\1.h>/g' \
`grep -rsl "#include \"zephyr/" drivers/`
Signed-off-by: Etienne Carriere <etienne.carriere@st.com>
The `thread` field is not initialized, if it's being animated via
k_work_queue_run instead of k_work_queue_start.
Signed-off-by: Michael Zimmermann <michael.zimmermann@sevenlab.de>
INA228_DRIVER_INIT sets CAL with
`.cal = (INA237_DT_CAL(inst) * 16)`, where INA237_DT_CAL ends in
`/ 10000000ULL`. C operator precedence runs the divide before the
*16, so the truncation residual gets amplified 16x — and for small
current_lsb * rshunt products (e.g. 191 nA LSB, 5 mOhm shunt) the
numerator is below 1e10 and CAL collapses to 0, leaving the CURRENT
register stuck at zero (datasheet section 8.1.2).
Replace both CAL macros with a single parameterized
INA2XX_DT_CAL(inst, scaling) so the *16 (folded into
INA228_CAL_SCALING) happens inside the product, and the divide is the
last operation. INA237 path is functionally unchanged.
Signed-off-by: Noah Luskey <luskey@meta.com>
Adds Driver emulation tests to validate configuration,
data fetching and temperature edge case checks.
Signed-off-by: Jan Carlo Roleda <jancarlo.roleda@analog.com>
Fixes a computation issue that causes negative temperature values
to be erroneously parsed from the device driver.
Signed-off-by: Jan Carlo Roleda <jancarlo.roleda@analog.com>
use min-len/max-len for asserting the correct length of the
array, drop corresponding build asserts
Signed-off-by: Jilay Pandya <jilay.pandya@outlook.com>
Init the sensorhub targets using 8-bit i2c_addr for those drivers
when their STMEMSC API requires it.
Signed-off-by: Armando Visconti <armando.visconti@st.com>
Previously, the `pac194x_sample_fetch` function would always read data
from all enabled physical channels over the I2C bus, regardless of which
specific sensor channel was actually requested by the caller. This commit
updates the fetch routine to respect the requested channel.
Signed-off-by: Albert Jakieła <jakiela@google.com>
Add microchip,refresh-mode property to Mictochip PAC194X/195X.
This property allows configuring the sensor's refresh behavior
directly from the devicetree.
Signed-off-by: Albert Jakieła <jakiela@google.com>
In Multi-LED mode, nothing prevents sending an incorrect slot to the chip.
One could unintentionally send a "reserved" slot code, which could result
in unexpected behavior. Values must be between 0 (time slot disabled)
and 3 (Green LED channel). For the MAX30102, the max value should be 2.
This fix limits the sensor binding using min/max properties and simplifies
the translate map generation by testing if the time slot is not disabled.
Signed-off-by: Alban Chauvel <a.chauvel@catie.fr>
The MAX30101 sensor driver does not correctly support the Multi-LED mode.
If a user sets four LEDs in the "led-slot" binding property, the fourth
measurement in the FIFO will be lost. Fix it by separating the number
of slots available in each FIFO sample (four) from the number of LED
channels available (three for the MAX30101, two for the MAX30102).
Signed-off-by: Alban Chauvel <a.chauvel@catie.fr>
Add conditional GPIO selects for ST sensor drivers when their
bindings expose *-gpios properties, including properties inherited
from included common binding files.
This aligns Kconfig GPIO dependencies with devicetree binding data.
Signed-off-by: Fabrice DJIATSA <fabrice.djiatsa-ext@st.com>
Drop all the symbols that were incorrectly part of the public header
and move them to a driver-internal header.
Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
Uses generic nomenclature for TDK ntcg series NTC thermistors, which use a
naming scheme that indicates their resistance (R25) and beta (B25/85)
values. Compensation tables are identical for parts with the same
resistance and beta values.
Signed-off-by: Dan Mangum <georgedanielmangum@gmail.com>
replace BUILD_ASSERT for fifo-watermark with min/max in bindings
replace all enums with min/max with their corresponding ranges
Signed-off-by: Jilay Pandya <jilay.pandya@outlook.com>
use min/max for fifo-watermark in bosch,bmi08x-gyro.yaml
and bosch,bmi08x-accel.yaml
drop BUILD_ASSERT in bmi08x_gyro.c
Signed-off-by: Jilay Pandya <jilay.pandya@outlook.com>
TMP108/AS6212 status alert bit masks are driver-internal. Move them from
the public header into tmp108.h.
Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
Status register bit macros are driver-internal and only used in
ti_hdc302x.c. Remove them from the public header.
Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
Add the possibility to configure the interrupt gpio in one of the
two possiblities:
- GPIO_INT_EDGE_TO_ACTIVE
- GPIO_INT_LEVEL_ACTIVE
Default is GPIO_INT_EDGE_TO_ACTIVE, which matches with old fixed
configuration.
Signed-off-by: Armando Visconti <armando.visconti@st.com>
Add sleep retention support for die temp driver. When peripheral
power down is enabled for light sleep, register data is lost,
so REGDMA backup is needed to mantein peripheral operational.
Signed-off-by: Raffael Rostagno <raffael.rostagno@espressif.com>
Add I2C bus support to the BMI323 sensor driver. The BMI323
supports I2C communication with a dummy byte offset protocol
where 2 dummy bytes precede actual data in read operations.
Changes:
- Add bmi323_i2c.c/.h with I2C read/write and chip ID validation
- Add BMI323_BUS_I2C Kconfig option
- Update BMI323_DEVICE_BUS macro to handle I2C bus type
- Add bosch,bmi323-i2c.yaml device tree binding
The I2C implementation handles the dummy byte offset required
by the BMI323 when reading registers over I2C.
Signed-off-by: Sudarshan Iyengar <sudarshan.iyengar@alifsemi.com>
Add Real-Time I/O (RTIO) asynchronous sensor API support to the
BMI323 driver. This enables non-blocking sensor reads with
kernel-managed buffering.
Features added:
- RTIO submit and decode operations for accel, gyro, and temp channels
- Q31 fixed-point format encoding for consistent sensor data scaling
- Unified sample fetch implementation shared between sync and async paths
- Decoder API with timestamped frame headers
The driver now supports both blocking (sensor_sample_fetch) and
non-blocking (sensor_read) operation modes when CONFIG_SENSOR_ASYNC_API
is enabled.
Signed-off-by: Sudarshan Iyengar <sudarshan.iyengar@alifsemi.com>
Assisted-by: GPTCodex:GPT-5.4
Add Real-Time I/O (RTIO) support to the BME680 sensor driver to enable
asynchronous sensor operations. This implementation follows the pattern
established by other Bosch sensor drivers in Zephyr.
Changes include:
- Add bme680_async.c implementing the sensor async API submit function
using RTIO lock free queues asynchronous read operations
- Add bme680_decoder.c implementing the sensor decoder API for
Q31-format data conversion of temperature, pressure, humidity, and
gas resistance channels
- Add RTIO encoded data structures (bme680_encoded_data, bme680_reading)
to bme680.h with proper bit-packed flags for channel presence
- Update CMakeLists.txt to conditionally build async sources when
CONFIG_SENSOR_ASYNC_API is enabled
The driver supports fetching temperature, pressure, humidity, and gas
resistance channels via the RTIO interface.
Signed-off-by: Sudarshan Iyengar <sudarshan.iyengar@alifsemi.com>
Assisted-by: Claude:claude-opus-4.6
Add support for the TI TMP451 remote and local temperature sensor.
Assisted-by: Claude:claude-opus-4.6
Signed-off-by: Kurtis Dinelle <kurtisdinelle@gmail.com>
The battery alias is verified to be a sensor device before use.
Also the commit fixes incorrect use of `argv[1]` instead of `dev->name`.
Signed-off-by: Maksim Salau <maksim.salau@gmail.com>
shell_info is intended for informational side-notes, not for printing
command result data. Use shell_print instead, consistent with other
Zephyr driver shell implementations (rtc_shell, gpio_shell, i2c_shell,
eeprom_shell).
Signed-off-by: Nick Ward <nix.ward@gmail.com>
Assisted-by: Claude:claude-sonnet-4-6
The streaming code previously hard-coded the INT pin as active-high
push-pull when writing INT_CONFIG. Add two boolean DT properties,
int-active-low and int-open-drain, and thread them through
bmp581_config so boards with active-low or open-drain INT wiring can
be supported without patching the driver.
Defaults preserve the previous hard-coded behavior (active-high,
push-pull) so existing in-tree boards do not need DT changes. Boards
with active-low INT wiring set int-active-low, which programs
BMP5_INT_POL_ACTIVE_LOW into INT_CONFIG. Note that the GPIO flags on
int-gpios must agree with the chip-side polarity setting.
Signed-off-by: Ryan McClelland <ryanmcclelland@meta.com>
Add a CONFIG_PM_DEVICE action handler that maps PM_DEVICE_ACTION_RESUME
to the devicetree-configured power-mode (NORMAL/FORCED/CONTINUOUS) and
PM_DEVICE_ACTION_SUSPEND to STANDBY, reusing set_power_mode() so the
mandatory STANDBY transition before entering an active mode (datasheet
section 4.3.7) is preserved. PM_DEVICE_DT_INST_DEFINE is wired into the
SENSOR_DEVICE_DT_INST_DEFINE call so the handler is registered for each
instance.
Add a bmp581_pm_busy_check() helper that returns -EBUSY when the device
is not PM_DEVICE_STATE_ACTIVE. The check is applied only to the
streaming branch of bmp581_submit(), because DRDY/FIFO interrupts only
fire while the device is in NORMAL or CONTINUOUS mode and a streaming
submission against a suspended device would otherwise wait forever for
an interrupt that cannot arrive.
Per datasheet section 4.3.1, STANDBY keeps all registers accessible for
read and write and preserves the last sample in the data registers, so
sample_fetch, channel_get, attr_set and the one-shot submit path are
deliberately left ungated. In particular IIR/FIFO/NVM writes (section
4.3.8) require STANDBY, and BMP5_ATTR_POWER_MODE is the mechanism used
to leave STANDBY, both of which would deadlock if attr_set were gated.
Signed-off-by: Ryan McClelland <ryanmcclelland@meta.com>
The BMP581 driver previously only supported I2C. Add SPI and I3C
transports by extending the existing RTIO-based bus abstraction with
two new bus types (BMP581_BUS_TYPE_SPI, BMP581_BUS_TYPE_I3C),
following the pattern established by the icm45686 driver.
For SPI, the read register address is OR'd with bit 7 (BMP5_SPI_RD_MASK)
per the datasheet, and bmp581_init() performs the SPI activation dummy
read both before and after soft-reset (the device boots and reverts to
I2C/I3C mode on reset and requires a 16-SCK transaction with CSB
asserted to switch to SPI). For I3C, RTIO_IODEV_I3C_STOP/RESTART flags
are set on the read/write SQEs.
The BMP581_INIT macro now uses COND_CODE_1 to dispatch on the bus type
and instantiate the appropriate I2C/SPI/I3C iodev. Kconfig selects
I2C/SPI/I3C and the corresponding *_RTIO option conditionally based
on which buses the matching DT nodes use.
The original bosch,bmp581.yaml is split into a common binding plus
per-bus bindings (bosch,bmp581-i2c.yaml, bosch,bmp581-spi.yaml,
bosch,bmp581-i3c.yaml) that include the bus-specific yaml. Test nodes
for SPI and I3C are added to the build_all sensor test.
Signed-off-by: Ryan McClelland <ryanmcclelland@meta.com>
In the 'off' path, sensor_trigger_set clears the hardware trigger
then find_sensor_trigger_device removes the bookkeeping entry. If the
device was not in sensor_trigger_devices[] (inconsistent state),
shell_error was printed but err remained 0 and the function returned
success. Return -ENOENT so the caller sees the failure.
Signed-off-by: Nick Ward <nix.ward@gmail.com>
Assisted-by: Claude:claude-sonnet-4-6
Replace four scattered k_mutex_unlock/return pairs with a single
goto unlock label. Each error path sets err and jumps to the label;
the lock and unlock are paired at the top and bottom of the function.
Adding a new error path now only requires goto unlock rather than a
manually-added unlock call.
The goto on sensor_read_async_mempool failure also prevents a thread
deadlock. sensor_processing_with_callback calls rtio_cqe_consume_block
which blocks with K_FOREVER waiting for a CQE. If the mempool call
fails (e.g. -ENOMEM from SQE pool exhaustion) no SQE is submitted and
no CQE ever arrives. Without the goto, the shell thread spins inside
sensor_processing_with_callback while holding cmd_get_mutex, causing
all subsequent 'sensor get' calls to fail with -EBUSY permanently.
Signed-off-by: Nick Ward <nix.ward@gmail.com>
Assisted-by: Claude:claude-sonnet-4-6
cmd_get_sensor discarded the error from sensor_read_async_mempool and
always returned 0. Return err so callers can detect a failed read.
Signed-off-by: Nick Ward <nix.ward@gmail.com>
Assisted-by: Claude:claude-sonnet-4-6
cmd_sensor_attr_set and cmd_sensor_attr_get never acquire cmd_get_mutex.
Signed-off-by: Nick Ward <nix.ward@gmail.com>
Assisted-by: Claude:claude-sonnet-4-6
Refactors the adltc2990 sensor driver to extract sample fetching into
static functions, and uses the new functions to support fetching
individual channels or all channels at once.
Signed-off-by: Maureen Helm <maureen.helm@analog.com>
The MAX30102 is register-compatible with the MAX30101 but has only
Red and IR LED channels (no Green LED). Re-use the existing MAX30101
driver by switching DT_DRV_COMPAT to maxim_max30102 and guarding
Green LED operations with an is_max30102 flag in the config struct.
A shared MAX3010X_INIT macro with a chip argument avoids duplicating
the device instantiation code between the two variants.
Signed-off-by: Md Shofiqul Islam <shofiqtest@gmail.com>
The sd-gpios property is optional, and GPIO_DT_SPEC_INST_GET_OR()
leaves sd_gpio.port NULL when it is absent.
The driver checked sd_gpio.port->name in the init and PM turn-off
paths, which dereferenced the missing GPIO spec before it could skip
shutdown pin setup. Check the port pointer directly instead.
Assisted-by: Codex CLI:GPT-5.5 High Reasoning
Signed-off-by: Daniel Lindestad <lindestad@proton.me>