better naming #12

Merged
muellerr merged 1 commits from better-naming into main 2025-09-03 10:09:32 +02:00
24 changed files with 592 additions and 572 deletions

View File

@@ -8,9 +8,26 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
## [unreleased] ## [unreleased]
## [v0.2.0]
Renamed to `vorago-shared-hal`
### Changed
- Various renaming to be more in-line with common Embedded Rust naming conventions.
- `PinId` -> `DynPinId`
- `PinIdProvider` -> `PinId`
- `FunSel` -> `FunctionSelect`
- `PinMarker` -> `AnyPin`
- Peripheral traits renamed from `*Marker` to `*Instance`
- `Clk` abbreviation in names changed to `Clock`
- `Cmd` abbreviation in names changed to `Command`
- `Irq` abbreviation in names changed to `Interrupt`
## [v0.1.0] 2025-09-02 ## [v0.1.0] 2025-09-02
Init commit. Init commit.
[unreleased]: https://egit.irs.uni-stuttgart.de/rust/va108xx-rs/compare/v0.1.0...HEAD [unreleased]: https://egit.irs.uni-stuttgart.de/rust/vorago-shared-periphs/compare/v0.1.0...HEAD
[unreleased]: https://egit.irs.uni-stuttgart.de/rust/vorago-shared-periphs/compare/v0.1.0...v0.2.0
[v0.1.0]: https://egit.irs.uni-stuttgart.de/rust/vorago-shared-periphs/src/tag/v0.1.0 [v0.1.0]: https://egit.irs.uni-stuttgart.de/rust/vorago-shared-periphs/src/tag/v0.1.0

View File

@@ -1,7 +1,7 @@
[package] [package]
name = "vorago-shared-periphs" name = "vorago-shared-hal"
version = "0.1.0" version = "0.1.0"
description = "Peripheral drivers shared between Vorago families" description = "Peripheral HAL components shared between Vorago families"
edition = "2024" edition = "2024"
homepage = "https://egit.irs.uni-stuttgart.de/rust/vorago-shared-periphs" homepage = "https://egit.irs.uni-stuttgart.de/rust/vorago-shared-periphs"
repository = "https://egit.irs.uni-stuttgart.de/rust/vorago-shared-periphs" repository = "https://egit.irs.uni-stuttgart.de/rust/vorago-shared-periphs"

View File

@@ -3,7 +3,7 @@ use core::cell::{Cell, RefCell};
use crate::{ use crate::{
enable_nvic_interrupt, enable_nvic_interrupt,
timer::{ timer::{
TimId, TimMarker, assert_tim_reset_for_cycles, enable_tim_clk, TimId, TimInstance, assert_tim_reset_for_cycles, enable_tim_clk,
regs::{EnableControl, MmioTimer}, regs::{EnableControl, MmioTimer},
}, },
}; };
@@ -59,7 +59,7 @@ pub struct TimerDriver {
impl TimerDriver { impl TimerDriver {
#[cfg(feature = "vor1x")] #[cfg(feature = "vor1x")]
#[doc(hidden)] #[doc(hidden)]
pub fn __init<TimekeeperTim: TimMarker, AlarmTim: TimMarker>( pub fn __init<TimekeeperTim: TimInstance, AlarmTim: TimInstance>(
&self, &self,
sysclk: Hertz, sysclk: Hertz,
_timekeeper_tim: TimekeeperTim, _timekeeper_tim: TimekeeperTim,
@@ -117,7 +117,7 @@ impl TimerDriver {
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
#[doc(hidden)] #[doc(hidden)]
pub fn __init<TimekeeperTim: TimMarker, AlarmTim: TimMarker>( pub fn __init<TimekeeperTim: TimInstance, AlarmTim: TimInstance>(
&self, &self,
_timekeeper_tim: TimekeeperTim, _timekeeper_tim: TimekeeperTim,
_alarm_tim: AlarmTim, _alarm_tim: AlarmTim,

View File

@@ -26,7 +26,7 @@ use va108xx as pac;
pub use super::ll::InterruptEdge; pub use super::ll::InterruptEdge;
use super::{ use super::{
Input, Port, Input, Port,
ll::{LowLevelGpio, PinId}, ll::{DynPinId, LowLevelGpio},
}; };
cfg_if::cfg_if! { cfg_if::cfg_if! {
@@ -146,7 +146,7 @@ fn on_interrupt_for_port(
/// which also implements the [embedded_hal_async::digital::Wait] trait. However, access to this /// which also implements the [embedded_hal_async::digital::Wait] trait. However, access to this
/// struture is granted to allow writing custom async structures. /// struture is granted to allow writing custom async structures.
pub struct InputPinFuture { pub struct InputPinFuture {
id: PinId, id: DynPinId,
waker_group: &'static [AtomicWaker], waker_group: &'static [AtomicWaker],
edge_detection_group: &'static [AtomicBool], edge_detection_group: &'static [AtomicBool],
} }

View File

@@ -1,6 +1,6 @@
pub use embedded_hal::digital::PinState; pub use embedded_hal::digital::PinState;
use crate::ioconfig::FilterClkSel; use crate::ioconfig::FilterClockSelect;
use crate::ioconfig::FilterType; use crate::ioconfig::FilterType;
#[cfg(feature = "vor1x")] #[cfg(feature = "vor1x")]
use crate::{PeripheralSelect, sysconfig::enable_peripheral_clock}; use crate::{PeripheralSelect, sysconfig::enable_peripheral_clock};
@@ -8,10 +8,10 @@ use crate::{PeripheralSelect, sysconfig::enable_peripheral_clock};
pub use crate::InvalidOffsetError; pub use crate::InvalidOffsetError;
pub use crate::Port; pub use crate::Port;
pub use crate::ioconfig::regs::Pull; pub use crate::ioconfig::regs::Pull;
use crate::ioconfig::regs::{FunSel, IoConfig, MmioIoConfig}; use crate::ioconfig::regs::{FunctionSelect, IoConfig, MmioIoConfig};
use crate::pins::PinId;
use super::Pin; use super::Pin;
use super::PinIdProvider;
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
@@ -31,7 +31,7 @@ pub enum InterruptLevel {
/// Pin identifier for all physical pins exposed by Vorago MCUs. /// Pin identifier for all physical pins exposed by Vorago MCUs.
#[derive(Debug, PartialEq, Eq, Clone, Copy)] #[derive(Debug, PartialEq, Eq, Clone, Copy)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct PinId { pub struct DynPinId {
port: Port, port: Port,
/// Offset within the port. /// Offset within the port.
offset: u8, offset: u8,
@@ -43,13 +43,13 @@ pub struct PinId {
#[error("port G does not support interrupts")] #[error("port G does not support interrupts")]
pub struct PortDoesNotSupportInterrupts; pub struct PortDoesNotSupportInterrupts;
impl PinId { impl DynPinId {
/// Unchecked constructor which panics on invalid offsets. /// Unchecked constructor which panics on invalid offsets.
pub const fn new_unchecked(port: Port, offset: usize) -> Self { pub const fn new_unchecked(port: Port, offset: usize) -> Self {
if offset >= port.max_offset() { if offset >= port.max_offset() {
panic!("Pin ID construction: offset is out of range"); panic!("Pin ID construction: offset is out of range");
} }
PinId { DynPinId {
port, port,
offset: offset as u8, offset: offset as u8,
} }
@@ -59,7 +59,7 @@ impl PinId {
if offset >= port.max_offset() { if offset >= port.max_offset() {
return Err(InvalidOffsetError { offset, port }); return Err(InvalidOffsetError { offset, port });
} }
Ok(PinId { Ok(DynPinId {
port, port,
offset: offset as u8, offset: offset as u8,
}) })
@@ -209,7 +209,7 @@ impl PinId {
pub struct LowLevelGpio { pub struct LowLevelGpio {
gpio: super::regs::MmioGpio<'static>, gpio: super::regs::MmioGpio<'static>,
ioconfig: MmioIoConfig<'static>, ioconfig: MmioIoConfig<'static>,
id: PinId, id: DynPinId,
} }
impl core::fmt::Debug for LowLevelGpio { impl core::fmt::Debug for LowLevelGpio {
@@ -225,12 +225,12 @@ impl LowLevelGpio {
/// Create a new low-level GPIO pin instance from a given [Pin]. /// Create a new low-level GPIO pin instance from a given [Pin].
/// ///
/// Can be used for performing resource management of the [Pin]s. /// Can be used for performing resource management of the [Pin]s.
pub fn new_with_pin<I: PinIdProvider>(_pin: Pin<I>) -> Self { pub fn new_with_pin<I: PinId>(_pin: Pin<I>) -> Self {
Self::new(I::ID) Self::new(I::ID)
} }
/// Create a new low-level GPIO pin instance using only the [PinId]. /// Create a new low-level GPIO pin instance using only the [PinId].
pub fn new(id: PinId) -> Self { pub fn new(id: DynPinId) -> Self {
LowLevelGpio { LowLevelGpio {
gpio: super::regs::Gpio::new_mmio(id.port), gpio: super::regs::Gpio::new_mmio(id.port),
ioconfig: IoConfig::new_mmio(), ioconfig: IoConfig::new_mmio(),
@@ -239,7 +239,7 @@ impl LowLevelGpio {
} }
#[inline] #[inline]
pub fn id(&self) -> PinId { pub fn id(&self) -> DynPinId {
self.id self.id
} }
@@ -255,7 +255,7 @@ impl LowLevelGpio {
pub fn configure_as_input_floating(&mut self) { pub fn configure_as_input_floating(&mut self) {
self.ioconfig.modify_pin_config(self.id, |mut config| { self.ioconfig.modify_pin_config(self.id, |mut config| {
config.set_funsel(FunSel::Sel0); config.set_funsel(FunctionSelect::Sel0);
config.set_io_disable(false); config.set_io_disable(false);
config.set_invert_input(false); config.set_invert_input(false);
config.set_open_drain(false); config.set_open_drain(false);
@@ -273,7 +273,7 @@ impl LowLevelGpio {
pub fn configure_as_input_with_pull(&mut self, pull: Pull) { pub fn configure_as_input_with_pull(&mut self, pull: Pull) {
self.ioconfig.modify_pin_config(self.id, |mut config| { self.ioconfig.modify_pin_config(self.id, |mut config| {
config.set_funsel(FunSel::Sel0); config.set_funsel(FunctionSelect::Sel0);
config.set_io_disable(false); config.set_io_disable(false);
config.set_invert_input(false); config.set_invert_input(false);
config.set_open_drain(false); config.set_open_drain(false);
@@ -292,7 +292,7 @@ impl LowLevelGpio {
pub fn configure_as_output_push_pull(&mut self, init_level: PinState) { pub fn configure_as_output_push_pull(&mut self, init_level: PinState) {
self.ioconfig.modify_pin_config(self.id, |mut config| { self.ioconfig.modify_pin_config(self.id, |mut config| {
config.set_funsel(FunSel::Sel0); config.set_funsel(FunctionSelect::Sel0);
config.set_io_disable(false); config.set_io_disable(false);
config.set_invert_input(false); config.set_invert_input(false);
config.set_open_drain(false); config.set_open_drain(false);
@@ -314,7 +314,7 @@ impl LowLevelGpio {
pub fn configure_as_output_open_drain(&mut self, init_level: PinState) { pub fn configure_as_output_open_drain(&mut self, init_level: PinState) {
self.ioconfig.modify_pin_config(self.id, |mut config| { self.ioconfig.modify_pin_config(self.id, |mut config| {
config.set_funsel(FunSel::Sel0); config.set_funsel(FunctionSelect::Sel0);
config.set_io_disable(false); config.set_io_disable(false);
config.set_invert_input(false); config.set_invert_input(false);
config.set_open_drain(true); config.set_open_drain(true);
@@ -336,7 +336,7 @@ impl LowLevelGpio {
}); });
} }
pub fn configure_as_peripheral_pin(&mut self, fun_sel: FunSel, pull: Option<Pull>) { pub fn configure_as_peripheral_pin(&mut self, fun_sel: FunctionSelect, pull: Option<Pull>) {
self.ioconfig.modify_pin_config(self.id, |mut config| { self.ioconfig.modify_pin_config(self.id, |mut config| {
config.set_funsel(fun_sel); config.set_funsel(fun_sel);
config.set_io_disable(false); config.set_io_disable(false);
@@ -487,7 +487,7 @@ impl LowLevelGpio {
/// Only useful for input pins /// Only useful for input pins
#[inline] #[inline]
pub fn configure_filter_type(&mut self, filter: FilterType, clksel: FilterClkSel) { pub fn configure_filter_type(&mut self, filter: FilterType, clksel: FilterClockSelect) {
self.ioconfig.modify_pin_config(self.id, |mut config| { self.ioconfig.modify_pin_config(self.id, |mut config| {
config.set_filter_type(filter); config.set_filter_type(filter);
config.set_filter_clk_sel(clksel); config.set_filter_clk_sel(clksel);

View File

@@ -1,53 +1,21 @@
//! GPIO support module. //! GPIO support module.
use core::convert::Infallible; use core::convert::Infallible;
pub use crate::ioconfig::{FilterClkSel, FilterType, regs::FunSel}; pub use crate::ioconfig::{FilterClockSelect, FilterType, regs::FunctionSelect};
pub use crate::pins::{Pin, PinId};
pub use embedded_hal::digital::PinState; pub use embedded_hal::digital::PinState;
pub use ll::{InterruptEdge, InterruptLevel, PinId, Port, Pull}; pub use ll::{DynPinId, InterruptEdge, InterruptLevel, Port, Pull};
pub mod asynch; pub mod asynch;
pub mod ll; pub mod ll;
pub mod regs; pub mod regs;
/// Trait implemented by data structures assocaited with pin identifiacation.
pub trait PinIdProvider {
const ID: ll::PinId;
}
/// Primary Pin structure for the physical pins exposed by Vorago MCUs.
///
/// This pin structure is only used for resource management and does not do anything on its
/// own.
pub struct Pin<I: PinIdProvider> {
phantom: core::marker::PhantomData<I>,
}
impl<I: PinIdProvider> Pin<I> {
#[allow(clippy::new_without_default)]
#[doc(hidden)]
pub const fn __new() -> Self {
Self {
phantom: core::marker::PhantomData,
}
}
/// Create a new pin instance.
///
/// # Safety
///
/// This circumvents ownership rules of the HAL and allows creating multiple instances
/// of the same pin.
pub const unsafe fn steal() -> Self {
Self::__new()
}
}
/// Push-Pull output pin. /// Push-Pull output pin.
#[derive(Debug)] #[derive(Debug)]
pub struct Output(ll::LowLevelGpio); pub struct Output(ll::LowLevelGpio);
impl Output { impl Output {
pub fn new<I: PinIdProvider>(_pin: Pin<I>, init_level: PinState) -> Self { pub fn new<I: PinId>(_pin: Pin<I>, init_level: PinState) -> Self {
let mut ll = ll::LowLevelGpio::new(I::ID); let mut ll = ll::LowLevelGpio::new(I::ID);
ll.configure_as_output_push_pull(init_level); ll.configure_as_output_push_pull(init_level);
Output(ll) Output(ll)
@@ -139,20 +107,20 @@ impl embedded_hal::digital::StatefulOutputPin for Output {
pub struct Input(ll::LowLevelGpio); pub struct Input(ll::LowLevelGpio);
impl Input { impl Input {
pub fn new_floating<I: PinIdProvider>(_pin: Pin<I>) -> Self { pub fn new_floating<I: PinId>(_pin: Pin<I>) -> Self {
let mut ll = ll::LowLevelGpio::new(I::ID); let mut ll = ll::LowLevelGpio::new(I::ID);
ll.configure_as_input_floating(); ll.configure_as_input_floating();
Input(ll) Input(ll)
} }
pub fn new_with_pull<I: PinIdProvider>(_pin: Pin<I>, pull: Pull) -> Self { pub fn new_with_pull<I: PinId>(_pin: Pin<I>, pull: Pull) -> Self {
let mut ll = ll::LowLevelGpio::new(I::ID); let mut ll = ll::LowLevelGpio::new(I::ID);
ll.configure_as_input_with_pull(pull); ll.configure_as_input_with_pull(pull);
Input(ll) Input(ll)
} }
#[inline] #[inline]
pub fn id(&self) -> PinId { pub fn id(&self) -> DynPinId {
self.0.id() self.0.id()
} }
@@ -187,7 +155,7 @@ impl Input {
} }
#[inline] #[inline]
pub fn configure_filter_type(&mut self, filter: FilterType, clksel: FilterClkSel) { pub fn configure_filter_type(&mut self, filter: FilterType, clksel: FilterClockSelect) {
self.0.configure_filter_type(filter, clksel); self.0.configure_filter_type(filter, clksel);
} }
@@ -252,7 +220,7 @@ pub struct Flex {
} }
impl Flex { impl Flex {
pub fn new<I: PinIdProvider>(_pin: Pin<I>) -> Self { pub fn new<I: PinId>(_pin: Pin<I>) -> Self {
let mut ll = ll::LowLevelGpio::new(I::ID); let mut ll = ll::LowLevelGpio::new(I::ID);
ll.configure_as_input_floating(); ll.configure_as_input_floating();
Flex { Flex {
@@ -360,13 +328,13 @@ impl embedded_hal::digital::StatefulOutputPin for Flex {
/// Can be used to configure pins as IO peripheral pins. /// Can be used to configure pins as IO peripheral pins.
pub struct IoPeriphPin { pub struct IoPeriphPin {
ll: ll::LowLevelGpio, ll: ll::LowLevelGpio,
fun_sel: FunSel, fun_sel: FunctionSelect,
} }
impl IoPeriphPin { impl IoPeriphPin {
pub fn new_with_pin<I: PinIdProvider>( pub fn new_with_pin<I: PinId>(
_pin: Pin<I>, _pin: Pin<I>,
fun_sel: FunSel, fun_sel: FunctionSelect,
pull: Option<Pull>, pull: Option<Pull>,
) -> Self { ) -> Self {
let mut ll = ll::LowLevelGpio::new(I::ID); let mut ll = ll::LowLevelGpio::new(I::ID);
@@ -374,7 +342,7 @@ impl IoPeriphPin {
IoPeriphPin { ll, fun_sel } IoPeriphPin { ll, fun_sel }
} }
pub fn new(pin_id: PinId, fun_sel: FunSel, pull: Option<Pull>) -> Self { pub fn new(pin_id: DynPinId, fun_sel: FunctionSelect, pull: Option<Pull>) -> Self {
let mut ll = ll::LowLevelGpio::new(pin_id); let mut ll = ll::LowLevelGpio::new(pin_id);
ll.configure_as_peripheral_pin(fun_sel, pull); ll.configure_as_peripheral_pin(fun_sel, pull);
IoPeriphPin { ll, fun_sel } IoPeriphPin { ll, fun_sel }
@@ -388,7 +356,7 @@ impl IoPeriphPin {
self.ll.offset() self.ll.offset()
} }
pub fn fun_sel(&self) -> FunSel { pub fn fun_sel(&self) -> FunctionSelect {
self.fun_sel self.fun_sel
} }
} }

View File

@@ -7,7 +7,7 @@ use crate::{
use arbitrary_int::{u4, u10, u11, u20}; use arbitrary_int::{u4, u10, u11, u20};
use core::marker::PhantomData; use core::marker::PhantomData;
use embedded_hal::i2c::{self, Operation, SevenBitAddress, TenBitAddress}; use embedded_hal::i2c::{self, Operation, SevenBitAddress, TenBitAddress};
use regs::ClkTimeoutLimit; use regs::ClockTimeoutLimit;
pub use regs::{Bank, I2cSpeed, RxFifoFullMode, TxFifoEmptyMode}; pub use regs::{Bank, I2cSpeed, RxFifoFullMode, TxFifoEmptyMode};
#[cfg(feature = "vor1x")] #[cfg(feature = "vor1x")]
@@ -60,7 +60,7 @@ pub enum InitError {
WrongAddrMode, WrongAddrMode,
/// APB1 clock is too slow for fast I2C mode. /// APB1 clock is too slow for fast I2C mode.
#[error("clock too slow for fast I2C mode: {0}")] #[error("clock too slow for fast I2C mode: {0}")]
ClkTooSlow(#[from] ClockTooSlowForFastI2cError), ClockTooSlow(#[from] ClockTooSlowForFastI2cError),
} }
impl embedded_hal::i2c::Error for Error { impl embedded_hal::i2c::Error for Error {
@@ -82,7 +82,7 @@ impl embedded_hal::i2c::Error for Error {
#[derive(Debug, PartialEq, Copy, Clone)] #[derive(Debug, PartialEq, Copy, Clone)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum I2cCmd { pub enum I2cCommand {
Start = 0b01, Start = 0b01,
Stop = 0b10, Stop = 0b10,
StartWithStop = 0b11, StartWithStop = 0b11,
@@ -113,7 +113,7 @@ impl I2cAddress {
/// Common trait implemented by all PAC peripheral access structures. The register block /// Common trait implemented by all PAC peripheral access structures. The register block
/// format is the same for all SPI blocks. /// format is the same for all SPI blocks.
pub trait I2cMarker: Sealed { pub trait I2cInstance: Sealed {
const ID: Bank; const ID: Bank;
const PERIPH_SEL: PeripheralSelect; const PERIPH_SEL: PeripheralSelect;
} }
@@ -123,7 +123,7 @@ pub type I2c0 = pac::I2ca;
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
pub type I2c0 = pac::I2c0; pub type I2c0 = pac::I2c0;
impl I2cMarker for I2c0 { impl I2cInstance for I2c0 {
const ID: Bank = Bank::I2c0; const ID: Bank = Bank::I2c0;
const PERIPH_SEL: PeripheralSelect = PeripheralSelect::I2c0; const PERIPH_SEL: PeripheralSelect = PeripheralSelect::I2c0;
} }
@@ -134,7 +134,7 @@ pub type I2c1 = pac::I2cb;
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
pub type I2c1 = pac::I2c1; pub type I2c1 = pac::I2c1;
impl I2cMarker for I2c1 { impl I2cInstance for I2c1 {
const ID: Bank = Bank::I2c1; const ID: Bank = Bank::I2c1;
const PERIPH_SEL: PeripheralSelect = PeripheralSelect::I2c1; const PERIPH_SEL: PeripheralSelect = PeripheralSelect::I2c1;
} }
@@ -291,7 +291,7 @@ pub struct I2cMaster<Addr = SevenBitAddress> {
} }
impl<Addr> I2cMaster<Addr> { impl<Addr> I2cMaster<Addr> {
pub fn new<I2c: I2cMarker>( pub fn new<I2c: I2cInstance>(
_i2c: I2c, _i2c: I2c,
#[cfg(feature = "vor1x")] sysclk: Hertz, #[cfg(feature = "vor1x")] sysclk: Hertz,
#[cfg(feature = "vor4x")] clks: &crate::clock::Clocks, #[cfg(feature = "vor4x")] clks: &crate::clock::Clocks,
@@ -306,7 +306,7 @@ impl<Addr> I2cMaster<Addr> {
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
let clk_div = calc_clk_div(clks, speed_mode)?; let clk_div = calc_clk_div(clks, speed_mode)?;
regs.write_clkscale( regs.write_clkscale(
regs::ClkScale::builder() regs::ClockScale::builder()
.with_div(clk_div) .with_div(clk_div)
.with_fastmode(speed_mode) .with_fastmode(speed_mode)
.build(), .build(),
@@ -344,7 +344,7 @@ impl<Addr> I2cMaster<Addr> {
.build(), .build(),
); );
if let Some(timeout) = cfg.timeout { if let Some(timeout) = cfg.timeout {
regs.write_clk_timeout_limit(ClkTimeoutLimit::new(timeout)); regs.write_clk_timeout_limit(ClockTimeoutLimit::new(timeout));
} }
let mut i2c_master = I2cMaster { let mut i2c_master = I2cMaster {
addr: PhantomData, addr: PhantomData,
@@ -377,7 +377,7 @@ impl<Addr> I2cMaster<Addr> {
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
let clk_div = calc_clk_div(clks, speed_mode)?; let clk_div = calc_clk_div(clks, speed_mode)?;
self.regs.write_clkscale( self.regs.write_clkscale(
regs::ClkScale::builder() regs::ClockScale::builder()
.with_div(clk_div) .with_div(clk_div)
.with_fastmode(speed_mode) .with_fastmode(speed_mode)
.build(), .build(),
@@ -426,13 +426,13 @@ impl<Addr> I2cMaster<Addr> {
#[inline] #[inline]
pub fn set_clock_low_timeout(&mut self, clock_cycles: u20) { pub fn set_clock_low_timeout(&mut self, clock_cycles: u20) {
self.regs self.regs
.write_clk_timeout_limit(ClkTimeoutLimit::new(clock_cycles)); .write_clk_timeout_limit(ClockTimeoutLimit::new(clock_cycles));
} }
#[inline] #[inline]
pub fn disable_clock_low_timeout(&mut self) { pub fn disable_clock_low_timeout(&mut self) {
self.regs self.regs
.write_clk_timeout_limit(ClkTimeoutLimit::new(u20::new(0))); .write_clk_timeout_limit(ClockTimeoutLimit::new(u20::new(0)));
} }
#[inline] #[inline]
@@ -467,7 +467,7 @@ impl<Addr> I2cMaster<Addr> {
} }
#[inline] #[inline]
pub fn write_command(&mut self, cmd: I2cCmd) { pub fn write_command(&mut self, cmd: I2cCommand) {
self.regs self.regs
.write_cmd(regs::Command::new_with_raw_value(cmd as u32)); .write_cmd(regs::Command::new_with_raw_value(cmd as u32));
} }
@@ -483,9 +483,9 @@ impl<Addr> I2cMaster<Addr> {
); );
} }
fn error_handler_write(&mut self, init_cmd: I2cCmd) { fn error_handler_write(&mut self, init_cmd: I2cCommand) {
if init_cmd == I2cCmd::Start { if init_cmd == I2cCommand::Start {
self.write_command(I2cCmd::Stop); self.write_command(I2cCommand::Stop);
} }
// The other case is start with stop where, so a CANCEL command should not be necessary // The other case is start with stop where, so a CANCEL command should not be necessary
// because the hardware takes care of it. // because the hardware takes care of it.
@@ -495,7 +495,7 @@ impl<Addr> I2cMaster<Addr> {
/// Blocking write transaction on the I2C bus. /// Blocking write transaction on the I2C bus.
pub fn write_blocking(&mut self, addr: I2cAddress, output: &[u8]) -> Result<(), Error> { pub fn write_blocking(&mut self, addr: I2cAddress, output: &[u8]) -> Result<(), Error> {
self.write_blocking_generic( self.write_blocking_generic(
I2cCmd::StartWithStop, I2cCommand::StartWithStop,
addr, addr,
output, output,
WriteCompletionCondition::Idle, WriteCompletionCondition::Idle,
@@ -522,7 +522,7 @@ impl<Addr> I2cMaster<Addr> {
let mut buf_iter = buffer.iter_mut(); let mut buf_iter = buffer.iter_mut();
let mut read_bytes = 0; let mut read_bytes = 0;
// Start receive transfer // Start receive transfer
self.write_command(I2cCmd::StartWithStop); self.write_command(I2cCommand::StartWithStop);
loop { loop {
let status = self.read_status(); let status = self.read_status();
if status.arb_lost() { if status.arb_lost() {
@@ -555,7 +555,7 @@ impl<Addr> I2cMaster<Addr> {
fn write_blocking_generic( fn write_blocking_generic(
&mut self, &mut self,
init_cmd: I2cCmd, init_cmd: I2cCommand,
addr: I2cAddress, addr: I2cAddress,
output: &[u8], output: &[u8],
end_condition: WriteCompletionCondition, end_condition: WriteCompletionCondition,
@@ -631,7 +631,7 @@ impl<Addr> I2cMaster<Addr> {
read: &mut [u8], read: &mut [u8],
) -> Result<(), Error> { ) -> Result<(), Error> {
self.write_blocking_generic( self.write_blocking_generic(
I2cCmd::Start, I2cCommand::Start,
address, address,
write, write,
WriteCompletionCondition::Waiting, WriteCompletionCondition::Waiting,

View File

@@ -93,7 +93,7 @@ pub enum I2cSpeed {
} }
#[bitbybit::bitfield(u32, default = 0x0, debug, defmt_fields(feature = "defmt"))] #[bitbybit::bitfield(u32, default = 0x0, debug, defmt_fields(feature = "defmt"))]
pub struct ClkScale { pub struct ClockScale {
/// Clock divide value. Reset value: 0x18. /// Clock divide value. Reset value: 0x18.
#[bits(0..=7, rw)] #[bits(0..=7, rw)]
div: u8, div: u8,
@@ -313,11 +313,11 @@ pub struct TimingConfig {
t_buf: u4, t_buf: u4,
} }
pub struct ClkTimeoutLimit(pub arbitrary_int::UInt<u32, 20>); pub struct ClockTimeoutLimit(pub arbitrary_int::UInt<u32, 20>);
impl ClkTimeoutLimit { impl ClockTimeoutLimit {
pub fn new(value: u20) -> Self { pub fn new(value: u20) -> Self {
ClkTimeoutLimit(arbitrary_int::UInt::<u32, 20>::new(value.value())) ClockTimeoutLimit(arbitrary_int::UInt::<u32, 20>::new(value.value()))
} }
pub fn value(&self) -> u20 { pub fn value(&self) -> u20 {
self.0 self.0
@@ -591,7 +591,7 @@ pub mod slave {
#[repr(C)] #[repr(C)]
pub struct I2c { pub struct I2c {
control: Control, control: Control,
clkscale: ClkScale, clkscale: ClockScale,
words: Words, words: Words,
address: Address, address: Address,
data: Data, data: Data,
@@ -617,7 +617,7 @@ pub struct I2c {
#[mmio(Write)] #[mmio(Write)]
fifo_clear: FifoClear, fifo_clear: FifoClear,
timing_config: TimingConfig, timing_config: TimingConfig,
clk_timeout_limit: ClkTimeoutLimit, clk_timeout_limit: ClockTimeoutLimit,
_reserved_0: [u32; 0x2D], _reserved_0: [u32; 0x2D],

View File

@@ -1,3 +1,3 @@
pub use regs::{FilterClkSel, FilterType}; pub use regs::{FilterClockSelect, FilterType};
pub mod regs; pub mod regs;

View File

@@ -1,6 +1,6 @@
use core::marker::PhantomData; use core::marker::PhantomData;
use crate::{NUM_PORT_A, NUM_PORT_B, gpio::PinId}; use crate::{NUM_PORT_A, NUM_PORT_B, gpio::DynPinId};
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
use crate::{NUM_PORT_DEFAULT, NUM_PORT_G}; use crate::{NUM_PORT_DEFAULT, NUM_PORT_G};
@@ -24,7 +24,7 @@ pub enum FilterType {
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
#[bitbybit::bitenum(u3, exhaustive = true)] #[bitbybit::bitenum(u3, exhaustive = true)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum FilterClkSel { pub enum FilterClockSelect {
SysClk = 0, SysClk = 0,
Clk1 = 1, Clk1 = 1,
Clk2 = 2, Clk2 = 2,
@@ -46,7 +46,7 @@ pub enum Pull {
#[derive(Debug, Eq, PartialEq)] #[derive(Debug, Eq, PartialEq)]
#[bitbybit::bitenum(u2, exhaustive = true)] #[bitbybit::bitenum(u2, exhaustive = true)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum FunSel { pub enum FunctionSelect {
Sel0 = 0b00, Sel0 = 0b00,
Sel1 = 0b01, Sel1 = 0b01,
Sel2 = 0b10, Sel2 = 0b10,
@@ -58,7 +58,7 @@ pub struct Config {
#[bit(16, rw)] #[bit(16, rw)]
io_disable: bool, io_disable: bool,
#[bits(13..=14, rw)] #[bits(13..=14, rw)]
funsel: FunSel, funsel: FunctionSelect,
#[bit(12, rw)] #[bit(12, rw)]
pull_when_output_active: bool, pull_when_output_active: bool,
#[bit(11, rw)] #[bit(11, rw)]
@@ -75,7 +75,7 @@ pub struct Config {
#[bit(6, rw)] #[bit(6, rw)]
invert_input: bool, invert_input: bool,
#[bits(3..=5, rw)] #[bits(3..=5, rw)]
filter_clk_sel: FilterClkSel, filter_clk_sel: FilterClockSelect,
#[bits(0..=2, rw)] #[bits(0..=2, rw)]
filter_type: Option<FilterType>, filter_type: Option<FilterType>,
} }
@@ -136,7 +136,7 @@ impl IoConfig {
} }
impl MmioIoConfig<'_> { impl MmioIoConfig<'_> {
pub fn read_pin_config(&self, id: PinId) -> Config { pub fn read_pin_config(&self, id: DynPinId) -> Config {
let offset = id.offset(); let offset = id.offset();
match id.port() { match id.port() {
crate::Port::A => unsafe { self.read_port_a_unchecked(offset) }, crate::Port::A => unsafe { self.read_port_a_unchecked(offset) },
@@ -154,12 +154,12 @@ impl MmioIoConfig<'_> {
} }
} }
pub fn modify_pin_config<F: FnOnce(Config) -> Config>(&mut self, id: PinId, f: F) { pub fn modify_pin_config<F: FnOnce(Config) -> Config>(&mut self, id: DynPinId, f: F) {
let config = self.read_pin_config(id); let config = self.read_pin_config(id);
self.write_pin_config(id, f(config)) self.write_pin_config(id, f(config))
} }
pub fn write_pin_config(&mut self, id: PinId, config: Config) { pub fn write_pin_config(&mut self, id: DynPinId, config: Config) {
let offset = id.offset(); let offset = id.offset();
match id.port() { match id.port() {
crate::Port::A => unsafe { self.write_port_a_unchecked(offset, config) }, crate::Port::A => unsafe { self.write_port_a_unchecked(offset, config) },

View File

@@ -1,3 +1,4 @@
//! Shared HAL code for Vorago VA108xx and VA416xx microcontrollers.
#![no_std] #![no_std]
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
pub mod clock; pub mod clock;
@@ -21,7 +22,7 @@ pub use sysconfig::{
#[cfg(not(feature = "_family-selected"))] #[cfg(not(feature = "_family-selected"))]
compile_error!("no Vorago CPU family was select. Choices: vor1x or vor4x"); compile_error!("no Vorago CPU family was select. Choices: vor1x or vor4x");
pub use ioconfig::regs::FunSel; pub use ioconfig::regs::FunctionSelect;
#[cfg(feature = "vor1x")] #[cfg(feature = "vor1x")]
use va108xx as pac; use va108xx as pac;
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]

View File

@@ -1,6 +1,6 @@
use crate::sysconfig::reset_peripheral_for_cycles; use crate::sysconfig::reset_peripheral_for_cycles;
pub use crate::gpio::{Pin, PinId, PinIdProvider, Port}; pub use crate::gpio::{DynPinId, Port};
use crate::PeripheralSelect; use crate::PeripheralSelect;
use crate::sealed::Sealed; use crate::sealed::Sealed;
@@ -9,8 +9,45 @@ use va108xx as pac;
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
use va416xx as pac; use va416xx as pac;
pub trait PinMarker: Sealed { /// Trait implemented by data structures associated with pin identification.
const ID: PinId; pub trait PinId {
const ID: crate::gpio::ll::DynPinId;
}
pub trait AnyPin: Sealed {
const ID: DynPinId;
}
/// Primary Pin structure for the physical pins exposed by Vorago MCUs.
///
/// This pin structure is only used for resource management and does not do anything on its
/// own.
pub struct Pin<Id: PinId> {
phantom: core::marker::PhantomData<Id>,
}
impl<Id: PinId + Sealed> AnyPin for Pin<Id> {
const ID: DynPinId = Id::ID;
}
impl<I: PinId> Pin<I> {
#[allow(clippy::new_without_default)]
#[doc(hidden)]
pub const fn __new() -> Self {
Self {
phantom: core::marker::PhantomData,
}
}
/// Create a new pin instance.
///
/// # Safety
///
/// This circumvents ownership rules of the HAL and allows creating multiple instances
/// of the same pin.
pub const unsafe fn steal() -> Self {
Self::__new()
}
} }
macro_rules! pin_id { macro_rules! pin_id {
@@ -22,18 +59,14 @@ macro_rules! pin_id {
pub enum $Id {} pub enum $Id {}
impl $crate::sealed::Sealed for $Id {} impl $crate::sealed::Sealed for $Id {}
impl PinIdProvider for $Id { impl PinId for $Id {
const ID: PinId = PinId::new_unchecked($Port, $num); const ID: DynPinId = DynPinId::new_unchecked($Port, $num);
}
impl PinMarker for Pin<$Id> {
const ID: PinId = $Id::ID;
} }
} }
}; };
} }
impl<I: PinIdProvider + Sealed> Sealed for Pin<I> {} impl<I: PinId + Sealed> Sealed for Pin<I> {}
pin_id!(Pa0, Port::A, 0); pin_id!(Pa0, Port::A, 0);
pin_id!(Pa1, Port::A, 1); pin_id!(Pa1, Port::A, 1);

View File

@@ -7,7 +7,7 @@ use crate::timer::regs::{EnableControl, StatusSelect};
use crate::{PeripheralSelect, enable_peripheral_clock}; use crate::{PeripheralSelect, enable_peripheral_clock};
use crate::time::Hertz; use crate::time::Hertz;
use crate::timer::{self, TimId, TimMarker, TimPin}; use crate::timer::{self, TimId, TimInstance, TimPin};
const DUTY_MAX: u16 = u16::MAX; const DUTY_MAX: u16 = u16::MAX;
@@ -46,7 +46,7 @@ pub struct PwmPin<Mode = PwmA> {
impl<Mode> PwmPin<Mode> { impl<Mode> PwmPin<Mode> {
/// Create a new PWM pin /// Create a new PWM pin
pub fn new<Pin: TimPin, Tim: TimMarker>( pub fn new<Pin: TimPin, Tim: TimInstance>(
_pin: Pin, _pin: Pin,
_tim: Tim, _tim: Tim,
#[cfg(feature = "vor1x")] sys_clk: Hertz, #[cfg(feature = "vor1x")] sys_clk: Hertz,

View File

@@ -1,12 +1,10 @@
use crate::FunSel; use crate::FunctionSelect;
use crate::gpio::{IoPeriphPin, PinId}; use crate::gpio::{DynPinId, IoPeriphPin};
use crate::{ use crate::{PeripheralSelect, enable_peripheral_clock, pins::AnyPin, sealed::Sealed, time::Hertz};
PeripheralSelect, enable_peripheral_clock, pins::PinMarker, sealed::Sealed, time::Hertz,
};
use core::{convert::Infallible, fmt::Debug, marker::PhantomData}; use core::{convert::Infallible, fmt::Debug, marker::PhantomData};
use embedded_hal::spi::{MODE_0, Mode}; use embedded_hal::spi::{MODE_0, Mode};
use regs::{ClkPrescaler, Data, FifoClear, WordSize}; use regs::{ClockPrescaler, Data, FifoClear, WordSize};
#[cfg(feature = "vor1x")] #[cfg(feature = "vor1x")]
use va108xx as pac; use va108xx as pac;
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
@@ -16,7 +14,7 @@ pub use regs::{Bank, HwChipSelectId};
pub mod regs; pub mod regs;
pub fn configure_pin_as_hw_cs_pin<P: PinMarker + HwCsProvider>(_pin: P) -> HwChipSelectId { pub fn configure_pin_as_hw_cs_pin<P: AnyPin + HwCsProvider>(_pin: P) -> HwChipSelectId {
IoPeriphPin::new(P::ID, P::FUN_SEL, None); IoPeriphPin::new(P::ID, P::FUN_SEL, None);
P::CS_ID P::CS_ID
} }
@@ -25,25 +23,25 @@ pub fn configure_pin_as_hw_cs_pin<P: PinMarker + HwCsProvider>(_pin: P) -> HwChi
// Pins and traits. // Pins and traits.
//================================================================================================== //==================================================================================================
pub trait PinSck: PinMarker { pub trait PinSck: AnyPin {
const SPI_ID: Bank; const SPI_ID: Bank;
const FUN_SEL: FunSel; const FUN_SEL: FunctionSelect;
} }
pub trait PinMosi: PinMarker { pub trait PinMosi: AnyPin {
const SPI_ID: Bank; const SPI_ID: Bank;
const FUN_SEL: FunSel; const FUN_SEL: FunctionSelect;
} }
pub trait PinMiso: PinMarker { pub trait PinMiso: AnyPin {
const SPI_ID: Bank; const SPI_ID: Bank;
const FUN_SEL: FunSel; const FUN_SEL: FunctionSelect;
} }
pub trait HwCsProvider { pub trait HwCsProvider {
const PIN_ID: PinId; const PIN_ID: DynPinId;
const SPI_ID: Bank; const SPI_ID: Bank;
const FUN_SEL: FunSel; const FUN_SEL: FunctionSelect;
const CS_ID: HwChipSelectId; const CS_ID: HwChipSelectId;
} }
@@ -77,9 +75,9 @@ mod macros {
impl crate::sealed::Sealed for $name {} impl crate::sealed::Sealed for $name {}
impl HwCsProvider for $name { impl HwCsProvider for $name {
const PIN_ID: PinId = <$pin_id as PinIdProvider>::ID; const PIN_ID: DynPinId = <$pin_id as PinId>::ID;
const SPI_ID: Bank = $spi_id; const SPI_ID: Bank = $spi_id;
const FUN_SEL: FunSel = $fun_sel; const FUN_SEL: FunctionSelect = $fun_sel;
const CS_ID: HwChipSelectId = $cs_id; const CS_ID: HwChipSelectId = $cs_id;
} }
}; };
@@ -90,9 +88,9 @@ mod macros {
($SpiId:path, $(($Px:ident, $FunSel:path, $HwCsIdent:path)$(,)?)+) => { ($SpiId:path, $(($Px:ident, $FunSel:path, $HwCsIdent:path)$(,)?)+) => {
$( $(
impl HwCsProvider for Pin<$Px> { impl HwCsProvider for Pin<$Px> {
const PIN_ID: PinId = $Px::ID; const PIN_ID: DynPinId = $Px::ID;
const SPI_ID: Bank = $SpiId; const SPI_ID: Bank = $SpiId;
const FUN_SEL: FunSel = $FunSel; const FUN_SEL: FunctionSelect = $FunSel;
const CS_ID: HwChipSelectId = $HwCsIdent; const CS_ID: HwChipSelectId = $HwCsIdent;
} }
)+ )+
@@ -119,7 +117,7 @@ pub const DEFAULT_CLK_DIV: u16 = 2;
/// Common trait implemented by all PAC peripheral access structures. The register block /// Common trait implemented by all PAC peripheral access structures. The register block
/// format is the same for all SPI blocks. /// format is the same for all SPI blocks.
pub trait SpiMarker: Sealed { pub trait SpiInstance: Sealed {
const ID: Bank; const ID: Bank;
const PERIPH_SEL: PeripheralSelect; const PERIPH_SEL: PeripheralSelect;
} }
@@ -129,7 +127,7 @@ pub type Spi0 = pac::Spia;
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
pub type Spi0 = pac::Spi0; pub type Spi0 = pac::Spi0;
impl SpiMarker for Spi0 { impl SpiInstance for Spi0 {
const ID: Bank = Bank::Spi0; const ID: Bank = Bank::Spi0;
const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Spi0; const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Spi0;
} }
@@ -140,7 +138,7 @@ pub type Spi1 = pac::Spib;
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
pub type Spi1 = pac::Spi1; pub type Spi1 = pac::Spi1;
impl SpiMarker for Spi1 { impl SpiInstance for Spi1 {
const ID: Bank = Bank::Spi1; const ID: Bank = Bank::Spi1;
const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Spi1; const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Spi1;
} }
@@ -151,14 +149,14 @@ pub type Spi2 = pac::Spic;
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
pub type Spi2 = pac::Spi2; pub type Spi2 = pac::Spi2;
impl SpiMarker for Spi2 { impl SpiInstance for Spi2 {
const ID: Bank = Bank::Spi2; const ID: Bank = Bank::Spi2;
const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Spi2; const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Spi2;
} }
impl Sealed for Spi2 {} impl Sealed for Spi2 {}
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
impl SpiMarker for pac::Spi3 { impl SpiInstance for pac::Spi3 {
const ID: Bank = Bank::Spi3; const ID: Bank = Bank::Spi3;
const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Spi3; const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Spi3;
} }
@@ -173,7 +171,7 @@ pub trait TransferConfigProvider {
fn sod(&mut self, sod: bool); fn sod(&mut self, sod: bool);
fn blockmode(&mut self, blockmode: bool); fn blockmode(&mut self, blockmode: bool);
fn mode(&mut self, mode: Mode); fn mode(&mut self, mode: Mode);
fn clk_cfg(&mut self, clk_cfg: SpiClkConfig); fn clk_cfg(&mut self, clk_cfg: SpiClockConfig);
fn hw_cs_id(&self) -> u8; fn hw_cs_id(&self) -> u8;
} }
@@ -182,7 +180,7 @@ pub trait TransferConfigProvider {
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct TransferConfig { pub struct TransferConfig {
pub clk_cfg: Option<SpiClkConfig>, pub clk_cfg: Option<SpiClockConfig>,
pub mode: Option<Mode>, pub mode: Option<Mode>,
pub sod: bool, pub sod: bool,
/// If this is enabled, all data in the FIFO is transmitted in a single frame unless /// If this is enabled, all data in the FIFO is transmitted in a single frame unless
@@ -197,7 +195,7 @@ pub struct TransferConfig {
impl TransferConfig { impl TransferConfig {
pub fn new_with_hw_cs( pub fn new_with_hw_cs(
clk_cfg: Option<SpiClkConfig>, clk_cfg: Option<SpiClockConfig>,
mode: Option<Mode>, mode: Option<Mode>,
blockmode: bool, blockmode: bool,
bmstall: bool, bmstall: bool,
@@ -219,7 +217,7 @@ impl TransferConfig {
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct SpiConfig { pub struct SpiConfig {
clk: SpiClkConfig, clk: SpiClockConfig,
// SPI mode configuration // SPI mode configuration
pub init_mode: Mode, pub init_mode: Mode,
/// If this is enabled, all data in the FIFO is transmitted in a single frame unless /// If this is enabled, all data in the FIFO is transmitted in a single frame unless
@@ -244,7 +242,7 @@ impl Default for SpiConfig {
blockmode: true, blockmode: true,
bmstall: true, bmstall: true,
// Default value is definitely valid. // Default value is definitely valid.
clk: SpiClkConfig::from_div(DEFAULT_CLK_DIV).unwrap(), clk: SpiClockConfig::from_div(DEFAULT_CLK_DIV).unwrap(),
slave_output_disable: Default::default(), slave_output_disable: Default::default(),
loopback_mode: Default::default(), loopback_mode: Default::default(),
master_delayer_capture: Default::default(), master_delayer_capture: Default::default(),
@@ -273,7 +271,7 @@ impl SpiConfig {
self self
} }
pub fn clk_cfg(mut self, clk_cfg: SpiClkConfig) -> Self { pub fn clk_cfg(mut self, clk_cfg: SpiClockConfig) -> Self {
self.clk = clk_cfg; self.clk = clk_cfg;
self self
} }
@@ -290,13 +288,13 @@ impl SpiConfig {
/// Configuration trait for the Word Size /// Configuration trait for the Word Size
/// used by the SPI peripheral /// used by the SPI peripheral
pub trait WordProvider: Copy + Default + Into<u32> + TryFrom<u32> + 'static { pub trait SpiWord: Copy + Default + Into<u32> + TryFrom<u32> + 'static {
const MASK: u32; const MASK: u32;
const WORD_SIZE: regs::WordSize; const WORD_SIZE: regs::WordSize;
fn word_reg() -> u8; fn word_reg() -> u8;
} }
impl WordProvider for u8 { impl SpiWord for u8 {
const MASK: u32 = 0xff; const MASK: u32 = 0xff;
const WORD_SIZE: regs::WordSize = regs::WordSize::EightBits; const WORD_SIZE: regs::WordSize = regs::WordSize::EightBits;
fn word_reg() -> u8 { fn word_reg() -> u8 {
@@ -304,7 +302,7 @@ impl WordProvider for u8 {
} }
} }
impl WordProvider for u16 { impl SpiWord for u16 {
const MASK: u32 = 0xffff; const MASK: u32 = 0xffff;
const WORD_SIZE: regs::WordSize = regs::WordSize::SixteenBits; const WORD_SIZE: regs::WordSize = regs::WordSize::SixteenBits;
fn word_reg() -> u8 { fn word_reg() -> u8 {
@@ -358,12 +356,12 @@ pub fn mode_to_cpo_cph_bit(mode: embedded_hal::spi::Mode) -> (bool, bool) {
#[derive(Debug, Copy, Clone, PartialEq, Eq)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct SpiClkConfig { pub struct SpiClockConfig {
prescale_val: u8, prescale_val: u8,
scrdv: u8, scrdv: u8,
} }
impl SpiClkConfig { impl SpiClockConfig {
pub fn prescale_val(&self) -> u8 { pub fn prescale_val(&self) -> u8 {
self.prescale_val self.prescale_val
} }
@@ -372,7 +370,7 @@ impl SpiClkConfig {
} }
} }
impl SpiClkConfig { impl SpiClockConfig {
pub fn new(prescale_val: u8, scrdv: u8) -> Self { pub fn new(prescale_val: u8, scrdv: u8) -> Self {
Self { Self {
prescale_val, prescale_val,
@@ -380,7 +378,7 @@ impl SpiClkConfig {
} }
} }
pub fn from_div(div: u16) -> Result<Self, SpiClkConfigError> { pub fn from_div(div: u16) -> Result<Self, SpiClockConfigError> {
spi_clk_config_from_div(div) spi_clk_config_from_div(div)
} }
@@ -402,7 +400,7 @@ impl SpiClkConfig {
#[derive(Debug, thiserror::Error)] #[derive(Debug, thiserror::Error)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum SpiClkConfigError { pub enum SpiClockConfigError {
#[error("division by zero")] #[error("division by zero")]
DivIsZero, DivIsZero,
#[error("divide value is not even")] #[error("divide value is not even")]
@@ -412,12 +410,12 @@ pub enum SpiClkConfigError {
} }
#[inline] #[inline]
pub fn spi_clk_config_from_div(mut div: u16) -> Result<SpiClkConfig, SpiClkConfigError> { pub fn spi_clk_config_from_div(mut div: u16) -> Result<SpiClockConfig, SpiClockConfigError> {
if div == 0 { if div == 0 {
return Err(SpiClkConfigError::DivIsZero); return Err(SpiClockConfigError::DivIsZero);
} }
if div % 2 != 0 { if div % 2 != 0 {
return Err(SpiClkConfigError::DivideValueNotEven); return Err(SpiClockConfigError::DivideValueNotEven);
} }
let mut prescale_val = 0; let mut prescale_val = 0;
@@ -430,14 +428,14 @@ pub fn spi_clk_config_from_div(mut div: u16) -> Result<SpiClkConfig, SpiClkConfi
} }
if prescale_val == 0 { if prescale_val == 0 {
return Err(SpiClkConfigError::DivideValueNotEven); return Err(SpiClockConfigError::DivideValueNotEven);
} }
div /= prescale_val; div /= prescale_val;
if div > u8::MAX as u16 + 1 { if div > u8::MAX as u16 + 1 {
return Err(SpiClkConfigError::ScrdvValueTooLarge); return Err(SpiClockConfigError::ScrdvValueTooLarge);
} }
Ok(SpiClkConfig { Ok(SpiClockConfig {
prescale_val: prescale_val as u8, prescale_val: prescale_val as u8,
scrdv: (div - 1) as u8, scrdv: (div - 1) as u8,
}) })
@@ -486,7 +484,7 @@ pub struct Spi<Word = u8> {
word: PhantomData<Word>, word: PhantomData<Word>,
} }
impl<Word: WordProvider> Spi<Word> impl<Word: SpiWord> Spi<Word>
where where
<Word as TryFrom<u32>>::Error: core::fmt::Debug, <Word as TryFrom<u32>>::Error: core::fmt::Debug,
{ {
@@ -496,7 +494,7 @@ where
/// ///
/// * `spi` - SPI bus to use /// * `spi` - SPI bus to use
/// * `spi_cfg` - Configuration specific to the SPI bus /// * `spi_cfg` - Configuration specific to the SPI bus
pub fn new_for_rom<SpiI: SpiMarker>( pub fn new_for_rom<SpiI: SpiInstance>(
spi: SpiI, spi: SpiI,
spi_cfg: SpiConfig, spi_cfg: SpiConfig,
) -> Result<Self, SpiIdMissmatchError> { ) -> Result<Self, SpiIdMissmatchError> {
@@ -519,7 +517,7 @@ where
/// * `pins` - Pins to be used for SPI transactions. These pins are consumed /// * `pins` - Pins to be used for SPI transactions. These pins are consumed
/// to ensure the pins can not be used for other purposes anymore /// to ensure the pins can not be used for other purposes anymore
/// * `spi_cfg` - Configuration specific to the SPI bus /// * `spi_cfg` - Configuration specific to the SPI bus
pub fn new<SpiI: SpiMarker, Sck: PinSck, Miso: PinMiso, Mosi: PinMosi>( pub fn new<SpiI: SpiInstance, Sck: PinSck, Miso: PinMiso, Mosi: PinMosi>(
spi: SpiI, spi: SpiI,
_pins: (Sck, Miso, Mosi), _pins: (Sck, Miso, Mosi),
spi_cfg: SpiConfig, spi_cfg: SpiConfig,
@@ -533,7 +531,7 @@ where
Ok(Self::new_generic(spi, spi_cfg)) Ok(Self::new_generic(spi, spi_cfg))
} }
pub fn new_generic<SpiI: SpiMarker>(_spi: SpiI, spi_cfg: SpiConfig) -> Self { pub fn new_generic<SpiI: SpiInstance>(_spi: SpiI, spi_cfg: SpiConfig) -> Self {
enable_peripheral_clock(SpiI::PERIPH_SEL); enable_peripheral_clock(SpiI::PERIPH_SEL);
let mut regs = regs::Spi::new_mmio(SpiI::ID); let mut regs = regs::Spi::new_mmio(SpiI::ID);
let (cpo_bit, cph_bit) = mode_to_cpo_cph_bit(spi_cfg.init_mode); let (cpo_bit, cph_bit) = mode_to_cpo_cph_bit(spi_cfg.init_mode);
@@ -559,7 +557,7 @@ where
.with_lbm(spi_cfg.loopback_mode) .with_lbm(spi_cfg.loopback_mode)
.build(), .build(),
); );
regs.write_clkprescale(ClkPrescaler::new(spi_cfg.clk.prescale_val)); regs.write_clkprescale(ClockPrescaler::new(spi_cfg.clk.prescale_val));
regs.write_fifo_clear( regs.write_fifo_clear(
FifoClear::builder() FifoClear::builder()
.with_tx_fifo(true) .with_tx_fifo(true)
@@ -584,13 +582,13 @@ where
} }
#[inline] #[inline]
pub fn cfg_clock(&mut self, cfg: SpiClkConfig) { pub fn cfg_clock(&mut self, cfg: SpiClockConfig) {
self.regs.modify_ctrl0(|mut value| { self.regs.modify_ctrl0(|mut value| {
value.set_scrdv(cfg.scrdv); value.set_scrdv(cfg.scrdv);
value value
}); });
self.regs self.regs
.write_clkprescale(regs::ClkPrescaler::new(cfg.prescale_val)); .write_clkprescale(regs::ClockPrescaler::new(cfg.prescale_val));
} }
pub fn set_fill_word(&mut self, fill_word: Word) { pub fn set_fill_word(&mut self, fill_word: Word) {
@@ -598,7 +596,7 @@ where
} }
#[inline] #[inline]
pub fn cfg_clock_from_div(&mut self, div: u16) -> Result<(), SpiClkConfigError> { pub fn cfg_clock_from_div(&mut self, div: u16) -> Result<(), SpiClockConfigError> {
let val = spi_clk_config_from_div(div)?; let val = spi_clk_config_from_div(div)?;
self.cfg_clock(val); self.cfg_clock(val);
Ok(()) Ok(())
@@ -772,9 +770,9 @@ where
} }
} }
impl<Word: WordProvider> SpiLowLevel for Spi<Word> impl<W: SpiWord> SpiLowLevel for Spi<W>
where where
<Word as TryFrom<u32>>::Error: core::fmt::Debug, <W as TryFrom<u32>>::Error: core::fmt::Debug,
{ {
#[inline(always)] #[inline(always)]
fn write_fifo(&mut self, data: u32) -> nb::Result<(), Infallible> { fn write_fifo(&mut self, data: u32) -> nb::Result<(), Infallible> {
@@ -804,11 +802,11 @@ where
} }
} }
impl<Word: WordProvider> embedded_hal::spi::ErrorType for Spi<Word> { impl<Word: SpiWord> embedded_hal::spi::ErrorType for Spi<Word> {
type Error = Infallible; type Error = Infallible;
} }
impl<Word: WordProvider> embedded_hal::spi::SpiBus<Word> for Spi<Word> impl<Word: SpiWord> embedded_hal::spi::SpiBus<Word> for Spi<Word>
where where
<Word as TryFrom<u32>>::Error: core::fmt::Debug, <Word as TryFrom<u32>>::Error: core::fmt::Debug,
{ {

View File

@@ -1,6 +1,6 @@
use super::{HwCsProvider, PinMiso, PinMosi, PinSck}; use super::{HwCsProvider, PinMiso, PinMosi, PinSck};
use crate::FunSel; use crate::FunctionSelect;
use crate::gpio::{PinId, PinIdProvider}; use crate::gpio::{DynPinId, PinId};
use crate::pins::{ use crate::pins::{
Pa10, Pa11, Pa12, Pa13, Pa14, Pa15, Pa16, Pa17, Pa18, Pa19, Pa20, Pa21, Pa22, Pa23, Pa24, Pa25, Pa10, Pa11, Pa12, Pa13, Pa14, Pa15, Pa16, Pa17, Pa18, Pa19, Pa20, Pa21, Pa22, Pa23, Pa24, Pa25,
@@ -14,65 +14,65 @@ use super::{Bank, HwChipSelectId};
impl PinSck for Pin<Pa31> { impl PinSck for Pin<Pa31> {
const SPI_ID: Bank = Bank::Spi0; const SPI_ID: Bank = Bank::Spi0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl PinMosi for Pin<Pa30> { impl PinMosi for Pin<Pa30> {
const SPI_ID: Bank = Bank::Spi0; const SPI_ID: Bank = Bank::Spi0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl PinMiso for Pin<Pa29> { impl PinMiso for Pin<Pa29> {
const SPI_ID: Bank = Bank::Spi0; const SPI_ID: Bank = Bank::Spi0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl PinSck for Pin<Pb9> { impl PinSck for Pin<Pb9> {
const SPI_ID: Bank = Bank::Spi0; const SPI_ID: Bank = Bank::Spi0;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinMosi for Pin<Pb8> { impl PinMosi for Pin<Pb8> {
const SPI_ID: Bank = Bank::Spi0; const SPI_ID: Bank = Bank::Spi0;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinMiso for Pin<Pb7> { impl PinMiso for Pin<Pb7> {
const SPI_ID: Bank = Bank::Spi0; const SPI_ID: Bank = Bank::Spi0;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
hw_cs_pins!( hw_cs_pins!(
Bank::Spi0, Bank::Spi0,
(Pb0, FunSel::Sel2, HwChipSelectId::Id1), (Pb0, FunctionSelect::Sel2, HwChipSelectId::Id1),
(Pb1, FunSel::Sel2, HwChipSelectId::Id2), (Pb1, FunctionSelect::Sel2, HwChipSelectId::Id2),
(Pb2, FunSel::Sel2, HwChipSelectId::Id3), (Pb2, FunctionSelect::Sel2, HwChipSelectId::Id3),
(Pb3, FunSel::Sel2, HwChipSelectId::Id4), (Pb3, FunctionSelect::Sel2, HwChipSelectId::Id4),
(Pb4, FunSel::Sel2, HwChipSelectId::Id5), (Pb4, FunctionSelect::Sel2, HwChipSelectId::Id5),
(Pb5, FunSel::Sel2, HwChipSelectId::Id6), (Pb5, FunctionSelect::Sel2, HwChipSelectId::Id6),
(Pb6, FunSel::Sel2, HwChipSelectId::Id0), (Pb6, FunctionSelect::Sel2, HwChipSelectId::Id0),
(Pa24, FunSel::Sel1, HwChipSelectId::Id4), (Pa24, FunctionSelect::Sel1, HwChipSelectId::Id4),
(Pa25, FunSel::Sel1, HwChipSelectId::Id3), (Pa25, FunctionSelect::Sel1, HwChipSelectId::Id3),
(Pa26, FunSel::Sel1, HwChipSelectId::Id2), (Pa26, FunctionSelect::Sel1, HwChipSelectId::Id2),
(Pa27, FunSel::Sel1, HwChipSelectId::Id1), (Pa27, FunctionSelect::Sel1, HwChipSelectId::Id1),
(Pa28, FunSel::Sel1, HwChipSelectId::Id0), (Pa28, FunctionSelect::Sel1, HwChipSelectId::Id0),
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPb0SpiaHwCsId1, PinPb0SpiaHwCsId1,
Pb0, Pb0,
Bank::Spi0, Bank::Spi0,
FunSel::Sel2, FunctionSelect::Sel2,
HwChipSelectId::Id1 HwChipSelectId::Id1
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPb1SpiaHwCsId2, PinPb1SpiaHwCsId2,
Pb1, Pb1,
Bank::Spi0, Bank::Spi0,
FunSel::Sel2, FunctionSelect::Sel2,
HwChipSelectId::Id2 HwChipSelectId::Id2
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPb2SpiaHwCsId3, PinPb2SpiaHwCsId3,
Pb2, Pb2,
Bank::Spi0, Bank::Spi0,
FunSel::Sel2, FunctionSelect::Sel2,
HwChipSelectId::Id3 HwChipSelectId::Id3
); );
@@ -80,21 +80,21 @@ hw_cs_multi_pin!(
PinPa21SpiaHwCsId7, PinPa21SpiaHwCsId7,
Pa21, Pa21,
Bank::Spi0, Bank::Spi0,
FunSel::Sel1, FunctionSelect::Sel1,
HwChipSelectId::Id7 HwChipSelectId::Id7
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPa22SpiaHwCsId6, PinPa22SpiaHwCsId6,
Pa22, Pa22,
Bank::Spi0, Bank::Spi0,
FunSel::Sel1, FunctionSelect::Sel1,
HwChipSelectId::Id6 HwChipSelectId::Id6
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPa23SpiaHwCsId5, PinPa23SpiaHwCsId5,
Pa23, Pa23,
Bank::Spi0, Bank::Spi0,
FunSel::Sel1, FunctionSelect::Sel1,
HwChipSelectId::Id5 HwChipSelectId::Id5
); );
@@ -102,15 +102,15 @@ hw_cs_multi_pin!(
impl PinSck for Pin<Pa20> { impl PinSck for Pin<Pa20> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinMosi for Pin<Pa19> { impl PinMosi for Pin<Pa19> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinMiso for Pin<Pa18> { impl PinMiso for Pin<Pa18> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
pub type SpiBPortASck = Pin<Pa20>; pub type SpiBPortASck = Pin<Pa20>;
@@ -119,69 +119,69 @@ pub type SpiBPortAMiso = Pin<Pa18>;
impl PinSck for Pin<Pb19> { impl PinSck for Pin<Pb19> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl PinMosi for Pin<Pb18> { impl PinMosi for Pin<Pb18> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl PinMiso for Pin<Pb17> { impl PinMiso for Pin<Pb17> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl PinSck for Pin<Pb5> { impl PinSck for Pin<Pb5> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl PinMosi for Pin<Pb4> { impl PinMosi for Pin<Pb4> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl PinMiso for Pin<Pb3> { impl PinMiso for Pin<Pb3> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
// TODO: Need to deal with these duplications.. // TODO: Need to deal with these duplications..
hw_cs_pins!( hw_cs_pins!(
Bank::Spi1, Bank::Spi1,
(Pb16, FunSel::Sel1, HwChipSelectId::Id0), (Pb16, FunctionSelect::Sel1, HwChipSelectId::Id0),
(Pb15, FunSel::Sel1, HwChipSelectId::Id1), (Pb15, FunctionSelect::Sel1, HwChipSelectId::Id1),
(Pb14, FunSel::Sel1, HwChipSelectId::Id2), (Pb14, FunctionSelect::Sel1, HwChipSelectId::Id2),
(Pb13, FunSel::Sel1, HwChipSelectId::Id3), (Pb13, FunctionSelect::Sel1, HwChipSelectId::Id3),
(Pa17, FunSel::Sel2, HwChipSelectId::Id0), (Pa17, FunctionSelect::Sel2, HwChipSelectId::Id0),
(Pa16, FunSel::Sel2, HwChipSelectId::Id1), (Pa16, FunctionSelect::Sel2, HwChipSelectId::Id1),
(Pa15, FunSel::Sel2, HwChipSelectId::Id2), (Pa15, FunctionSelect::Sel2, HwChipSelectId::Id2),
(Pa14, FunSel::Sel2, HwChipSelectId::Id3), (Pa14, FunctionSelect::Sel2, HwChipSelectId::Id3),
(Pa13, FunSel::Sel2, HwChipSelectId::Id4), (Pa13, FunctionSelect::Sel2, HwChipSelectId::Id4),
(Pa12, FunSel::Sel2, HwChipSelectId::Id5), (Pa12, FunctionSelect::Sel2, HwChipSelectId::Id5),
(Pa11, FunSel::Sel2, HwChipSelectId::Id6), (Pa11, FunctionSelect::Sel2, HwChipSelectId::Id6),
(Pa10, FunSel::Sel2, HwChipSelectId::Id7), (Pa10, FunctionSelect::Sel2, HwChipSelectId::Id7),
(Pa23, FunSel::Sel2, HwChipSelectId::Id5), (Pa23, FunctionSelect::Sel2, HwChipSelectId::Id5),
(Pa22, FunSel::Sel2, HwChipSelectId::Id6), (Pa22, FunctionSelect::Sel2, HwChipSelectId::Id6),
(Pa21, FunSel::Sel2, HwChipSelectId::Id7), (Pa21, FunctionSelect::Sel2, HwChipSelectId::Id7),
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPb0SpibHwCsId2, PinPb0SpibHwCsId2,
Pb0, Pb0,
Bank::Spi1, Bank::Spi1,
FunSel::Sel1, FunctionSelect::Sel1,
HwChipSelectId::Id2 HwChipSelectId::Id2
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPb1SpibHwCsId1, PinPb1SpibHwCsId1,
Pb1, Pb1,
Bank::Spi1, Bank::Spi1,
FunSel::Sel1, FunctionSelect::Sel1,
HwChipSelectId::Id1 HwChipSelectId::Id1
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPb2SpibHwCsId0, PinPb2SpibHwCsId0,
Pb2, Pb2,
Bank::Spi1, Bank::Spi1,
FunSel::Sel1, FunctionSelect::Sel1,
HwChipSelectId::Id0 HwChipSelectId::Id0
); );
@@ -189,21 +189,21 @@ hw_cs_multi_pin!(
PinPb10SpibHwCsId6, PinPb10SpibHwCsId6,
Pb10, Pb10,
Bank::Spi1, Bank::Spi1,
FunSel::Sel1, FunctionSelect::Sel1,
HwChipSelectId::Id6 HwChipSelectId::Id6
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPb11SpibHwCsId5, PinPb11SpibHwCsId5,
Pb11, Pb11,
Bank::Spi1, Bank::Spi1,
FunSel::Sel1, FunctionSelect::Sel1,
HwChipSelectId::Id5 HwChipSelectId::Id5
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPb12SpibHwCsId4, PinPb12SpibHwCsId4,
Pb12, Pb12,
Bank::Spi1, Bank::Spi1,
FunSel::Sel1, FunctionSelect::Sel1,
HwChipSelectId::Id4 HwChipSelectId::Id4
); );
@@ -211,21 +211,21 @@ hw_cs_multi_pin!(
PinPb10SpibHwCsId2, PinPb10SpibHwCsId2,
Pb10, Pb10,
Bank::Spi1, Bank::Spi1,
FunSel::Sel2, FunctionSelect::Sel2,
HwChipSelectId::Id2 HwChipSelectId::Id2
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPb11SpibHwCsId1, PinPb11SpibHwCsId1,
Pb11, Pb11,
Bank::Spi1, Bank::Spi1,
FunSel::Sel2, FunctionSelect::Sel2,
HwChipSelectId::Id1 HwChipSelectId::Id1
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPb12SpibHwCsId0, PinPb12SpibHwCsId0,
Pb12, Pb12,
Bank::Spi1, Bank::Spi1,
FunSel::Sel2, FunctionSelect::Sel2,
HwChipSelectId::Id0 HwChipSelectId::Id0
); );
@@ -233,21 +233,21 @@ hw_cs_multi_pin!(
PinPa21SpibHwCsId7, PinPa21SpibHwCsId7,
Pa21, Pa21,
Bank::Spi1, Bank::Spi1,
FunSel::Sel2, FunctionSelect::Sel2,
HwChipSelectId::Id7 HwChipSelectId::Id7
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPa22SpibHwCsId6, PinPa22SpibHwCsId6,
Pa22, Pa22,
Bank::Spi1, Bank::Spi1,
FunSel::Sel2, FunctionSelect::Sel2,
HwChipSelectId::Id6 HwChipSelectId::Id6
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPa23SpibHwCsId5, PinPa23SpibHwCsId5,
Pa23, Pa23,
Bank::Spi1, Bank::Spi1,
FunSel::Sel2, FunctionSelect::Sel2,
HwChipSelectId::Id5 HwChipSelectId::Id5
); );
@@ -255,35 +255,35 @@ hw_cs_multi_pin!(
hw_cs_pins!( hw_cs_pins!(
Bank::Spi2, Bank::Spi2,
(Pb9, FunSel::Sel3, HwChipSelectId::Id1), (Pb9, FunctionSelect::Sel3, HwChipSelectId::Id1),
(Pb8, FunSel::Sel3, HwChipSelectId::Id2), (Pb8, FunctionSelect::Sel3, HwChipSelectId::Id2),
(Pb7, FunSel::Sel3, HwChipSelectId::Id3), (Pb7, FunctionSelect::Sel3, HwChipSelectId::Id3),
(Pb23, FunSel::Sel3, HwChipSelectId::Id2), (Pb23, FunctionSelect::Sel3, HwChipSelectId::Id2),
(Pb22, FunSel::Sel3, HwChipSelectId::Id1), (Pb22, FunctionSelect::Sel3, HwChipSelectId::Id1),
(Pa20, FunSel::Sel1, HwChipSelectId::Id1), (Pa20, FunctionSelect::Sel1, HwChipSelectId::Id1),
(Pa19, FunSel::Sel1, HwChipSelectId::Id2), (Pa19, FunctionSelect::Sel1, HwChipSelectId::Id2),
(Pb18, FunSel::Sel1, HwChipSelectId::Id3), (Pb18, FunctionSelect::Sel1, HwChipSelectId::Id3),
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPa21SpicHwCsId3, PinPa21SpicHwCsId3,
Pa21, Pa21,
Bank::Spi2, Bank::Spi2,
FunSel::Sel3, FunctionSelect::Sel3,
HwChipSelectId::Id3 HwChipSelectId::Id3
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPa22SpicHwCsId2, PinPa22SpicHwCsId2,
Pa22, Pa22,
Bank::Spi2, Bank::Spi2,
FunSel::Sel3, FunctionSelect::Sel3,
HwChipSelectId::Id2 HwChipSelectId::Id2
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPa23SpicHwCsId1, PinPa23SpicHwCsId1,
Pa23, Pa23,
Bank::Spi2, Bank::Spi2,
FunSel::Sel3, FunctionSelect::Sel3,
HwChipSelectId::Id1 HwChipSelectId::Id1
); );
@@ -291,13 +291,13 @@ hw_cs_multi_pin!(
PinPa20SpicHwCsId1, PinPa20SpicHwCsId1,
Pa20, Pa20,
Bank::Spi2, Bank::Spi2,
FunSel::Sel1, FunctionSelect::Sel1,
HwChipSelectId::Id1 HwChipSelectId::Id1
); );
hw_cs_multi_pin!( hw_cs_multi_pin!(
PinPa20SpicHwCsId4, PinPa20SpicHwCsId4,
Pa20, Pa20,
Bank::Spi2, Bank::Spi2,
FunSel::Sel3, FunctionSelect::Sel3,
HwChipSelectId::Id4 HwChipSelectId::Id4
); );

View File

@@ -1,6 +1,6 @@
use crate::{ use crate::{
FunSel, FunctionSelect,
gpio::{Pin, PinId, PinIdProvider}, gpio::{DynPinId, Pin, PinId},
pins::{ pins::{
Pa0, Pa1, Pa2, Pa3, Pa4, Pa5, Pa6, Pa7, Pa8, Pa9, Pb0, Pb1, Pb2, Pb3, Pb4, Pb12, Pb13, Pa0, Pa1, Pa2, Pa3, Pa4, Pa5, Pa6, Pa7, Pa8, Pa9, Pb0, Pb1, Pb2, Pb3, Pb4, Pb12, Pb13,
Pb14, Pb15, Pc0, Pc1, Pc7, Pc8, Pc9, Pc10, Pc11, Pe5, Pe6, Pe7, Pe8, Pe9, Pe12, Pe13, Pe14, Pb14, Pb15, Pc0, Pc1, Pc7, Pc8, Pc9, Pc10, Pc11, Pe5, Pe6, Pe7, Pe8, Pe9, Pe12, Pe13, Pe14,
@@ -17,122 +17,125 @@ use super::{Bank, HwChipSelectId, HwCsProvider, PinMiso, PinMosi, PinSck};
impl PinSck for Pin<Pb15> { impl PinSck for Pin<Pb15> {
const SPI_ID: Bank = Bank::Spi0; const SPI_ID: Bank = Bank::Spi0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl PinMosi for Pin<Pc1> { impl PinMosi for Pin<Pc1> {
const SPI_ID: Bank = Bank::Spi0; const SPI_ID: Bank = Bank::Spi0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl PinMiso for Pin<Pc0> { impl PinMiso for Pin<Pc0> {
const SPI_ID: Bank = Bank::Spi0; const SPI_ID: Bank = Bank::Spi0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
hw_cs_pins!( hw_cs_pins!(
Bank::Spi0, Bank::Spi0,
(Pb14, FunSel::Sel1, HwChipSelectId::Id0), (Pb14, FunctionSelect::Sel1, HwChipSelectId::Id0),
(Pb13, FunSel::Sel1, HwChipSelectId::Id1), (Pb13, FunctionSelect::Sel1, HwChipSelectId::Id1),
(Pb12, FunSel::Sel1, HwChipSelectId::Id2), (Pb12, FunctionSelect::Sel1, HwChipSelectId::Id2),
); );
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
hw_cs_pins!(Bank::Spi0, (Pb11, FunSel::Sel1, HwChipSelectId::Id3)); hw_cs_pins!(
Bank::Spi0,
(Pb11, FunctionSelect::Sel1, HwChipSelectId::Id3)
);
// SPI1 // SPI1
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
impl PinSck for Pin<Pb8> { impl PinSck for Pin<Pb8> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
impl PinMosi for Pin<Pb10> { impl PinMosi for Pin<Pb10> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
impl PinMiso for Pin<Pb9> { impl PinMiso for Pin<Pb9> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl PinSck for Pin<Pc9> { impl PinSck for Pin<Pc9> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinMosi for Pin<Pc11> { impl PinMosi for Pin<Pc11> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinMiso for Pin<Pc10> { impl PinMiso for Pin<Pc10> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinSck for Pin<Pe13> { impl PinSck for Pin<Pe13> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinMosi for Pin<Pe15> { impl PinMosi for Pin<Pe15> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinMiso for Pin<Pe14> { impl PinMiso for Pin<Pe14> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
impl PinSck for Pin<Pf3> { impl PinSck for Pin<Pf3> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
impl PinMosi for Pin<Pf5> { impl PinMosi for Pin<Pf5> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
impl PinMiso for Pin<Pf4> { impl PinMiso for Pin<Pf4> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl PinSck for Pin<Pg3> { impl PinSck for Pin<Pg3> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinMiso for Pin<Pg4> { impl PinMiso for Pin<Pg4> {
const SPI_ID: Bank = Bank::Spi1; const SPI_ID: Bank = Bank::Spi1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
hw_cs_pins!( hw_cs_pins!(
Bank::Spi1, Bank::Spi1,
(Pb4, FunSel::Sel3, HwChipSelectId::Id3), (Pb4, FunctionSelect::Sel3, HwChipSelectId::Id3),
(Pb3, FunSel::Sel3, HwChipSelectId::Id4), (Pb3, FunctionSelect::Sel3, HwChipSelectId::Id4),
(Pb2, FunSel::Sel3, HwChipSelectId::Id5), (Pb2, FunctionSelect::Sel3, HwChipSelectId::Id5),
(Pb1, FunSel::Sel3, HwChipSelectId::Id6), (Pb1, FunctionSelect::Sel3, HwChipSelectId::Id6),
(Pb0, FunSel::Sel3, HwChipSelectId::Id7), (Pb0, FunctionSelect::Sel3, HwChipSelectId::Id7),
(Pc8, FunSel::Sel2, HwChipSelectId::Id0), (Pc8, FunctionSelect::Sel2, HwChipSelectId::Id0),
(Pc7, FunSel::Sel2, HwChipSelectId::Id1), (Pc7, FunctionSelect::Sel2, HwChipSelectId::Id1),
(Pe12, FunSel::Sel2, HwChipSelectId::Id0), (Pe12, FunctionSelect::Sel2, HwChipSelectId::Id0),
(Pe9, FunSel::Sel2, HwChipSelectId::Id3), (Pe9, FunctionSelect::Sel2, HwChipSelectId::Id3),
(Pe8, FunSel::Sel2, HwChipSelectId::Id4), (Pe8, FunctionSelect::Sel2, HwChipSelectId::Id4),
(Pe7, FunSel::Sel3, HwChipSelectId::Id5), (Pe7, FunctionSelect::Sel3, HwChipSelectId::Id5),
(Pe6, FunSel::Sel3, HwChipSelectId::Id6), (Pe6, FunctionSelect::Sel3, HwChipSelectId::Id6),
(Pe5, FunSel::Sel3, HwChipSelectId::Id7), (Pe5, FunctionSelect::Sel3, HwChipSelectId::Id7),
(Pg2, FunSel::Sel2, HwChipSelectId::Id0), (Pg2, FunctionSelect::Sel2, HwChipSelectId::Id0),
); );
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
hw_cs_pins!( hw_cs_pins!(
Bank::Spi1, Bank::Spi1,
(Pb7, FunSel::Sel3, HwChipSelectId::Id0), (Pb7, FunctionSelect::Sel3, HwChipSelectId::Id0),
(Pb6, FunSel::Sel3, HwChipSelectId::Id1), (Pb6, FunctionSelect::Sel3, HwChipSelectId::Id1),
(Pb5, FunSel::Sel3, HwChipSelectId::Id2), (Pb5, FunctionSelect::Sel3, HwChipSelectId::Id2),
(Pe11, FunSel::Sel2, HwChipSelectId::Id1), (Pe11, FunctionSelect::Sel2, HwChipSelectId::Id1),
(Pe10, FunSel::Sel2, HwChipSelectId::Id2), (Pe10, FunctionSelect::Sel2, HwChipSelectId::Id2),
); );
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
@@ -140,7 +143,7 @@ hw_cs_multi_pin!(
PinPf2Spi1HwCsId0, PinPf2Spi1HwCsId0,
Pf2, Pf2,
Bank::Spi2, Bank::Spi2,
FunSel::Sel1, FunctionSelect::Sel1,
HwChipSelectId::Id0 HwChipSelectId::Id0
); );
@@ -148,51 +151,51 @@ hw_cs_multi_pin!(
impl PinSck for Pin<Pa5> { impl PinSck for Pin<Pa5> {
const SPI_ID: Bank = Bank::Spi2; const SPI_ID: Bank = Bank::Spi2;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinMosi for Pin<Pa7> { impl PinMosi for Pin<Pa7> {
const SPI_ID: Bank = Bank::Spi2; const SPI_ID: Bank = Bank::Spi2;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl PinMiso for Pin<Pa6> { impl PinMiso for Pin<Pa6> {
const SPI_ID: Bank = Bank::Spi2; const SPI_ID: Bank = Bank::Spi2;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
impl PinSck for Pin<Pf5> { impl PinSck for Pin<Pf5> {
const SPI_ID: Bank = Bank::Spi2; const SPI_ID: Bank = Bank::Spi2;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
impl PinMosi for Pin<Pf7> { impl PinMosi for Pin<Pf7> {
const SPI_ID: Bank = Bank::Spi2; const SPI_ID: Bank = Bank::Spi2;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
impl PinMiso for Pin<Pf6> { impl PinMiso for Pin<Pf6> {
const SPI_ID: Bank = Bank::Spi2; const SPI_ID: Bank = Bank::Spi2;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
hw_cs_pins!( hw_cs_pins!(
Bank::Spi1, Bank::Spi1,
(Pa4, FunSel::Sel2, HwChipSelectId::Id0), (Pa4, FunctionSelect::Sel2, HwChipSelectId::Id0),
(Pa3, FunSel::Sel2, HwChipSelectId::Id1), (Pa3, FunctionSelect::Sel2, HwChipSelectId::Id1),
(Pa2, FunSel::Sel2, HwChipSelectId::Id2), (Pa2, FunctionSelect::Sel2, HwChipSelectId::Id2),
(Pa1, FunSel::Sel2, HwChipSelectId::Id3), (Pa1, FunctionSelect::Sel2, HwChipSelectId::Id3),
(Pa0, FunSel::Sel2, HwChipSelectId::Id4), (Pa0, FunctionSelect::Sel2, HwChipSelectId::Id4),
(Pa8, FunSel::Sel2, HwChipSelectId::Id5), (Pa8, FunctionSelect::Sel2, HwChipSelectId::Id5),
(Pa9, FunSel::Sel2, HwChipSelectId::Id6), (Pa9, FunctionSelect::Sel2, HwChipSelectId::Id6),
(Pf0, FunSel::Sel2, HwChipSelectId::Id4), (Pf0, FunctionSelect::Sel2, HwChipSelectId::Id4),
(Pf1, FunSel::Sel2, HwChipSelectId::Id3), (Pf1, FunctionSelect::Sel2, HwChipSelectId::Id3),
); );
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
hw_cs_pins!( hw_cs_pins!(
Bank::Spi1, Bank::Spi1,
(Pf3, FunSel::Sel2, HwChipSelectId::Id1), (Pf3, FunctionSelect::Sel2, HwChipSelectId::Id1),
(Pf4, FunSel::Sel2, HwChipSelectId::Id0), (Pf4, FunctionSelect::Sel2, HwChipSelectId::Id0),
); );
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
@@ -200,6 +203,6 @@ hw_cs_multi_pin!(
PinPf2Spi2HwCsId2, PinPf2Spi2HwCsId2,
Pf2, Pf2,
Bank::Spi2, Bank::Spi2,
FunSel::Sel2, FunctionSelect::Sel2,
HwChipSelectId::Id2 HwChipSelectId::Id2
); );

View File

@@ -146,11 +146,11 @@ pub struct Status {
/// are used as clock divisor values, and uneven values are truncated to the next even value. /// are used as clock divisor values, and uneven values are truncated to the next even value.
/// A value of 0 acts as a 1 for the divisor value. /// A value of 0 acts as a 1 for the divisor value.
#[derive(Debug, Copy, Clone, PartialEq, Eq)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct ClkPrescaler(arbitrary_int::UInt<u32, 8>); pub struct ClockPrescaler(arbitrary_int::UInt<u32, 8>);
impl ClkPrescaler { impl ClockPrescaler {
pub const fn new(value: u8) -> Self { pub const fn new(value: u8) -> Self {
ClkPrescaler(arbitrary_int::UInt::<u32, 8>::new(value as u32)) ClockPrescaler(arbitrary_int::UInt::<u32, 8>::new(value as u32))
} }
pub const fn value(&self) -> u8 { pub const fn value(&self) -> u8 {
self.0.value() as u8 self.0.value() as u8
@@ -220,7 +220,7 @@ pub struct Spi {
data: Data, data: Data,
#[mmio(PureRead)] #[mmio(PureRead)]
status: Status, status: Status,
clkprescale: ClkPrescaler, clkprescale: ClockPrescaler,
irq_enb: InterruptControl, irq_enb: InterruptControl,
/// Raw interrupt status. /// Raw interrupt status.
#[mmio(PureRead)] #[mmio(PureRead)]

View File

@@ -9,7 +9,7 @@ use crate::sysconfig::enable_peripheral_clock;
pub use regs::{CascadeSource, InvalidTimerIndex, TimId}; pub use regs::{CascadeSource, InvalidTimerIndex, TimId};
use crate::{enable_nvic_interrupt, sealed::Sealed, time::Hertz}; use crate::{enable_nvic_interrupt, sealed::Sealed, time::Hertz};
use crate::{gpio::PinId, ioconfig::regs::FunSel, pins::PinMarker}; use crate::{gpio::DynPinId, ioconfig::regs::FunctionSelect, pins::AnyPin};
use fugit::RateExtU32; use fugit::RateExtU32;
#[cfg(feature = "vor1x")] #[cfg(feature = "vor1x")]
@@ -69,13 +69,13 @@ pub enum CascadeSelect {
// Valid TIM and PIN combinations // Valid TIM and PIN combinations
//================================================================================================== //==================================================================================================
pub trait TimPin: PinMarker { pub trait TimPin: AnyPin {
const PIN_ID: PinId; const PIN_ID: DynPinId;
const FUN_SEL: FunSel; const FUN_SEL: FunctionSelect;
const TIM_ID: TimId; const TIM_ID: TimId;
} }
pub trait TimMarker: Sealed { pub trait TimInstance: Sealed {
// TIM ID ranging from 0 to 23 for 24 TIM peripherals // TIM ID ranging from 0 to 23 for 24 TIM peripherals
const ID: TimId; const ID: TimId;
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
@@ -93,14 +93,14 @@ pub trait TimMarker: Sealed {
macro_rules! tim_marker { macro_rules! tim_marker {
($TIMX:path, $ID:expr) => { ($TIMX:path, $ID:expr) => {
impl TimMarker for $TIMX { impl TimInstance for $TIMX {
const ID: TimId = TimId::new_unchecked($ID); const ID: TimId = TimId::new_unchecked($ID);
} }
impl Sealed for $TIMX {} impl Sealed for $TIMX {}
}; };
($TIMX:path, $ID:expr, $IrqId:ident) => { ($TIMX:path, $ID:expr, $IrqId:ident) => {
impl TimMarker for $TIMX { impl TimInstance for $TIMX {
const ID: TimId = TimId::new_unchecked($ID); const ID: TimId = TimId::new_unchecked($ID);
const IRQ: va416xx::Interrupt = va416xx::Interrupt::$IrqId; const IRQ: va416xx::Interrupt = va416xx::Interrupt::$IrqId;
} }
@@ -163,7 +163,7 @@ cfg_if::cfg_if! {
} }
} }
pub trait ValidTimAndPin<Pin: TimPin, Tim: TimMarker>: Sealed {} pub trait ValidTimAndPin<Pin: TimPin, Tim: TimInstance>: Sealed {}
#[macro_use] #[macro_use]
mod macros { mod macros {
@@ -171,10 +171,10 @@ mod macros {
($Px:ident, $FunSel:path, $ID:expr) => { ($Px:ident, $FunSel:path, $ID:expr) => {
impl TimPin for Pin<$Px> impl TimPin for Pin<$Px>
where where
$Px: PinIdProvider, $Px: PinId,
{ {
const PIN_ID: PinId = $Px::ID; const PIN_ID: DynPinId = $Px::ID;
const FUN_SEL: FunSel = $FunSel; const FUN_SEL: FunctionSelect = $FunSel;
const TIM_ID: TimId = TimId::new_unchecked($ID); const TIM_ID: TimId = TimId::new_unchecked($ID);
} }
}; };
@@ -207,7 +207,7 @@ impl CountdownTimer {
/// [Self::enable_interrupt] and [Self::enable] API to set up and configure the countdown /// [Self::enable_interrupt] and [Self::enable] API to set up and configure the countdown
/// timer. /// timer.
#[cfg(feature = "vor1x")] #[cfg(feature = "vor1x")]
pub fn new<Tim: TimMarker>(_tim: Tim, sys_clk: Hertz) -> Self { pub fn new<Tim: TimInstance>(_tim: Tim, sys_clk: Hertz) -> Self {
enable_tim_clk(Tim::ID); enable_tim_clk(Tim::ID);
assert_tim_reset_for_cycles(Tim::ID, 2); assert_tim_reset_for_cycles(Tim::ID, 2);
CountdownTimer { CountdownTimer {
@@ -226,7 +226,7 @@ impl CountdownTimer {
/// [Self::enable_interrupt] and [Self::enable] API to set up and configure the countdown /// [Self::enable_interrupt] and [Self::enable] API to set up and configure the countdown
/// timer. /// timer.
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
pub fn new<Tim: TimMarker>(_tim: Tim, clks: &crate::clock::Clocks) -> Self { pub fn new<Tim: TimInstance>(_tim: Tim, clks: &crate::clock::Clocks) -> Self {
enable_tim_clk(Tim::ID); enable_tim_clk(Tim::ID);
assert_tim_reset_for_cycles(Tim::ID, 2); assert_tim_reset_for_cycles(Tim::ID, 2);
CountdownTimer { CountdownTimer {

View File

@@ -1,56 +1,56 @@
use super::{TimId, TimPin}; use super::{TimId, TimPin};
use crate::FunSel; use crate::FunctionSelect;
use crate::pins::{ use crate::pins::{
Pa0, Pa1, Pa2, Pa3, Pa4, Pa5, Pa6, Pa7, Pa8, Pa9, Pa10, Pa11, Pa12, Pa13, Pa14, Pa15, Pa24, DynPinId, Pa0, Pa1, Pa2, Pa3, Pa4, Pa5, Pa6, Pa7, Pa8, Pa9, Pa10, Pa11, Pa12, Pa13, Pa14, Pa15,
Pa25, Pa26, Pa27, Pa28, Pa29, Pa30, Pa31, Pb0, Pb1, Pb2, Pb3, Pb4, Pb5, Pb6, Pb10, Pb11, Pb12, Pa24, Pa25, Pa26, Pa27, Pa28, Pa29, Pa30, Pa31, Pb0, Pb1, Pb2, Pb3, Pb4, Pb5, Pb6, Pb10, Pb11,
Pb13, Pb14, Pb15, Pb16, Pb17, Pb18, Pb19, Pb20, Pb21, Pb22, Pb23, Pin, PinId, PinIdProvider, Pb12, Pb13, Pb14, Pb15, Pb16, Pb17, Pb18, Pb19, Pb20, Pb21, Pb22, Pb23, Pin, PinId,
}; };
pin_and_tim!(Pa0, FunSel::Sel1, 0); pin_and_tim!(Pa0, FunctionSelect::Sel1, 0);
pin_and_tim!(Pa1, FunSel::Sel1, 1); pin_and_tim!(Pa1, FunctionSelect::Sel1, 1);
pin_and_tim!(Pa2, FunSel::Sel1, 2); pin_and_tim!(Pa2, FunctionSelect::Sel1, 2);
pin_and_tim!(Pa3, FunSel::Sel1, 3); pin_and_tim!(Pa3, FunctionSelect::Sel1, 3);
pin_and_tim!(Pa4, FunSel::Sel1, 4); pin_and_tim!(Pa4, FunctionSelect::Sel1, 4);
pin_and_tim!(Pa5, FunSel::Sel1, 5); pin_and_tim!(Pa5, FunctionSelect::Sel1, 5);
pin_and_tim!(Pa6, FunSel::Sel1, 6); pin_and_tim!(Pa6, FunctionSelect::Sel1, 6);
pin_and_tim!(Pa7, FunSel::Sel1, 7); pin_and_tim!(Pa7, FunctionSelect::Sel1, 7);
pin_and_tim!(Pa8, FunSel::Sel1, 8); pin_and_tim!(Pa8, FunctionSelect::Sel1, 8);
pin_and_tim!(Pa9, FunSel::Sel1, 9); pin_and_tim!(Pa9, FunctionSelect::Sel1, 9);
pin_and_tim!(Pa10, FunSel::Sel1, 10); pin_and_tim!(Pa10, FunctionSelect::Sel1, 10);
pin_and_tim!(Pa11, FunSel::Sel1, 11); pin_and_tim!(Pa11, FunctionSelect::Sel1, 11);
pin_and_tim!(Pa12, FunSel::Sel1, 12); pin_and_tim!(Pa12, FunctionSelect::Sel1, 12);
pin_and_tim!(Pa13, FunSel::Sel1, 13); pin_and_tim!(Pa13, FunctionSelect::Sel1, 13);
pin_and_tim!(Pa14, FunSel::Sel1, 14); pin_and_tim!(Pa14, FunctionSelect::Sel1, 14);
pin_and_tim!(Pa15, FunSel::Sel1, 15); pin_and_tim!(Pa15, FunctionSelect::Sel1, 15);
pin_and_tim!(Pa24, FunSel::Sel2, 16); pin_and_tim!(Pa24, FunctionSelect::Sel2, 16);
pin_and_tim!(Pa25, FunSel::Sel2, 17); pin_and_tim!(Pa25, FunctionSelect::Sel2, 17);
pin_and_tim!(Pa26, FunSel::Sel2, 18); pin_and_tim!(Pa26, FunctionSelect::Sel2, 18);
pin_and_tim!(Pa27, FunSel::Sel2, 19); pin_and_tim!(Pa27, FunctionSelect::Sel2, 19);
pin_and_tim!(Pa28, FunSel::Sel2, 20); pin_and_tim!(Pa28, FunctionSelect::Sel2, 20);
pin_and_tim!(Pa29, FunSel::Sel2, 21); pin_and_tim!(Pa29, FunctionSelect::Sel2, 21);
pin_and_tim!(Pa30, FunSel::Sel2, 22); pin_and_tim!(Pa30, FunctionSelect::Sel2, 22);
pin_and_tim!(Pa31, FunSel::Sel2, 23); pin_and_tim!(Pa31, FunctionSelect::Sel2, 23);
pin_and_tim!(Pb0, FunSel::Sel3, 0); pin_and_tim!(Pb0, FunctionSelect::Sel3, 0);
pin_and_tim!(Pb1, FunSel::Sel3, 1); pin_and_tim!(Pb1, FunctionSelect::Sel3, 1);
pin_and_tim!(Pb2, FunSel::Sel3, 2); pin_and_tim!(Pb2, FunctionSelect::Sel3, 2);
pin_and_tim!(Pb3, FunSel::Sel3, 3); pin_and_tim!(Pb3, FunctionSelect::Sel3, 3);
pin_and_tim!(Pb4, FunSel::Sel3, 4); pin_and_tim!(Pb4, FunctionSelect::Sel3, 4);
pin_and_tim!(Pb5, FunSel::Sel3, 5); pin_and_tim!(Pb5, FunctionSelect::Sel3, 5);
pin_and_tim!(Pb6, FunSel::Sel3, 6); pin_and_tim!(Pb6, FunctionSelect::Sel3, 6);
pin_and_tim!(Pb10, FunSel::Sel3, 10); pin_and_tim!(Pb10, FunctionSelect::Sel3, 10);
pin_and_tim!(Pb11, FunSel::Sel3, 11); pin_and_tim!(Pb11, FunctionSelect::Sel3, 11);
pin_and_tim!(Pb12, FunSel::Sel3, 12); pin_and_tim!(Pb12, FunctionSelect::Sel3, 12);
pin_and_tim!(Pb13, FunSel::Sel3, 13); pin_and_tim!(Pb13, FunctionSelect::Sel3, 13);
pin_and_tim!(Pb14, FunSel::Sel3, 14); pin_and_tim!(Pb14, FunctionSelect::Sel3, 14);
pin_and_tim!(Pb15, FunSel::Sel3, 15); pin_and_tim!(Pb15, FunctionSelect::Sel3, 15);
pin_and_tim!(Pb16, FunSel::Sel3, 16); pin_and_tim!(Pb16, FunctionSelect::Sel3, 16);
pin_and_tim!(Pb17, FunSel::Sel3, 17); pin_and_tim!(Pb17, FunctionSelect::Sel3, 17);
pin_and_tim!(Pb18, FunSel::Sel3, 18); pin_and_tim!(Pb18, FunctionSelect::Sel3, 18);
pin_and_tim!(Pb19, FunSel::Sel3, 19); pin_and_tim!(Pb19, FunctionSelect::Sel3, 19);
pin_and_tim!(Pb20, FunSel::Sel3, 20); pin_and_tim!(Pb20, FunctionSelect::Sel3, 20);
pin_and_tim!(Pb21, FunSel::Sel3, 21); pin_and_tim!(Pb21, FunctionSelect::Sel3, 21);
pin_and_tim!(Pb22, FunSel::Sel3, 22); pin_and_tim!(Pb22, FunctionSelect::Sel3, 22);
pin_and_tim!(Pb23, FunSel::Sel3, 23); pin_and_tim!(Pb23, FunctionSelect::Sel3, 23);

View File

@@ -1,9 +1,9 @@
use super::{FunSel, TimId, TimPin}; use super::{FunctionSelect, TimId, TimPin};
use crate::pins::{ use crate::pins::{
Pa0, Pa1, Pa2, Pa3, Pa4, Pa5, Pa6, Pa7, Pa8, Pa10, Pa11, Pa12, Pa13, Pa14, Pa15, Pb0, Pb1, Pb2, DynPinId, Pa0, Pa1, Pa2, Pa3, Pa4, Pa5, Pa6, Pa7, Pa8, Pa10, Pa11, Pa12, Pa13, Pa14, Pa15, Pb0,
Pb3, Pb4, Pb12, Pb13, Pb14, Pb15, Pc0, Pc1, Pd10, Pd11, Pd12, Pd13, Pd14, Pd15, Pe0, Pe1, Pe2, Pb1, Pb2, Pb3, Pb4, Pb12, Pb13, Pb14, Pb15, Pc0, Pc1, Pd10, Pd11, Pd12, Pd13, Pd14, Pd15, Pe0,
Pe3, Pe4, Pe5, Pe6, Pe7, Pe8, Pe9, Pe12, Pe13, Pe14, Pe15, Pf0, Pf1, Pf9, Pf11, Pf12, Pf13, Pe1, Pe2, Pe3, Pe4, Pe5, Pe6, Pe7, Pe8, Pe9, Pe12, Pe13, Pe14, Pe15, Pf0, Pf1, Pf9, Pf11, Pf12,
Pf14, Pf15, Pg0, Pg1, Pg2, Pg3, Pg6, Pin, PinId, PinIdProvider, Pf13, Pf14, Pf15, Pg0, Pg1, Pg2, Pg3, Pg6, Pin, PinId,
}; };
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
use crate::pins::{ use crate::pins::{
@@ -11,122 +11,122 @@ use crate::pins::{
Pe11, Pf2, Pf3, Pf4, Pf5, Pf6, Pf7, Pf8, Pf10, Pe11, Pf2, Pf3, Pf4, Pf5, Pf6, Pf7, Pf8, Pf10,
}; };
pin_and_tim!(Pa0, FunSel::Sel1, 0); pin_and_tim!(Pa0, FunctionSelect::Sel1, 0);
pin_and_tim!(Pa1, FunSel::Sel1, 1); pin_and_tim!(Pa1, FunctionSelect::Sel1, 1);
pin_and_tim!(Pa2, FunSel::Sel1, 2); pin_and_tim!(Pa2, FunctionSelect::Sel1, 2);
pin_and_tim!(Pa3, FunSel::Sel1, 3); pin_and_tim!(Pa3, FunctionSelect::Sel1, 3);
pin_and_tim!(Pa4, FunSel::Sel1, 4); pin_and_tim!(Pa4, FunctionSelect::Sel1, 4);
pin_and_tim!(Pa5, FunSel::Sel1, 5); pin_and_tim!(Pa5, FunctionSelect::Sel1, 5);
pin_and_tim!(Pa6, FunSel::Sel1, 6); pin_and_tim!(Pa6, FunctionSelect::Sel1, 6);
pin_and_tim!(Pa7, FunSel::Sel1, 7); pin_and_tim!(Pa7, FunctionSelect::Sel1, 7);
pin_and_tim!(Pa8, FunSel::Sel3, 8); pin_and_tim!(Pa8, FunctionSelect::Sel3, 8);
pin_and_tim!(Pa10, FunSel::Sel2, 23); pin_and_tim!(Pa10, FunctionSelect::Sel2, 23);
pin_and_tim!(Pa11, FunSel::Sel2, 22); pin_and_tim!(Pa11, FunctionSelect::Sel2, 22);
pin_and_tim!(Pa12, FunSel::Sel2, 21); pin_and_tim!(Pa12, FunctionSelect::Sel2, 21);
pin_and_tim!(Pa13, FunSel::Sel2, 20); pin_and_tim!(Pa13, FunctionSelect::Sel2, 20);
pin_and_tim!(Pa14, FunSel::Sel2, 19); pin_and_tim!(Pa14, FunctionSelect::Sel2, 19);
pin_and_tim!(Pa15, FunSel::Sel2, 18); pin_and_tim!(Pa15, FunctionSelect::Sel2, 18);
pin_and_tim!(Pb0, FunSel::Sel2, 17); pin_and_tim!(Pb0, FunctionSelect::Sel2, 17);
pin_and_tim!(Pb1, FunSel::Sel2, 16); pin_and_tim!(Pb1, FunctionSelect::Sel2, 16);
pin_and_tim!(Pb2, FunSel::Sel2, 15); pin_and_tim!(Pb2, FunctionSelect::Sel2, 15);
pin_and_tim!(Pb3, FunSel::Sel2, 14); pin_and_tim!(Pb3, FunctionSelect::Sel2, 14);
pin_and_tim!(Pb4, FunSel::Sel2, 13); pin_and_tim!(Pb4, FunctionSelect::Sel2, 13);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pb5, FunSel::Sel2, 12); pin_and_tim!(Pb5, FunctionSelect::Sel2, 12);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pb6, FunSel::Sel2, 11); pin_and_tim!(Pb6, FunctionSelect::Sel2, 11);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pb7, FunSel::Sel2, 10); pin_and_tim!(Pb7, FunctionSelect::Sel2, 10);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pb8, FunSel::Sel2, 9); pin_and_tim!(Pb8, FunctionSelect::Sel2, 9);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pb9, FunSel::Sel2, 8); pin_and_tim!(Pb9, FunctionSelect::Sel2, 8);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pb10, FunSel::Sel2, 7); pin_and_tim!(Pb10, FunctionSelect::Sel2, 7);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pb11, FunSel::Sel2, 6); pin_and_tim!(Pb11, FunctionSelect::Sel2, 6);
pin_and_tim!(Pb12, FunSel::Sel2, 5); pin_and_tim!(Pb12, FunctionSelect::Sel2, 5);
pin_and_tim!(Pb13, FunSel::Sel2, 4); pin_and_tim!(Pb13, FunctionSelect::Sel2, 4);
pin_and_tim!(Pb14, FunSel::Sel2, 3); pin_and_tim!(Pb14, FunctionSelect::Sel2, 3);
pin_and_tim!(Pb15, FunSel::Sel2, 2); pin_and_tim!(Pb15, FunctionSelect::Sel2, 2);
pin_and_tim!(Pc0, FunSel::Sel2, 1); pin_and_tim!(Pc0, FunctionSelect::Sel2, 1);
pin_and_tim!(Pc1, FunSel::Sel2, 0); pin_and_tim!(Pc1, FunctionSelect::Sel2, 0);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pd0, FunSel::Sel2, 0); pin_and_tim!(Pd0, FunctionSelect::Sel2, 0);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pd1, FunSel::Sel2, 1); pin_and_tim!(Pd1, FunctionSelect::Sel2, 1);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pd2, FunSel::Sel2, 2); pin_and_tim!(Pd2, FunctionSelect::Sel2, 2);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pd3, FunSel::Sel2, 3); pin_and_tim!(Pd3, FunctionSelect::Sel2, 3);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pd4, FunSel::Sel2, 4); pin_and_tim!(Pd4, FunctionSelect::Sel2, 4);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pd5, FunSel::Sel2, 5); pin_and_tim!(Pd5, FunctionSelect::Sel2, 5);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pd6, FunSel::Sel2, 6); pin_and_tim!(Pd6, FunctionSelect::Sel2, 6);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pd7, FunSel::Sel2, 7); pin_and_tim!(Pd7, FunctionSelect::Sel2, 7);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pd8, FunSel::Sel2, 8); pin_and_tim!(Pd8, FunctionSelect::Sel2, 8);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pd9, FunSel::Sel2, 9); pin_and_tim!(Pd9, FunctionSelect::Sel2, 9);
pin_and_tim!(Pd10, FunSel::Sel2, 10); pin_and_tim!(Pd10, FunctionSelect::Sel2, 10);
pin_and_tim!(Pd11, FunSel::Sel2, 11); pin_and_tim!(Pd11, FunctionSelect::Sel2, 11);
pin_and_tim!(Pd12, FunSel::Sel2, 12); pin_and_tim!(Pd12, FunctionSelect::Sel2, 12);
pin_and_tim!(Pd13, FunSel::Sel2, 13); pin_and_tim!(Pd13, FunctionSelect::Sel2, 13);
pin_and_tim!(Pd14, FunSel::Sel2, 14); pin_and_tim!(Pd14, FunctionSelect::Sel2, 14);
pin_and_tim!(Pd15, FunSel::Sel2, 15); pin_and_tim!(Pd15, FunctionSelect::Sel2, 15);
pin_and_tim!(Pe0, FunSel::Sel2, 16); pin_and_tim!(Pe0, FunctionSelect::Sel2, 16);
pin_and_tim!(Pe1, FunSel::Sel2, 17); pin_and_tim!(Pe1, FunctionSelect::Sel2, 17);
pin_and_tim!(Pe2, FunSel::Sel2, 18); pin_and_tim!(Pe2, FunctionSelect::Sel2, 18);
pin_and_tim!(Pe3, FunSel::Sel2, 19); pin_and_tim!(Pe3, FunctionSelect::Sel2, 19);
pin_and_tim!(Pe4, FunSel::Sel2, 20); pin_and_tim!(Pe4, FunctionSelect::Sel2, 20);
pin_and_tim!(Pe5, FunSel::Sel2, 21); pin_and_tim!(Pe5, FunctionSelect::Sel2, 21);
pin_and_tim!(Pe6, FunSel::Sel2, 22); pin_and_tim!(Pe6, FunctionSelect::Sel2, 22);
pin_and_tim!(Pe7, FunSel::Sel2, 23); pin_and_tim!(Pe7, FunctionSelect::Sel2, 23);
pin_and_tim!(Pe8, FunSel::Sel3, 16); pin_and_tim!(Pe8, FunctionSelect::Sel3, 16);
pin_and_tim!(Pe9, FunSel::Sel3, 17); pin_and_tim!(Pe9, FunctionSelect::Sel3, 17);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pe10, FunSel::Sel3, 18); pin_and_tim!(Pe10, FunctionSelect::Sel3, 18);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pe11, FunSel::Sel3, 19); pin_and_tim!(Pe11, FunctionSelect::Sel3, 19);
pin_and_tim!(Pe12, FunSel::Sel3, 20); pin_and_tim!(Pe12, FunctionSelect::Sel3, 20);
pin_and_tim!(Pe13, FunSel::Sel3, 21); pin_and_tim!(Pe13, FunctionSelect::Sel3, 21);
pin_and_tim!(Pe14, FunSel::Sel3, 22); pin_and_tim!(Pe14, FunctionSelect::Sel3, 22);
pin_and_tim!(Pe15, FunSel::Sel3, 23); pin_and_tim!(Pe15, FunctionSelect::Sel3, 23);
pin_and_tim!(Pf0, FunSel::Sel3, 0); pin_and_tim!(Pf0, FunctionSelect::Sel3, 0);
pin_and_tim!(Pf1, FunSel::Sel3, 1); pin_and_tim!(Pf1, FunctionSelect::Sel3, 1);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pf2, FunSel::Sel3, 2); pin_and_tim!(Pf2, FunctionSelect::Sel3, 2);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pf3, FunSel::Sel3, 3); pin_and_tim!(Pf3, FunctionSelect::Sel3, 3);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pf4, FunSel::Sel3, 4); pin_and_tim!(Pf4, FunctionSelect::Sel3, 4);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pf5, FunSel::Sel3, 5); pin_and_tim!(Pf5, FunctionSelect::Sel3, 5);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pf6, FunSel::Sel3, 6); pin_and_tim!(Pf6, FunctionSelect::Sel3, 6);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pf7, FunSel::Sel3, 7); pin_and_tim!(Pf7, FunctionSelect::Sel3, 7);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pf8, FunSel::Sel3, 8); pin_and_tim!(Pf8, FunctionSelect::Sel3, 8);
pin_and_tim!(Pf9, FunSel::Sel3, 9); pin_and_tim!(Pf9, FunctionSelect::Sel3, 9);
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
pin_and_tim!(Pf10, FunSel::Sel3, 10); pin_and_tim!(Pf10, FunctionSelect::Sel3, 10);
pin_and_tim!(Pf11, FunSel::Sel3, 11); pin_and_tim!(Pf11, FunctionSelect::Sel3, 11);
pin_and_tim!(Pf12, FunSel::Sel3, 12); pin_and_tim!(Pf12, FunctionSelect::Sel3, 12);
pin_and_tim!(Pf13, FunSel::Sel2, 19); pin_and_tim!(Pf13, FunctionSelect::Sel2, 19);
pin_and_tim!(Pf14, FunSel::Sel2, 20); pin_and_tim!(Pf14, FunctionSelect::Sel2, 20);
pin_and_tim!(Pf15, FunSel::Sel2, 21); pin_and_tim!(Pf15, FunctionSelect::Sel2, 21);
pin_and_tim!(Pg0, FunSel::Sel2, 22); pin_and_tim!(Pg0, FunctionSelect::Sel2, 22);
pin_and_tim!(Pg1, FunSel::Sel2, 23); pin_and_tim!(Pg1, FunctionSelect::Sel2, 23);
pin_and_tim!(Pg2, FunSel::Sel1, 9); pin_and_tim!(Pg2, FunctionSelect::Sel1, 9);
pin_and_tim!(Pg3, FunSel::Sel1, 10); pin_and_tim!(Pg3, FunctionSelect::Sel1, 10);
pin_and_tim!(Pg6, FunSel::Sel1, 12); pin_and_tim!(Pg6, FunctionSelect::Sel1, 12);

View File

@@ -16,10 +16,10 @@ use core::convert::Infallible;
pub mod regs; pub mod regs;
#[cfg(feature = "vor1x")] #[cfg(feature = "vor1x")]
use crate::InterruptConfig; use crate::InterruptConfig;
use crate::{FunSel, gpio::IoPeriphPin, pins::PinMarker, sealed::Sealed}; use crate::{FunctionSelect, gpio::IoPeriphPin, pins::AnyPin, sealed::Sealed};
use arbitrary_int::{prelude::*, u6, u18}; use arbitrary_int::{prelude::*, u6, u18};
use fugit::RateExtU32; use fugit::RateExtU32;
use regs::{ClkScale, Control, Data, Enable, FifoClear, InterruptClear, MmioUart}; use regs::{ClockScale, Control, Data, Enable, FifoClear, InterruptClear, MmioUart};
use crate::{PeripheralSelect, enable_nvic_interrupt, enable_peripheral_clock, time::Hertz}; use crate::{PeripheralSelect, enable_nvic_interrupt, enable_peripheral_clock, time::Hertz};
use embedded_hal_nb::serial::Read; use embedded_hal_nb::serial::Read;
@@ -47,13 +47,13 @@ pub use rx_asynch::*;
// Type-Level support // Type-Level support
//================================================================================================== //==================================================================================================
pub trait TxPin: PinMarker { pub trait TxPin: AnyPin {
const BANK: Bank; const BANK: Bank;
const FUN_SEL: FunSel; const FUN_SEL: FunctionSelect;
} }
pub trait RxPin: PinMarker { pub trait RxPin: AnyPin {
const BANK: Bank; const BANK: Bank;
const FUN_SEL: FunSel; const FUN_SEL: FunctionSelect;
} }
//================================================================================================== //==================================================================================================
@@ -180,33 +180,33 @@ impl From<Hertz> for Config {
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct IrqContextTimeoutOrMaxSize { pub struct InterruptContextTimeoutOrMaxSize {
rx_idx: usize, rx_idx: usize,
mode: IrqReceptionMode, mode: InterruptReceptionMode,
pub max_len: usize, pub max_len: usize,
} }
impl IrqContextTimeoutOrMaxSize { impl InterruptContextTimeoutOrMaxSize {
pub fn new(max_len: usize) -> Self { pub fn new(max_len: usize) -> Self {
IrqContextTimeoutOrMaxSize { InterruptContextTimeoutOrMaxSize {
rx_idx: 0, rx_idx: 0,
max_len, max_len,
mode: IrqReceptionMode::Idle, mode: InterruptReceptionMode::Idle,
} }
} }
} }
impl IrqContextTimeoutOrMaxSize { impl InterruptContextTimeoutOrMaxSize {
pub fn reset(&mut self) { pub fn reset(&mut self) {
self.rx_idx = 0; self.rx_idx = 0;
self.mode = IrqReceptionMode::Idle; self.mode = InterruptReceptionMode::Idle;
} }
} }
/// This struct is used to return the default IRQ handler result to the user /// This struct is used to return the default IRQ handler result to the user
#[derive(Debug, Default)] #[derive(Debug, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct IrqResult { pub struct InterruptResult {
pub bytes_read: usize, pub bytes_read: usize,
pub errors: Option<UartErrors>, pub errors: Option<UartErrors>,
} }
@@ -214,16 +214,16 @@ pub struct IrqResult {
/// This struct is used to return the default IRQ handler result to the user /// This struct is used to return the default IRQ handler result to the user
#[derive(Debug, Default)] #[derive(Debug, Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct IrqResultMaxSizeOrTimeout { pub struct InterruptResultMaxSizeOrTimeout {
complete: bool, complete: bool,
timeout: bool, timeout: bool,
pub errors: Option<UartErrors>, pub errors: Option<UartErrors>,
pub bytes_read: usize, pub bytes_read: usize,
} }
impl IrqResultMaxSizeOrTimeout { impl InterruptResultMaxSizeOrTimeout {
pub fn new() -> Self { pub fn new() -> Self {
IrqResultMaxSizeOrTimeout { InterruptResultMaxSizeOrTimeout {
complete: false, complete: false,
timeout: false, timeout: false,
errors: None, errors: None,
@@ -231,7 +231,7 @@ impl IrqResultMaxSizeOrTimeout {
} }
} }
} }
impl IrqResultMaxSizeOrTimeout { impl InterruptResultMaxSizeOrTimeout {
#[inline] #[inline]
pub fn has_errors(&self) -> bool { pub fn has_errors(&self) -> bool {
self.errors.is_some() self.errors.is_some()
@@ -265,7 +265,7 @@ impl IrqResultMaxSizeOrTimeout {
#[derive(Debug, PartialEq, Copy, Clone)] #[derive(Debug, PartialEq, Copy, Clone)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
enum IrqReceptionMode { enum InterruptReceptionMode {
Idle, Idle,
Pending, Pending,
} }
@@ -319,7 +319,7 @@ pub struct BufferTooShortError {
// UART peripheral wrapper // UART peripheral wrapper
//================================================================================================== //==================================================================================================
pub trait UartPeripheralMarker: Sealed { pub trait UartInstance: Sealed {
const ID: Bank; const ID: Bank;
const PERIPH_SEL: PeripheralSelect; const PERIPH_SEL: PeripheralSelect;
} }
@@ -329,7 +329,7 @@ pub type Uart0 = pac::Uarta;
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
pub type Uart0 = pac::Uart0; pub type Uart0 = pac::Uart0;
impl UartPeripheralMarker for Uart0 { impl UartInstance for Uart0 {
const ID: Bank = Bank::Uart0; const ID: Bank = Bank::Uart0;
const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Uart0; const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Uart0;
} }
@@ -340,14 +340,14 @@ pub type Uart1 = pac::Uartb;
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
pub type Uart1 = pac::Uart1; pub type Uart1 = pac::Uart1;
impl UartPeripheralMarker for Uart1 { impl UartInstance for Uart1 {
const ID: Bank = Bank::Uart1; const ID: Bank = Bank::Uart1;
const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Uart1; const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Uart1;
} }
impl Sealed for Uart1 {} impl Sealed for Uart1 {}
#[cfg(feature = "vor4x")] #[cfg(feature = "vor4x")]
impl UartPeripheralMarker for pac::Uart2 { impl UartInstance for pac::Uart2 {
const ID: Bank = Bank::Uart2; const ID: Bank = Bank::Uart2;
const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Uart2; const PERIPH_SEL: PeripheralSelect = PeripheralSelect::Uart2;
} }
@@ -373,22 +373,22 @@ impl Uart {
cfg_if::cfg_if! { cfg_if::cfg_if! {
if #[cfg(feature = "vor1x")] { if #[cfg(feature = "vor1x")] {
/// Calls [Self::new] with the interrupt configuration to some valid value. /// Calls [Self::new] with the interrupt configuration to some valid value.
pub fn new_with_interrupt<UartI: UartPeripheralMarker, TxPinI: TxPin, RxPinI: RxPin>( pub fn new_with_interrupt<UartPeriph: UartInstance, Tx: TxPin, Rx: RxPin>(
uart: UartI, uart: UartPeriph,
tx_pin: TxPinI, tx_pin: Tx,
rx_pin: RxPinI, rx_pin: Rx,
sys_clk: Hertz, sys_clk: Hertz,
config: Config, config: Config,
irq_cfg: InterruptConfig, irq_cfg: InterruptConfig,
) -> Result<Uart, UartIdMissmatchError> { ) -> Result<Self, UartIdMissmatchError> {
Self::new(uart, tx_pin, rx_pin, sys_clk, config, Some(irq_cfg)) Self::new(uart, tx_pin, rx_pin, sys_clk, config, Some(irq_cfg))
} }
/// Calls [Self::new] with the interrupt configuration to [None]. /// Calls [Self::new] with the interrupt configuration to [None].
pub fn new_without_interrupt<UartI: UartPeripheralMarker, TxPinI: TxPin, RxPinI: RxPin>( pub fn new_without_interrupt<UartPeriph: UartInstance, Tx: TxPin, Rx: RxPin>(
uart: UartI, uart: UartPeriph,
tx_pin: TxPinI, tx_pin: Tx,
rx_pin: RxPinI, rx_pin: Rx,
sys_clk: Hertz, sys_clk: Hertz,
config: Config, config: Config,
) -> Result<Self, UartIdMissmatchError> { ) -> Result<Self, UartIdMissmatchError> {
@@ -407,10 +407,10 @@ impl Uart {
/// - `irq_cfg`: Optional interrupt configuration. This should be a valid value if the plan /// - `irq_cfg`: Optional interrupt configuration. This should be a valid value if the plan
/// is to use TX or RX functionality relying on interrupts. If only the blocking API without /// is to use TX or RX functionality relying on interrupts. If only the blocking API without
/// any interrupt support is used, this can be [None]. /// any interrupt support is used, this can be [None].
pub fn new<UartI: UartPeripheralMarker, TxPinI: TxPin, RxPinI: RxPin>( pub fn new<UartPeriph: UartInstance, Tx: TxPin, Rx: RxPin>(
uart: UartI, uart: UartPeriph,
tx_pin: TxPinI, tx_pin: Tx,
rx_pin: RxPinI, rx_pin: Rx,
sys_clk: Hertz, sys_clk: Hertz,
config: Config, config: Config,
opt_irq_cfg: Option<InterruptConfig>, opt_irq_cfg: Option<InterruptConfig>,
@@ -426,10 +426,10 @@ impl Uart {
/// - `uart`: The concrete UART peripheral instance. /// - `uart`: The concrete UART peripheral instance.
/// - `pins`: UART TX and RX pin tuple. /// - `pins`: UART TX and RX pin tuple.
/// - `config`: UART specific configuration parameters like baudrate. /// - `config`: UART specific configuration parameters like baudrate.
pub fn new<UartI: UartPeripheralMarker, TxPinI: TxPin, RxPinI: RxPin>( pub fn new<UartI: UartInstance, Tx: TxPin, Rx: RxPin>(
uart: UartI, uart: UartI,
tx_pin: TxPinI, tx_pin: Tx,
rx_pin: RxPinI, rx_pin: Rx,
clks: &Clocks, clks: &Clocks,
config: Config, config: Config,
) -> Result<Self, UartIdMissmatchError> { ) -> Result<Self, UartIdMissmatchError> {
@@ -448,10 +448,10 @@ impl Uart {
/// - `uart`: The concrete UART peripheral instance. /// - `uart`: The concrete UART peripheral instance.
/// - `pins`: UART TX and RX pin tuple. /// - `pins`: UART TX and RX pin tuple.
/// - `config`: UART specific configuration parameters like baudrate. /// - `config`: UART specific configuration parameters like baudrate.
pub fn new_with_ref_clk<UartI: UartPeripheralMarker, TxPinI: TxPin, RxPinI: RxPin>( pub fn new_with_ref_clk<Uart: UartInstance, Tx: TxPin, Rx: RxPin>(
uart: UartI, uart: Uart,
tx_pin: TxPinI, tx_pin: Tx,
rx_pin: RxPinI, rx_pin: Rx,
ref_clk: Hertz, ref_clk: Hertz,
config: Config, config: Config,
) -> Result<Self, UartIdMissmatchError> { ) -> Result<Self, UartIdMissmatchError> {
@@ -460,7 +460,7 @@ impl Uart {
} }
} }
fn new_internal<UartI: UartPeripheralMarker, TxPinI: TxPin, RxPinI: RxPin>( fn new_internal<UartI: UartInstance, TxPinI: TxPin, RxPinI: RxPin>(
_uart: UartI, _uart: UartI,
_pins: (TxPinI, RxPinI), _pins: (TxPinI, RxPinI),
ref_clk: Hertz, ref_clk: Hertz,
@@ -489,7 +489,7 @@ impl Uart {
let x = ref_clk.raw() as f32 / (config.baudrate.raw() * baud_multiplier) as f32; let x = ref_clk.raw() as f32 / (config.baudrate.raw() * baud_multiplier) as f32;
let integer_part = x as u32; let integer_part = x as u32;
reg_block.write_clkscale( reg_block.write_clkscale(
ClkScale::builder() ClockScale::builder()
.with_int(u18::new(integer_part)) .with_int(u18::new(integer_part))
.with_frac(u6::new(frac as u8)) .with_frac(u6::new(frac as u8))
.build(), .build(),
@@ -545,7 +545,7 @@ impl Uart {
} }
#[inline] #[inline]
pub fn perid(&self) -> u32 { pub fn peripheral_id(&self) -> u32 {
self.tx.perid() self.tx.perid()
} }
@@ -1095,12 +1095,12 @@ impl RxWithInterrupt {
/// of a packet. /// of a packet.
pub fn read_fixed_len_or_timeout_based_using_irq( pub fn read_fixed_len_or_timeout_based_using_irq(
&mut self, &mut self,
context: &mut IrqContextTimeoutOrMaxSize, context: &mut InterruptContextTimeoutOrMaxSize,
) -> Result<(), TransferPendingError> { ) -> Result<(), TransferPendingError> {
if context.mode != IrqReceptionMode::Idle { if context.mode != InterruptReceptionMode::Idle {
return Err(TransferPendingError); return Err(TransferPendingError);
} }
context.mode = IrqReceptionMode::Pending; context.mode = InterruptReceptionMode::Pending;
context.rx_idx = 0; context.rx_idx = 0;
self.start(); self.start();
Ok(()) Ok(())
@@ -1131,9 +1131,9 @@ impl RxWithInterrupt {
/// ///
/// This function will not disable the RX interrupts, so you don't need to call any other /// This function will not disable the RX interrupts, so you don't need to call any other
/// API after calling this function to continue emptying the FIFO. RX errors are handled /// API after calling this function to continue emptying the FIFO. RX errors are handled
/// as partial errors and are returned as part of the [IrqResult]. /// as partial errors and are returned as part of the [InterruptResult].
pub fn on_interrupt(&mut self, buf: &mut [u8; 16]) -> IrqResult { pub fn on_interrupt(&mut self, buf: &mut [u8; 16]) -> InterruptResult {
let mut result = IrqResult::default(); let mut result = InterruptResult::default();
let irq_status = self.0.regs.read_irq_status(); let irq_status = self.0.regs.read_irq_status();
let irq_enabled = self.0.regs.read_irq_enabled(); let irq_enabled = self.0.regs.read_irq_enabled();
@@ -1182,23 +1182,23 @@ impl RxWithInterrupt {
/// ///
/// If either the maximum number of packets have been read or a timeout occured, the transfer /// If either the maximum number of packets have been read or a timeout occured, the transfer
/// will be deemed completed. The state information of the transfer is tracked in the /// will be deemed completed. The state information of the transfer is tracked in the
/// [IrqContextTimeoutOrMaxSize] structure. /// [InterruptContextTimeoutOrMaxSize] structure.
/// ///
/// If passed buffer is equal to or larger than the specified maximum length, an /// If passed buffer is equal to or larger than the specified maximum length, an
/// [BufferTooShortError] will be returned. Other RX errors are treated as partial errors /// [BufferTooShortError] will be returned. Other RX errors are treated as partial errors
/// and returned inside the [IrqResultMaxSizeOrTimeout] structure. /// and returned inside the [InterruptResultMaxSizeOrTimeout] structure.
pub fn on_interrupt_max_size_or_timeout_based( pub fn on_interrupt_max_size_or_timeout_based(
&mut self, &mut self,
context: &mut IrqContextTimeoutOrMaxSize, context: &mut InterruptContextTimeoutOrMaxSize,
buf: &mut [u8], buf: &mut [u8],
) -> Result<IrqResultMaxSizeOrTimeout, BufferTooShortError> { ) -> Result<InterruptResultMaxSizeOrTimeout, BufferTooShortError> {
if buf.len() < context.max_len { if buf.len() < context.max_len {
return Err(BufferTooShortError { return Err(BufferTooShortError {
found: buf.len(), found: buf.len(),
expected: context.max_len, expected: context.max_len,
}); });
} }
let mut result = IrqResultMaxSizeOrTimeout::default(); let mut result = InterruptResultMaxSizeOrTimeout::default();
let irq_status = self.0.regs.read_irq_status(); let irq_status = self.0.regs.read_irq_status();
let rx_enabled = self.0.regs.read_enable().rx(); let rx_enabled = self.0.regs.read_enable().rx();
@@ -1283,14 +1283,14 @@ impl RxWithInterrupt {
fn irq_completion_handler_max_size_timeout( fn irq_completion_handler_max_size_timeout(
&mut self, &mut self,
res: &mut IrqResultMaxSizeOrTimeout, res: &mut InterruptResultMaxSizeOrTimeout,
context: &mut IrqContextTimeoutOrMaxSize, context: &mut InterruptContextTimeoutOrMaxSize,
) { ) {
self.disable_interrupts(); self.disable_interrupts();
self.0.disable(); self.0.disable();
res.bytes_read = context.rx_idx; res.bytes_read = context.rx_idx;
res.complete = true; res.complete = true;
context.mode = IrqReceptionMode::Idle; context.mode = InterruptReceptionMode::Idle;
context.rx_idx = 0; context.rx_idx = 0;
} }

View File

@@ -1,7 +1,7 @@
// UART A pins // UART A pins
use crate::{ use crate::{
FunSel, FunctionSelect,
pins::{ pins::{
Pa2, Pa3, Pa8, Pa9, Pa16, Pa17, Pa18, Pa19, Pa26, Pa27, Pa30, Pa31, Pb6, Pb7, Pb8, Pb9, Pa2, Pa3, Pa8, Pa9, Pa16, Pa17, Pa18, Pa19, Pa26, Pa27, Pa30, Pa31, Pb6, Pb7, Pb8, Pb9,
Pb18, Pb19, Pb20, Pb21, Pb22, Pb23, Pin, Pb18, Pb19, Pb20, Pb21, Pb22, Pb23, Pin,
@@ -12,101 +12,101 @@ use super::{Bank, RxPin, TxPin};
impl TxPin for Pin<Pa9> { impl TxPin for Pin<Pa9> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl RxPin for Pin<Pa8> { impl RxPin for Pin<Pa8> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl TxPin for Pin<Pa17> { impl TxPin for Pin<Pa17> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl RxPin for Pin<Pa16> { impl RxPin for Pin<Pa16> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl TxPin for Pin<Pa31> { impl TxPin for Pin<Pa31> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl RxPin for Pin<Pa30> { impl RxPin for Pin<Pa30> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl TxPin for Pin<Pb9> { impl TxPin for Pin<Pb9> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl RxPin for Pin<Pb8> { impl RxPin for Pin<Pb8> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl TxPin for Pin<Pb23> { impl TxPin for Pin<Pb23> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl RxPin for Pin<Pb22> { impl RxPin for Pin<Pb22> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
// UART B pins // UART B pins
impl TxPin for Pin<Pa3> { impl TxPin for Pin<Pa3> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl RxPin for Pin<Pa2> { impl RxPin for Pin<Pa2> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl TxPin for Pin<Pa19> { impl TxPin for Pin<Pa19> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl RxPin for Pin<Pa18> { impl RxPin for Pin<Pa18> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl TxPin for Pin<Pa27> { impl TxPin for Pin<Pa27> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl RxPin for Pin<Pa26> { impl RxPin for Pin<Pa26> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl TxPin for Pin<Pb7> { impl TxPin for Pin<Pb7> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl RxPin for Pin<Pb6> { impl RxPin for Pin<Pb6> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl TxPin for Pin<Pb19> { impl TxPin for Pin<Pb19> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl RxPin for Pin<Pb18> { impl RxPin for Pin<Pb18> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl TxPin for Pin<Pb21> { impl TxPin for Pin<Pb21> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl RxPin for Pin<Pb20> { impl RxPin for Pin<Pb20> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }

View File

@@ -1,7 +1,7 @@
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
use crate::pins::{Pc15, Pf8}; use crate::pins::{Pc15, Pf8};
use crate::{ use crate::{
FunSel, FunctionSelect,
gpio::Pin, gpio::Pin,
pins::{Pa2, Pa3, Pb14, Pb15, Pc4, Pc5, Pc14, Pd11, Pd12, Pe2, Pe3, Pf9, Pf12, Pf13, Pg0, Pg1}, pins::{Pa2, Pa3, Pb14, Pb15, Pc4, Pc5, Pc14, Pd11, Pd12, Pe2, Pe3, Pf9, Pf12, Pf13, Pg0, Pg1},
}; };
@@ -12,87 +12,87 @@ use super::{Bank, RxPin, TxPin};
impl TxPin for Pin<Pa2> { impl TxPin for Pin<Pa2> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl RxPin for Pin<Pa3> { impl RxPin for Pin<Pa3> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl TxPin for Pin<Pc4> { impl TxPin for Pin<Pc4> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl RxPin for Pin<Pc5> { impl RxPin for Pin<Pc5> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
impl TxPin for Pin<Pe2> { impl TxPin for Pin<Pe2> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl RxPin for Pin<Pe3> { impl RxPin for Pin<Pe3> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl TxPin for Pin<Pg0> { impl TxPin for Pin<Pg0> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl RxPin for Pin<Pg1> { impl RxPin for Pin<Pg1> {
const BANK: Bank = Bank::Uart0; const BANK: Bank = Bank::Uart0;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
// UART 1 pins // UART 1 pins
impl TxPin for Pin<Pb14> { impl TxPin for Pin<Pb14> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl RxPin for Pin<Pb15> { impl RxPin for Pin<Pb15> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl TxPin for Pin<Pd11> { impl TxPin for Pin<Pd11> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl RxPin for Pin<Pd12> { impl RxPin for Pin<Pd12> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel3; const FUN_SEL: FunctionSelect = FunctionSelect::Sel3;
} }
impl TxPin for Pin<Pf12> { impl TxPin for Pin<Pf12> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl RxPin for Pin<Pf13> { impl RxPin for Pin<Pf13> {
const BANK: Bank = Bank::Uart1; const BANK: Bank = Bank::Uart1;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
// UART 2 pins // UART 2 pins
impl TxPin for Pin<Pc14> { impl TxPin for Pin<Pc14> {
const BANK: Bank = Bank::Uart2; const BANK: Bank = Bank::Uart2;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
impl RxPin for Pin<Pc15> { impl RxPin for Pin<Pc15> {
const BANK: Bank = Bank::Uart2; const BANK: Bank = Bank::Uart2;
const FUN_SEL: FunSel = FunSel::Sel2; const FUN_SEL: FunctionSelect = FunctionSelect::Sel2;
} }
#[cfg(not(feature = "va41628"))] #[cfg(not(feature = "va41628"))]
impl TxPin for Pin<Pf8> { impl TxPin for Pin<Pf8> {
const BANK: Bank = Bank::Uart2; const BANK: Bank = Bank::Uart2;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }
impl RxPin for Pin<Pf9> { impl RxPin for Pin<Pf9> {
const BANK: Bank = Bank::Uart2; const BANK: Bank = Bank::Uart2;
const FUN_SEL: FunSel = FunSel::Sel1; const FUN_SEL: FunctionSelect = FunctionSelect::Sel1;
} }

View File

@@ -117,7 +117,7 @@ pub struct Control {
} }
#[bitbybit::bitfield(u32, default = 0x0, debug, defmt_bitfields(feature = "defmt"))] #[bitbybit::bitfield(u32, default = 0x0, debug, defmt_bitfields(feature = "defmt"))]
pub struct ClkScale { pub struct ClockScale {
#[bits(6..=23, rw)] #[bits(6..=23, rw)]
int: u18, int: u18,
#[bits(0..=5, rw)] #[bits(0..=5, rw)]
@@ -263,7 +263,7 @@ pub struct Uart {
data: Data, data: Data,
enable: Enable, enable: Enable,
ctrl: Control, ctrl: Control,
clkscale: ClkScale, clkscale: ClockScale,
#[mmio(PureRead)] #[mmio(PureRead)]
rx_status: RxStatus, rx_status: RxStatus,
#[mmio(PureRead)] #[mmio(PureRead)]