diff options
| author | Dario Nieuwenhuis <[email protected]> | 2025-09-05 23:00:31 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2025-09-05 23:00:31 +0200 |
| commit | 7419b398bf7cc5c1ff164c504f4a4027cd6bcd3b (patch) | |
| tree | 9ea26e1059b70502d0e5929a72a9f50c8c43838b /embassy-stm32/src/timer/mod.rs | |
| parent | a6562c4f033432e40970aafe82f33c5138adf84e (diff) | |
stm32/afio: use type inference for timer remaps as well.
Diffstat (limited to 'embassy-stm32/src/timer/mod.rs')
| -rw-r--r-- | embassy-stm32/src/timer/mod.rs | 43 |
1 files changed, 7 insertions, 36 deletions
diff --git a/embassy-stm32/src/timer/mod.rs b/embassy-stm32/src/timer/mod.rs index 38f4a1a51..b09bc7166 100644 --- a/embassy-stm32/src/timer/mod.rs +++ b/embassy-stm32/src/timer/mod.rs | |||
| @@ -14,8 +14,6 @@ pub mod pwm_input; | |||
| 14 | pub mod qei; | 14 | pub mod qei; |
| 15 | pub mod simple_pwm; | 15 | pub mod simple_pwm; |
| 16 | 16 | ||
| 17 | #[cfg(afio)] | ||
| 18 | use crate::gpio::SealedPin; | ||
| 19 | use crate::interrupt; | 17 | use crate::interrupt; |
| 20 | use crate::rcc::RccPeripheral; | 18 | use crate::rcc::RccPeripheral; |
| 21 | 19 | ||
| @@ -157,15 +155,9 @@ trait SealedInstance: RccPeripheral + PeripheralType { | |||
| 157 | fn state() -> &'static State; | 155 | fn state() -> &'static State; |
| 158 | } | 156 | } |
| 159 | 157 | ||
| 160 | #[allow(unused)] | ||
| 161 | pub(crate) trait Afio { | ||
| 162 | fn afio_mappings() -> &'static [AfioMapping]; | ||
| 163 | fn set_afio(value: u8); | ||
| 164 | } | ||
| 165 | |||
| 166 | /// Core timer instance. | 158 | /// Core timer instance. |
| 167 | #[allow(private_bounds)] | 159 | #[allow(private_bounds)] |
| 168 | pub trait CoreInstance: SealedInstance + Afio + 'static { | 160 | pub trait CoreInstance: SealedInstance + 'static { |
| 169 | /// Update Interrupt for this timer. | 161 | /// Update Interrupt for this timer. |
| 170 | type UpdateInterrupt: interrupt::typelevel::Interrupt; | 162 | type UpdateInterrupt: interrupt::typelevel::Interrupt; |
| 171 | 163 | ||
| @@ -231,15 +223,15 @@ pub trait AdvancedInstance2Channel: BasicInstance + GeneralInstance2Channel + Ad | |||
| 231 | /// Advanced 16-bit timer with 4 channels instance. | 223 | /// Advanced 16-bit timer with 4 channels instance. |
| 232 | pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel {} | 224 | pub trait AdvancedInstance4Channel: AdvancedInstance2Channel + GeneralInstance4Channel {} |
| 233 | 225 | ||
| 234 | pin_trait!(TimerPin, GeneralInstance4Channel, TimerChannel); | 226 | pin_trait!(TimerPin, GeneralInstance4Channel, TimerChannel, @A); |
| 235 | pin_trait!(ExternalTriggerPin, GeneralInstance4Channel); | 227 | pin_trait!(ExternalTriggerPin, GeneralInstance4Channel, @A); |
| 236 | 228 | ||
| 237 | pin_trait!(TimerComplementaryPin, AdvancedInstance4Channel, TimerChannel); | 229 | pin_trait!(TimerComplementaryPin, AdvancedInstance4Channel, TimerChannel, @A); |
| 238 | 230 | ||
| 239 | pin_trait!(BreakInputPin, AdvancedInstance4Channel, BreakInput); | 231 | pin_trait!(BreakInputPin, AdvancedInstance4Channel, BreakInput, @A); |
| 240 | 232 | ||
| 241 | pin_trait!(BreakInputComparator1Pin, AdvancedInstance4Channel, BreakInput); | 233 | pin_trait!(BreakInputComparator1Pin, AdvancedInstance4Channel, BreakInput, @A); |
| 242 | pin_trait!(BreakInputComparator2Pin, AdvancedInstance4Channel, BreakInput); | 234 | pin_trait!(BreakInputComparator2Pin, AdvancedInstance4Channel, BreakInput, @A); |
| 243 | 235 | ||
| 244 | // Update Event trigger DMA for every timer | 236 | // Update Event trigger DMA for every timer |
| 245 | dma_trait!(UpDma, BasicInstance); | 237 | dma_trait!(UpDma, BasicInstance); |
| @@ -458,24 +450,3 @@ impl<T: GeneralInstance1Channel> interrupt::typelevel::Handler<T::CaptureCompare | |||
| 458 | } | 450 | } |
| 459 | } | 451 | } |
| 460 | } | 452 | } |
| 461 | |||
| 462 | #[allow(unused)] | ||
| 463 | pub(crate) struct AfioMapping { | ||
| 464 | pub(crate) value: u8, | ||
| 465 | pub(crate) pins: &'static [u8], | ||
| 466 | } | ||
| 467 | |||
| 468 | #[cfg(afio)] | ||
| 469 | fn set_afio<'d, T: Afio>(pins: &[Option<embassy_hal_internal::Peri<'d, crate::gpio::AnyPin>>]) { | ||
| 470 | let mapping = T::afio_mappings() | ||
| 471 | .iter() | ||
| 472 | .find(|m| { | ||
| 473 | pins.iter() | ||
| 474 | .flatten() | ||
| 475 | .map(|p| (*p).pin_port()) | ||
| 476 | .all(|p| m.pins.contains(&p)) | ||
| 477 | }) | ||
| 478 | .expect("Should be called with a combination of timer pins supported by the hardware"); | ||
| 479 | |||
| 480 | T::set_afio(mapping.value); | ||
| 481 | } | ||
