1use super::super::{
2 BusOperation, DelayNs, Error, Lps22df, RegisterOperation, SensorOperation, bisync,
3 register::OnState,
4};
5
6use bitfield_struct::bitfield;
7use derive_more::TryFrom;
8
9use st_mem_bank_macro::register;
10
11#[repr(u8)]
13#[derive(Clone, Copy, PartialEq)]
14pub enum Reg {
15 InterruptCfg = 0x0B,
16 ThsPL = 0x0C,
17 ThsPH = 0x0D,
18 IfCtrl = 0x0E,
19 WhoAmI = 0x0F,
20 CtrlReg1 = 0x10,
21 CtrlReg2 = 0x11,
22 CtrlReg3 = 0x12,
23 CtrlReg4 = 0x13,
24 FifoCtrl = 0x14,
25 FifoWtm = 0x15,
26 RefPL = 0x16,
27 RefPH = 0x17,
28 I3cIfCtrl = 0x19,
29 RpdsL = 0x1A,
30 RpdsH = 0x1B,
31 IntSource = 0x24,
32 FifoStatus1 = 0x25,
33 FifoStatus2 = 0x26,
34 Status = 0x27,
35 PressOutXl = 0x28,
36 PressOutL = 0x29,
37 PressOutH = 0x2A,
38 TempOutL = 0x2B,
39 TempOutH = 0x2C,
40 FifoDataOutPressXl = 0x78,
41 FifoDataOutPressL = 0x79,
42 FifoDataOutPressH = 0x7A,
43}
44
45#[register(address = Reg::InterruptCfg, access_type = "Lps22df<B, T, OnState>")]
49#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
50#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
51pub struct InterruptCfg {
52 #[bits(1)]
55 pub phe: u8,
56 #[bits(1)]
59 pub ple: u8,
60 #[bits(1)]
63 pub lir: u8,
64 #[bits(1, access = RO)]
65 pub not_used_01: u8,
66 #[bits(1)]
69 pub reset_az: u8,
70 #[bits(1)]
73 pub autozero: u8,
74 #[bits(1)]
77 pub reset_arp: u8,
78 #[bits(1)]
81 pub autorefp: u8,
82}
83
84#[register(address = Reg::ThsPL, access_type = "Lps22df<B, T, OnState>", override_type = u16)]
90#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
91#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
92pub struct ThsP {
93 #[bits(15)]
94 pub ths: u16,
95 #[bits(1, access = RO)]
96 pub not_used_01: u8,
97}
98
99#[register(address = Reg::IfCtrl, access_type = "Lps22df<B, T, OnState>")]
103#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
104#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
105pub struct IfCtrl {
106 #[bits(1, access = RO)]
107 pub not_used_01: u8,
108 #[bits(1)]
111 pub cs_pu_dis: u8,
112 #[bits(1)]
115 pub int_pd_dis: u8,
116 #[bits(1)]
119 pub sdo_pu_en: u8,
120 #[bits(1)]
123 pub sda_pu_en: u8,
124 #[bits(1)]
127 pub sim: u8,
128 #[bits(1)]
131 pub i2c_i3c_dis: u8,
132 #[bits(1)]
135 pub int_en_i3c: u8,
136}
137
138#[register(address = Reg::WhoAmI, access_type = "Lps22df<B, T, OnState>")]
142#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
143#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
144pub struct WhoAmI {
145 #[bits(8)]
147 pub id: u8,
148}
149
150#[register(address = Reg::CtrlReg1, access_type = "Lps22df<B, T, OnState>")]
154#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
155#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
156pub struct CtrlReg1 {
157 #[bits(3)]
160 pub avg: u8,
161 #[bits(4)]
164 pub odr: u8,
165 #[bits(1, access = RO)]
166 pub not_used_01: u8,
167}
168
169#[register(address = Reg::CtrlReg2, access_type = "Lps22df<B, T, OnState>")]
173#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
174#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
175pub struct CtrlReg2 {
176 #[bits(1)]
179 pub oneshot: u8,
180 #[bits(1, access = RO)]
181 pub not_used_01: u8,
182 #[bits(1)]
185 pub swreset: u8,
186 #[bits(1)]
189 pub bdu: u8,
190 #[bits(1)]
193 pub en_lpfp: u8,
194 #[bits(1)]
197 pub lfpf_cfg: u8,
198 #[bits(1, access = RO)]
199 pub not_used_02: u8,
200 #[bits(1)]
203 pub boot: u8,
204}
205
206#[register(address = Reg::CtrlReg3, access_type = "Lps22df<B, T, OnState>")]
210#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
211#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
212pub struct CtrlReg3 {
213 #[bits(1)]
216 pub if_add_inc: u8,
217 #[bits(1)]
220 pub pp_od: u8,
221 #[bits(1, access = RO)]
222 pub not_used_02: u8,
223 #[bits(1)]
226 pub int_h_l: u8,
227 #[bits(4, access = RO)]
228 pub not_used_01: u8,
229}
230
231#[register(address = Reg::CtrlReg4, access_type = "Lps22df<B, T, OnState>")]
235#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
236#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
237pub struct CtrlReg4 {
238 #[bits(1)]
241 pub int_f_ovr: u8,
242 #[bits(1)]
245 pub int_f_wtm: u8,
246 #[bits(1)]
249 pub int_f_full: u8,
250 #[bits(1, access = RO)]
251 pub not_used_02: u8,
252 #[bits(1)]
255 pub int_en: u8,
256 #[bits(1)]
259 pub drdy: u8,
260 #[bits(1)]
263 pub drdy_pls: u8,
264 #[bits(1, access = RO)]
265 pub not_used_01: u8,
266}
267
268#[register(address = Reg::FifoCtrl, access_type = "Lps22df<B, T, OnState>")]
272#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
273#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
274pub struct FifoCtrl {
275 #[bits(2)]
278 pub f_mode: u8,
279 #[bits(1)]
281 pub trig_modes: u8,
282 #[bits(1)]
285 pub stop_on_wtm: u8,
286 #[bits(4, access = RO)]
287 pub not_used_01: u8,
288}
289
290#[register(address = Reg::FifoWtm, access_type = "Lps22df<B, T, OnState>")]
294#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
295#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
296pub struct FifoWtm {
297 #[bits(7)]
299 pub wtm: u8,
300 #[bits(1, access = RO)]
301 pub not_used_01: u8,
302}
303
304#[register(address = Reg::RefPL, access_type = "Lps22df<B, T, OnState>")]
310#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
311#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
312pub struct RefP {
313 #[bits(16)]
314 pub refp: i16,
315}
316
317#[register(address = Reg::I3cIfCtrl, access_type = "Lps22df<B, T, OnState>")]
321#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
322#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
323pub struct I3cIfCtrl {
324 #[bits(2)]
327 pub i3c_bus_avb_sel: u8,
328 #[bits(3, access = RO)]
329 pub not_used_02: u8,
330 #[bits(1)]
333 pub asf_on: u8,
334 #[bits(2, access = RO)]
335 pub not_used_01: u8,
336}
337
338#[register(address = Reg::RpdsL, access_type = "Lps22df<B, T, OnState>", override_type = u16)]
342#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
343#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
344pub struct Rpds {
345 #[bits(16)]
346 pub offset: i16,
347}
348
349#[register(address = Reg::IntSource, access_type = "Lps22df<B, T, 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 IntSource {
356 #[bits(1)]
359 pub ph: u8,
360 #[bits(1)]
363 pub pl: u8,
364 #[bits(1)]
367 pub ia: u8,
368 #[bits(4, access = RO)]
369 pub not_used_01: u8,
370 #[bits(1)]
373 pub boot_on: u8,
374}
375
376#[register(address = Reg::FifoStatus1, access_type = "Lps22df<B, T, OnState>")]
382#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
383#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
384pub struct FifoStatus1 {
385 #[bits(8)]
386 pub fss: u8,
387}
388
389#[register(address = Reg::FifoStatus2, access_type = "Lps22df<B, T, OnState>")]
393#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
394#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
395pub struct FifoStatus2 {
396 #[bits(5, access = RO)]
397 pub not_used_01: u8,
398 #[bits(1)]
401 pub fifo_full_ia: u8,
402 #[bits(1)]
405 pub fifo_ovr_ia: u8,
406 #[bits(1)]
409 pub fifo_wtm_ia: u8,
410}
411
412#[register(address = Reg::Status, access_type = "Lps22df<B, T, OnState>")]
416#[cfg_attr(feature = "bit_order_msb", bitfield(u8, order = Msb))]
417#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u8, order = Lsb))]
418pub struct Status {
419 #[bits(1)]
422 pub p_da: u8,
423 #[bits(1)]
426 pub t_da: u8,
427 #[bits(2, access = RO)]
428 pub not_used_01: u8,
429 #[bits(1)]
432 pub p_or: u8,
433 #[bits(1)]
436 pub t_or: u8,
437 #[bits(2, access = RO)]
438 pub not_used_02: u8,
439}
440
441#[register(address = Reg::PressOutXl, access_type = "Lps22df<B, T, OnState>")]
449#[cfg_attr(feature = "bit_order_msb", bitfield(u32, order = Msb))]
450#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u32, order = Lsb))]
451pub struct PressOut {
452 #[offset_before(8)]
453 #[bits(32)]
454 pub pressure: i32,
455}
456
457#[register(address = Reg::TempOutL, access_type = "Lps22df<B, T, OnState>", override_type = u16)]
463#[cfg_attr(feature = "bit_order_msb", bitfield(u16, order = Msb))]
464#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u16, order = Lsb))]
465pub struct TempOut {
466 #[bits(16)]
467 pub temp_c: i16,
468}
469
470#[register(address = Reg::FifoDataOutPressXl, access_type = "Lps22df<B, T, OnState>")]
476#[cfg_attr(feature = "bit_order_msb", bitfield(u32, order = Msb))]
477#[cfg_attr(not(feature = "bit_order_msb"), bitfield(u32, order = Lsb))]
478pub struct FifoDataOutPress {
479 #[offset_before(8)]
480 #[bits(32)]
481 pub pressure: i32,
482}
483
484#[repr(u8)]
486#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
487#[try_from(repr)]
488pub enum Interface {
489 #[default]
491 SelByHw = 0x00,
492 Spi4w = 0x02,
494 Spi3w = 0x03,
496 IntPinOnI3c = 0x04,
498}
499
500#[repr(u8)]
502#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
503#[try_from(repr)]
504pub enum Filter {
505 #[default]
507 FilterAuto = 0x00,
508 FilterAlwaysOn = 0x01,
510}
511
512#[repr(u8)]
514#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
515#[try_from(repr)]
516pub enum I3cIbiTime {
517 #[default]
519 Ibi50us = 0x0,
520 Ibi2us = 0x1,
522 Ibi1ms = 0x2,
524 Ibi25ms = 0x3,
526}
527
528#[repr(u8)]
530#[derive(Clone, Copy, PartialEq, TryFrom)]
531#[try_from(repr)]
532pub enum Init {
533 DrvRdy = 0x00,
535 Boot = 0x01,
537 Reset = 0x02,
539}
540
541#[repr(u8)]
543#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
544#[try_from(repr)]
545pub enum Odr {
546 #[default]
548 OneShot = 0x00,
549 _1hz = 0x01,
551 _4hz = 0x02,
553 _10hz = 0x03,
555 _25hz = 0x04,
557 _50hz = 0x05,
559 _75hz = 0x06,
561 _100hz = 0x07,
563 _200hz = 0x08,
565}
566
567#[repr(u8)]
569#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
570#[try_from(repr)]
571pub enum Avg {
572 #[default]
574 _4 = 0,
575 _8 = 1,
577 _16 = 2,
579 _32 = 3,
581 _64 = 4,
583 _128 = 5,
585 _256 = 6,
587 _512 = 7,
589}
590
591#[repr(u8)]
593#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
594#[try_from(repr)]
595pub enum LowPassFilter {
596 #[default]
598 Disable = 0,
599 OdrDiv4 = 1,
601 OdrDiv9 = 3,
603}
604
605#[repr(u8)]
607#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
608#[try_from(repr)]
609pub enum Operation {
610 #[default]
612 Bypass = 0,
613 Fifo = 1,
615 Stream = 2,
617 StreamToFifo = 7,
619 BypassToStream = 6,
621 BypassToFifo = 5,
623}
624
625#[repr(u8)]
627#[derive(Clone, Copy, PartialEq, TryFrom)]
628#[try_from(repr)]
629pub enum ApplyRef {
630 OutAndInterrupt = 0,
632 OnlyInterrupt = 1,
634 RstRefs = 2,
636}
637
638#[repr(u8)]
649#[derive(Clone, Copy, PartialEq, Default, TryFrom)]
650#[try_from(repr)]
651pub enum FifoEvent {
652 #[default]
653 Wtm = 0x0,
654 Full = 0x1,
655}
656
657#[derive(Default)]
658pub struct BusMode {
659 pub interface: Interface,
660 pub filter: Filter,
661 pub i3c_ibi_time: I3cIbiTime,
662}
663
664pub struct Stat {
665 pub sw_reset: u8,
666 pub boot: u8,
667 pub drdy_pres: u8,
668 pub drdy_temp: u8,
669 pub ovr_pres: u8,
670 pub ovr_temp: u8,
671 pub end_meas: u8,
672 pub ref_done: u8,
673}
674
675pub struct PinConf {
676 pub int_push_pull: u8,
677 pub int_pull_down: u8,
678 pub sdo_pull_up: u8,
679 pub sda_pull_up: u8,
680 pub cs_pull_up: u8,
681}
682
683pub struct AllSources {
684 pub drdy_pres: u8,
685 pub drdy_temp: u8,
686 pub over_pres: u8,
687 pub under_pres: u8,
688 pub thrsld_pres: u8,
689 pub fifo_full: u8,
690 pub fifo_ovr: u8,
691 pub fifo_th: u8,
692}
693
694#[derive(Default)]
695pub struct Md {
696 pub odr: Odr,
697 pub avg: Avg,
698 pub lpf: LowPassFilter,
699}
700
701#[derive(Copy, Clone)]
702pub struct FifoData {
703 pub hpa: f32,
704 pub raw: i32,
705}
706
707pub struct IntMode {
708 pub int_latched: u8,
709 pub active_low: u8,
710 pub drdy_latched: u8,
711}
712
713#[derive(Default)]
714pub struct PinIntRoute {
715 pub drdy_pres: u8,
716 pub fifo_th: u8,
717 pub fifo_ovr: u8,
718 pub fifo_full: u8,
719}
720
721pub struct IntThMd {
722 pub threshold: u16,
723 pub over_th: u8,
724 pub under_th: u8,
725}
726
727pub struct RefMd {
728 pub apply_ref: ApplyRef,
729 pub get_ref: u8,
730}
731
732#[derive(Copy, Clone)]
733pub struct Pressure {
734 pub hpa: f32,
735 pub raw: i32, }
737#[derive(Copy, Clone)]
738pub struct Heat {
739 pub deg_c: f32,
740 pub raw: i16,
741}
742#[derive(Copy, Clone)]
743pub struct Data {
744 pub pressure: Pressure,
745 pub heat: Heat,
746}