Skip to content

Commit f3a08d8

Browse files
committed
refactor(uart): add enable_uart clock configurator
Signed-off-by: Zhouqi Jiang <[email protected]>
1 parent b3c4caf commit f3a08d8

File tree

7 files changed

+75
-54
lines changed

7 files changed

+75
-54
lines changed

allwinner-hal/src/uart/blocking.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ impl<'a> Serial<'a> {
1919
uart: impl Instance<'a>,
2020
pads: impl Pads<'a, I>,
2121
config: impl Into<Config>,
22-
clock: impl Clock,
22+
clock: impl Clock<I>,
2323
) -> Serial<'a> {
2424
// 1. unwrap parameters
2525
let Config {

allwinner-hal/src/uart/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub trait UartExt<'a, const I: usize> {
2121
self,
2222
pads: impl Pads<'a, I>,
2323
config: impl Into<Config>,
24-
clock: impl Clock,
24+
clock: impl Clock<I>,
2525
) -> BlockingSerial<'a>;
2626
}
2727

@@ -62,8 +62,8 @@ where
6262
}
6363
}
6464

65-
/// Valid clock input for UART peripheral.
66-
pub trait Clock {
65+
/// Valid clock input for UART peripheral `I`.
66+
pub trait Clock<const I: usize> {
6767
/// UART clock frequency in hertz.
6868
fn uart_clock(&self) -> Hertz;
6969
}

allwinner-rt/src/macros.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ macro_rules! impl_uart {
8484
self,
8585
pads: impl allwinner_hal::uart::Pads<'a, $i>,
8686
config: impl Into<allwinner_hal::uart::Config>,
87-
clock: impl allwinner_hal::uart::Clock,
87+
clock: impl allwinner_hal::uart::Clock<$i>,
8888
) -> allwinner_hal::uart::BlockingSerial<'a> {
8989
allwinner_hal::uart::BlockingSerial::new(self, pads, config, clock)
9090
}
@@ -95,7 +95,7 @@ macro_rules! impl_uart {
9595
self,
9696
pads: impl allwinner_hal::uart::Pads<'static, $i>,
9797
config: impl Into<allwinner_hal::uart::Config>,
98-
clock: impl allwinner_hal::uart::Clock,
98+
clock: impl allwinner_hal::uart::Clock<$i>,
9999
) -> allwinner_hal::uart::BlockingSerial<'static> {
100100
allwinner_hal::uart::BlockingSerial::new(self, pads, config, clock)
101101
}

allwinner-rt/src/soc/d1.rs

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
//! D1-H, D1s, F133, F133A/B chip platforms.
22
3+
mod clock;
4+
5+
pub use clock::{Clocks, UartClock};
6+
37
use allwinner_hal::{gpio::PadExt, uart::UartExt};
48
use core::num::NonZeroU32;
5-
use embedded_time::rate::{Extensions, Hertz};
9+
use embedded_time::rate::Extensions;
610

711
/// ROM runtime peripheral ownership and configurations.
812
pub struct Peripherals {
@@ -288,44 +292,6 @@ impl_spi_pads! {
288292
// ('C', 7, 3): smhc::Data<3>;
289293
// }
290294

291-
/// ROM clock configuration on current SoC.
292-
#[derive(Debug)]
293-
pub struct Clocks {
294-
/// PSI clock frequency.
295-
pub psi: Hertz,
296-
/// Advanced Peripheral Bus 1 clock frequency.
297-
pub apb1: Hertz,
298-
}
299-
300-
impl allwinner_hal::uart::Clock for Clocks {
301-
#[inline]
302-
fn uart_clock(&self) -> embedded_time::rate::Hertz {
303-
self.apb1
304-
}
305-
}
306-
307-
impl<'a> allwinner_hal::uart::Clock for &'a Clocks {
308-
#[inline]
309-
fn uart_clock(&self) -> embedded_time::rate::Hertz {
310-
self.apb1
311-
}
312-
}
313-
314-
impl allwinner_hal::spi::Clock for Clocks {
315-
#[inline]
316-
fn spi_clock(&self) -> embedded_time::rate::Hertz {
317-
// TODO calculate from more clock parameters
318-
self.psi
319-
}
320-
}
321-
322-
impl allwinner_hal::smhc::Clock for Clocks {
323-
#[inline]
324-
fn smhc_clock(&self) -> embedded_time::rate::Hertz {
325-
self.psi
326-
}
327-
}
328-
329295
#[doc(hidden)]
330296
#[inline]
331297
pub fn __rom_init_params() -> (Peripherals, Clocks) {

allwinner-rt/src/soc/d1/clock.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use super::CCU;
2+
use embedded_time::rate::Hertz;
3+
4+
/// ROM clock configuration on current SoC.
5+
#[derive(Debug)]
6+
pub struct Clocks {
7+
/// PSI clock frequency.
8+
pub psi: Hertz,
9+
/// Advanced Peripheral Bus 1 clock frequency.
10+
pub apb1: Hertz,
11+
}
12+
13+
impl Clocks {
14+
/// Enable clock of UART `I`.
15+
#[inline]
16+
pub fn enable_uart<const I: usize>(&self, ccu: &CCU) -> UartClock<I> {
17+
unsafe {
18+
ccu.uart_bgr
19+
.modify(|v| v.gate_pass::<0>().deassert_reset::<0>())
20+
};
21+
UartClock { apb1: self.apb1 }
22+
}
23+
}
24+
25+
// No UART clock; should enable first.
26+
27+
impl allwinner_hal::spi::Clock for Clocks {
28+
#[inline]
29+
fn spi_clock(&self) -> embedded_time::rate::Hertz {
30+
// TODO calculate from more clock parameters
31+
self.psi
32+
}
33+
}
34+
35+
impl allwinner_hal::smhc::Clock for Clocks {
36+
#[inline]
37+
fn smhc_clock(&self) -> embedded_time::rate::Hertz {
38+
self.psi
39+
}
40+
}
41+
42+
/// Dynamic configurated clock configuration on current SoC.
43+
pub struct UartClock<const I: usize> {
44+
/// Inherited from Advanced Peripheral Bus 1 clock frequency.
45+
apb1: Hertz,
46+
}
47+
48+
impl<const I: usize> allwinner_hal::uart::Clock<I> for UartClock<I> {
49+
#[inline]
50+
fn uart_clock(&self) -> embedded_time::rate::Hertz {
51+
self.apb1
52+
}
53+
}
54+
55+
impl<'a, const I: usize> allwinner_hal::uart::Clock<I> for &'a UartClock<I> {
56+
#[inline]
57+
fn uart_clock(&self) -> embedded_time::rate::Hertz {
58+
self.apb1
59+
}
60+
}

examples/nezha-d1/src/bin/sdmmc.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ impl embedded_sdmmc::TimeSource for MyTimeSource {
2121

2222
#[entry]
2323
fn main(p: Peripherals, c: Clocks) {
24+
let clk = c.enable_uart(&p.ccu);
2425
let pads = (p.gpio.pb8, p.gpio.pb9);
25-
let mut serial = p.uart0.serial(pads, Config::default(), &c);
26+
let mut serial = p.uart0.serial(pads, Config::default(), &clk);
2627

2728
writeln!(serial, "Hello World!").ok();
2829

examples/nezha-d1/src/bin/uart.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,9 @@ use allwinner_rt::{Clocks, Peripherals, entry};
66

77
#[entry]
88
fn main(p: Peripherals, c: Clocks) {
9-
// TODO make it clean
10-
unsafe {
11-
p.ccu
12-
.uart_bgr
13-
.modify(|v| v.gate_pass::<0>().deassert_reset::<0>())
14-
};
15-
9+
let clk = c.enable_uart(&p.ccu);
1610
let pads = (p.gpio.pb8, p.gpio.pb9);
17-
let mut serial = p.uart0.serial(pads, Config::default(), &c);
11+
let mut serial = p.uart0.serial(pads, Config::default(), &clk);
1812

1913
writeln!(serial, "Hello World!").ok();
2014

0 commit comments

Comments
 (0)