Expand description
§Rust on Alarmo!
This project provides a convenient API to bootstrap firmware and access peripherals on the Nintendo Alarmo, using Rust.
§Status
This started as a Rust port of GaryOderNichts’s MIT-licensed alarmo repository, which uses the official hardware abstraction layer. As a proof-of-concept, I first made a Rust loader that would just call GaryOderNichts’s implementation, then I incrementally rewrote each part in the Rust module.
In its current state, the project no longer relies on the official HAL.
Consider this list of goals tentative:
- It works!
-
LCD frontend using the
display_interface
crate -
Better build environment (automate
objcopy
and firmware signing) - Button inputs (+ interrupts)
- Dial input
- Dial LED
-
Allocator with external RAM (enable the
alloc
feature) - Sound
-
USB-CDC (
usb-device
,usbd-serial
) - WLAN
§Usage
§Running an example
- Compile the example, for example
lcd
:
# "--features display" required to build the LCD example
cargo build --example lcd --features display
- Convert the example ELF into BINF:
arm-none-eabi-objcopy target/thumbv7em-none-eabihf/debug/examples/lcd lcd.bin
- Sign the firmware to get the
a.bin
.
§Creating a project
- After you’ve created the Cargo project, copy the
link.ld
file and.cargo/
directory from this repository to the root of your crate. - Add the library as a dependency:
# With LCD support
cargo add alarmo -F display
# No LCD support
cargo add alarmo
# Optionally, add some other dependencies for peripherals, see examples for details
# cargo add mipidsi
# cargo add embedded-graphics
- Build the project:
cargo build
- Convert the result ELF into BINF (change
debug
torelease
for--release
):
arm-none-eabi-objcopy target/thumbv7em-none-eabihf/debug/your_crate your_crate.bin
- Sign the firmware to get the
a.bin
.
§License
The library and its examples are dual-licensed under both Apache-2.0 and MIT.
§Credits
- GaryOderNichts, whose project this repository is derived from, and for their blog post exploring the Alarmo.
- Spinda and hexkyz for their incredible work reverse-engineering the Alarmo!
Modules§
- dial
- Dial peripheral, used for input and LED
- display
- Provides a display interface (see crate
display_interface
) to send data and commands to the LCD on the Alarmo. - input
- panic
- Provides a panic handler that displays the panic message on the Alarmo’s display
Structs§
- Alarmo
- Singleton that allows access to the Alarmo’s peripherals.
- Alarmo
Options