updated GPIO impl

This commit is contained in:
Robin Müller 2025-02-14 14:35:33 +01:00
parent 423449c1c6
commit 980c674f6d
Signed by: muellerr
GPG Key ID: A649FB78196E3849
6 changed files with 32 additions and 26 deletions

View File

@ -30,12 +30,6 @@ rustup target add thumbv7em-none-eabihf
After that, you can use `cargo build` to build the development version of the crate. After that, you can use `cargo build` to build the development version of the crate.
If you have not done this yet, it is recommended to read some of the excellent resources
available to learn Rust:
- [Rust Embedded Book](https://docs.rust-embedded.org/book/)
- [Rust Discovery Book](https://docs.rust-embedded.org/discovery/)
## Setting up your own binary crate ## Setting up your own binary crate
If you have a custom board, you might be interested in setting up a new binary crate for your If you have a custom board, you might be interested in setting up a new binary crate for your
@ -71,3 +65,11 @@ is contained within the
7. Flashing the board might work differently for different boards and there is usually 7. Flashing the board might work differently for different boards and there is usually
more than one way. You can find example instructions in primary README. more than one way. You can find example instructions in primary README.
## Embedded Rust
If you have not done this yet, it is recommended to read some of the excellent resources
available to learn Rust:
- [Rust Embedded Book](https://docs.rust-embedded.org/book/)
- [Rust Discovery Book](https://docs.rust-embedded.org/discovery/)

3
va416xx-hal/docs.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/sh
export RUSTDOCFLAGS="--cfg docsrs --generate-link-to-definition -Z unstable-options"
cargo +nightly doc --all-features --open

View File

@ -55,7 +55,7 @@
//! error. If the [`DynPin`] is not in the correct [`DynPinMode`] for the //! error. If the [`DynPin`] is not in the correct [`DynPinMode`] for the
//! operation, the trait functions will return //! operation, the trait functions will return
//! [InvalidPinTypeError]. //! [InvalidPinTypeError].
use embedded_hal::digital::{ErrorKind, ErrorType, InputPin, OutputPin, StatefulOutputPin}; use embedded_hal::digital::{ErrorType, InputPin, OutputPin, StatefulOutputPin};
use super::{ use super::{
reg::RegisterInterface, FilterClkSel, FilterType, InterruptEdge, InterruptLevel, Pin, PinId, reg::RegisterInterface, FilterClkSel, FilterType, InterruptEdge, InterruptLevel, Pin, PinId,

View File

@ -472,11 +472,6 @@ impl<I: PinId, M: PinMode> Pin<I, M> {
self.inner.regs.write_pin(false) self.inner.regs.write_pin(false)
} }
#[inline]
pub(crate) fn _toggle_with_toggle_reg(&mut self) {
self.inner.regs.toggle();
}
#[inline] #[inline]
pub(crate) fn _is_low(&self) -> bool { pub(crate) fn _is_low(&self) -> bool {
!self.inner.regs.read_pin() !self.inner.regs.read_pin()
@ -598,6 +593,11 @@ impl<I: PinId, C: OutputConfig> Pin<I, Output<C>> {
self.inner.regs.configure_delay(delay_1, delay_2); self.inner.regs.configure_delay(delay_1, delay_2);
} }
#[inline]
pub fn toggle_with_toggle_reg(&mut self) {
self.inner.regs.toggle()
}
/// See p.52 of the programmers guide for more information. /// See p.52 of the programmers guide for more information.
/// When configured for pulse mode, a given pin will set the non-default state for exactly /// When configured for pulse mode, a given pin will set the non-default state for exactly
/// one clock cycle before returning to the configured default state /// one clock cycle before returning to the configured default state

View File

@ -144,7 +144,7 @@ pub(super) unsafe trait RegisterInterface {
} }
} }
#[inline] #[inline(always)]
fn port_reg(&self) -> &PortRegisterBlock { fn port_reg(&self) -> &PortRegisterBlock {
match self.id().group { match self.id().group {
DynGroup::A => unsafe { &(*Porta::ptr()) }, DynGroup::A => unsafe { &(*Porta::ptr()) },
@ -157,6 +157,7 @@ pub(super) unsafe trait RegisterInterface {
} }
} }
#[inline(always)]
fn iocfg_port(&self) -> &PortReg { fn iocfg_port(&self) -> &PortReg {
let ioconfig = unsafe { Ioconfig::ptr().as_ref().unwrap() }; let ioconfig = unsafe { Ioconfig::ptr().as_ref().unwrap() };
match self.id().group { match self.id().group {
@ -170,12 +171,12 @@ pub(super) unsafe trait RegisterInterface {
} }
} }
#[inline] #[inline(always)]
fn mask_32(&self) -> u32 { fn mask_32(&self) -> u32 {
1 << self.id().num 1 << self.id().num
} }
#[inline] #[inline(always)]
fn enable_irq(&self) { fn enable_irq(&self) {
self.port_reg() self.port_reg()
.irq_enb() .irq_enb()

View File

@ -30,7 +30,7 @@ pub enum FifoEmptyMode {
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct ClockTooSlowForFastI2c; pub struct ClockTooSlowForFastI2cError;
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[cfg_attr(feature = "defmt", derive(defmt::Format))]
@ -52,11 +52,11 @@ pub enum InitError {
/// Wrong address used in constructor /// Wrong address used in constructor
WrongAddrMode, WrongAddrMode,
/// APB1 clock is too slow for fast I2C mode. /// APB1 clock is too slow for fast I2C mode.
ClkTooSlow(ClockTooSlowForFastI2c), ClkTooSlow(ClockTooSlowForFastI2cError),
} }
impl From<ClockTooSlowForFastI2c> for InitError { impl From<ClockTooSlowForFastI2cError> for InitError {
fn from(value: ClockTooSlowForFastI2c) -> Self { fn from(value: ClockTooSlowForFastI2cError) -> Self {
Self::ClkTooSlow(value) Self::ClkTooSlow(value)
} }
} }
@ -318,7 +318,7 @@ impl<I2c: Instance> I2cBase<I2c> {
speed_mode: I2cSpeed, speed_mode: I2cSpeed,
ms_cfg: Option<&MasterConfig>, ms_cfg: Option<&MasterConfig>,
sl_cfg: Option<&SlaveConfig>, sl_cfg: Option<&SlaveConfig>,
) -> Result<Self, ClockTooSlowForFastI2c> { ) -> Result<Self, ClockTooSlowForFastI2cError> {
syscfg.enable_peripheral_clock(I2c::PERIPH_SEL); syscfg.enable_peripheral_clock(I2c::PERIPH_SEL);
let mut i2c_base = I2cBase { let mut i2c_base = I2cBase {
@ -421,19 +421,19 @@ impl<I2c: Instance> I2cBase<I2c> {
}); });
} }
fn calc_clk_div(&self, speed_mode: I2cSpeed) -> Result<u8, ClockTooSlowForFastI2c> { fn calc_clk_div(&self, speed_mode: I2cSpeed) -> Result<u8, ClockTooSlowForFastI2cError> {
if speed_mode == I2cSpeed::Regular100khz { if speed_mode == I2cSpeed::Regular100khz {
Ok(((self.clock.raw() / CLK_100K.raw() / 20) - 1) as u8) Ok(((self.clock.raw() / CLK_100K.raw() / 20) - 1) as u8)
} else { } else {
if self.clock.raw() < MIN_CLK_400K.raw() { if self.clock.raw() < MIN_CLK_400K.raw() {
return Err(ClockTooSlowForFastI2c); return Err(ClockTooSlowForFastI2cError);
} }
Ok(((self.clock.raw() / CLK_400K.raw() / 25) - 1) as u8) Ok(((self.clock.raw() / CLK_400K.raw() / 25) - 1) as u8)
} }
} }
/// Configures the clock scale for a given speed mode setting /// Configures the clock scale for a given speed mode setting
pub fn cfg_clk_scale(&mut self, speed_mode: I2cSpeed) -> Result<(), ClockTooSlowForFastI2c> { pub fn cfg_clk_scale(&mut self, speed_mode: I2cSpeed) -> Result<(), ClockTooSlowForFastI2cError> {
let clk_div = self.calc_clk_div(speed_mode)?; let clk_div = self.calc_clk_div(speed_mode)?;
self.i2c self.i2c
.clkscale() .clkscale()
@ -472,7 +472,7 @@ impl<I2c: Instance, Addr> I2cMaster<I2c, Addr> {
cfg: MasterConfig, cfg: MasterConfig,
clocks: &Clocks, clocks: &Clocks,
speed_mode: I2cSpeed, speed_mode: I2cSpeed,
) -> Result<Self, ClockTooSlowForFastI2c> { ) -> Result<Self, ClockTooSlowForFastI2cError> {
Ok(I2cMaster { Ok(I2cMaster {
i2c_base: I2cBase::new(i2c, sys_cfg, clocks, speed_mode, Some(&cfg), None)?, i2c_base: I2cBase::new(i2c, sys_cfg, clocks, speed_mode, Some(&cfg), None)?,
addr: PhantomData, addr: PhantomData,
@ -733,7 +733,7 @@ impl<I2c: Instance, Addr> I2cSlave<I2c, Addr> {
cfg: SlaveConfig, cfg: SlaveConfig,
clocks: &Clocks, clocks: &Clocks,
speed_mode: I2cSpeed, speed_mode: I2cSpeed,
) -> Result<Self, ClockTooSlowForFastI2c> { ) -> Result<Self, ClockTooSlowForFastI2cError> {
Ok(I2cSlave { Ok(I2cSlave {
i2c_base: I2cBase::new(i2c, sys_cfg, clocks, speed_mode, None, Some(&cfg))?, i2c_base: I2cBase::new(i2c, sys_cfg, clocks, speed_mode, None, Some(&cfg))?,
addr: PhantomData, addr: PhantomData,
@ -895,7 +895,7 @@ impl<I2c: Instance> I2cSlave<I2c, TenBitAddress> {
cfg: SlaveConfig, cfg: SlaveConfig,
clocks: &Clocks, clocks: &Clocks,
speed_mode: I2cSpeed, speed_mode: I2cSpeed,
) -> Result<Self, ClockTooSlowForFastI2c> { ) -> Result<Self, ClockTooSlowForFastI2cError> {
Self::new_generic(i2c, sys_cfg, cfg, clocks, speed_mode) Self::new_generic(i2c, sys_cfg, cfg, clocks, speed_mode)
} }
} }