lps22hh_rs/register/main.rs
1use super::super::{
2 BusOperation, Error, Lps22hh, RegisterOperation, SensorOperation, bisync, register::OnState,
3};
4
5use bitfield_struct::bitfield;
6use derive_more::TryFrom;
7
8use st_mem_bank_macro::register;
9
10/// Register addresses for LPS22HH sensor
11///
12/// This enum represents the 8-bit register addresses embedded in the device.
13/// Registers marked as Reserved must not be changed to avoid permanent damage.
14/// The content of registers loaded at boot contains factory calibration values and should not be changed.
15#[repr(u8)]
16#[derive(Clone, Copy)]
17pub enum Reg {
18 /// Interrupt configuration register
19 InterruptCfg = 0x0B,
20 /// Pressure threshold low register (least significant bits)
21 ThsPL = 0x0C,
22 /// Pressure threshold high register (most significant bits)
23 ThsPH = 0x0D,
24 /// Interface control register
25 IfCtrl = 0x0E,
26 /// Device identification register
27 WhoAmI = 0x0F,
28 /// Control register 1
29 CtrlReg1 = 0x10,
30 /// Control register 2
31 CtrlReg2 = 0x11,
32 /// Control register 3
33 CtrlReg3 = 0x12,
34 /// FIFO control register
35 FifoCtrl = 0x13,
36 /// FIFO watermark level register
37 FifoWtm = 0x14,
38 /// Reference pressure low register
39 RefPL = 0x15,
40 /// Reference pressure high register
41 RefPH = 0x16,
42 /// Pressure offset low register
43 RpdsL = 0x18,
44 /// Pressure offset high register
45 RpdsH = 0x19,
46 /// Interrupt source register
47 IntSource = 0x24,
48 /// FIFO status register 1
49 FifoStatus1 = 0x25,
50 /// FIFO status register 2
51 FifoStatus2 = 0x26,
52 /// Status register
53 Status = 0x27,
54 /// Pressure output least significant byte
55 PressOutXl = 0x28,
56 /// Pressure output middle byte
57 PressOutL = 0x29,
58 /// Pressure output most significant byte
59 PressOutH = 0x2A,
60 /// Temperature output least significant byte
61 TempOutL = 0x2B,
62 /// Temperature output most significant byte
63 TempOutH = 0x2C,
64 /// FIFO pressure output least significant byte
65 FifoDataOutPressXl = 0x78,
66 /// FIFO pressure output middle byte
67 FifoDataOutPressL = 0x79,
68 /// FIFO pressure output most significant byte
69 FifoDataOutPressH = 0x7A,
70 /// FIFO temperature output least significant byte
71 FifoDataOutTempL = 0x7B,
72 /// FIFO temperature output most significant byte
73 FifoDataOutTempH = 0x7C,
74}
75
76/// INTERRUPT_CFG (0x0B)
77///
78/// Interrupt configuration register (R/W)
79///
80/// Configures interrupt generation based on pressure threshold events,
81/// autozero and autoreference reset and enable functions, and interrupt latching.
82#[register(address = Reg::InterruptCfg, access_type = "Lps22hh<B, OnState>")]
83#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
84#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
85pub struct InterruptCfg {
86 /// Pressure event interrupt enable (2 bits)
87 /// 00: No threshold (interrupt disabled)
88 /// 01: Positive threshold event enabled
89 /// 10: Negative threshold event enabled
90 /// 11: Both positive and negative threshold events enabled
91 #[bits(2)]
92 pub pe: u8,
93 /// Latch interrupt request to INT_SOURCE register (1 bit)
94 /// 0: Interrupt request not latched (pulsed)
95 /// 1: Interrupt request latched
96 #[bits(1)]
97 pub lir: u8,
98 /// Differential pressure interrupt enable (1 bit)
99 /// 0: Interrupt generation disabled
100 /// 1: Interrupt generation enabled
101 #[bits(1)]
102 pub diff_en: u8,
103 /// Reset Autozero function (1 bit)
104 /// Writing 1 resets AUTOZERO and REF_P registers to 0
105 #[bits(1)]
106 pub reset_az: u8,
107 /// Enable Autozero function (1 bit)
108 /// When set, measured pressure is used as reference and stored in REF_P
109 /// AUTOZERO bit auto-clears after first conversion
110 #[bits(1)]
111 pub autozero: u8,
112 /// Reset AutoRefP function (1 bit)
113 /// Writing 1 resets AUTOREFP function
114 #[bits(1)]
115 pub reset_arp: u8,
116 /// Enable AutoRefP function (1 bit)
117 /// When set, differential pressure is used for interrupt generation without changing PRESS_OUT registers
118 #[bits(1)]
119 pub autorefp: u8,
120}
121
122/// THS_P_L - THS_P_H (0x0C - 0x0D)
123///
124/// User-defined threshold value for pressure interrupt event (R/W)
125///
126/// Contains the 15-bit threshold pressure value used for interrupt generation.
127/// Threshold value = Desired interrupt threshold (hPa) × 16
128#[register(address = Reg::ThsPL, access_type = "Lps22hh<B, OnState>")]
129#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
130#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
131pub struct ThsP {
132 /// Threshold pressure low bits [7:0] (8 bits)
133 #[bits(15)]
134 pub ths: u16,
135 #[bits(1, access = RO)]
136 pub not_used_01: u8,
137}
138
139/// IF_CTRL (0x0E)
140///
141/// Interface control register (R/W)
142///
143/// Controls enabling/disabling of I2C and MIPI I3C interfaces, pull-up and pull-down resistors,
144/// and interrupt pin configuration.
145#[register(address = Reg::IfCtrl, access_type = "Lps22hh<B, OnState>")]
146#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
147#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
148pub struct IfCtrl {
149 /// I2C interface disable (1 bit)
150 /// - 0: I2C enabled
151 /// - 1: I2C disabled
152 #[bits(1)]
153 pub i2c_disable: u8,
154 /// MIPI I3C interface disable (1 bit)
155 /// - 0: MIPI I3C enabled
156 /// - 1: MIPI I3C disabled
157 #[bits(1)]
158 pub i3c_disable: u8,
159 /// Pull-down disable on INT1 pin (1 bit)
160 /// - 0: INT1 pin with pull-down enabled
161 /// - 1: INT1 pin pull-down disabled
162 #[bits(1)]
163 pub pd_dis_int1: u8,
164 /// SDO pull-up enable (1 bit)
165 /// - 0: Pull-up disconnected
166 /// - 1: Pull-up connected
167 #[bits(1)]
168 pub sdo_pu_en: u8,
169 /// SDA pull-up enable (1 bit)
170 /// - 0: Pull-up disconnected
171 /// - 1: Pull-up connected
172 #[bits(1)]
173 pub sda_pu_en: u8,
174 #[bits(2, access = RO)]
175 pub not_used_01: u8,
176 /// Interrupt enable on INT1 pin for MIPI I3C (1 bit)
177 /// - 0: INT1 disabled with MIPI I3C
178 /// - 1: INT1 enabled with MIPI I3C
179 #[bits(1)]
180 pub int_en_i3c: u8,
181}
182
183/// WHO_AM_I (0x0F)
184///
185/// The identification register is used to identity the device (R)
186#[register(address = Reg::WhoAmI, access_type = "Lps22hh<B, OnState>")]
187#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
188#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
189pub struct WhoAmI {
190 #[bits(8, access = RO)]
191 pub who_am_i: u8,
192}
193
194/// CTRL_REG1 (0x10)
195///
196/// Control register 1 (R/W)
197///
198/// Controls output data rate, low-pass filter, block data update, and SPI interface mode.
199#[register(address = Reg::CtrlReg1, access_type = "Lps22hh<B, OnState>")]
200#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
201#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
202pub struct CtrlReg1 {
203 /// SPI Serial Interface Mode selection (1 bit)
204 /// - 0: 4-wire SPI interface
205 /// - 1: 3-wire SPI interface
206 #[bits(1)]
207 pub sim: u8,
208 /// Block Data Update (1 bit)
209 /// - 0: Continuous update of output registers
210 /// - 1: Output registers not updated until MSB and LSB are read
211 #[bits(1)]
212 pub bdu: u8,
213 /// Low-pass filter configuration (2 bits)
214 /// - 00: Disabled (bandwidth = ODR/2)
215 /// - 01: Enabled (bandwidth = ODR/9)
216 /// - 10: Enabled (bandwidth = ODR/20)
217 #[bits(2)]
218 pub lpfp_cfg: u8,
219 /// Output data rate selection (3 bits)
220 /// - 000: Power-down mode
221 /// - 001: 3 Hz
222 /// - 010: 10 Hz
223 /// - 011: 25 Hz
224 /// - 100: 50 Hz
225 /// - 101: 75 Hz
226 /// - 110: 100 Hz (low-noise mode disabled automatically)
227 /// - 111: 200 Hz (low-noise mode disabled automatically)
228 #[bits(3)]
229 pub odr: u8,
230 #[bits(1, access = RO)]
231 pub not_used_01: u8,
232}
233/// CTRL_REG2 (0x11)
234///
235/// Control register 2 (R/W)
236///
237/// Controls one-shot mode, low noise mode, software reset, address auto-increment,
238/// interrupt pin configuration, and reboot memory content.
239#[register(address = Reg::CtrlReg2, access_type = "Lps22hh<B, OnState>")]
240#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
241#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
242pub struct CtrlReg2 {
243 /// One-shot mode enable (1 bit)
244 /// - 0: Idle mode
245 /// - 1: Triggers a single acquisition when device is in power-down mode
246 #[bits(1)]
247 pub one_shot: u8,
248 /// Low noise enable (1 bit)
249 /// - 0: Low current mode
250 /// - 1: Low noise mode (only valid if ODR < 100 Hz)
251 #[bits(1)]
252 pub low_noise_en: u8,
253 /// Software reset (1 bit)
254 /// Writing 1 resets volatile registers to default values; bit self-clears after reset
255 #[bits(1)]
256 pub swreset: u8,
257 #[bits(1, access = RO)]
258 pub not_used_01: u8,
259 /// Register address auto-increment (1 bit)
260 /// - 0: Disabled
261 /// - 1: Enabled (default)
262 #[bits(1)]
263 pub if_add_inc: u8,
264 /// Push-pull/open-drain selection on interrupt pads (1 bit)
265 /// - 0: Push-pull
266 /// - 1: Open-drain
267 #[bits(1)]
268 pub pp_od: u8,
269 /// Interrupt active level (1 bit)
270 /// - 0: Active high
271 /// - 1: Active low
272 #[bits(1)]
273 pub int_h_l: u8,
274 /// Reboot memory content (1 bit)
275 /// Writing 1 reloads calibration parameters from internal flash; bit auto-clears
276 #[bits(1)]
277 pub boot: u8,
278}
279
280/// CTRL_REG3 (0x12)
281///
282/// Control register 3 - INT_DRDY pin control register (R/W)
283///
284/// Controls interrupt signals routed to the INT_DRDY pin.
285#[register(address = Reg::CtrlReg3, access_type = "Lps22hh<B, OnState>")]
286#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
287#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
288pub struct CtrlReg3 {
289 /// Data signal on INT_DRDY pin control bits (2 bits)
290 /// - 00: Data signal (priority: DRDY or FIFO watermark or FIFO overrun or FIFO full)
291 /// - 01: Pressure high event
292 /// - 10: Pressure low event
293 /// - 11: Pressure low OR high event
294 #[bits(2)]
295 pub int_s: u8,
296 /// Data-ready signal on INT_DRDY pin (1 bit)
297 /// - 0: Disabled
298 /// - 1: Enabled
299 #[bits(1)]
300 pub drdy: u8,
301 /// FIFO overrun interrupt on INT_DRDY pin (1 bit)
302 /// - 0: Disabled
303 /// - 1: Enabled
304 #[bits(1)]
305 pub int_f_ovr: u8,
306 /// FIFO watermark status on INT_DRDY pin (1 bit)
307 /// - 0: Disabled
308 /// - 1: Enabled
309 #[bits(1)]
310 pub int_f_wtm: u8,
311 /// FIFO full flag on INT_DRDY pin (1 bit)
312 /// - 0: Disabled
313 /// - 1: Enabled
314 #[bits(1)]
315 pub int_f_full: u8,
316 #[bits(2, access = RO)]
317 pub not_used_01: u8,
318}
319
320/// FIFO_CTRL (0x13)
321///
322/// FIFO control register (R/W)
323///
324/// Controls FIFO mode selection and watermark stop behavior.
325#[register(address = Reg::FifoCtrl, access_type = "Lps22hh<B, OnState>")]
326#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
327#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
328pub struct FifoCtrl {
329 /// FIFO mode selection (3 bits)
330 /// - 000: Bypass mode
331 /// - 001: FIFO mode
332 /// - 01x: Continuous (Dynamic-Stream) mode
333 /// - 101: Bypass-to-FIFO mode
334 /// - 110: Bypass-to-Continuous (Dynamic-Stream) mode
335 /// - 111: Continuous (Dynamic-Stream)-to-FIFO mode
336 #[bits(3)]
337 pub f_mode: u8,
338 /// Stop on FIFO watermark (1 bit)
339 /// - 0: Disabled
340 /// - 1: Enabled (FIFO depth limited to watermark level)
341 #[bits(1)]
342 pub stop_on_wtm: u8,
343 #[bits(4, access = RO)]
344 pub not_used_01: u8,
345}
346
347/// FIFO_WTM (0x14)
348///
349/// FIFO watermark setting register (R/W)
350///
351/// Sets the FIFO watermark level for interrupt generation.
352#[register(address = Reg::FifoWtm, access_type = "Lps22hh<B, OnState>")]
353#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
354#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
355pub struct FifoWtm {
356 /// FIFO watermark level (7 bits)
357 #[bits(7)]
358 pub wtm: u8,
359 #[bits(1, access = RO)]
360 pub not_used_01: u8,
361}
362
363/// REF_P_L - REF_P_H (0x15 - 0x16)
364///
365/// Reference pressure registers (R/W)
366///
367/// Contains the 16-bit (expressed in 2's complement) reference pressure value used in AUTOZERO or AUTOREFP modes.
368#[register(address = Reg::RefPL, access_type = "Lps22hh<B, OnState>")]
369#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
370#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
371pub struct RefP {
372 /// Reference pressure
373 #[bits(16)]
374 pub ref_p: i16,
375}
376
377/// RPDS_L - RPDS_H (0x18 - 0x19)
378///
379/// Pressure offset low and high register (R/W)
380///
381/// Contains the 16-bit (2's complement) pressure offset value used for one-point calibration (OPC).
382#[register(address = Reg::RpdsL, access_type = "Lps22hh<B, OnState>")]
383#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
384#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
385pub struct Rpds {
386 /// Pressure offset (16 bits)
387 #[bits(16)]
388 pub rpds: i16,
389}
390
391/// INT_SOURCE (0x24)
392///
393/// Interrupt source register (R)
394#[register(address = Reg::IntSource, access_type = "Lps22hh<B, OnState>")]
395#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
396#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
397pub struct IntSource {
398 /// Differential pressure high event flag (1 bit)
399 #[bits(1)]
400 pub ph: u8,
401 /// Differential pressure low event flag (1 bit)
402 #[bits(1)]
403 pub pl: u8,
404 /// Interrupt active flag (1 bit)
405 #[bits(1)]
406 pub ia: u8,
407 #[bits(4, access = RO)]
408 pub not_used_01: u8,
409 /// Boot phase indicator (1 bit)
410 #[bits(1)]
411 pub boot_on: u8,
412}
413
414/// FIFO_STATUS1 - FIFO_STATUS2 (0x25 - 0x26)
415///
416/// FIFO status register 1 (R)
417#[register(address = Reg::FifoStatus1, access_type = "Lps22hh<B, OnState>")]
418#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
419#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
420pub struct FifoStatusReg {
421 /// FIFO stored data level, number of unread samples stored in FIFO (8 bits)
422 #[bits(8)]
423 pub fss: u8,
424 #[bits(5, access = RO)]
425 pub not_used_01: u8,
426 /// FIFO full interrupt active flag (1 bit)
427 #[bits(1)]
428 pub fifo_full_ia: u8,
429 /// FIFO overrun interrupt active flag (1 bit)
430 #[bits(1)]
431 pub fifo_ovr_ia: u8,
432 /// FIFO watermark interrupt active flag (1 bit)
433 #[bits(1)]
434 pub fifo_wtm_ia: u8,
435}
436
437impl From<FifoStatusReg> for FifoStatus1 {
438 fn from(value: FifoStatusReg) -> Self {
439 let bytes = value.into_bits().to_le_bytes();
440 Self::from_bits(bytes[0])
441 }
442}
443
444impl From<FifoStatusReg> for FifoStatus2 {
445 fn from(value: FifoStatusReg) -> Self {
446 let bytes = value.into_bits().to_le_bytes();
447 Self::from_bits(bytes[1])
448 }
449}
450
451/// FIFO_STATUS1 (0x25)
452///
453/// FIFO status register 1 (R)
454#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
455#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
456pub struct FifoStatus1 {
457 /// FIFO stored data level, number of unread samples stored in FIFO (8 bits)
458 #[bits(8)]
459 pub fss: u8,
460}
461
462/// FIFO_STATUS2 (0x26)
463///
464/// FIFO status register 2 (R)
465#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
466#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
467pub struct FifoStatus2 {
468 #[bits(5, access = RO)]
469 pub not_used_01: u8,
470 /// FIFO full interrupt active flag (1 bit)
471 #[bits(1)]
472 pub fifo_full_ia: u8,
473 /// FIFO overrun interrupt active flag (1 bit)
474 #[bits(1)]
475 pub fifo_ovr_ia: u8,
476 /// FIFO watermark interrupt active flag (1 bit)
477 #[bits(1)]
478 pub fifo_wtm_ia: u8,
479}
480
481/// STATUS (0x27)
482///
483/// Status register (R)
484#[register(address = Reg::Status, access_type = "Lps22hh<B, OnState>")]
485#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
486#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
487pub struct Status {
488 /// Pressure data available flag (1 bit)
489 #[bits(1)]
490 pub p_da: u8,
491 /// Temperature data available flag (1 bit)
492 #[bits(1)]
493 pub t_da: u8,
494 #[bits(2, access = RO)]
495 pub not_used_01: u8,
496 /// Pressure data overrun flag (1 bit)
497 #[bits(1)]
498 pub p_or: u8,
499 /// Temperature data overrun flag (1 bit)
500 #[bits(1)]
501 pub t_or: u8,
502 #[bits(2, access = RO)]
503 pub not_used_02: u8,
504}
505
506/// PRESS_OUT_XL - PRESS_OUT_L - PRESS_OUT_H (0x28 - 0x2A)
507///
508/// Pressure output value (R)
509#[register(address = Reg::PressOutXl, access_type = "Lps22hh<B, OnState>")]
510#[cfg_attr(feature = "bit_order_msb", bitfield(u32, order = Msb))]
511#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u32, order = Lsb))]
512pub struct PressOut {
513 #[offset_before(8)]
514 /// Pressure output (3 byte)
515 #[bits(32)]
516 pub pressure: u32,
517}
518
519/// TempOut (0x2B - 0x2C)
520///
521/// Temperature register of the sensor in 2's complement format
522#[register(address = Reg::TempOutL, access_type = "Lps22hh<B, OnState>")]
523#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
524#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
525pub struct TempOut {
526 /// Temperature output
527 #[bits(16)]
528 pub temperature: i16,
529}
530
531/// FIFO_DATA_OUT_PRESS_XL - FIFO_DATA_OUT_PRESS_L - FIFO_DATA_OUT_PRESS_H (0x78 - 0x7A)
532///
533/// FIFO pressure output (3 byte) (R)
534#[register(address = Reg::FifoDataOutPressXl, access_type = "Lps22hh<B, OnState>")]
535#[cfg_attr(feature = "bit_order_msb", bitfield(u32, order = Msb))]
536#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u32, order = Lsb))]
537pub struct FifoDataOutPress {
538 #[offset_before(8)]
539 /// FIFO pressure output (24 bits)
540 #[bits(32)]
541 pub pressure: u32,
542}
543
544/// FIFO_DATA_OUT_TEMP_L - FIFO_DATA_OUT_TEMP_H (0x7B - 0x7C)
545///
546/// FIFO temperature output two's complement 16 bit format(R)
547#[register(address = Reg::FifoDataOutTempL, access_type = "Lps22hh<B, OnState>")]
548#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
549#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
550pub struct FifoDataOutTemp {
551 /// FIFO temperature output (16 bits)
552 #[bits(16)]
553 pub temperature: i16,
554}
555
556/// Output data rate (ODR) settings for LPS22HH sensor
557///
558/// Controls the frequency of pressure and temperature data acquisition.
559/// When set to '000', device is in Power-down mode.
560/// Other values correspond to continuous acquisition at specified Hz.
561///
562/// The device is in Power-down mode when ODR bits are set to '000'.
563/// Continuous mode acquires data at frequencies from 1 Hz to 200 Hz.
564/// Low-noise mode is enabled only if ODR < 100 Hz and LOW_NOISE_EN bit is set.
565/// ODR 100 Hz and 200 Hz disable low-noise mode automatically.
566#[repr(u8)]
567#[derive(Clone, Copy, Default, TryFrom)]
568#[try_from(repr)]
569pub enum Odr {
570 /// Power-down mode, no continuous data acquisition.
571 #[default]
572 PowerDown = 0x00,
573 /// One-shot mode triggers a single acquisition.
574 OneShoot = 0x08,
575 /// 1 Hz output data rate.
576 _1hz = 0x01,
577 /// 10 Hz output data rate.
578 _10hz = 0x02,
579 /// 25 Hz output data rate.
580 _25hz = 0x03,
581 /// 50 Hz output data rate.
582 _50hz = 0x04,
583 /// 75 Hz output data rate.
584 _75hz = 0x05,
585 /// 1 Hz output data rate with low-noise mode enabled.
586 _1hzLowNoise = 0x11,
587 /// 10 Hz output data rate with low-noise mode enabled.
588 _10hzLowNoise = 0x12,
589 /// 25 Hz output data rate with low-noise mode enabled.
590 _25hzLowNoise = 0x13,
591 /// 50 Hz output data rate with low-noise mode enabled.
592 _50hzLowNoise = 0x14,
593 /// 75 Hz output data rate with low-noise mode enabled.
594 _75hzLowNoise = 0x15,
595 /// 100 Hz output data rate (low-noise mode disabled automatically).
596 _100hz = 0x06,
597 /// 200 Hz output data rate (low-noise mode disabled automatically).
598 _200hz = 0x07,
599}
600
601/// Low-pass filter configurations for LPS22HH sensor
602///
603/// Controls additional low-pass filter status and device bandwidth.
604/// - 0: Disabled, bandwidth = ODR/2
605/// - 1: Enabled, bandwidth = ODR/9
606/// - 2: Enabled, bandwidth = ODR/20
607#[repr(u8)]
608#[derive(Clone, Copy, Default, TryFrom)]
609#[try_from(repr)]
610pub enum LpfpCfg {
611 /// Low-pass filter disabled; device bandwidth = ODR/2
612 #[default]
613 OdrDiv2 = 0,
614 /// Low-pass filter enabled; device bandwidth = ODR/9
615 OdrDiv9 = 1,
616 /// Low-pass filter enabled; device bandwidth = ODR/20
617 OdrDiv20 = 2,
618}
619
620/// I2C interface enable/disable for LPS22HH sensor
621///
622/// Controls whether the I2C interface is enabled or disabled.
623/// - 0: I2C enabled
624/// - 1: I2C disabled
625#[repr(u8)]
626#[derive(Clone, Copy, Default, TryFrom)]
627#[try_from(repr)]
628pub enum I2cMode {
629 /// I2C interface enabled
630 #[default]
631 Enable = 0,
632 /// I2C interface disabled
633 Disable = 1,
634}
635
636/// MIPI I3C interface enable/disable for LPS22HH sensor
637///
638/// Controls MIPI I3C communication protocol and interrupt pin.
639/// - 0x00: I3C enabled, interrupt pin disabled
640/// - 0x10: I3C enabled, interrupt pin enabled
641/// - 0x11: I3C disabled
642#[repr(u8)]
643#[derive(Clone, Copy, Default, TryFrom)]
644#[try_from(repr)]
645pub enum I3cMode {
646 /// I3C enabled, interrupt pin disabled
647 #[default]
648 Enable = 0x00,
649 /// I3C enabled, interrupt pin enabled
650 EnableIntPinEnable = 0x10,
651 /// I3C disabled
652 Disable = 0x11,
653}
654
655/// Pull-up enable for SDO or SDA pins on LPS22HH sensor
656///
657/// Controls connection of internal pull-up resistors.
658/// - 0: Pull-up disconnected
659/// - 1: Pull-up connected
660#[repr(u8)]
661#[derive(Clone, Copy, Default, TryFrom)]
662#[try_from(repr)]
663pub enum PullUp {
664 /// Pull-up disconnected
665 #[default]
666 Disconnect = 0,
667 /// Pull-up connected
668 Connect = 1,
669}
670
671/// SPI interface mode selection for LPS22HH sensor
672///
673/// Selects between 4-wire and 3-wire SPI interface modes.
674/// - 0: 4-wire SPI interface
675/// - 1: 3-wire SPI interface
676#[repr(u8)]
677#[derive(Clone, Copy, Default, TryFrom)]
678#[try_from(repr)]
679pub enum Sim {
680 /// 4-wire SPI interface mode
681 #[default]
682 Spi4Wire = 0,
683 /// 3-wire SPI interface mode
684 Spi3Wire = 1,
685}
686
687/// Interrupt request latch mode for LPS22HH sensor
688///
689/// Controls whether interrupt requests are pulsed or latched.
690/// - 0: Interrupt request not latched (pulsed)
691/// - 1: Interrupt request latched
692#[repr(u8)]
693#[derive(Clone, Copy, Default, TryFrom)]
694#[try_from(repr)]
695pub enum Lir {
696 /// Interrupt request pulsed
697 #[default]
698 Pulsed = 0,
699 /// Interrupt request latched
700 Latched = 1,
701}
702
703/// Interrupt pin output mode for LPS22HH sensor
704///
705/// Controls push-pull or open-drain configuration on interrupt pads.
706/// - 0: Push-pull
707/// - 1: Open-drain
708#[repr(u8)]
709#[derive(Clone, Copy, Default, TryFrom)]
710#[try_from(repr)]
711pub enum PpOd {
712 /// Push-pull output mode
713 #[default]
714 PushPull = 0,
715 /// Open-drain output mode
716 OpenDrain = 1,
717}
718
719/// Interrupt active level for LPS22HH sensor
720///
721/// Controls whether interrupt is active-high or active-low.
722/// - 0: Active high
723/// - 1: Active low
724#[repr(u8)]
725#[derive(Clone, Copy, Default, TryFrom)]
726#[try_from(repr)]
727pub enum IntHL {
728 /// Interrupt active high
729 #[default]
730 ActiveHigh = 0,
731 /// Interrupt active low
732 ActiveLow = 1,
733}
734
735/// Pressure event interrupt enable for LPS22HH sensor
736///
737/// Controls interrupt generation on pressure threshold events.
738/// - 0: No threshold (interrupt disabled)
739/// - 1: Positive threshold event enabled
740/// - 2: Negative threshold event enabled
741/// - 3: Both positive and negative threshold events enabled
742#[repr(u8)]
743#[derive(Clone, Copy, Default, TryFrom)]
744#[try_from(repr)]
745pub enum Pe {
746 /// No threshold interrupt (interrupt disabled)
747 #[default]
748 NoThreshold = 0,
749 /// Interrupt on positive pressure threshold event
750 Positive = 1,
751 /// Interrupt on negative pressure threshold event
752 Negative = 2,
753 /// Interrupt on both positive and negative pressure threshold events
754 Both = 3,
755}
756
757/// FIFO mode selection for LPS22HH sensor FIFO buffer operation
758///
759/// The FIFO buffer can work according to six different modes:
760/// - 0: Bypass mode (FIFO not operational, remains empty)
761/// - 1: FIFO mode (data stored until FIFO full)
762/// - 2,3: Continuous (Dynamic-Stream) mode (streaming data)
763/// - 5: Bypass-to-FIFO mode (switches on interrupt)
764/// - 6: Bypass-to-Continuous (Dynamic-Stream) mode (switches on interrupt)
765/// - 7: Continuous (Dynamic-Stream)-to-FIFO mode (switches on interrupt)
766#[repr(u8)]
767#[derive(Clone, Copy, Default, TryFrom)]
768#[try_from(repr)]
769pub enum FMode {
770 /// Bypass mode: FIFO is not operational and remains empty.
771 #[default]
772 BypassMode = 0,
773 /// FIFO mode: Data stored in FIFO until full.
774 FifoMode = 1,
775 /// Continuous (Dynamic-Stream) mode: FIFO behaves as a stream buffer.
776 StreamMode = 2,
777 /// Continuous (Dynamic-Stream) mode: alternate encoding.
778 DynamicStreamMode = 3,
779 /// Bypass-to-FIFO mode: FIFO switches from Bypass to FIFO mode on interrupt.
780 BypassToFifoMode = 5,
781 /// Bypass-to-Continuous (Dynamic-Stream) mode: FIFO switches from Bypass to Continuous mode on interrupt.
782 BypassToStreamMode = 6,
783 /// Continuous (Dynamic-Stream)-to-FIFO mode: FIFO switches from Continuous to FIFO mode on interrupt.
784 StreamToFifoMode = 7,
785}
786
787#[derive(Default)]
788pub struct PinIntRoute {
789 pub drdy_pres: bool,
790 pub fifo_th: bool,
791 pub fifo_ovr: bool,
792 pub fifo_full: bool,
793}