aboutsummaryrefslogtreecommitdiff
path: root/embassy-embedded-hal
diff options
context:
space:
mode:
authorShaw Drastin <[email protected]>2025-02-04 10:53:45 +0800
committerShaw Drastin <[email protected]>2025-02-04 10:55:47 +0800
commit188828775e83cbebb7a558843eae5eb50e1dc2b8 (patch)
tree40eb2c22abbcb4d2e0e8166dc3dd79989b2c521f /embassy-embedded-hal
parent2c8a550410653d58b103d71b7571668872dd79fa (diff)
SpiDevice cancel safety: always set CS pin to high on drop
If a transfer is dropped, the CS will stay in a low state, which seems to be unsafe.
Diffstat (limited to 'embassy-embedded-hal')
-rw-r--r--embassy-embedded-hal/Cargo.toml1
-rw-r--r--embassy-embedded-hal/src/shared_bus/asynch/spi.rs15
2 files changed, 12 insertions, 4 deletions
diff --git a/embassy-embedded-hal/Cargo.toml b/embassy-embedded-hal/Cargo.toml
index 9dd2e419f..f385963f1 100644
--- a/embassy-embedded-hal/Cargo.toml
+++ b/embassy-embedded-hal/Cargo.toml
@@ -22,6 +22,7 @@ time = ["dep:embassy-time"]
22default = ["time"] 22default = ["time"]
23 23
24[dependencies] 24[dependencies]
25embassy-hal-internal = { version = "0.2.0", path = "../embassy-hal-internal" }
25embassy-futures = { version = "0.1.0", path = "../embassy-futures" } 26embassy-futures = { version = "0.1.0", path = "../embassy-futures" }
26embassy-sync = { version = "0.6.2", path = "../embassy-sync" } 27embassy-sync = { version = "0.6.2", path = "../embassy-sync" }
27embassy-time = { version = "0.4.0", path = "../embassy-time", optional = true } 28embassy-time = { version = "0.4.0", path = "../embassy-time", optional = true }
diff --git a/embassy-embedded-hal/src/shared_bus/asynch/spi.rs b/embassy-embedded-hal/src/shared_bus/asynch/spi.rs
index 30d4ecc36..0ba1033f6 100644
--- a/embassy-embedded-hal/src/shared_bus/asynch/spi.rs
+++ b/embassy-embedded-hal/src/shared_bus/asynch/spi.rs
@@ -25,6 +25,7 @@
25//! let display2 = ST7735::new(spi_dev2, dc2, rst2, Default::default(), 160, 128); 25//! let display2 = ST7735::new(spi_dev2, dc2, rst2, Default::default(), 160, 128);
26//! ``` 26//! ```
27 27
28use embassy_hal_internal::drop::OnDrop;
28use embassy_sync::blocking_mutex::raw::RawMutex; 29use embassy_sync::blocking_mutex::raw::RawMutex;
29use embassy_sync::mutex::Mutex; 30use embassy_sync::mutex::Mutex;
30use embedded_hal_1::digital::OutputPin; 31use embedded_hal_1::digital::OutputPin;
@@ -70,6 +71,10 @@ where
70 let mut bus = self.bus.lock().await; 71 let mut bus = self.bus.lock().await;
71 self.cs.set_low().map_err(SpiDeviceError::Cs)?; 72 self.cs.set_low().map_err(SpiDeviceError::Cs)?;
72 73
74 let cs_drop = OnDrop::new(|| {
75 let _ = self.cs.set_high();
76 });
77
73 let op_res = 'ops: { 78 let op_res = 'ops: {
74 for op in operations { 79 for op in operations {
75 let res = match op { 80 let res = match op {
@@ -97,11 +102,10 @@ where
97 102
98 // On failure, it's important to still flush and deassert CS. 103 // On failure, it's important to still flush and deassert CS.
99 let flush_res = bus.flush().await; 104 let flush_res = bus.flush().await;
100 let cs_res = self.cs.set_high(); 105 drop(cs_drop);
101 106
102 let op_res = op_res.map_err(SpiDeviceError::Spi)?; 107 let op_res = op_res.map_err(SpiDeviceError::Spi)?;
103 flush_res.map_err(SpiDeviceError::Spi)?; 108 flush_res.map_err(SpiDeviceError::Spi)?;
104 cs_res.map_err(SpiDeviceError::Cs)?;
105 109
106 Ok(op_res) 110 Ok(op_res)
107 } 111 }
@@ -155,6 +159,10 @@ where
155 bus.set_config(&self.config).map_err(|_| SpiDeviceError::Config)?; 159 bus.set_config(&self.config).map_err(|_| SpiDeviceError::Config)?;
156 self.cs.set_low().map_err(SpiDeviceError::Cs)?; 160 self.cs.set_low().map_err(SpiDeviceError::Cs)?;
157 161
162 let cs_drop = OnDrop::new(|| {
163 let _ = self.cs.set_high();
164 });
165
158 let op_res = 'ops: { 166 let op_res = 'ops: {
159 for op in operations { 167 for op in operations {
160 let res = match op { 168 let res = match op {
@@ -182,11 +190,10 @@ where
182 190
183 // On failure, it's important to still flush and deassert CS. 191 // On failure, it's important to still flush and deassert CS.
184 let flush_res = bus.flush().await; 192 let flush_res = bus.flush().await;
185 let cs_res = self.cs.set_high(); 193 drop(cs_drop);
186 194
187 let op_res = op_res.map_err(SpiDeviceError::Spi)?; 195 let op_res = op_res.map_err(SpiDeviceError::Spi)?;
188 flush_res.map_err(SpiDeviceError::Spi)?; 196 flush_res.map_err(SpiDeviceError::Spi)?;
189 cs_res.map_err(SpiDeviceError::Cs)?;
190 197
191 Ok(op_res) 198 Ok(op_res)
192 } 199 }