diff options
| author | Dario Nieuwenhuis <[email protected]> | 2022-02-24 02:36:30 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2022-02-24 02:49:20 +0100 |
| commit | bf80504ac76161a25acef6d1f3ace1009c26cf04 (patch) | |
| tree | 544744c982b4b1c36d67e9dc8d36cb460210f4e1 | |
| parent | 29aa51a1ad299943cc31515a16317852151ed112 (diff) | |
stm32: centralize gpio reg access in the gpio module.
| -rw-r--r-- | embassy-stm32/src/eth/v1c/mod.rs | 17 | ||||
| -rw-r--r-- | embassy-stm32/src/eth/v2/mod.rs | 13 | ||||
| -rw-r--r-- | embassy-stm32/src/fmc/mod.rs | 8 | ||||
| -rw-r--r-- | embassy-stm32/src/gpio.rs | 102 | ||||
| -rw-r--r-- | embassy-stm32/src/i2c/v1.rs | 11 | ||||
| -rw-r--r-- | embassy-stm32/src/i2c/v2.rs | 17 | ||||
| -rw-r--r-- | embassy-stm32/src/sdmmc/v2.rs | 231 | ||||
| -rw-r--r-- | embassy-stm32/src/spi/mod.rs | 6 | ||||
| m--------- | stm32-data | 0 |
9 files changed, 116 insertions, 289 deletions
diff --git a/embassy-stm32/src/eth/v1c/mod.rs b/embassy-stm32/src/eth/v1c/mod.rs index 1927a9a26..044e2cc9c 100644 --- a/embassy-stm32/src/eth/v1c/mod.rs +++ b/embassy-stm32/src/eth/v1c/mod.rs | |||
| @@ -11,9 +11,7 @@ use embassy_hal_common::unborrow; | |||
| 11 | use embassy_net::{Device, DeviceCapabilities, LinkState, PacketBuf, MTU}; | 11 | use embassy_net::{Device, DeviceCapabilities, LinkState, PacketBuf, MTU}; |
| 12 | 12 | ||
| 13 | use crate::gpio::sealed::Pin as __GpioPin; | 13 | use crate::gpio::sealed::Pin as __GpioPin; |
| 14 | use crate::gpio::Pin as GpioPin; | ||
| 15 | use crate::gpio::{sealed::AFType, AnyPin, Speed}; | 14 | use crate::gpio::{sealed::AFType, AnyPin, Speed}; |
| 16 | use crate::pac::gpio::vals::Ospeedr; | ||
| 17 | use crate::pac::{ETH, RCC, SYSCFG}; | 15 | use crate::pac::{ETH, RCC, SYSCFG}; |
| 18 | 16 | ||
| 19 | mod descriptors; | 17 | mod descriptors; |
| @@ -308,15 +306,12 @@ impl<'d, T: Instance, P: PHY, const TX: usize, const RX: usize> Drop | |||
| 308 | dma.dmaomr().modify(|w| w.set_sr(DmaomrSr::STOPPED)); | 306 | dma.dmaomr().modify(|w| w.set_sr(DmaomrSr::STOPPED)); |
| 309 | } | 307 | } |
| 310 | 308 | ||
| 311 | for pin in self.pins.iter_mut() { | 309 | // NOTE(unsafe) Exclusive access to the regs |
| 312 | // NOTE(unsafe) Exclusive access to the regs | 310 | critical_section::with(|_| unsafe { |
| 313 | critical_section::with(|_| unsafe { | 311 | for pin in self.pins.iter_mut() { |
| 314 | pin.set_as_analog(); | 312 | pin.set_as_disconnected(); |
| 315 | pin.block() | 313 | } |
| 316 | .ospeedr() | 314 | }) |
| 317 | .modify(|w| w.set_ospeedr(pin.pin() as usize, Ospeedr::LOWSPEED)); | ||
| 318 | }) | ||
| 319 | } | ||
| 320 | } | 315 | } |
| 321 | } | 316 | } |
| 322 | 317 | ||
diff --git a/embassy-stm32/src/eth/v2/mod.rs b/embassy-stm32/src/eth/v2/mod.rs index ad81b1d51..34b0bc093 100644 --- a/embassy-stm32/src/eth/v2/mod.rs +++ b/embassy-stm32/src/eth/v2/mod.rs | |||
| @@ -304,13 +304,12 @@ impl<'d, T: Instance, P: PHY, const TX: usize, const RX: usize> Drop | |||
| 304 | dma.dmacrx_cr().modify(|w| w.set_sr(false)); | 304 | dma.dmacrx_cr().modify(|w| w.set_sr(false)); |
| 305 | } | 305 | } |
| 306 | 306 | ||
| 307 | for pin in self.pins.iter_mut() { | 307 | // NOTE(unsafe) Exclusive access to the regs |
| 308 | // NOTE(unsafe) Exclusive access to the regs | 308 | critical_section::with(|_| unsafe { |
| 309 | critical_section::with(|_| unsafe { | 309 | for pin in self.pins.iter_mut() { |
| 310 | pin.set_as_analog(); | 310 | pin.set_as_disconnected(); |
| 311 | pin.set_speed(Speed::Low); | 311 | } |
| 312 | }) | 312 | }) |
| 313 | } | ||
| 314 | } | 313 | } |
| 315 | } | 314 | } |
| 316 | 315 | ||
diff --git a/embassy-stm32/src/fmc/mod.rs b/embassy-stm32/src/fmc/mod.rs index 796964213..a17b88ea9 100644 --- a/embassy-stm32/src/fmc/mod.rs +++ b/embassy-stm32/src/fmc/mod.rs | |||
| @@ -2,9 +2,8 @@ use core::marker::PhantomData; | |||
| 2 | use embassy::util::Unborrow; | 2 | use embassy::util::Unborrow; |
| 3 | use embassy_hal_common::unborrow; | 3 | use embassy_hal_common::unborrow; |
| 4 | 4 | ||
| 5 | use crate::gpio::sealed::AFType::OutputPushPull; | 5 | use crate::gpio::sealed::AFType; |
| 6 | use crate::gpio::Speed; | 6 | use crate::gpio::{Pull, Speed}; |
| 7 | use crate::pac::gpio::vals::Pupdr; | ||
| 8 | 7 | ||
| 9 | mod pins; | 8 | mod pins; |
| 10 | pub use pins::*; | 9 | pub use pins::*; |
| @@ -41,9 +40,8 @@ macro_rules! config_pins { | |||
| 41 | ($($pin:ident),*) => { | 40 | ($($pin:ident),*) => { |
| 42 | unborrow!($($pin),*); | 41 | unborrow!($($pin),*); |
| 43 | $( | 42 | $( |
| 44 | $pin.set_as_af($pin.af_num(), OutputPushPull); | 43 | $pin.set_as_af_pull($pin.af_num(), AFType::OutputPushPull, Pull::Up); |
| 45 | $pin.set_speed(Speed::VeryHigh); | 44 | $pin.set_speed(Speed::VeryHigh); |
| 46 | $pin.block().pupdr().modify(|w| w.set_pupdr($pin.pin() as usize, Pupdr::PULLUP)); | ||
| 47 | )* | 45 | )* |
| 48 | }; | 46 | }; |
| 49 | } | 47 | } |
diff --git a/embassy-stm32/src/gpio.rs b/embassy-stm32/src/gpio.rs index 3e12ea5cb..aef8ee552 100644 --- a/embassy-stm32/src/gpio.rs +++ b/embassy-stm32/src/gpio.rs | |||
| @@ -48,9 +48,9 @@ impl From<Speed> for vals::Mode { | |||
| 48 | use Speed::*; | 48 | use Speed::*; |
| 49 | 49 | ||
| 50 | match speed { | 50 | match speed { |
| 51 | Low => vals::Mode::OUTPUT2, | 51 | Low => vals::Mode::OUTPUT2MHZ, |
| 52 | Medium => vals::Mode::OUTPUT, | 52 | Medium => vals::Mode::OUTPUT10MHZ, |
| 53 | VeryHigh => vals::Mode::OUTPUT50, | 53 | VeryHigh => vals::Mode::OUTPUT50MHZ, |
| 54 | } | 54 | } |
| 55 | } | 55 | } |
| 56 | } | 56 | } |
| @@ -85,20 +85,23 @@ impl<'d, T: Pin> Input<'d, T> { | |||
| 85 | let n = pin.pin() as usize; | 85 | let n = pin.pin() as usize; |
| 86 | #[cfg(gpio_v1)] | 86 | #[cfg(gpio_v1)] |
| 87 | { | 87 | { |
| 88 | let cnf = match pull { | ||
| 89 | Pull::Up => { | ||
| 90 | r.bsrr().write(|w| w.set_bs(n, true)); | ||
| 91 | vals::CnfIn::PULL | ||
| 92 | } | ||
| 93 | Pull::Down => { | ||
| 94 | r.bsrr().write(|w| w.set_br(n, true)); | ||
| 95 | vals::CnfIn::PULL | ||
| 96 | } | ||
| 97 | Pull::None => vals::CnfIn::FLOATING, | ||
| 98 | }; | ||
| 99 | |||
| 88 | let crlh = if n < 8 { 0 } else { 1 }; | 100 | let crlh = if n < 8 { 0 } else { 1 }; |
| 89 | match pull { | 101 | r.cr(crlh).modify(|w| { |
| 90 | Pull::Up => r.bsrr().write(|w| w.set_bs(n, true)), | 102 | w.set_mode(n % 8, vals::Mode::INPUT); |
| 91 | Pull::Down => r.bsrr().write(|w| w.set_br(n, true)), | 103 | w.set_cnf_in(n % 8, cnf); |
| 92 | Pull::None => {} | 104 | }); |
| 93 | } | ||
| 94 | if pull == Pull::None { | ||
| 95 | r.cr(crlh) | ||
| 96 | .modify(|w| w.set_cnf(n % 8, vals::Cnf::OPENDRAIN)); | ||
| 97 | } else { | ||
| 98 | r.cr(crlh) | ||
| 99 | .modify(|w| w.set_cnf(n % 8, vals::Cnf::ALTPUSHPULL)); | ||
| 100 | } | ||
| 101 | r.cr(crlh).modify(|w| w.set_mode(n % 8, vals::Mode::INPUT)); | ||
| 102 | } | 105 | } |
| 103 | #[cfg(gpio_v2)] | 106 | #[cfg(gpio_v2)] |
| 104 | { | 107 | { |
| @@ -133,7 +136,7 @@ impl<'d, T: Pin> Drop for Input<'d, T> { | |||
| 133 | { | 136 | { |
| 134 | let crlh = if n < 8 { 0 } else { 1 }; | 137 | let crlh = if n < 8 { 0 } else { 1 }; |
| 135 | r.cr(crlh) | 138 | r.cr(crlh) |
| 136 | .modify(|w| w.set_cnf(n % 8, vals::Cnf::OPENDRAIN)); | 139 | .modify(|w| w.set_cnf_in(n % 8, vals::CnfIn::FLOATING)); |
| 137 | } | 140 | } |
| 138 | #[cfg(gpio_v2)] | 141 | #[cfg(gpio_v2)] |
| 139 | r.pupdr().modify(|w| w.set_pupdr(n, vals::Pupdr::FLOATING)); | 142 | r.pupdr().modify(|w| w.set_pupdr(n, vals::Pupdr::FLOATING)); |
| @@ -170,8 +173,10 @@ impl<'d, T: Pin> Output<'d, T> { | |||
| 170 | #[cfg(gpio_v1)] | 173 | #[cfg(gpio_v1)] |
| 171 | { | 174 | { |
| 172 | let crlh = if n < 8 { 0 } else { 1 }; | 175 | let crlh = if n < 8 { 0 } else { 1 }; |
| 173 | r.cr(crlh).modify(|w| w.set_cnf(n % 8, vals::Cnf::PUSHPULL)); | 176 | r.cr(crlh).modify(|w| { |
| 174 | r.cr(crlh).modify(|w| w.set_mode(n % 8, speed.into())); | 177 | w.set_mode(n % 8, speed.into()); |
| 178 | w.set_cnf_out(n % 8, vals::CnfOut::PUSHPULL); | ||
| 179 | }); | ||
| 175 | } | 180 | } |
| 176 | #[cfg(gpio_v2)] | 181 | #[cfg(gpio_v2)] |
| 177 | { | 182 | { |
| @@ -227,9 +232,10 @@ impl<'d, T: Pin> Drop for Output<'d, T> { | |||
| 227 | #[cfg(gpio_v1)] | 232 | #[cfg(gpio_v1)] |
| 228 | { | 233 | { |
| 229 | let crlh = if n < 8 { 0 } else { 1 }; | 234 | let crlh = if n < 8 { 0 } else { 1 }; |
| 230 | r.cr(crlh) | 235 | r.cr(crlh).modify(|w| { |
| 231 | .modify(|w| w.set_cnf(n % 8, vals::Cnf::OPENDRAIN)); | 236 | w.set_mode(n % 8, vals::Mode::INPUT); |
| 232 | r.cr(crlh).modify(|w| w.set_mode(n % 8, vals::Mode::INPUT)); | 237 | w.set_cnf_in(n % 8, vals::CnfIn::FLOATING); |
| 238 | }); | ||
| 233 | } | 239 | } |
| 234 | #[cfg(gpio_v2)] | 240 | #[cfg(gpio_v2)] |
| 235 | { | 241 | { |
| @@ -273,7 +279,7 @@ impl<'d, T: Pin> OutputOpenDrain<'d, T> { | |||
| 273 | } | 279 | } |
| 274 | r.cr(crlh).modify(|w| w.set_mode(n % 8, speed.into())); | 280 | r.cr(crlh).modify(|w| w.set_mode(n % 8, speed.into())); |
| 275 | r.cr(crlh) | 281 | r.cr(crlh) |
| 276 | .modify(|w| w.set_cnf(n % 8, vals::Cnf::OPENDRAIN)); | 282 | .modify(|w| w.set_cnf_out(n % 8, vals::CnfOut::OPENDRAIN)); |
| 277 | } | 283 | } |
| 278 | #[cfg(gpio_v2)] | 284 | #[cfg(gpio_v2)] |
| 279 | { | 285 | { |
| @@ -338,9 +344,10 @@ impl<'d, T: Pin> Drop for OutputOpenDrain<'d, T> { | |||
| 338 | #[cfg(gpio_v1)] | 344 | #[cfg(gpio_v1)] |
| 339 | { | 345 | { |
| 340 | let crlh = if n < 8 { 0 } else { 1 }; | 346 | let crlh = if n < 8 { 0 } else { 1 }; |
| 341 | r.cr(crlh) | 347 | r.cr(crlh).modify(|w| { |
| 342 | .modify(|w| w.set_cnf(n % 8, vals::Cnf::OPENDRAIN)); | 348 | w.set_mode(n % 8, vals::Mode::INPUT); |
| 343 | r.cr(crlh).modify(|w| w.set_mode(n % 8, vals::Mode::INPUT)); | 349 | w.set_cnf_in(n % 8, vals::CnfIn::FLOATING); |
| 350 | }); | ||
| 344 | } | 351 | } |
| 345 | #[cfg(gpio_v2)] | 352 | #[cfg(gpio_v2)] |
| 346 | { | 353 | { |
| @@ -410,30 +417,34 @@ pub(crate) mod sealed { | |||
| 410 | AFType::Input => { | 417 | AFType::Input => { |
| 411 | r.cr(crlh).modify(|w| { | 418 | r.cr(crlh).modify(|w| { |
| 412 | w.set_mode(n % 8, vals::Mode::INPUT); | 419 | w.set_mode(n % 8, vals::Mode::INPUT); |
| 413 | w.set_cnf(n % 8, vals::Cnf::OPENDRAIN); | 420 | w.set_cnf_in(n % 8, vals::CnfIn::FLOATING); |
| 414 | }); | 421 | }); |
| 415 | } | 422 | } |
| 416 | AFType::OutputPushPull => { | 423 | AFType::OutputPushPull => { |
| 417 | r.cr(crlh).modify(|w| { | 424 | r.cr(crlh).modify(|w| { |
| 418 | w.set_mode(n % 8, vals::Mode::OUTPUT50); | 425 | w.set_mode(n % 8, vals::Mode::OUTPUT50MHZ); |
| 419 | w.set_cnf(n % 8, vals::Cnf::ALTPUSHPULL); | 426 | w.set_cnf_out(n % 8, vals::CnfOut::ALTPUSHPULL); |
| 420 | }); | 427 | }); |
| 421 | } | 428 | } |
| 422 | AFType::OutputOpenDrain => { | 429 | AFType::OutputOpenDrain => { |
| 423 | r.cr(crlh).modify(|w| { | 430 | r.cr(crlh).modify(|w| { |
| 424 | w.set_mode(n % 8, vals::Mode::OUTPUT50); | 431 | w.set_mode(n % 8, vals::Mode::OUTPUT50MHZ); |
| 425 | w.set_cnf(n % 8, vals::Cnf::ALTOPENDRAIN); | 432 | w.set_cnf_out(n % 8, vals::CnfOut::ALTOPENDRAIN); |
| 426 | }); | 433 | }); |
| 427 | } | 434 | } |
| 428 | } | 435 | } |
| 429 | } | 436 | } |
| 437 | |||
| 430 | #[cfg(gpio_v2)] | 438 | #[cfg(gpio_v2)] |
| 431 | unsafe fn set_as_af(&self, af_num: u8, af_type: AFType) { | 439 | unsafe fn set_as_af(&self, af_num: u8, af_type: AFType) { |
| 440 | self.set_as_af_pull(af_num, af_type, Pull::None); | ||
| 441 | } | ||
| 442 | |||
| 443 | #[cfg(gpio_v2)] | ||
| 444 | unsafe fn set_as_af_pull(&self, af_num: u8, af_type: AFType, pull: Pull) { | ||
| 432 | let pin = self._pin() as usize; | 445 | let pin = self._pin() as usize; |
| 433 | let block = self.block(); | 446 | let block = self.block(); |
| 434 | block | 447 | block.afr(pin / 8).modify(|w| w.set_afr(pin % 8, af_num)); |
| 435 | .afr(pin / 8) | ||
| 436 | .modify(|w| w.set_afr(pin % 8, vals::Afr(af_num))); | ||
| 437 | match af_type { | 448 | match af_type { |
| 438 | AFType::Input => {} | 449 | AFType::Input => {} |
| 439 | AFType::OutputPushPull => { | 450 | AFType::OutputPushPull => { |
| @@ -443,9 +454,7 @@ pub(crate) mod sealed { | |||
| 443 | .otyper() | 454 | .otyper() |
| 444 | .modify(|w| w.set_ot(pin, vals::Ot::OPENDRAIN)), | 455 | .modify(|w| w.set_ot(pin, vals::Ot::OPENDRAIN)), |
| 445 | } | 456 | } |
| 446 | block | 457 | block.pupdr().modify(|w| w.set_pupdr(pin, pull.into())); |
| 447 | .pupdr() | ||
| 448 | .modify(|w| w.set_pupdr(pin, vals::Pupdr::FLOATING)); | ||
| 449 | 458 | ||
| 450 | block | 459 | block |
| 451 | .moder() | 460 | .moder() |
| @@ -458,12 +467,10 @@ pub(crate) mod sealed { | |||
| 458 | #[cfg(gpio_v1)] | 467 | #[cfg(gpio_v1)] |
| 459 | { | 468 | { |
| 460 | let crlh = if pin < 8 { 0 } else { 1 }; | 469 | let crlh = if pin < 8 { 0 } else { 1 }; |
| 461 | block | 470 | block.cr(crlh).modify(|w| { |
| 462 | .cr(crlh) | 471 | w.set_mode(pin % 8, vals::Mode::INPUT); |
| 463 | .modify(|w| w.set_cnf(pin % 8, vals::Cnf::PUSHPULL)); | 472 | w.set_cnf_in(pin % 8, vals::CnfIn::ANALOG); |
| 464 | block | 473 | }); |
| 465 | .cr(crlh) | ||
| 466 | .modify(|w| w.set_mode(pin % 8, vals::Mode::INPUT)); | ||
| 467 | } | 474 | } |
| 468 | #[cfg(gpio_v2)] | 475 | #[cfg(gpio_v2)] |
| 469 | block | 476 | block |
| @@ -471,6 +478,15 @@ pub(crate) mod sealed { | |||
| 471 | .modify(|w| w.set_moder(pin, vals::Moder::ANALOG)); | 478 | .modify(|w| w.set_moder(pin, vals::Moder::ANALOG)); |
| 472 | } | 479 | } |
| 473 | 480 | ||
| 481 | /// Set the pin as "disconnected", ie doing nothing and consuming the lowest | ||
| 482 | /// amount of power possible. | ||
| 483 | /// | ||
| 484 | /// This is currently the same as set_as_analog but is semantically different really. | ||
| 485 | /// Drivers should set_as_disconnected pins when dropped. | ||
| 486 | unsafe fn set_as_disconnected(&self) { | ||
| 487 | self.set_as_analog(); | ||
| 488 | } | ||
| 489 | |||
| 474 | #[cfg(gpio_v2)] | 490 | #[cfg(gpio_v2)] |
| 475 | unsafe fn set_speed(&self, speed: Speed) { | 491 | unsafe fn set_speed(&self, speed: Speed) { |
| 476 | let pin = self._pin() as usize; | 492 | let pin = self._pin() as usize; |
diff --git a/embassy-stm32/src/i2c/v1.rs b/embassy-stm32/src/i2c/v1.rs index 5a9e82828..2bd0dcdf7 100644 --- a/embassy-stm32/src/i2c/v1.rs +++ b/embassy-stm32/src/i2c/v1.rs | |||
| @@ -1,12 +1,11 @@ | |||
| 1 | use crate::i2c::{Error, Instance, SclPin, SdaPin}; | ||
| 2 | use crate::time::Hertz; | ||
| 3 | use core::marker::PhantomData; | 1 | use core::marker::PhantomData; |
| 4 | use embassy::util::Unborrow; | 2 | use embassy::util::Unborrow; |
| 5 | use embassy_hal_common::unborrow; | 3 | use embassy_hal_common::unborrow; |
| 6 | 4 | ||
| 5 | use crate::gpio::sealed::AFType; | ||
| 6 | use crate::i2c::{Error, Instance, SclPin, SdaPin}; | ||
| 7 | use crate::pac::i2c; | 7 | use crate::pac::i2c; |
| 8 | 8 | use crate::time::Hertz; | |
| 9 | use crate::gpio::sealed::AFType::OutputOpenDrain; | ||
| 10 | 9 | ||
| 11 | pub struct I2c<'d, T: Instance> { | 10 | pub struct I2c<'d, T: Instance> { |
| 12 | phantom: PhantomData<&'d mut T>, | 11 | phantom: PhantomData<&'d mut T>, |
| @@ -27,8 +26,8 @@ impl<'d, T: Instance> I2c<'d, T> { | |||
| 27 | T::enable(); | 26 | T::enable(); |
| 28 | 27 | ||
| 29 | unsafe { | 28 | unsafe { |
| 30 | scl.set_as_af(scl.af_num(), OutputOpenDrain); | 29 | scl.set_as_af(scl.af_num(), AFType::OutputOpenDrain); |
| 31 | sda.set_as_af(sda.af_num(), OutputOpenDrain); | 30 | sda.set_as_af(sda.af_num(), AFType::OutputOpenDrain); |
| 32 | } | 31 | } |
| 33 | 32 | ||
| 34 | unsafe { | 33 | unsafe { |
diff --git a/embassy-stm32/src/i2c/v2.rs b/embassy-stm32/src/i2c/v2.rs index 493aacb6d..a1ba5bc7d 100644 --- a/embassy-stm32/src/i2c/v2.rs +++ b/embassy-stm32/src/i2c/v2.rs | |||
| @@ -11,10 +11,9 @@ use embassy_hal_common::unborrow; | |||
| 11 | use futures::future::poll_fn; | 11 | use futures::future::poll_fn; |
| 12 | 12 | ||
| 13 | use crate::dma::NoDma; | 13 | use crate::dma::NoDma; |
| 14 | use crate::gpio::sealed::AFType; | ||
| 14 | use crate::i2c::{Error, Instance, SclPin, SdaPin}; | 15 | use crate::i2c::{Error, Instance, SclPin, SdaPin}; |
| 15 | use crate::pac; | 16 | use crate::pac; |
| 16 | use crate::pac::gpio::vals::{Afr, Moder, Ot}; | ||
| 17 | use crate::pac::gpio::Gpio; | ||
| 18 | use crate::pac::i2c; | 17 | use crate::pac::i2c; |
| 19 | use crate::time::Hertz; | 18 | use crate::time::Hertz; |
| 20 | 19 | ||
| @@ -64,8 +63,8 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> { | |||
| 64 | T::enable(); | 63 | T::enable(); |
| 65 | 64 | ||
| 66 | unsafe { | 65 | unsafe { |
| 67 | Self::configure_pin(scl.block(), scl.pin() as _, scl.af_num()); | 66 | scl.set_as_af(scl.af_num(), AFType::OutputOpenDrain); |
| 68 | Self::configure_pin(sda.block(), sda.pin() as _, sda.af_num()); | 67 | sda.set_as_af(sda.af_num(), AFType::OutputOpenDrain); |
| 69 | } | 68 | } |
| 70 | 69 | ||
| 71 | unsafe { | 70 | unsafe { |
| @@ -120,16 +119,6 @@ impl<'d, T: Instance, TXDMA, RXDMA> I2c<'d, T, TXDMA, RXDMA> { | |||
| 120 | }); | 119 | }); |
| 121 | } | 120 | } |
| 122 | 121 | ||
| 123 | unsafe fn configure_pin(block: Gpio, pin: usize, af_num: u8) { | ||
| 124 | let (afr, n_af) = if pin < 8 { (0, pin) } else { (1, pin - 8) }; | ||
| 125 | block.moder().modify(|w| w.set_moder(pin, Moder::ALTERNATE)); | ||
| 126 | block.afr(afr).modify(|w| w.set_afr(n_af, Afr(af_num))); | ||
| 127 | block.otyper().modify(|w| w.set_ot(pin, Ot::OPENDRAIN)); | ||
| 128 | //block | ||
| 129 | //.ospeedr() | ||
| 130 | //.modify(|w| w.set_ospeedr(pin, crate::pac::gpio::vals::Ospeedr::VERYHIGHSPEED)); | ||
| 131 | } | ||
| 132 | |||
| 133 | fn master_stop(&mut self) { | 122 | fn master_stop(&mut self) { |
| 134 | unsafe { | 123 | unsafe { |
| 135 | T::regs().cr2().write(|w| w.set_stop(true)); | 124 | T::regs().cr2().write(|w| w.set_stop(true)); |
diff --git a/embassy-stm32/src/sdmmc/v2.rs b/embassy-stm32/src/sdmmc/v2.rs index 77a7c28cd..1f4c9db70 100644 --- a/embassy-stm32/src/sdmmc/v2.rs +++ b/embassy-stm32/src/sdmmc/v2.rs | |||
| @@ -12,9 +12,9 @@ use embassy_hal_common::unborrow; | |||
| 12 | use futures::future::poll_fn; | 12 | use futures::future::poll_fn; |
| 13 | use sdio_host::{BusWidth, CardCapacity, CardStatus, CurrentState, SDStatus, CID, CSD, OCR, SCR}; | 13 | use sdio_host::{BusWidth, CardCapacity, CardStatus, CurrentState, SDStatus, CID, CSD, OCR, SCR}; |
| 14 | 14 | ||
| 15 | use crate::gpio::sealed::AFType; | ||
| 16 | use crate::gpio::{Pull, Speed}; | ||
| 15 | use crate::interrupt::Interrupt; | 17 | use crate::interrupt::Interrupt; |
| 16 | use crate::pac; | ||
| 17 | use crate::pac::gpio::Gpio; | ||
| 18 | use crate::pac::sdmmc::Sdmmc as RegBlock; | 18 | use crate::pac::sdmmc::Sdmmc as RegBlock; |
| 19 | use crate::peripherals; | 19 | use crate::peripherals; |
| 20 | use crate::time::Hertz; | 20 | use crate::time::Hertz; |
| @@ -1191,23 +1191,6 @@ where | |||
| 1191 | { | 1191 | { |
| 1192 | } | 1192 | } |
| 1193 | 1193 | ||
| 1194 | /// # Safety | ||
| 1195 | /// | ||
| 1196 | /// Access to `block` registers should be exclusive | ||
| 1197 | unsafe fn configure_pin(block: Gpio, n: usize, afr_num: u8, pup: bool) { | ||
| 1198 | use pac::gpio::vals::{Afr, Moder, Ospeedr, Pupdr}; | ||
| 1199 | |||
| 1200 | let (afr, n_af) = if n < 8 { (0, n) } else { (1, n - 8) }; | ||
| 1201 | block.afr(afr).modify(|w| w.set_afr(n_af, Afr(afr_num))); | ||
| 1202 | block.moder().modify(|w| w.set_moder(n, Moder::ALTERNATE)); | ||
| 1203 | if pup { | ||
| 1204 | block.pupdr().modify(|w| w.set_pupdr(n, Pupdr::PULLUP)); | ||
| 1205 | } | ||
| 1206 | block | ||
| 1207 | .ospeedr() | ||
| 1208 | .modify(|w| w.set_ospeedr(n, Ospeedr::VERYHIGHSPEED)); | ||
| 1209 | } | ||
| 1210 | |||
| 1211 | impl<T, CLK, CMD, D0, D1, D2, D3> Pins<T> for (CLK, CMD, D0, D1, D2, D3) | 1194 | impl<T, CLK, CMD, D0, D1, D2, D3> Pins<T> for (CLK, CMD, D0, D1, D2, D3) |
| 1212 | where | 1195 | where |
| 1213 | T: Instance, | 1196 | T: Instance, |
| @@ -1224,135 +1207,32 @@ where | |||
| 1224 | let (clk_pin, cmd_pin, d0_pin, d1_pin, d2_pin, d3_pin) = self; | 1207 | let (clk_pin, cmd_pin, d0_pin, d1_pin, d2_pin, d3_pin) = self; |
| 1225 | 1208 | ||
| 1226 | critical_section::with(|_| unsafe { | 1209 | critical_section::with(|_| unsafe { |
| 1227 | // clk | 1210 | clk_pin.set_as_af_pull(clk_pin.af_num(), AFType::OutputPushPull, Pull::None); |
| 1228 | let block = clk_pin.block(); | 1211 | cmd_pin.set_as_af_pull(cmd_pin.af_num(), AFType::OutputPushPull, Pull::Up); |
| 1229 | let n = clk_pin.pin() as usize; | 1212 | d0_pin.set_as_af_pull(d0_pin.af_num(), AFType::OutputPushPull, Pull::Up); |
| 1230 | let afr_num = clk_pin.af_num(); | 1213 | d1_pin.set_as_af_pull(d1_pin.af_num(), AFType::OutputPushPull, Pull::Up); |
| 1231 | configure_pin(block, n, afr_num, false); | 1214 | d2_pin.set_as_af_pull(d2_pin.af_num(), AFType::OutputPushPull, Pull::Up); |
| 1232 | 1215 | d3_pin.set_as_af_pull(d3_pin.af_num(), AFType::OutputPushPull, Pull::Up); | |
| 1233 | // cmd | 1216 | |
| 1234 | let block = cmd_pin.block(); | 1217 | clk_pin.set_speed(Speed::VeryHigh); |
| 1235 | let n = cmd_pin.pin() as usize; | 1218 | cmd_pin.set_speed(Speed::VeryHigh); |
| 1236 | let afr_num = cmd_pin.af_num(); | 1219 | d0_pin.set_speed(Speed::VeryHigh); |
| 1237 | configure_pin(block, n, afr_num, true); | 1220 | d1_pin.set_speed(Speed::VeryHigh); |
| 1238 | 1221 | d2_pin.set_speed(Speed::VeryHigh); | |
| 1239 | // d0 | 1222 | d3_pin.set_speed(Speed::VeryHigh); |
| 1240 | let block = d0_pin.block(); | ||
| 1241 | let n = d0_pin.pin() as usize; | ||
| 1242 | let afr_num = d0_pin.af_num(); | ||
| 1243 | configure_pin(block, n, afr_num, true); | ||
| 1244 | |||
| 1245 | // d1 | ||
| 1246 | let block = d1_pin.block(); | ||
| 1247 | let n = d1_pin.pin() as usize; | ||
| 1248 | let afr_num = d1_pin.af_num(); | ||
| 1249 | configure_pin(block, n, afr_num, true); | ||
| 1250 | |||
| 1251 | // d2 | ||
| 1252 | let block = d2_pin.block(); | ||
| 1253 | let n = d2_pin.pin() as usize; | ||
| 1254 | let afr_num = d2_pin.af_num(); | ||
| 1255 | configure_pin(block, n, afr_num, true); | ||
| 1256 | |||
| 1257 | // d3 | ||
| 1258 | let block = d3_pin.block(); | ||
| 1259 | let n = d3_pin.pin() as usize; | ||
| 1260 | let afr_num = d3_pin.af_num(); | ||
| 1261 | configure_pin(block, n, afr_num, true); | ||
| 1262 | }); | 1223 | }); |
| 1263 | } | 1224 | } |
| 1264 | 1225 | ||
| 1265 | fn deconfigure(&mut self) { | 1226 | fn deconfigure(&mut self) { |
| 1266 | use pac::gpio::vals::{Moder, Ospeedr, Pupdr}; | ||
| 1267 | |||
| 1268 | let (clk_pin, cmd_pin, d0_pin, d1_pin, d2_pin, d3_pin) = self; | 1227 | let (clk_pin, cmd_pin, d0_pin, d1_pin, d2_pin, d3_pin) = self; |
| 1269 | 1228 | ||
| 1270 | critical_section::with(|_| unsafe { | 1229 | critical_section::with(|_| unsafe { |
| 1271 | // clk | 1230 | clk_pin.set_as_disconnected(); |
| 1272 | let n = clk_pin.pin().into(); | 1231 | cmd_pin.set_as_disconnected(); |
| 1273 | clk_pin | 1232 | d0_pin.set_as_disconnected(); |
| 1274 | .block() | 1233 | d1_pin.set_as_disconnected(); |
| 1275 | .moder() | 1234 | d2_pin.set_as_disconnected(); |
| 1276 | .modify(|w| w.set_moder(n, Moder::ANALOG)); | 1235 | d3_pin.set_as_disconnected(); |
| 1277 | clk_pin | ||
| 1278 | .block() | ||
| 1279 | .ospeedr() | ||
| 1280 | .modify(|w| w.set_ospeedr(n, Ospeedr::LOWSPEED)); | ||
| 1281 | |||
| 1282 | // cmd | ||
| 1283 | let n = cmd_pin.pin().into(); | ||
| 1284 | cmd_pin | ||
| 1285 | .block() | ||
| 1286 | .moder() | ||
| 1287 | .modify(|w| w.set_moder(n, Moder::ANALOG)); | ||
| 1288 | cmd_pin | ||
| 1289 | .block() | ||
| 1290 | .ospeedr() | ||
| 1291 | .modify(|w| w.set_ospeedr(n, Ospeedr::LOWSPEED)); | ||
| 1292 | cmd_pin | ||
| 1293 | .block() | ||
| 1294 | .pupdr() | ||
| 1295 | .modify(|w| w.set_pupdr(n, Pupdr::FLOATING)); | ||
| 1296 | |||
| 1297 | // d0 | ||
| 1298 | let n = d0_pin.pin().into(); | ||
| 1299 | d0_pin | ||
| 1300 | .block() | ||
| 1301 | .moder() | ||
| 1302 | .modify(|w| w.set_moder(n, Moder::ANALOG)); | ||
| 1303 | d0_pin | ||
| 1304 | .block() | ||
| 1305 | .ospeedr() | ||
| 1306 | .modify(|w| w.set_ospeedr(n, Ospeedr::LOWSPEED)); | ||
| 1307 | d0_pin | ||
| 1308 | .block() | ||
| 1309 | .pupdr() | ||
| 1310 | .modify(|w| w.set_pupdr(n, Pupdr::FLOATING)); | ||
| 1311 | |||
| 1312 | // d1 | ||
| 1313 | let n = d1_pin.pin().into(); | ||
| 1314 | d1_pin | ||
| 1315 | .block() | ||
| 1316 | .moder() | ||
| 1317 | .modify(|w| w.set_moder(n, Moder::ANALOG)); | ||
| 1318 | d1_pin | ||
| 1319 | .block() | ||
| 1320 | .ospeedr() | ||
| 1321 | .modify(|w| w.set_ospeedr(n, Ospeedr::LOWSPEED)); | ||
| 1322 | d1_pin | ||
| 1323 | .block() | ||
| 1324 | .pupdr() | ||
| 1325 | .modify(|w| w.set_pupdr(n, Pupdr::FLOATING)); | ||
| 1326 | |||
| 1327 | // d2 | ||
| 1328 | let n = d2_pin.pin().into(); | ||
| 1329 | d2_pin | ||
| 1330 | .block() | ||
| 1331 | .moder() | ||
| 1332 | .modify(|w| w.set_moder(n, Moder::ANALOG)); | ||
| 1333 | d2_pin | ||
| 1334 | .block() | ||
| 1335 | .ospeedr() | ||
| 1336 | .modify(|w| w.set_ospeedr(n, Ospeedr::LOWSPEED)); | ||
| 1337 | d2_pin | ||
| 1338 | .block() | ||
| 1339 | .pupdr() | ||
| 1340 | .modify(|w| w.set_pupdr(n, Pupdr::FLOATING)); | ||
| 1341 | |||
| 1342 | // d3 | ||
| 1343 | let n = d3_pin.pin().into(); | ||
| 1344 | d3_pin | ||
| 1345 | .block() | ||
| 1346 | .moder() | ||
| 1347 | .modify(|w| w.set_moder(n, Moder::ANALOG)); | ||
| 1348 | d3_pin | ||
| 1349 | .block() | ||
| 1350 | .ospeedr() | ||
| 1351 | .modify(|w| w.set_ospeedr(n, Ospeedr::LOWSPEED)); | ||
| 1352 | d3_pin | ||
| 1353 | .block() | ||
| 1354 | .pupdr() | ||
| 1355 | .modify(|w| w.set_pupdr(n, Pupdr::FLOATING)); | ||
| 1356 | }); | 1236 | }); |
| 1357 | } | 1237 | } |
| 1358 | } | 1238 | } |
| @@ -1370,72 +1250,23 @@ where | |||
| 1370 | let (clk_pin, cmd_pin, d0_pin) = self; | 1250 | let (clk_pin, cmd_pin, d0_pin) = self; |
| 1371 | 1251 | ||
| 1372 | critical_section::with(|_| unsafe { | 1252 | critical_section::with(|_| unsafe { |
| 1373 | // clk | 1253 | clk_pin.set_as_af_pull(clk_pin.af_num(), AFType::OutputPushPull, Pull::None); |
| 1374 | let block = clk_pin.block(); | 1254 | cmd_pin.set_as_af_pull(cmd_pin.af_num(), AFType::OutputPushPull, Pull::Up); |
| 1375 | let n = clk_pin.pin() as usize; | 1255 | d0_pin.set_as_af_pull(d0_pin.af_num(), AFType::OutputPushPull, Pull::Up); |
| 1376 | let afr_num = clk_pin.af_num(); | 1256 | |
| 1377 | configure_pin(block, n, afr_num, false); | 1257 | clk_pin.set_speed(Speed::VeryHigh); |
| 1378 | 1258 | cmd_pin.set_speed(Speed::VeryHigh); | |
| 1379 | // cmd | 1259 | d0_pin.set_speed(Speed::VeryHigh); |
| 1380 | let block = cmd_pin.block(); | ||
| 1381 | let n = cmd_pin.pin() as usize; | ||
| 1382 | let afr_num = cmd_pin.af_num(); | ||
| 1383 | configure_pin(block, n, afr_num, true); | ||
| 1384 | |||
| 1385 | // d0 | ||
| 1386 | let block = d0_pin.block(); | ||
| 1387 | let n = d0_pin.pin() as usize; | ||
| 1388 | let afr_num = d0_pin.af_num(); | ||
| 1389 | configure_pin(block, n, afr_num, true); | ||
| 1390 | }); | 1260 | }); |
| 1391 | } | 1261 | } |
| 1392 | 1262 | ||
| 1393 | fn deconfigure(&mut self) { | 1263 | fn deconfigure(&mut self) { |
| 1394 | use pac::gpio::vals::{Moder, Ospeedr, Pupdr}; | ||
| 1395 | |||
| 1396 | let (clk_pin, cmd_pin, d0_pin) = self; | 1264 | let (clk_pin, cmd_pin, d0_pin) = self; |
| 1397 | 1265 | ||
| 1398 | critical_section::with(|_| unsafe { | 1266 | critical_section::with(|_| unsafe { |
| 1399 | // clk | 1267 | clk_pin.set_as_disconnected(); |
| 1400 | let n = clk_pin.pin().into(); | 1268 | cmd_pin.set_as_disconnected(); |
| 1401 | clk_pin | 1269 | d0_pin.set_as_disconnected(); |
| 1402 | .block() | ||
| 1403 | .moder() | ||
| 1404 | .modify(|w| w.set_moder(n, Moder::ANALOG)); | ||
| 1405 | clk_pin | ||
| 1406 | .block() | ||
| 1407 | .ospeedr() | ||
| 1408 | .modify(|w| w.set_ospeedr(n, Ospeedr::LOWSPEED)); | ||
| 1409 | |||
| 1410 | // cmd | ||
| 1411 | let n = cmd_pin.pin().into(); | ||
| 1412 | cmd_pin | ||
| 1413 | .block() | ||
| 1414 | .moder() | ||
| 1415 | .modify(|w| w.set_moder(n, Moder::ANALOG)); | ||
| 1416 | cmd_pin | ||
| 1417 | .block() | ||
| 1418 | .ospeedr() | ||
| 1419 | .modify(|w| w.set_ospeedr(n, Ospeedr::LOWSPEED)); | ||
| 1420 | cmd_pin | ||
| 1421 | .block() | ||
| 1422 | .pupdr() | ||
| 1423 | .modify(|w| w.set_pupdr(n, Pupdr::FLOATING)); | ||
| 1424 | |||
| 1425 | // d0 | ||
| 1426 | let n = d0_pin.pin().into(); | ||
| 1427 | d0_pin | ||
| 1428 | .block() | ||
| 1429 | .moder() | ||
| 1430 | .modify(|w| w.set_moder(n, Moder::ANALOG)); | ||
| 1431 | d0_pin | ||
| 1432 | .block() | ||
| 1433 | .ospeedr() | ||
| 1434 | .modify(|w| w.set_ospeedr(n, Ospeedr::LOWSPEED)); | ||
| 1435 | d0_pin | ||
| 1436 | .block() | ||
| 1437 | .pupdr() | ||
| 1438 | .modify(|w| w.set_pupdr(n, Pupdr::FLOATING)); | ||
| 1439 | }); | 1270 | }); |
| 1440 | } | 1271 | } |
| 1441 | } | 1272 | } |
diff --git a/embassy-stm32/src/spi/mod.rs b/embassy-stm32/src/spi/mod.rs index 91420375b..fe2014147 100644 --- a/embassy-stm32/src/spi/mod.rs +++ b/embassy-stm32/src/spi/mod.rs | |||
| @@ -458,9 +458,9 @@ impl<'d, T: Instance, Tx, Rx> Spi<'d, T, Tx, Rx> { | |||
| 458 | impl<'d, T: Instance, Tx, Rx> Drop for Spi<'d, T, Tx, Rx> { | 458 | impl<'d, T: Instance, Tx, Rx> Drop for Spi<'d, T, Tx, Rx> { |
| 459 | fn drop(&mut self) { | 459 | fn drop(&mut self) { |
| 460 | unsafe { | 460 | unsafe { |
| 461 | self.sck.as_ref().map(|x| x.set_as_analog()); | 461 | self.sck.as_ref().map(|x| x.set_as_disconnected()); |
| 462 | self.mosi.as_ref().map(|x| x.set_as_analog()); | 462 | self.mosi.as_ref().map(|x| x.set_as_disconnected()); |
| 463 | self.miso.as_ref().map(|x| x.set_as_analog()); | 463 | self.miso.as_ref().map(|x| x.set_as_disconnected()); |
| 464 | } | 464 | } |
| 465 | } | 465 | } |
| 466 | } | 466 | } |
diff --git a/stm32-data b/stm32-data | |||
| Subproject dbb0ad74f2a4612f0ca168da38e1c443a838a60 | Subproject 608581a8960b95c4d472f59d0b028b47053d587 | ||
