Skip to content

Commit

Permalink
Clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
gdobato committed Oct 28, 2023
1 parent d05cc5a commit 76dd79f
Show file tree
Hide file tree
Showing 7 changed files with 165 additions and 154 deletions.
19 changes: 11 additions & 8 deletions examples/blinky.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@
#![no_main]

#[allow(unused_imports)]
use portenta_h7::{log, log_init, user_led};
use portenta_h7::{
board::{self, Board},
led, log, log_init,
};
use rtic::app;
use systick_monotonic::{fugit::MillisDurationU64, Systick};

Expand All @@ -20,9 +23,9 @@ mod app {

#[local]
struct Local {
led_red: user_led::Red,
led_green: user_led::Green,
led_blue: user_led::Blue,
led_red: led::user::Red,
led_green: led::user::Green,
led_blue: led::user::Blue,
}

#[monotonic(binds = SysTick, default = true)]
Expand All @@ -32,15 +35,15 @@ mod app {
fn init(cx: init::Context) -> (Shared, Local, init::Monotonics) {
log_init!();

let mono = Systick::new(cx.core.SYST, portenta_h7::CORE_FREQUENCY.raw());
let mono = Systick::new(cx.core.SYST, board::CORE_FREQUENCY.raw());

// Get boatd resources
let portenta_h7::Board {
// Get board resources
let Board {
led_red,
led_green,
led_blue,
..
} = portenta_h7::Board::take();
} = Board::take();

#[cfg(debug_assertions)]
log!("spawning tasks");
Expand Down
14 changes: 7 additions & 7 deletions examples/usb_echo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

use cortex_m::singleton;
use portenta_h7::{
board::{self, Board, UsbBus, USB},
led::{self, Led},
log, log_init,
user_led::{self, UserLed},
UsbBus, USB,
};
use rtic::app;
use systick_monotonic::Systick;
Expand All @@ -31,7 +31,7 @@ mod app {

#[local]
struct Local {
led_blue: user_led::Blue,
led_blue: led::user::Blue,
usb_dev: UsbDevice<'static, UsbBus<USB>>,
usb_serial_port: CdcAcmClass<'static, UsbBus<USB>>,
}
Expand All @@ -43,10 +43,10 @@ mod app {
fn init(cx: init::Context) -> (Shared, Local, init::Monotonics) {
log_init!();

let mono = Systick::new(cx.core.SYST, portenta_h7::CORE_FREQUENCY.raw());
let mono = Systick::new(cx.core.SYST, board::CORE_FREQUENCY.raw());

// Get board resources
let portenta_h7::Board { led_blue, usb, .. } = portenta_h7::Board::take();
let Board { led_blue, usb, .. } = Board::take();

// Init USB stack
let usb_bus = singleton!(
Expand Down Expand Up @@ -110,14 +110,14 @@ mod app {
// Transition to enumeration
UsbDeviceState::Configured if previous_state == UsbDeviceState::Addressed => {
log!("Enumeration completed");
cx.local.led_blue.set_on();
cx.local.led_blue.on();
}
// Already enumerated
UsbDeviceState::Configured => {}
// Enumeration lost
_ if previous_state == UsbDeviceState::Configured => {
log!("Enumeration lost");
cx.local.led_blue.set_off();
cx.local.led_blue.off();
}
_ => (),
}
Expand Down
99 changes: 99 additions & 0 deletions src/board.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
//! board
#[allow(unused)]
use crate::log;
use crate::{hal, led, sys};
use core::sync::atomic::{AtomicBool, Ordering};
pub use hal::usb_hs::{UsbBus, USB1_ULPI as USB};
use hal::{gpio::PinState, pac, prelude::*, rcc, time::Hertz, usb_hs::USB1_ULPI};

pub const CORE_FREQUENCY: Hertz = Hertz::from_raw(480_000_000);

pub struct Board {
pub led_red: led::user::Red,
pub led_green: led::user::Green,
pub led_blue: led::user::Blue,
pub usb: USB1_ULPI,
}

impl Board {
pub fn take() -> Self {
static TAKEN: AtomicBool = AtomicBool::new(false);
debug_assert!(!TAKEN.swap(true, Ordering::SeqCst));
Self::setup()
}

fn setup() -> Self {
#[cfg(debug_assertions)]
log!("Board init");

// Reset previous configuration and enable external oscillator as HSE source (25 MHz)
sys::Clk::new().reset().enable_ext_clock();
let dp = pac::Peripherals::take().unwrap();

// Configure power domains and clock tree
let pwrcfg = dp.PWR.constrain().vos0(&dp.SYSCFG).freeze();
let ccdr = dp
.RCC
.constrain()
.use_hse(25.MHz())
.bypass_hse()
.sys_ck(CORE_FREQUENCY)
.hclk(240.MHz())
.pll1_strategy(rcc::PllConfigStrategy::Iterative)
.freeze(pwrcfg, &dp.SYSCFG);

debug_assert_eq!(sys::Clk::get_source(), Some(sys::ClkSource::Pll1));
debug_assert_eq!(sys::Clk::get_pll_source(), sys::PllSourceVariant::Hse);

// USB
let (gpioa, gpiob, gpioc, gpioh, gpioi, gpioj) = {
(
dp.GPIOA.split(ccdr.peripheral.GPIOA),
dp.GPIOB.split(ccdr.peripheral.GPIOB),
dp.GPIOC.split(ccdr.peripheral.GPIOC),
dp.GPIOH.split_without_reset(ccdr.peripheral.GPIOH), // Do not do a reset since external oscillator is enabled by GPIOH1
dp.GPIOI.split(ccdr.peripheral.GPIOI),
dp.GPIOJ.split(ccdr.peripheral.GPIOJ),
)
};
// Enable ULPI transceiver (GPIOJ4)
let mut ulpi_reset = gpioj.pj4.into_push_pull_output();
ulpi_reset.set_high();

let usb = USB1_ULPI::new(
dp.OTG1_HS_GLOBAL,
dp.OTG1_HS_DEVICE,
dp.OTG1_HS_PWRCLK,
gpioa.pa5.into_alternate(),
gpioi.pi11.into_alternate(),
gpioh.ph4.into_alternate(),
gpioc.pc0.into_alternate(),
gpioa.pa3.into_alternate(),
gpiob.pb0.into_alternate(),
gpiob.pb1.into_alternate(),
gpiob.pb10.into_alternate(),
gpiob.pb11.into_alternate(),
gpiob.pb12.into_alternate(),
gpiob.pb13.into_alternate(),
gpiob.pb5.into_alternate(),
ccdr.peripheral.USB1OTG,
&ccdr.clocks,
);

// User LEDs
let gpiok = dp.GPIOK.split(ccdr.peripheral.GPIOK);
let (led_red, led_green, led_blue) = (
gpiok.pk5.into_push_pull_output_in_state(PinState::High),
gpiok.pk6.into_push_pull_output_in_state(PinState::High),
gpiok.pk7.into_push_pull_output_in_state(PinState::High),
);

Board {
led_red,
led_green,
led_blue,
usb,
}
}
}
3 changes: 2 additions & 1 deletion src/interrupt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
pub use crate::hal::pac::interrupt;
use crate::hal::{self, usb_hs::USB1_ULPI};
use crate::CorePeripherals;

type CorePeripherals = cortex_m::Peripherals;

pub trait InterruptEnabler {
fn enable_interrupt(&self);
Expand Down
44 changes: 44 additions & 0 deletions src/led.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//! led
pub use crate::hal::gpio::{gpiok::*, Output, Pin, PinState, PushPull};
type DigitalOutputPin<const P: char, const N: u8> = Pin<P, N, Output<PushPull>>;

pub trait Led {
fn on(&mut self);
fn off(&mut self);
fn toggle(&mut self);
}

pub mod user {
use super::*;

pub type Red = DigitalOutputPin<'K', 5>;
pub type Green = DigitalOutputPin<'K', 6>;
pub type Blue = DigitalOutputPin<'K', 7>;

// Marker trait
trait BoardLed {}
impl BoardLed for Red {}
impl BoardLed for Green {}
impl BoardLed for Blue {}

impl<const P: char, const N: u8> Led for DigitalOutputPin<P, N>
where
DigitalOutputPin<P, N>: BoardLed,
{
#[inline]
fn on(&mut self) {
self.set_low();
}

#[inline]
fn off(&mut self) {
self.set_high();
}

#[inline]
fn toggle(&mut self) {
self.toggle();
}
}
}
100 changes: 2 additions & 98 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,107 +1,11 @@
#![no_std]

pub mod board;
pub mod interrupt;
pub mod led;
pub mod panic;
mod sys;
pub mod user_led;

use core::sync::atomic::{AtomicBool, Ordering};
pub use cortex_m_rt::entry;
pub use hal::usb_hs::{UsbBus, USB1_ULPI as USB};
use hal::{gpio::PinState, pac, prelude::*, rcc, time::Hertz, usb_hs::USB1_ULPI};
#[allow(unused_imports)]
pub use rtt_target::{rprintln as log, rtt_init_print as log_init};
pub use stm32h7xx_hal as hal;

pub type CorePeripherals = cortex_m::Peripherals;

pub const CORE_FREQUENCY: Hertz = Hertz::from_raw(480_000_000);

pub struct Board {
pub led_red: user_led::Red,
pub led_green: user_led::Green,
pub led_blue: user_led::Blue,
pub usb: USB1_ULPI,
}

impl Board {
pub fn take() -> Self {
static TAKEN: AtomicBool = AtomicBool::new(false);
debug_assert!(!TAKEN.swap(true, Ordering::SeqCst));
Self::setup()
}

fn setup() -> Self {
#[cfg(debug_assertions)]
log!("Board init");

// Reset previous configuration and enable external oscillator as HSE source (25 MHz)
sys::Clk::new().reset().enable_ext_clock();
let dp = pac::Peripherals::take().unwrap();

// Configure power domains and clock tree
let pwrcfg = dp.PWR.constrain().vos0(&dp.SYSCFG).freeze();
let ccdr = dp
.RCC
.constrain()
.use_hse(25.MHz())
.bypass_hse()
.sys_ck(CORE_FREQUENCY)
.hclk(240.MHz())
.pll1_strategy(rcc::PllConfigStrategy::Iterative)
.freeze(pwrcfg, &dp.SYSCFG);

debug_assert_eq!(sys::Clk::get_source(), Some(sys::ClkSource::Pll1));
debug_assert_eq!(sys::Clk::get_pll_source(), sys::PllSourceVariant::Hse);

// USB
let (gpioa, gpiob, gpioc, gpioh, gpioi, gpioj) = {
(
dp.GPIOA.split(ccdr.peripheral.GPIOA),
dp.GPIOB.split(ccdr.peripheral.GPIOB),
dp.GPIOC.split(ccdr.peripheral.GPIOC),
dp.GPIOH.split_without_reset(ccdr.peripheral.GPIOH), // Do not do a reset since external oscillator is enabled by GPIOH1
dp.GPIOI.split(ccdr.peripheral.GPIOI),
dp.GPIOJ.split(ccdr.peripheral.GPIOJ),
)
};
// Enable ULPI transceiver (GPIOJ4)
let mut ulpi_reset = gpioj.pj4.into_push_pull_output();
ulpi_reset.set_high();

let usb = USB1_ULPI::new(
dp.OTG1_HS_GLOBAL,
dp.OTG1_HS_DEVICE,
dp.OTG1_HS_PWRCLK,
gpioa.pa5.into_alternate(),
gpioi.pi11.into_alternate(),
gpioh.ph4.into_alternate(),
gpioc.pc0.into_alternate(),
gpioa.pa3.into_alternate(),
gpiob.pb0.into_alternate(),
gpiob.pb1.into_alternate(),
gpiob.pb10.into_alternate(),
gpiob.pb11.into_alternate(),
gpiob.pb12.into_alternate(),
gpiob.pb13.into_alternate(),
gpiob.pb5.into_alternate(),
ccdr.peripheral.USB1OTG,
&ccdr.clocks,
);

// User LEDs
let gpiok = dp.GPIOK.split(ccdr.peripheral.GPIOK);
let (led_red, led_green, led_blue) = (
gpiok.pk5.into_push_pull_output_in_state(PinState::High),
gpiok.pk6.into_push_pull_output_in_state(PinState::High),
gpiok.pk7.into_push_pull_output_in_state(PinState::High),
);

Board {
led_red,
led_green,
led_blue,
usb,
}
}
}
Loading

0 comments on commit 76dd79f

Please sign in to comment.