aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlf Lilleengen <[email protected]>2025-08-25 20:36:35 +0200
committerUlf Lilleengen <[email protected]>2025-08-25 20:36:35 +0200
commitc40c20563664a62607f754fc734c7473d28ee955 (patch)
tree43cf61325000967269dbaa619da2d581655df0d9
parentc1116d68c9b4e62c3636f83bcfa8478535fc9df6 (diff)
fix: stm32 wb sai
-rw-r--r--embassy-stm32/src/sai/mod.rs50
1 files changed, 22 insertions, 28 deletions
diff --git a/embassy-stm32/src/sai/mod.rs b/embassy-stm32/src/sai/mod.rs
index 0c9c27797..524e01be7 100644
--- a/embassy-stm32/src/sai/mod.rs
+++ b/embassy-stm32/src/sai/mod.rs
@@ -48,7 +48,7 @@ pub enum Mode {
48} 48}
49 49
50impl Mode { 50impl Mode {
51 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 51 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
52 const fn mode(&self, tx_rx: TxRx) -> vals::Mode { 52 const fn mode(&self, tx_rx: TxRx) -> vals::Mode {
53 match tx_rx { 53 match tx_rx {
54 TxRx::Transmitter => match self { 54 TxRx::Transmitter => match self {
@@ -83,7 +83,7 @@ pub enum SlotSize {
83} 83}
84 84
85impl SlotSize { 85impl SlotSize {
86 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 86 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
87 const fn slotsz(&self) -> vals::Slotsz { 87 const fn slotsz(&self) -> vals::Slotsz {
88 match self { 88 match self {
89 SlotSize::DataSize => vals::Slotsz::DATA_SIZE, 89 SlotSize::DataSize => vals::Slotsz::DATA_SIZE,
@@ -106,7 +106,7 @@ pub enum DataSize {
106} 106}
107 107
108impl DataSize { 108impl DataSize {
109 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 109 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
110 const fn ds(&self) -> vals::Ds { 110 const fn ds(&self) -> vals::Ds {
111 match self { 111 match self {
112 DataSize::Data8 => vals::Ds::BIT8, 112 DataSize::Data8 => vals::Ds::BIT8,
@@ -131,7 +131,7 @@ pub enum FifoThreshold {
131} 131}
132 132
133impl FifoThreshold { 133impl FifoThreshold {
134 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 134 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
135 const fn fth(&self) -> vals::Fth { 135 const fn fth(&self) -> vals::Fth {
136 match self { 136 match self {
137 FifoThreshold::Empty => vals::Fth::EMPTY, 137 FifoThreshold::Empty => vals::Fth::EMPTY,
@@ -152,7 +152,7 @@ pub enum MuteValue {
152} 152}
153 153
154impl MuteValue { 154impl MuteValue {
155 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 155 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
156 const fn muteval(&self) -> vals::Muteval { 156 const fn muteval(&self) -> vals::Muteval {
157 match self { 157 match self {
158 MuteValue::Zero => vals::Muteval::SEND_ZERO, 158 MuteValue::Zero => vals::Muteval::SEND_ZERO,
@@ -171,7 +171,7 @@ pub enum Protocol {
171} 171}
172 172
173impl Protocol { 173impl Protocol {
174 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 174 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
175 const fn prtcfg(&self) -> vals::Prtcfg { 175 const fn prtcfg(&self) -> vals::Prtcfg {
176 match self { 176 match self {
177 Protocol::Free => vals::Prtcfg::FREE, 177 Protocol::Free => vals::Prtcfg::FREE,
@@ -229,7 +229,7 @@ pub enum StereoMono {
229} 229}
230 230
231impl StereoMono { 231impl StereoMono {
232 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 232 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
233 const fn mono(&self) -> vals::Mono { 233 const fn mono(&self) -> vals::Mono {
234 match self { 234 match self {
235 StereoMono::Stereo => vals::Mono::STEREO, 235 StereoMono::Stereo => vals::Mono::STEREO,
@@ -248,7 +248,7 @@ pub enum BitOrder {
248} 248}
249 249
250impl BitOrder { 250impl BitOrder {
251 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 251 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
252 const fn lsbfirst(&self) -> vals::Lsbfirst { 252 const fn lsbfirst(&self) -> vals::Lsbfirst {
253 match self { 253 match self {
254 BitOrder::LsbFirst => vals::Lsbfirst::LSB_FIRST, 254 BitOrder::LsbFirst => vals::Lsbfirst::LSB_FIRST,
@@ -267,7 +267,7 @@ pub enum FrameSyncOffset {
267} 267}
268 268
269impl FrameSyncOffset { 269impl FrameSyncOffset {
270 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 270 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
271 const fn fsoff(&self) -> vals::Fsoff { 271 const fn fsoff(&self) -> vals::Fsoff {
272 match self { 272 match self {
273 FrameSyncOffset::OnFirstBit => vals::Fsoff::ON_FIRST, 273 FrameSyncOffset::OnFirstBit => vals::Fsoff::ON_FIRST,
@@ -286,7 +286,7 @@ pub enum FrameSyncPolarity {
286} 286}
287 287
288impl FrameSyncPolarity { 288impl FrameSyncPolarity {
289 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 289 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
290 const fn fspol(&self) -> vals::Fspol { 290 const fn fspol(&self) -> vals::Fspol {
291 match self { 291 match self {
292 FrameSyncPolarity::ActiveLow => vals::Fspol::FALLING_EDGE, 292 FrameSyncPolarity::ActiveLow => vals::Fspol::FALLING_EDGE,
@@ -304,7 +304,7 @@ pub enum FrameSyncDefinition {
304} 304}
305 305
306impl FrameSyncDefinition { 306impl FrameSyncDefinition {
307 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 307 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
308 const fn fsdef(&self) -> bool { 308 const fn fsdef(&self) -> bool {
309 match self { 309 match self {
310 FrameSyncDefinition::StartOfFrame => false, 310 FrameSyncDefinition::StartOfFrame => false,
@@ -322,7 +322,7 @@ pub enum ClockStrobe {
322} 322}
323 323
324impl ClockStrobe { 324impl ClockStrobe {
325 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 325 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
326 const fn ckstr(&self) -> vals::Ckstr { 326 const fn ckstr(&self) -> vals::Ckstr {
327 match self { 327 match self {
328 ClockStrobe::Falling => vals::Ckstr::FALLING_EDGE, 328 ClockStrobe::Falling => vals::Ckstr::FALLING_EDGE,
@@ -340,7 +340,7 @@ pub enum ComplementFormat {
340} 340}
341 341
342impl ComplementFormat { 342impl ComplementFormat {
343 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 343 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
344 const fn cpl(&self) -> vals::Cpl { 344 const fn cpl(&self) -> vals::Cpl {
345 match self { 345 match self {
346 ComplementFormat::OnesComplement => vals::Cpl::ONES_COMPLEMENT, 346 ComplementFormat::OnesComplement => vals::Cpl::ONES_COMPLEMENT,
@@ -359,7 +359,7 @@ pub enum Companding {
359} 359}
360 360
361impl Companding { 361impl Companding {
362 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 362 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
363 const fn comp(&self) -> vals::Comp { 363 const fn comp(&self) -> vals::Comp {
364 match self { 364 match self {
365 Companding::None => vals::Comp::NO_COMPANDING, 365 Companding::None => vals::Comp::NO_COMPANDING,
@@ -378,7 +378,7 @@ pub enum OutputDrive {
378} 378}
379 379
380impl OutputDrive { 380impl OutputDrive {
381 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 381 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
382 const fn outdriv(&self) -> vals::Outdriv { 382 const fn outdriv(&self) -> vals::Outdriv {
383 match self { 383 match self {
384 OutputDrive::OnStart => vals::Outdriv::ON_START, 384 OutputDrive::OnStart => vals::Outdriv::ON_START,
@@ -390,7 +390,7 @@ impl OutputDrive {
390/// Master clock divider. 390/// Master clock divider.
391#[derive(Copy, Clone, PartialEq)] 391#[derive(Copy, Clone, PartialEq)]
392#[allow(missing_docs)] 392#[allow(missing_docs)]
393#[cfg(any(sai_v1, sai_v2))] 393#[cfg(any(sai_v1, sai_v1_4pdm, sai_v2))]
394pub enum MasterClockDivider { 394pub enum MasterClockDivider {
395 MasterClockDisabled, 395 MasterClockDisabled,
396 Div1, 396 Div1,
@@ -483,7 +483,7 @@ pub enum MasterClockDivider {
483} 483}
484 484
485impl MasterClockDivider { 485impl MasterClockDivider {
486 #[cfg(any(sai_v1, sai_v2))] 486 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2))]
487 const fn mckdiv(&self) -> u8 { 487 const fn mckdiv(&self) -> u8 {
488 match self { 488 match self {
489 MasterClockDivider::MasterClockDisabled => 0, 489 MasterClockDivider::MasterClockDisabled => 0,
@@ -704,7 +704,7 @@ fn update_synchronous_config(config: &mut Config) {
704 config.mode = Mode::Slave; 704 config.mode = Mode::Slave;
705 config.sync_output = false; 705 config.sync_output = false;
706 706
707 #[cfg(any(sai_v1, sai_v2))] 707 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2))]
708 { 708 {
709 config.sync_input = SyncInput::Internal; 709 config.sync_input = SyncInput::Internal;
710 } 710 }
@@ -858,7 +858,7 @@ impl<'d, T: Instance, W: word::Word> Sai<'d, T, W> {
858 ) -> Self { 858 ) -> Self {
859 let ch = T::REGS.ch(sub_block as usize); 859 let ch = T::REGS.ch(sub_block as usize);
860 860
861 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 861 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
862 { 862 {
863 ch.cr1().modify(|w| w.set_saien(false)); 863 ch.cr1().modify(|w| w.set_saien(false));
864 } 864 }
@@ -884,7 +884,7 @@ impl<'d, T: Instance, W: word::Word> Sai<'d, T, W> {
884 } 884 }
885 } 885 }
886 886
887 #[cfg(any(sai_v1, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))] 887 #[cfg(any(sai_v1, sai_v1_4pdm, sai_v2, sai_v3_2pdm, sai_v3_4pdm, sai_v4_2pdm, sai_v4_4pdm))]
888 { 888 {
889 ch.cr1().modify(|w| { 889 ch.cr1().modify(|w| {
890 w.set_mode(config.mode.mode(if Self::is_transmitter(&ring_buffer) { 890 w.set_mode(config.mode.mode(if Self::is_transmitter(&ring_buffer) {
@@ -899,14 +899,8 @@ impl<'d, T: Instance, W: word::Word> Sai<'d, T, W> {
899 w.set_syncen(config.sync_input.syncen()); 899 w.set_syncen(config.sync_input.syncen());
900 w.set_mono(config.stereo_mono.mono()); 900 w.set_mono(config.stereo_mono.mono());
901 w.set_outdriv(config.output_drive.outdriv()); 901 w.set_outdriv(config.output_drive.outdriv());
902 w.set_mckdiv(config.master_clock_divider.mckdiv()); 902 w.set_mckdiv(config.master_clock_divider.mckdiv().into());
903 w.set_nodiv( 903 w.set_nodiv(config.master_clock_divider == MasterClockDivider::MasterClockDisabled);
904 if config.master_clock_divider == MasterClockDivider::MasterClockDisabled {
905 vals::Nodiv::NO_DIV
906 } else {
907 vals::Nodiv::MASTER_CLOCK
908 },
909 );
910 w.set_dmaen(true); 904 w.set_dmaen(true);
911 }); 905 });
912 906