mirror of
https://github.com/apache/nuttx.git
synced 2026-09-06 08:56:32 +00:00
Interrupt-driven mode so far pushes one uORB event per physical sample: one I2C burst read and one interrupt per sample, at whatever ODR the topic is running. That's the dominant power cost for a battery-constrained use case sampling continuously -- draining the chip's FIFO in batches cuts both by roughly the watermark size. The LSM6DS3TR-C's FIFO is the older ST "pattern" style (no per-sample tag byte, unlike LSM6DSO/ISM330): FIFO_CTRL3's per-sub-sensor decimation bits choose which of gyro/accel feed the FIFO (0 = excluded, 1 = no decimation -- only 0/1 are used here), FIFO_CTRL5 sets one shared FIFO-only ODR, and FIFO_STATUS1/2's DIFF_FIFO reports how many 16-bit words are waiting. Reused the existing INT1 wiring, but switched from DRDY (per-sample) to FTH (threshold reached) when CONFIG_SENSORS_LSM6DS3TRC_FIFO is on -- new bool that's a whole-driver mode switch, not a per-instance choice, so a board doesn't change; only its Kconfig does. lsm6ds3trc_fifo_configure() re-derives and writes the decimation bits, FIFO ODR, and watermark threshold (in words = watermark-in-samples * words-per-pattern, 3 with one sub-sensor active or 6 with both) from current dev->gyro/accel enabled+odr state; called from activate() and set_interval(). Both sub-sensors are forced to the same ODR while FIFO is on -- decimation factors > 1 for independent per-topic rates is real complexity (matching ODR ratios to decimation values) left for later. lsm6ds3trc_fifo_worker() replaces lsm6ds3trc_worker() under the Kconfig guard: reads DIFF_FIFO, bursts that many words (rounded down to a whole pattern chunk, capped at 2x the configured watermark so a late drain doesn't overflow the read buffer -- whatever's left over just waits in the chip's own FIFO for the next drain), then walks the buffer decoding each chunk into a push_event() same as before. FIFO entries don't carry their own timestamp, so each one is interpolated backwards from the ISR's timestamp by the configured ODR interval. Temperature isn't part of the FIFO pattern (FIFO_TEMP_EN stays off to keep the pattern width simple); one direct OUT_TEMP_L read per drain is applied to the whole batch instead. Validated on the bench, both pattern widths: with both topics subscribed (6-word pattern) and with only the accelerometer (3-word), samples arrive in watermark-sized bursts with interpolated timestamps spaced by the exact configured ODR interval (52Hz -> 19230us between every consecutive sample, matched exactly), sane accel/gyro values, no I2C errors, no overruns, sustained for 15+ seconds continuous. Assisted-by: Claude <noreply@anthropic.com> Signed-off-by: Felipe Moura <moura.fmo@gmail.com> |
||
|---|---|---|
| .. | ||
| 1wire | ||
| aie | ||
| analog | ||
| audio | ||
| bch | ||
| can | ||
| clk | ||
| contactless | ||
| coresight | ||
| crypto | ||
| devfreq | ||
| devicetree | ||
| dma | ||
| dummy | ||
| eeprom | ||
| efuse | ||
| i2c | ||
| i2s | ||
| i3c | ||
| input | ||
| ioexpander | ||
| ipcc | ||
| lcd | ||
| leds | ||
| loop | ||
| math | ||
| misc | ||
| mmcsd | ||
| modem | ||
| motor | ||
| mtd | ||
| net | ||
| note | ||
| pci | ||
| pinctrl | ||
| pipes | ||
| power | ||
| rc | ||
| regmap | ||
| reset | ||
| rf | ||
| rpmsg | ||
| rptun | ||
| segger | ||
| sensors | ||
| serial | ||
| spi | ||
| syslog | ||
| thermal | ||
| timers | ||
| usbdev | ||
| usbhost | ||
| usbmisc | ||
| usbmonitor | ||
| usrsock | ||
| vhost | ||
| video | ||
| virtio | ||
| wireless | ||
| .gitignore | ||
| CMakeLists.txt | ||
| drivers_initialize.c | ||
| Kconfig | ||
| Makefile | ||