aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2022-02-24 02:36:30 +0100
committerDario Nieuwenhuis <[email protected]>2022-02-24 02:49:20 +0100
commitbf80504ac76161a25acef6d1f3ace1009c26cf04 (patch)
tree544744c982b4b1c36d67e9dc8d36cb460210f4e1
parent29aa51a1ad299943cc31515a16317852151ed112 (diff)
stm32: centralize gpio reg access in the gpio module.
-rw-r--r--embassy-stm32/src/eth/v1c/mod.rs17
-rw-r--r--embassy-stm32/src/eth/v2/mod.rs13
-rw-r--r--embassy-stm32/src/fmc/mod.rs8
-rw-r--r--embassy-stm32/src/gpio.rs102
-rw-r--r--embassy-stm32/src/i2c/v1.rs11
-rw-r--r--embassy-stm32/src/i2c/v2.rs17
-rw-r--r--embassy-stm32/src/sdmmc/v2.rs231
-rw-r--r--embassy-stm32/src/spi/mod.rs6
m---------stm32-data0
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;
11use embassy_net::{Device, DeviceCapabilities, LinkState, PacketBuf, MTU}; 11use embassy_net::{Device, DeviceCapabilities, LinkState, PacketBuf, MTU};
12 12
13use crate::gpio::sealed::Pin as __GpioPin; 13use crate::gpio::sealed::Pin as __GpioPin;
14use crate::gpio::Pin as GpioPin;
15use crate::gpio::{sealed::AFType, AnyPin, Speed}; 14use crate::gpio::{sealed::AFType, AnyPin, Speed};
16use crate::pac::gpio::vals::Ospeedr;
17use crate::pac::{ETH, RCC, SYSCFG}; 15use crate::pac::{ETH, RCC, SYSCFG};
18 16
19mod descriptors; 17mod 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;
2use embassy::util::Unborrow; 2use embassy::util::Unborrow;
3use embassy_hal_common::unborrow; 3use embassy_hal_common::unborrow;
4 4
5use crate::gpio::sealed::AFType::OutputPushPull; 5use crate::gpio::sealed::AFType;
6use crate::gpio::Speed; 6use crate::gpio::{Pull, Speed};
7use crate::pac::gpio::vals::Pupdr;
8 7
9mod pins; 8mod pins;
10pub use pins::*; 9pub 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 @@
1use crate::i2c::{Error, Instance, SclPin, SdaPin};
2use crate::time::Hertz;
3use core::marker::PhantomData; 1use core::marker::PhantomData;
4use embassy::util::Unborrow; 2use embassy::util::Unborrow;
5use embassy_hal_common::unborrow; 3use embassy_hal_common::unborrow;
6 4
5use crate::gpio::sealed::AFType;
6use crate::i2c::{Error, Instance, SclPin, SdaPin};
7use crate::pac::i2c; 7use crate::pac::i2c;
8 8use crate::time::Hertz;
9use crate::gpio::sealed::AFType::OutputOpenDrain;
10 9
11pub struct I2c<'d, T: Instance> { 10pub 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;
11use futures::future::poll_fn; 11use futures::future::poll_fn;
12 12
13use crate::dma::NoDma; 13use crate::dma::NoDma;
14use crate::gpio::sealed::AFType;
14use crate::i2c::{Error, Instance, SclPin, SdaPin}; 15use crate::i2c::{Error, Instance, SclPin, SdaPin};
15use crate::pac; 16use crate::pac;
16use crate::pac::gpio::vals::{Afr, Moder, Ot};
17use crate::pac::gpio::Gpio;
18use crate::pac::i2c; 17use crate::pac::i2c;
19use crate::time::Hertz; 18use 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;
12use futures::future::poll_fn; 12use futures::future::poll_fn;
13use sdio_host::{BusWidth, CardCapacity, CardStatus, CurrentState, SDStatus, CID, CSD, OCR, SCR}; 13use sdio_host::{BusWidth, CardCapacity, CardStatus, CurrentState, SDStatus, CID, CSD, OCR, SCR};
14 14
15use crate::gpio::sealed::AFType;
16use crate::gpio::{Pull, Speed};
15use crate::interrupt::Interrupt; 17use crate::interrupt::Interrupt;
16use crate::pac;
17use crate::pac::gpio::Gpio;
18use crate::pac::sdmmc::Sdmmc as RegBlock; 18use crate::pac::sdmmc::Sdmmc as RegBlock;
19use crate::peripherals; 19use crate::peripherals;
20use crate::time::Hertz; 20use 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
1197unsafe 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
1211impl<T, CLK, CMD, D0, D1, D2, D3> Pins<T> for (CLK, CMD, D0, D1, D2, D3) 1194impl<T, CLK, CMD, D0, D1, D2, D3> Pins<T> for (CLK, CMD, D0, D1, D2, D3)
1212where 1195where
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> {
458impl<'d, T: Instance, Tx, Rx> Drop for Spi<'d, T, Tx, Rx> { 458impl<'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