diff options
Diffstat (limited to 'crates/teensy4/src/lib.rs')
| -rw-r--r-- | crates/teensy4/src/lib.rs | 67 |
1 files changed, 67 insertions, 0 deletions
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); +} |
