Skip to content

Commit 2668fd7

Browse files
committed
spi: remove redundant error checks
1 parent a7a3064 commit 2668fd7

File tree

1 file changed

+27
-12
lines changed

1 file changed

+27
-12
lines changed

src/spi.rs

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -214,11 +214,7 @@ macro_rules! spi {
214214
} else if sr.crcerr().bit_is_set() {
215215
nb::Error::Other(Error::Crc)
216216
} else if sr.rxne().bit_is_set() {
217-
// NOTE(read_volatile) read only 1 byte (the svd2rust API only allows
218-
// reading a half-word)
219-
return Ok(unsafe {
220-
ptr::read_volatile(&self.spi.dr as *const _ as *const W)
221-
});
217+
return Ok(self.read_unchecked());
222218
} else {
223219
nb::Error::WouldBlock
224220
})
@@ -233,15 +229,33 @@ macro_rules! spi {
233229
} else if sr.crcerr().bit_is_set() {
234230
nb::Error::Other(Error::Crc)
235231
} else if sr.txe().bit_is_set() {
236-
let dr = &self.spi.dr as *const _ as *const UnsafeCell<W>;
237-
// NOTE(write_volatile) see note above
238-
unsafe { ptr::write_volatile(UnsafeCell::raw_get(dr), word) };
232+
self.write_unchecked(word);
239233
return Ok(());
240234
} else {
241235
nb::Error::WouldBlock
242236
})
243237
}
244238
#[inline]
239+
fn nb_read_no_err(&mut self) -> nb::Result<u8, ()> {
240+
if self.spi.sr.read().rxne().bit_is_set() {
241+
Ok(self.read_unchecked())
242+
} else {
243+
Err(nb::Error::WouldBlock)
244+
}
245+
}
246+
#[inline]
247+
fn read_unchecked<W: FrameSize>(&mut self) -> W {
248+
// NOTE(read_volatile) read only 1 byte (the svd2rust API only allows
249+
// reading a half-word)
250+
unsafe { ptr::read_volatile(&self.spi.dr as *const _ as *const W) }
251+
}
252+
#[inline]
253+
fn write_unchecked<W: FrameSize>(&mut self, word: W) {
254+
let dr = &self.spi.dr as *const _ as *const UnsafeCell<W>;
255+
// NOTE(write_volatile) see note above
256+
unsafe { ptr::write_volatile(UnsafeCell::raw_get(dr), word) };
257+
}
258+
#[inline]
245259
pub fn set_tx_only(&mut self) {
246260
self.spi
247261
.cr1
@@ -278,10 +292,11 @@ macro_rules! spi {
278292
// one frame should be enough?
279293
nb::block!(self.nb_write(0u8))?;
280294
let len = words.len();
281-
for w in words[..len-1].iter_mut() {
295+
for r in words[..len-1].iter_mut() {
282296
// TODO: 16 bit frames, bidirectional pins
283297
nb::block!(self.nb_write(0u8))?;
284-
*w = nb::block!(self.nb_read())?;
298+
// errors have been checked by the write above
299+
*r = unsafe { nb::block!(self.nb_read_no_err()).unwrap_unchecked() };
285300
}
286301
// safety: length > 0 checked at start of function
287302
*words.last_mut().unwrap() = nb::block!(self.nb_read())?;
@@ -314,7 +329,7 @@ macro_rules! spi {
314329
let zipped = read.iter_mut().zip(write.into_iter().skip(1)).take(common_len - 1);
315330
for (r, w) in zipped {
316331
nb::block!(self.nb_write(*w))?;
317-
*r = nb::block!(self.nb_read())?;
332+
*r = unsafe { nb::block!(self.nb_read_no_err()).unwrap_unchecked() };
318333
}
319334
read[common_len-1] = nb::block!(self.nb_read())?;
320335

@@ -335,7 +350,7 @@ macro_rules! spi {
335350
let w = &rw[1];
336351

337352
nb::block!(self.nb_write(w.get()))?;
338-
r.set(nb::block!(self.nb_read())?);
353+
r.set(unsafe { nb::block!(self.nb_read_no_err()).unwrap_unchecked() });
339354
}
340355
*words.last_mut().unwrap() = nb::block!(self.nb_read())?;
341356
Ok(())

0 commit comments

Comments
 (0)