From 16591346e5aa84e2a37a8922993dbb2eed67af99 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 17 Feb 2025 23:52:26 +0100 Subject: [PATCH] prep embassy v0.2.0 --- examples/embassy/Cargo.toml | 2 +- examples/embassy/src/bin/async-gpio.rs | 17 ++- examples/embassy/src/bin/async-uart-rx.rs | 17 ++- examples/embassy/src/bin/async-uart-tx.rs | 17 ++- examples/embassy/src/main.rs | 41 ++++--- va108xx-embassy/CHANGELOG.md | 6 +- va108xx-embassy/Cargo.toml | 2 +- va108xx-embassy/src/lib.rs | 131 ++++++++++------------ 8 files changed, 105 insertions(+), 128 deletions(-) diff --git a/examples/embassy/Cargo.toml b/examples/embassy/Cargo.toml index d4a2c30..9c3046c 100644 --- a/examples/embassy/Cargo.toml +++ b/examples/embassy/Cargo.toml @@ -28,7 +28,7 @@ embassy-executor = { version = "0.7", features = [ ]} va108xx-hal = { version = "0.10" } -va108xx-embassy = { version = "0.1", path = "../../va108xx-embassy" } +va108xx-embassy = { version = "0.2", path = "../../va108xx-embassy" } [features] default = ["ticks-hz-1_000", "va108xx-embassy/irq-oc30-oc31"] diff --git a/examples/embassy/src/bin/async-gpio.rs b/examples/embassy/src/bin/async-gpio.rs index a722b66..3237e4c 100644 --- a/examples/embassy/src/bin/async-gpio.rs +++ b/examples/embassy/src/bin/async-gpio.rs @@ -12,7 +12,6 @@ use embassy_time::{Duration, Instant, Timer}; use embedded_hal_async::digital::Wait; use panic_rtt_target as _; use rtt_target::{rprintln, rtt_init_print}; -use va108xx_embassy::embassy; use va108xx_hal::gpio::{ on_interrupt_for_async_gpio_for_port, InputDynPinAsync, InputPinAsync, PinsB, Port, }; @@ -65,15 +64,13 @@ async fn main(spawner: Spawner) { let mut dp = pac::Peripherals::take().unwrap(); // Safety: Only called once here. - unsafe { - embassy::init( - &mut dp.sysconfig, - &dp.irqsel, - SYSCLK_FREQ, - dp.tim23, - dp.tim22, - ) - }; + va108xx_embassy::init( + &mut dp.sysconfig, + &dp.irqsel, + SYSCLK_FREQ, + dp.tim23, + dp.tim22, + ); let porta = PinsA::new(&mut dp.sysconfig, dp.porta); let portb = PinsB::new(&mut dp.sysconfig, dp.portb); diff --git a/examples/embassy/src/bin/async-uart-rx.rs b/examples/embassy/src/bin/async-uart-rx.rs index e0ee129..ccd163e 100644 --- a/examples/embassy/src/bin/async-uart-rx.rs +++ b/examples/embassy/src/bin/async-uart-rx.rs @@ -23,7 +23,6 @@ use embedded_io_async::Read; use heapless::spsc::{Consumer, Producer, Queue}; use panic_rtt_target as _; use rtt_target::{rprintln, rtt_init_print}; -use va108xx_embassy::embassy; use va108xx_hal::{ gpio::PinsA, pac::{self, interrupt}, @@ -56,15 +55,13 @@ async fn main(spawner: Spawner) { let mut dp = pac::Peripherals::take().unwrap(); // Safety: Only called once here. - unsafe { - embassy::init( - &mut dp.sysconfig, - &dp.irqsel, - SYSCLK_FREQ, - dp.tim23, - dp.tim22, - ); - } + va108xx_embassy::init( + &mut dp.sysconfig, + &dp.irqsel, + SYSCLK_FREQ, + dp.tim23, + dp.tim22, + ); let porta = PinsA::new(&mut dp.sysconfig, dp.porta); let mut led0 = porta.pa10.into_readable_push_pull_output(); diff --git a/examples/embassy/src/bin/async-uart-tx.rs b/examples/embassy/src/bin/async-uart-tx.rs index 9963ecf..fdf97aa 100644 --- a/examples/embassy/src/bin/async-uart-tx.rs +++ b/examples/embassy/src/bin/async-uart-tx.rs @@ -15,7 +15,6 @@ use embassy_time::{Duration, Instant, Ticker}; use embedded_io_async::Write; use panic_rtt_target as _; use rtt_target::{rprintln, rtt_init_print}; -use va108xx_embassy::embassy; use va108xx_hal::{ gpio::PinsA, pac::{self, interrupt}, @@ -42,15 +41,13 @@ async fn main(_spawner: Spawner) { let mut dp = pac::Peripherals::take().unwrap(); // Safety: Only called once here. - unsafe { - embassy::init( - &mut dp.sysconfig, - &dp.irqsel, - SYSCLK_FREQ, - dp.tim23, - dp.tim22, - ); - } + va108xx_embassy::init( + &mut dp.sysconfig, + &dp.irqsel, + SYSCLK_FREQ, + dp.tim23, + dp.tim22, + ); let porta = PinsA::new(&mut dp.sysconfig, dp.porta); let mut led0 = porta.pa10.into_readable_push_pull_output(); diff --git a/examples/embassy/src/main.rs b/examples/embassy/src/main.rs index fc15fd7..d1ecad8 100644 --- a/examples/embassy/src/main.rs +++ b/examples/embassy/src/main.rs @@ -4,7 +4,6 @@ use embassy_executor::Spawner; use embassy_time::{Duration, Instant, Ticker}; use panic_rtt_target as _; use rtt_target::{rprintln, rtt_init_print}; -use va108xx_embassy::embassy; cfg_if::cfg_if! { if #[cfg(feature = "custom-irqs")] { @@ -27,27 +26,25 @@ async fn main(_spawner: Spawner) { let mut dp = pac::Peripherals::take().unwrap(); // Safety: Only called once here. - unsafe { - cfg_if::cfg_if! { - if #[cfg(not(feature = "custom-irqs"))] { - embassy::init( - &mut dp.sysconfig, - &dp.irqsel, - SYSCLK_FREQ, - dp.tim23, - dp.tim22, - ); - } else { - embassy::init_with_custom_irqs( - &mut dp.sysconfig, - &dp.irqsel, - SYSCLK_FREQ, - dp.tim23, - dp.tim22, - pac::Interrupt::OC23, - pac::Interrupt::OC24, - ); - } + cfg_if::cfg_if! { + if #[cfg(not(feature = "custom-irqs"))] { + va108xx_embassy::init( + &mut dp.sysconfig, + &dp.irqsel, + SYSCLK_FREQ, + dp.tim23, + dp.tim22, + ); + } else { + va108xx_embassy::init_with_custom_irqs( + &mut dp.sysconfig, + &dp.irqsel, + SYSCLK_FREQ, + dp.tim23, + dp.tim22, + pac::Interrupt::OC23, + pac::Interrupt::OC24, + ); } } diff --git a/va108xx-embassy/CHANGELOG.md b/va108xx-embassy/CHANGELOG.md index 6eb14fc..b62c81d 100644 --- a/va108xx-embassy/CHANGELOG.md +++ b/va108xx-embassy/CHANGELOG.md @@ -8,9 +8,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [unreleased] -## [v0.1.3] 2025-02-17 +## [v0.2.0] 2025-02-17 + +- Bumped va108xx-hal to v0.10.0 +- Remove `embassy` module, expose public functions in library root directly -Bumped va108xx-hal to v0.10.0 ## [v0.1.2] and [v0.1.1] 2025-02-13 diff --git a/va108xx-embassy/Cargo.toml b/va108xx-embassy/Cargo.toml index 1da337f..3cf1171 100644 --- a/va108xx-embassy/Cargo.toml +++ b/va108xx-embassy/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "va108xx-embassy" -version = "0.1.3" +version = "0.2.0" edition = "2021" authors = ["Robin Mueller "] description = "Embassy-rs support for the Vorago VA108xx family of microcontrollers" diff --git a/va108xx-embassy/src/lib.rs b/va108xx-embassy/src/lib.rs index b7d4e5f..dce3ef7 100644 --- a/va108xx-embassy/src/lib.rs +++ b/va108xx-embassy/src/lib.rs @@ -1,17 +1,17 @@ //! # Embassy-rs support for the Vorago VA108xx MCU family //! -//! This repository contains the [embassy-rs](https://github.com/embassy-rs/embassy) support for the -//! VA108xx family. Currently, it contains the time driver to allow using embassy-rs. It uses the TIM -//! peripherals provided by the VA108xx family for this purpose. +//! This repository contains the [embassy-rs](https://github.com/embassy-rs/embassy) support for +//! the VA108xx family. Currently, it contains the time driver to allow using embassy-rs. It uses +//! the TIM peripherals provided by the VA108xx family for this purpose. //! //! ## Usage //! -//! This library only exposes the [embassy::init] method which sets up the time driver. This -//! function must be called once at the start of the application. +//! This library exposes the [init] or the [init_with_custom_irqs] functions which set up the time +//! driver. This function must be called once at the start of the application. //! //! This implementation requires two TIM peripherals provided by the VA108xx device. //! The user can freely specify the two used TIM peripheral by passing the concrete TIM instances -//! into the [embassy::init_with_custom_irqs] and [embassy::init] method. +//! into the [init_with_custom_irqs] and [init] method. //! //! The application also requires two interrupt handlers to handle the timekeeper and alarm //! interrupts. By default, this library will define the interrupt handler inside the library @@ -24,7 +24,7 @@ //! You can disable the default features and then specify one of the features above to use the //! documented combination of IRQs. It is also possible to specify custom IRQs by importing and //! using the [embassy_time_driver_irqs] macro to declare the IRQ handlers in the -//! application code. If this is done, [embassy::init_with_custom_irqs] must be used +//! application code. If this is done, [init_with_custom_irqs] must be used //! method to pass the IRQ numbers to the library. //! //! ## Examples @@ -76,7 +76,7 @@ macro_rules! embassy_time_driver_irqs { #[allow(non_snake_case)] fn $timekeeper_irq() { // Safety: We call it once here. - unsafe { $crate::embassy::time_driver().on_interrupt_timekeeping() } + unsafe { $crate::time_driver().on_interrupt_timekeeping() } } const ALARM_IRQ: pac::Interrupt = pac::Interrupt::$alarm_irq; @@ -85,7 +85,7 @@ macro_rules! embassy_time_driver_irqs { #[allow(non_snake_case)] fn $alarm_irq() { // Safety: We call it once here. - unsafe { $crate::embassy::time_driver().on_interrupt_alarm() } + unsafe { $crate::time_driver().on_interrupt_alarm() } } }; } @@ -99,71 +99,58 @@ embassy_time_driver_irqs!(timekeeper_irq = OC30, alarm_irq = OC29); #[cfg(feature = "irq-oc28-oc29")] embassy_time_driver_irqs!(timekeeper_irq = OC29, alarm_irq = OC28); -pub mod embassy { - use super::*; - use va108xx_hal::{pac, timer::TimRegInterface}; +/// Expose the time driver so the user can specify the IRQ handlers themselves. +pub fn time_driver() -> &'static TimerDriver { + &TIME_DRIVER +} - /// Expose the time driver so the user can specify the IRQ handlers themselves. - pub fn time_driver() -> &'static TimerDriver { - &TIME_DRIVER - } +/// Initialization method for embassy. +/// +/// This should be used if the interrupt handler is provided by the library, which is the +/// default case. +#[cfg(feature = "irqs-in-lib")] +pub fn init( + syscfg: &mut pac::Sysconfig, + irqsel: &pac::Irqsel, + sysclk: impl Into, + timekeeper_tim: TimekeeperTim, + alarm_tim: AlarmTim, +) { + TIME_DRIVER.init( + syscfg, + irqsel, + sysclk, + timekeeper_tim, + alarm_tim, + TIMEKEEPER_IRQ, + ALARM_IRQ, + ) +} - /// Initialization method for embassy - /// - /// # Safety - /// - /// This has to be called once at initialization time to initiate the time driver for - /// embassy. - #[cfg(feature = "irqs-in-lib")] - pub unsafe fn init< - TimekeeperTim: TimRegInterface + ValidTim, - AlarmTim: TimRegInterface + ValidTim, - >( - syscfg: &mut pac::Sysconfig, - irqsel: &pac::Irqsel, - sysclk: impl Into, - timekeeper_tim: TimekeeperTim, - alarm_tim: AlarmTim, - ) { - TIME_DRIVER.init( - syscfg, - irqsel, - sysclk, - timekeeper_tim, - alarm_tim, - TIMEKEEPER_IRQ, - ALARM_IRQ, - ) - } - - /// Initialization method for embassy - /// - /// # Safety - /// - /// This has to be called once at initialization time to initiate the time driver for - /// embassy. - pub unsafe fn init_with_custom_irqs< - TimekeeperTim: TimRegInterface + ValidTim, - AlarmTim: TimRegInterface + ValidTim, - >( - syscfg: &mut pac::Sysconfig, - irqsel: &pac::Irqsel, - sysclk: impl Into, - timekeeper_tim: TimekeeperTim, - alarm_tim: AlarmTim, - timekeeper_irq: pac::Interrupt, - alarm_irq: pac::Interrupt, - ) { - TIME_DRIVER.init( - syscfg, - irqsel, - sysclk, - timekeeper_tim, - alarm_tim, - timekeeper_irq, - alarm_irq, - ) - } +/// Initialization method for embassy when using custom IRQ handlers. +/// +/// Requires an explicit [pac::Interrupt] argument for the timekeeper and alarm IRQs. +pub fn init_with_custom_irqs< + TimekeeperTim: TimRegInterface + ValidTim, + AlarmTim: TimRegInterface + ValidTim, +>( + syscfg: &mut pac::Sysconfig, + irqsel: &pac::Irqsel, + sysclk: impl Into, + timekeeper_tim: TimekeeperTim, + alarm_tim: AlarmTim, + timekeeper_irq: pac::Interrupt, + alarm_irq: pac::Interrupt, +) { + TIME_DRIVER.init( + syscfg, + irqsel, + sysclk, + timekeeper_tim, + alarm_tim, + timekeeper_irq, + alarm_irq, + ) } struct AlarmState {