Skip to content

Commit

Permalink
Prepare async infrastructure
Browse files Browse the repository at this point in the history
  • Loading branch information
gdobato committed Jun 18, 2024
1 parent ef9397d commit b94ddb8
Show file tree
Hide file tree
Showing 9 changed files with 169 additions and 153 deletions.
19 changes: 10 additions & 9 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,18 @@ ee = "embed --example"
oe = "objcopy --example"

# Aliases
blinky = "be blinky"
blinky-probe = "ee blinky"
blinky-bin = "oe blinky --release -- -O binary target/thumbv7em-none-eabihf/release/examples/blinky.bin"
# TODO: Automate all this
rtic_blinky = "be rtic_blinky"
rtic_blinky-probe = "ee rtic_blinky"
rtic_blinky-bin = "oe rtic_blinky --release -- -O binary target/thumbv7em-none-eabihf/release/examples/rtic_blinky.bin"

usb_echo = "be usb_echo"
usb_echo-probe = "ee usb_echo"
usb_echo-bin = "oe usb_echo --release -- -O binary target/thumbv7em-none-eabihf/release/examples/usb_echo.bin"
rtic_usb_echo = "be rtic_usb_echo"
rtic_usb_echo-probe = "ee rtic_usb_echo"
rtic_usb_echo-bin = "oe rtic_usb_echo --release -- -O binary target/thumbv7em-none-eabihf/release/examples/rtic_usb_echo.bin"

usb_led_ctrl = "be usb_led_ctrl"
usb_led_ctrl-probe = "ee usb_led_ctrl"
usb_led_ctrl-bin = "oe usb_led_ctrl --release -- -O binary target/thumbv7em-none-eabihf/release/examples/usb_led_ctrl.bin"
rtic_usb_led_ctrl = "be rtic_usb_led_ctrl"
rtic_usb_led_ctrl-probe = "ee rtic_usb_led_ctrl"
rtic_usb_led_ctrl-bin = "oe rtic_usb_led_ctrl --release -- -O binary target/thumbv7em-none-eabihf/release/examples/rtic_usb_led_ctrl.bin"

[build]
target = "thumbv7em-none-eabihf" # Cortex-M4F and Cortex-M7F (with FPU)
Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ embedded-hal-v1 = { version = "1.0.0", package = "embedded-hal" }
embedded-hal-v0 = { version = "0.2.6", package = "embedded-hal", features = ["unproven"] }
embedded-hal-async = "1.0.0"
rtic-sync = "1.3.0"
fugit = "0.3.7"

[dev-dependencies]
rtic = { version = "2.1.1", features = ["thumbv7-backend"] }
Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ To build an example, run the following command:
```
cargo <example_name> [--release]
```
For instance, to build `blinky`:
For instance, to build `rtic_blinky`:
```
cargo blinky
cargo rtic_blinky
```
## Flash with DFU (USB)
1. If not already, install [dfu-utils](https://dfu-util.sourceforge.net/) on your system.
Expand All @@ -55,26 +55,26 @@ cargo blinky
```
cargo <example_name>-bin
```
For example, to generate the target binary for `blinky`, run the following command:
For example, to generate the target binary for `rtic_blinky`, run the following command:
```
cargo blinky-bin
cargo rtic_blinky-bin
```
4. Flash the binary to the target by running the following command:
```
dfu-util -a 0 -d 2341:035b --dfuse-address=0x08040000:leave -D <binary_path>
```
For example, to flash `blinky`, run the following command:
For example, to flash `rtic_blinky`, run the following command:
```
dfu-util -a 0 -d 2341:035b --dfuse-address=0x08040000:leave -D target/thumbv7em-none-eabihf/release/examples/blinky.bin
dfu-util -a 0 -d 2341:035b --dfuse-address=0x08040000:leave -D target/thumbv7em-none-eabihf/release/examples/rtic_blinky.bin
```
## Flash with debug probe (JLink, ST-Link)
1. Connect the probe to the JTAG port of the breakout board.
2. Run the following command:
```
cargo <example_name>-probe [--release]
```
For example, to flash `blinky`, run the following command:
For example, to flash `rtic_blinky`, run the following command:
```
cargo blinky-probe
cargo rtic_blinky-probe
```

7 changes: 5 additions & 2 deletions examples/blinky.rs → examples/rtic_blinky.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//! Example Blinky
//! Example of blinky
//!
//! Toggles the 3 user LEDs with a different frequency
//!
Expand All @@ -7,7 +7,10 @@
#![no_main]

use defmt::info;
use portenta_h7::board::{self, Board, LedBlue, LedGreen, LedRed};
use portenta_h7::board::{
self,
non_async_impl::{Board, LedBlue, LedGreen, LedRed},
};
use rtic::app;
use rtic_monotonics::systick::prelude::*;

Expand Down
5 changes: 4 additions & 1 deletion examples/usb_echo.rs → examples/rtic_usb_echo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
#![no_main]

use defmt::{error, info};
use portenta_h7::board::{self, Board, LedGreen, LedRed, UsbBusImpl};
use portenta_h7::board::{
self,
non_async_impl::{Board, LedGreen, LedRed, UsbBusImpl},
};
use rtic::app;
use rtic_monotonics::systick::prelude::*;
use rtic_sync::{channel::*, make_channel};
Expand Down
9 changes: 5 additions & 4 deletions examples/usb_led_ctrl.rs → examples/rtic_usb_led_ctrl.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
//! Example USB LED Control
//!
//! Controls LEDs over USB using the USB Device Class (CDC) for communication.
//!
//! The `Led` enum represents the different LEDs that can be controlled: Red (`0xAA`), Green (`0xBB`), and Blue (`0xCC`).
//!
//! The `Action` enum represents the actions that can be performed on an LED: turning it on (`0x01`) or off (`0x02`).
//!
//! To control an LED, send the hexadecimal value of the LED followed by the hexadecimal value of the action. For example, to turn the red LED on, send `0xAA 0x01`.
//!

#![no_std]
#![no_main]

use core::mem::size_of;
use defmt::{debug, error, info};
use portenta_h7::board::{self, Board, LedBlue, LedGreen, LedRed, UsbBusImpl};
use portenta_h7::board::{
self,
non_async_impl::{Board, LedBlue, LedGreen, LedRed, UsbBusImpl},
};
use rtic::app;
use rtic_monotonics::systick::prelude::*;
use rtic_sync::{channel::*, make_channel};
Expand Down
Empty file added src/board/async_impl.rs
Empty file.
135 changes: 6 additions & 129 deletions src/board/mod.rs
Original file line number Diff line number Diff line change
@@ -1,131 +1,8 @@
//! board
#[cfg(feature = "async")]
pub mod async_impl;

use crate::{
drivers::{led, pmic},
hal, sys,
};
use core::sync::atomic::{AtomicBool, Ordering};
use defmt::debug;
use hal::{
gpio::{Output, Pin, PinState, PushPull},
pac,
prelude::*,
rcc,
time::Hertz,
usb_hs::{UsbBus, USB1_ULPI},
};
#[cfg(not(feature = "async"))]
pub mod non_async_impl;

type DigitalOutputPin<const P: char, const N: u8> = Pin<P, N, Output<PushPull>>;
pub type LedRed = led::Led<DigitalOutputPin<'K', 5>>;
pub type LedGreen = led::Led<DigitalOutputPin<'K', 6>>;
pub type LedBlue = led::Led<DigitalOutputPin<'K', 7>>;
pub type UsbPer = USB1_ULPI;
pub type UsbBusImpl = UsbBus<UsbPer>;
pub const CORE_FREQUENCY: Hertz = Hertz::from_raw(480_000_000);

pub struct Board {
pub led_red: LedRed,
pub led_green: LedGreen,
pub led_blue: LedBlue,
pub usb: UsbPer,
}

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

fn setup() -> Self {
// 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);

// GPIOs
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 (output_k5, output_k6, output_k7) = (
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),
);

let led_red = led::Led::new(output_k5);
let led_green = led::Led::new(output_k6);
let led_blue = led::Led::new(output_k7);

// PMIC
let (i2c1_scl, i2c1_sda) = (
gpiob.pb6.into_alternate_open_drain(),
gpiob.pb7.into_alternate_open_drain(),
);
let i2c1 = dp.I2C1.i2c(
(i2c1_scl, i2c1_sda),
400.kHz(),
ccdr.peripheral.I2C1,
&ccdr.clocks,
);
let mut pmic = pmic::Pmic::new(i2c1);
match pmic.device_id() {
Ok(id) => debug!("PMIC device ID: {:X}", id),
Err(_) => debug!("PMIC device ID read error"),
}

Board {
led_red,
led_green,
led_blue,
usb,
}
}
}
pub use fugit::HertzU32;
pub const CORE_FREQUENCY: HertzU32 = HertzU32::from_raw(480_000_000);
Loading

0 comments on commit b94ddb8

Please sign in to comment.