Skip to content

Commit 7bb55f1

Browse files
Serial refactoring
1 parent 24a8887 commit 7bb55f1

File tree

1 file changed

+46
-79
lines changed

1 file changed

+46
-79
lines changed

src/serial.rs

Lines changed: 46 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,10 @@
7676
//! let received: u8 = block!(rx.read()).unwrap();
7777
//! ```
7878
79+
use core::convert::Infallible;
7980
use core::marker::PhantomData;
8081
use core::ops::Deref;
8182
use core::sync::atomic::{self, Ordering};
82-
83-
use crate::pac::{RCC, USART1, USART2, USART3};
84-
use core::convert::Infallible;
8583
use embedded_dma::{StaticReadBuffer, StaticWriteBuffer};
8684
use embedded_hal::serial::Write;
8785

@@ -92,6 +90,7 @@ use crate::gpio::gpiob::{PB10, PB11, PB6, PB7};
9290
use crate::gpio::gpioc::{PC10, PC11};
9391
use crate::gpio::gpiod::{PD5, PD6, PD8, PD9};
9492
use crate::gpio::{Alternate, Input};
93+
use crate::pac::{RCC, USART1, USART2, USART3};
9594
use crate::rcc::{BusClock, Clocks, Enable, Reset};
9695
use crate::time::{Bps, U32Ext};
9796

@@ -167,13 +166,13 @@ pub enum Parity {
167166
}
168167

169168
pub enum StopBits {
170-
#[doc = "1 stop bit"]
169+
/// 1 stop bit
171170
STOP1,
172-
#[doc = "0.5 stop bits"]
171+
/// 0.5 stop bits
173172
STOP0P5,
174-
#[doc = "2 stop bits"]
173+
/// 2 stop bits
175174
STOP2,
176-
#[doc = "1.5 stop bits"]
175+
/// 1.5 stop bits
177176
STOP1P5,
178177
}
179178

@@ -320,21 +319,19 @@ where
320319
assert!(brr >= 16, "impossible baud rate");
321320
self.usart.brr.write(|w| unsafe { w.bits(brr) });
322321

323-
let (parity_control_enable, parity) = match config.parity {
322+
// Configure word
323+
let (parity_is_used, parity_is_odd) = match config.parity {
324324
Parity::ParityNone => (false, false),
325325
Parity::ParityEven => (true, false),
326326
Parity::ParityOdd => (true, true),
327327
};
328328
self.usart.cr1.modify(|_r, w| {
329-
w.m()
330-
.bit(match config.wordlength {
331-
WordLength::DataBits8 => false,
332-
WordLength::DataBits9 => true,
333-
})
334-
.ps()
335-
.bit(parity)
336-
.pce()
337-
.bit(parity_control_enable)
329+
w.m().bit(match config.wordlength {
330+
WordLength::DataBits8 => false,
331+
WordLength::DataBits9 => true,
332+
});
333+
w.ps().bit(parity_is_odd);
334+
w.pce().bit(parity_is_used)
338335
});
339336

340337
// Configure stop bits
@@ -356,12 +353,11 @@ where
356353
config: impl Into<Config>,
357354
clocks: Clocks,
358355
) -> nb::Result<(), Infallible> {
359-
let sr = self.usart.sr.read();
360356
// if we're currently busy transmitting, we have to wait until that is
361357
// over -- regarding reception, we assume that the caller -- with
362358
// exclusive access to the Serial instance due to &mut self -- knows
363359
// what they're doing.
364-
if sr.tc().bit_is_clear() {
360+
if self.usart.sr.read().tc().bit_is_clear() {
365361
return nb::Result::Err(nb::Error::WouldBlock);
366362
}
367363
self.apply_config(config.into(), clocks);
@@ -372,22 +368,22 @@ where
372368
/// ready to be read (RXNE)_ interrupt and _Transmit data
373369
/// register empty (TXE)_ interrupt
374370
pub fn listen(&mut self, event: Event) {
375-
match event {
376-
Event::Rxne => self.usart.cr1.modify(|_, w| w.rxneie().set_bit()),
377-
Event::Txe => self.usart.cr1.modify(|_, w| w.txeie().set_bit()),
378-
Event::Idle => self.usart.cr1.modify(|_, w| w.idleie().set_bit()),
379-
}
371+
self.usart.cr1.modify(|_, w| match event {
372+
Event::Rxne => w.rxneie().set_bit(),
373+
Event::Txe => w.txeie().set_bit(),
374+
Event::Idle => w.idleie().set_bit(),
375+
});
380376
}
381377

382378
/// Stops listening to the USART by disabling the _Received data
383379
/// ready to be read (RXNE)_ interrupt and _Transmit data
384380
/// register empty (TXE)_ interrupt
385381
pub fn unlisten(&mut self, event: Event) {
386-
match event {
387-
Event::Rxne => self.usart.cr1.modify(|_, w| w.rxneie().clear_bit()),
388-
Event::Txe => self.usart.cr1.modify(|_, w| w.txeie().clear_bit()),
389-
Event::Idle => self.usart.cr1.modify(|_, w| w.idleie().clear_bit()),
390-
}
382+
self.usart.cr1.modify(|_, w| match event {
383+
Event::Rxne => w.rxneie().clear_bit(),
384+
Event::Txe => w.txeie().clear_bit(),
385+
Event::Idle => w.idleie().clear_bit(),
386+
});
391387
}
392388

393389
/// Returns true if the line idle status is set
@@ -407,10 +403,8 @@ where
407403

408404
/// Clear idle line interrupt flag
409405
pub fn clear_idle_interrupt(&self) {
410-
unsafe {
411-
let _ = (*USART::ptr()).sr.read();
412-
let _ = (*USART::ptr()).dr.read();
413-
}
406+
let _ = self.usart.sr.read();
407+
let _ = self.usart.dr.read();
414408
}
415409

416410
/// Returns ownership of the borrowed register handles
@@ -686,17 +680,14 @@ where
686680

687681
if let Some(err) = err {
688682
// Some error occurred. In order to clear that error flag, you have to
689-
// do a read from the sr register followed by a read from the dr
690-
// register
691-
// NOTE(read_volatile) see `write_volatile` below
683+
// do a read from the sr register followed by a read from the dr register.
692684
let _ = usart.sr.read();
693685
let _ = usart.dr.read();
694686
Err(nb::Error::Other(err))
695687
} else {
696688
// Check if a byte is available
697689
if sr.rxne().bit_is_set() {
698690
// Read the received byte
699-
// NOTE(read_volatile) see `write_volatile` below
700691
Ok(usart.dr.read().dr().bits())
701692
} else {
702693
Err(nb::Error::WouldBlock)
@@ -727,11 +718,13 @@ where
727718
{
728719
type Error = Infallible;
729720

721+
#[inline(always)]
730722
fn write(&mut self, word: u8) -> nb::Result<(), Self::Error> {
731723
// Delegate to u16 version
732-
Tx::<USART, u16>::new().write(u16::from(word))
724+
Tx::<USART, u16>::new().write(word as u16)
733725
}
734726

727+
#[inline(always)]
735728
fn flush(&mut self) -> nb::Result<(), Self::Error> {
736729
// Delegate to u16 version
737730
Tx::<USART, u16>::new().flush()
@@ -750,9 +743,9 @@ where
750743
type Error = Infallible;
751744

752745
fn flush(&mut self) -> nb::Result<(), Self::Error> {
753-
let sr = unsafe { &*USART::ptr() }.sr.read();
746+
let usart = unsafe { &*USART::ptr() };
754747

755-
if sr.tc().bit_is_set() {
748+
if usart.sr.read().tc().bit_is_set() {
756749
Ok(())
757750
} else {
758751
Err(nb::Error::WouldBlock)
@@ -761,11 +754,9 @@ where
761754

762755
fn write(&mut self, word: u16) -> nb::Result<(), Self::Error> {
763756
let usart = unsafe { &*USART::ptr() };
764-
let sr = usart.sr.read();
765757

766-
if sr.txe().bit_is_set() {
767-
// NOTE(unsafe) atomic write to stateless register
768-
unsafe { &*USART::ptr() }.dr.write(|w| w.dr().bits(word));
758+
if usart.sr.read().txe().bit_is_set() {
759+
usart.dr.write(|w| w.dr().bits(word));
769760
Ok(())
770761
} else {
771762
Err(nb::Error::WouldBlock)
@@ -780,26 +771,14 @@ where
780771
type Error = Infallible;
781772

782773
fn bwrite_all(&mut self, buffer: &[u16]) -> Result<(), Self::Error> {
783-
for &b in buffer {
784-
loop {
785-
match self.write(b) {
786-
Err(nb::Error::WouldBlock) => continue,
787-
Err(nb::Error::Other(err)) => return Err(err),
788-
Ok(()) => break,
789-
}
790-
}
774+
for &w in buffer {
775+
nb::block!(<Self as crate::hal::serial::Write<u16>>::write(self, w))?;
791776
}
792777
Ok(())
793778
}
794779

795780
fn bflush(&mut self) -> Result<(), Self::Error> {
796-
loop {
797-
match <Self as crate::hal::serial::Write<u16>>::flush(self) {
798-
Ok(()) => return Ok(()),
799-
Err(nb::Error::WouldBlock) => continue,
800-
Err(nb::Error::Other(err)) => return Err(err),
801-
}
802-
}
781+
nb::block!(<Self as crate::hal::serial::Write<u16>>::flush(self))
803782
}
804783
}
805784

@@ -809,27 +788,15 @@ where
809788
{
810789
type Error = Infallible;
811790

812-
fn bwrite_all(&mut self, bytes: &[u8]) -> Result<(), Self::Error> {
813-
for &b in bytes {
814-
loop {
815-
match self.write(b) {
816-
Err(nb::Error::WouldBlock) => continue,
817-
Err(nb::Error::Other(err)) => return Err(err),
818-
Ok(()) => break,
819-
}
820-
}
791+
fn bwrite_all(&mut self, buffer: &[u8]) -> Result<(), Self::Error> {
792+
for &w in buffer {
793+
nb::block!(<Self as crate::hal::serial::Write<u8>>::write(self, w))?;
821794
}
822795
Ok(())
823796
}
824797

825798
fn bflush(&mut self) -> Result<(), Self::Error> {
826-
loop {
827-
match <Self as crate::hal::serial::Write<u8>>::flush(self) {
828-
Ok(()) => return Ok(()),
829-
Err(nb::Error::WouldBlock) => continue,
830-
Err(nb::Error::Other(err)) => return Err(err),
831-
}
832-
}
799+
nb::block!(<Self as crate::hal::serial::Write<u8>>::flush(self))
833800
}
834801
}
835802

@@ -839,8 +806,8 @@ where
839806
{
840807
type Error = Infallible;
841808

842-
fn bwrite_all(&mut self, bytes: &[u16]) -> Result<(), Self::Error> {
843-
self.tx.bwrite_all(bytes)
809+
fn bwrite_all(&mut self, buffer: &[u16]) -> Result<(), Self::Error> {
810+
self.tx.bwrite_all(buffer)
844811
}
845812

846813
fn bflush(&mut self) -> Result<(), Self::Error> {
@@ -854,8 +821,8 @@ where
854821
{
855822
type Error = Infallible;
856823

857-
fn bwrite_all(&mut self, bytes: &[u8]) -> Result<(), Self::Error> {
858-
self.tx.bwrite_all(bytes)
824+
fn bwrite_all(&mut self, buffer: &[u8]) -> Result<(), Self::Error> {
825+
self.tx.bwrite_all(buffer)
859826
}
860827

861828
fn bflush(&mut self) -> Result<(), Self::Error> {

0 commit comments

Comments
 (0)