diff options
| author | Ian McIntyre <me@mciantyre.dev> | 2026-08-03 07:46:10 -0400 |
|---|---|---|
| committer | Ian McIntyre <me@mciantyre.dev> | 2026-08-03 07:46:10 -0400 |
| commit | 7ffc62ab8613b097485b2c664093e649907dc2a1 (patch) | |
| tree | 428e6e958af00e1022e663676fffe9c19f0174a6 /crates/teensy4 | |
First commit
Diffstat (limited to 'crates/teensy4')
| -rw-r--r-- | crates/teensy4/Cargo.toml | 12 | ||||
| -rw-r--r-- | crates/teensy4/src/lib.rs | 67 | ||||
| -rw-r--r-- | crates/teensy4/src/main.rs | 13 |
3 files changed, 92 insertions, 0 deletions
diff --git a/crates/teensy4/Cargo.toml b/crates/teensy4/Cargo.toml new file mode 100644 index 0000000..4b196d5 --- /dev/null +++ b/crates/teensy4/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "rust-threadx-teensy4" +version = "0.1.0" +edition = "2024" +publish = false + +[dependencies] +cortex-m = { workspace = true } +teensy4-bsp = { version = "0.6", features = ["rt"] } + +rust-threadx-cortex-m = { workspace = true } +rust-threadx-stdio-imxrt-usbd = { workspace = true } diff --git a/crates/teensy4/src/lib.rs b/crates/teensy4/src/lib.rs new file mode 100644 index 0000000..35afb31 --- /dev/null +++ b/crates/teensy4/src/lib.rs @@ -0,0 +1,67 @@ +#![no_std] +#![feature(rustc_private)] +extern crate fusible; + +use core::pin::Pin; + +use rust_threadx_cortex_m as _; +use rust_threadx_stdio_imxrt_usbd as stdio; + +#[doc(hidden)] +#[unsafe(no_mangle)] +pub unsafe extern "C" fn _tx_initialize_low_level() { + use cortex_m::{ + Peripherals, + peripheral::{scb::SystemHandler, syst::SystClkSource}, + }; + + cortex_m::interrupt::disable(); + + unsafe { + let Peripherals { + mut SYST, mut SCB, .. + } = Peripherals::steal(); + + SCB.set_priority(SystemHandler::SysTick, 0x40); + SCB.set_priority(SystemHandler::PendSV, 0xff); + SCB.set_priority(SystemHandler::SVCall, 0xff); + + SYST.set_clock_source(SystClkSource::External); + SYST.set_reload(100_000 / 100 - 1); + SYST.clear_current(); + SYST.enable_interrupt(); + SYST.enable_counter(); + } +} + +use fusible::thread::{StaticStack, Thread, ThreadContext}; +static STACK: StaticStack<512> = StaticStack::new(); +static THREAD: ThreadContext = Thread::context(); + +#[unsafe(no_mangle)] +#[doc(hidden)] +pub extern "C" fn __rust_threadx_app_define() { + let instances = teensy4_bsp::board::instances(); + let mut resources = teensy4_bsp::board::t40(instances); + + let led = teensy4_bsp::board::led(&mut resources.gpio2, resources.pins.p13); + Thread::create( + Pin::static_ref(&THREAD), + STACK.take().unwrap(), + &Default::default(), + move || loop { + fusible::thread::sleep(50); + led.toggle(); + }, + ) + .unwrap(); + + stdio::start(resources.usb, interrupt::USB_OTG1); +} + +use teensy4_bsp::{ral::interrupt, rt::interrupt}; + +#[interrupt] +fn USB_OTG1() { + stdio::on_interrupt(interrupt::USB_OTG1); +} diff --git a/crates/teensy4/src/main.rs b/crates/teensy4/src/main.rs new file mode 100644 index 0000000..16a1a1b --- /dev/null +++ b/crates/teensy4/src/main.rs @@ -0,0 +1,13 @@ +use std::thread; +use std::time::Duration; + +use rust_threadx_teensy4 as _; + +fn main() { + let mut count = 0_usize; + loop { + thread::sleep(Duration::from_millis(500)); + println!("Hello world! The count is {count}\r"); + count = count.wrapping_add(1); + } +} |
