nrf/uart: make rts/cts optional.
This commit is contained in:
parent
e7e34cb8c2
commit
a0511e6caa
@ -78,7 +78,7 @@ macro_rules! peripherals {
|
|||||||
macro_rules! unborrow {
|
macro_rules! unborrow {
|
||||||
($($name:ident),*) => {
|
($($name:ident),*) => {
|
||||||
$(
|
$(
|
||||||
let $name = unsafe { $name.unborrow() };
|
let mut $name = unsafe { $name.unborrow() };
|
||||||
)*
|
)*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#[path = "../example_common.rs"]
|
#[path = "../example_common.rs"]
|
||||||
mod example_common;
|
mod example_common;
|
||||||
|
use embassy_nrf::gpio::NoPin;
|
||||||
use example_common::*;
|
use example_common::*;
|
||||||
|
|
||||||
use cortex_m_rt::entry;
|
use cortex_m_rt::entry;
|
||||||
@ -29,8 +30,7 @@ async fn run() {
|
|||||||
config.baudrate = uarte::Baudrate::BAUD115200;
|
config.baudrate = uarte::Baudrate::BAUD115200;
|
||||||
|
|
||||||
let irq = interrupt::take!(UARTE0_UART0);
|
let irq = interrupt::take!(UARTE0_UART0);
|
||||||
let uart =
|
let uart = unsafe { uarte::Uarte::new(p.uarte0, irq, p.p0_08, p.p0_06, NoPin, NoPin, config) };
|
||||||
unsafe { uarte::Uarte::new(p.uarte0, irq, p.p0_08, p.p0_06, p.p0_07, p.p0_05, config) };
|
|
||||||
pin_mut!(uart);
|
pin_mut!(uart);
|
||||||
|
|
||||||
info!("uarte initialized!");
|
info!("uarte initialized!");
|
||||||
|
@ -1,8 +1,4 @@
|
|||||||
//! Async low power UARTE.
|
//! Async UART
|
||||||
//!
|
|
||||||
//! The peripheral is automatically enabled and disabled as required to save power.
|
|
||||||
//! Lowest power consumption can only be guaranteed if the send receive futures
|
|
||||||
//! are dropped correctly (e.g. not using `mem::forget()`).
|
|
||||||
|
|
||||||
use core::future::Future;
|
use core::future::Future;
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
@ -10,12 +6,13 @@ use core::pin::Pin;
|
|||||||
use core::sync::atomic::{compiler_fence, Ordering};
|
use core::sync::atomic::{compiler_fence, Ordering};
|
||||||
use core::task::Poll;
|
use core::task::Poll;
|
||||||
use embassy::traits::uart::{Error, Read, Write};
|
use embassy::traits::uart::{Error, Read, Write};
|
||||||
use embassy::util::{wake_on_interrupt, OnDrop, PeripheralBorrow, Signal};
|
use embassy::util::{wake_on_interrupt, OnDrop, PeripheralBorrow};
|
||||||
use embassy_extras::unborrow;
|
use embassy_extras::unborrow;
|
||||||
use futures::future::poll_fn;
|
use futures::future::poll_fn;
|
||||||
|
|
||||||
use crate::fmt::{assert, *};
|
use crate::fmt::{assert, *};
|
||||||
use crate::gpio::Pin as GpioPin;
|
use crate::gpio::sealed::Pin as _;
|
||||||
|
use crate::gpio::{OptionalPin as GpioOptionalPin, Pin as GpioPin};
|
||||||
use crate::hal::pac;
|
use crate::hal::pac;
|
||||||
use crate::hal::target_constants::EASY_DMA_SIZE;
|
use crate::hal::target_constants::EASY_DMA_SIZE;
|
||||||
use crate::interrupt;
|
use crate::interrupt;
|
||||||
@ -62,8 +59,8 @@ impl<'d, T: Instance> Uarte<'d, T> {
|
|||||||
irq: impl PeripheralBorrow<Target = T::Interrupt> + 'd,
|
irq: impl PeripheralBorrow<Target = T::Interrupt> + 'd,
|
||||||
rxd: impl PeripheralBorrow<Target = impl GpioPin> + 'd,
|
rxd: impl PeripheralBorrow<Target = impl GpioPin> + 'd,
|
||||||
txd: impl PeripheralBorrow<Target = impl GpioPin> + 'd,
|
txd: impl PeripheralBorrow<Target = impl GpioPin> + 'd,
|
||||||
cts: impl PeripheralBorrow<Target = impl GpioPin> + 'd,
|
cts: impl PeripheralBorrow<Target = impl GpioOptionalPin> + 'd,
|
||||||
rts: impl PeripheralBorrow<Target = impl GpioPin> + 'd,
|
rts: impl PeripheralBorrow<Target = impl GpioOptionalPin> + 'd,
|
||||||
config: Config,
|
config: Config,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
unborrow!(uarte, irq, rxd, txd, cts, rts);
|
unborrow!(uarte, irq, rxd, txd, cts, rts);
|
||||||
@ -72,19 +69,23 @@ impl<'d, T: Instance> Uarte<'d, T> {
|
|||||||
|
|
||||||
assert!(r.enable.read().enable().is_disabled());
|
assert!(r.enable.read().enable().is_disabled());
|
||||||
|
|
||||||
// TODO OptionalPin for RTS/CTS.
|
rxd.conf().write(|w| w.input().connect().drive().h0h1());
|
||||||
|
r.psel.rxd.write(|w| unsafe { w.bits(rxd.psel_bits()) });
|
||||||
|
|
||||||
txd.set_high();
|
txd.set_high();
|
||||||
rts.set_high();
|
|
||||||
rxd.conf().write(|w| w.input().connect().drive().h0h1());
|
|
||||||
txd.conf().write(|w| w.dir().output().drive().h0h1());
|
txd.conf().write(|w| w.dir().output().drive().h0h1());
|
||||||
//cts.conf().write(|w| w.input().connect().drive().h0h1());
|
|
||||||
//rts.conf().write(|w| w.dir().output().drive().h0h1());
|
|
||||||
|
|
||||||
r.psel.rxd.write(|w| unsafe { w.bits(rxd.psel_bits()) });
|
|
||||||
r.psel.txd.write(|w| unsafe { w.bits(txd.psel_bits()) });
|
r.psel.txd.write(|w| unsafe { w.bits(txd.psel_bits()) });
|
||||||
//r.psel.cts.write(|w| unsafe { w.bits(cts.psel_bits()) });
|
|
||||||
//r.psel.rts.write(|w| unsafe { w.bits(rts.psel_bits()) });
|
if let Some(pin) = rts.pin_mut() {
|
||||||
|
pin.set_high();
|
||||||
|
pin.conf().write(|w| w.dir().output().drive().h0h1());
|
||||||
|
}
|
||||||
|
r.psel.cts.write(|w| unsafe { w.bits(cts.psel_bits()) });
|
||||||
|
|
||||||
|
if let Some(pin) = cts.pin_mut() {
|
||||||
|
pin.conf().write(|w| w.input().connect().drive().h0h1());
|
||||||
|
}
|
||||||
|
r.psel.rts.write(|w| unsafe { w.bits(rts.psel_bits()) });
|
||||||
|
|
||||||
r.baudrate.write(|w| w.baudrate().variant(config.baudrate));
|
r.baudrate.write(|w| w.baudrate().variant(config.baudrate));
|
||||||
r.config.write(|w| w.parity().variant(config.parity));
|
r.config.write(|w| w.parity().variant(config.parity));
|
||||||
@ -98,64 +99,15 @@ impl<'d, T: Instance> Uarte<'d, T> {
|
|||||||
phantom: PhantomData,
|
phantom: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
impl<'d, T: Instance> Drop for Uarte<'d, T> {
|
||||||
unsafe fn on_irq(_ctx: *mut ()) {
|
fn drop(&mut self) {
|
||||||
let uarte = &*pac::UARTE0::ptr();
|
let r = self.peri.regs();
|
||||||
|
r.enable.write(|w| w.enable().disabled());
|
||||||
|
|
||||||
let mut try_disable = false;
|
// todo disable pins
|
||||||
|
|
||||||
if uarte.events_endtx.read().bits() != 0 {
|
|
||||||
uarte.events_endtx.reset();
|
|
||||||
trace!("endtx");
|
|
||||||
compiler_fence(Ordering::SeqCst);
|
|
||||||
|
|
||||||
if uarte.events_txstarted.read().bits() != 0 {
|
|
||||||
// The ENDTX was signal triggered because DMA has finished.
|
|
||||||
uarte.events_txstarted.reset();
|
|
||||||
try_disable = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
T::state().tx_done.signal(());
|
|
||||||
}
|
|
||||||
|
|
||||||
if uarte.events_txstopped.read().bits() != 0 {
|
|
||||||
uarte.events_txstopped.reset();
|
|
||||||
trace!("txstopped");
|
|
||||||
try_disable = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if uarte.events_endrx.read().bits() != 0 {
|
|
||||||
uarte.events_endrx.reset();
|
|
||||||
trace!("endrx");
|
|
||||||
let len = uarte.rxd.amount.read().bits();
|
|
||||||
compiler_fence(Ordering::SeqCst);
|
|
||||||
|
|
||||||
if uarte.events_rxstarted.read().bits() != 0 {
|
|
||||||
// The ENDRX was signal triggered because DMA buffer is full.
|
|
||||||
uarte.events_rxstarted.reset();
|
|
||||||
try_disable = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
T::state().rx_done.signal(len);
|
|
||||||
}
|
|
||||||
|
|
||||||
if uarte.events_rxto.read().bits() != 0 {
|
|
||||||
uarte.events_rxto.reset();
|
|
||||||
trace!("rxto");
|
|
||||||
try_disable = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disable the peripheral if not active.
|
|
||||||
if try_disable
|
|
||||||
&& uarte.events_txstarted.read().bits() == 0
|
|
||||||
&& uarte.events_rxstarted.read().bits() == 0
|
|
||||||
{
|
|
||||||
trace!("disable");
|
|
||||||
uarte.enable.write(|w| w.enable().disabled());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: Instance> Read for Uarte<'d, T> {
|
impl<'d, T: Instance> Read for Uarte<'d, T> {
|
||||||
|
Loading…
Reference in New Issue
Block a user