slint/internal/backends/mcu
Olivier Goffart b62132392d stm32h735g: Use a intermediate line vector in the RAM for rendring
It is much faster than blending on the frame buffer which is in hyperram
2022-06-17 09:30:09 +02:00
..
LICENSES Fix LICENSES symlinks 2022-02-09 17:05:47 +01:00
pico_st7789 mcu pico: fix the screen artifacts by re-implementing display-interface-spi 2022-06-16 21:36:15 +02:00
simulator [reorg]: Move the rendering backends into internal 2022-01-31 16:00:50 +01:00
stm32h735g stm32h735g: cleanup 2022-04-27 09:00:52 +02:00
build.rs WIP: STM32H735G support 2022-04-27 09:00:52 +02:00
Cargo.toml rp2040 backend: use DMA to send pixels to the screen via SPI 2022-06-17 09:30:09 +02:00
lib.rs rp2040 backend: use DMA to send pixels to the screen via SPI 2022-06-17 09:30:09 +02:00
pico_st7789.rs rp2040 backend: use DMA to send pixels to the screen via SPI 2022-06-17 09:30:09 +02:00
profiler.rs MCU: Refactor the renderer in a LineRenderer 2022-05-23 16:40:34 +02:00
README.md Fix instructions on how to build the mcu printer demo for the simulator 2022-05-16 08:29:33 +02:00
simulator.rs rp2040 backend: use DMA to send pixels to the screen via SPI 2022-06-17 09:30:09 +02:00
stm32h735g.rs stm32h735g: Use a intermediate line vector in the RAM for rendring 2022-06-17 09:30:09 +02:00

NOTE: This library is an internal crate of the Slint project. This crate should not be used directly by applications using Slint. You should use the slint crate instead.

WARNING: This crate does not follow the semver convention for versioning and can only be used with version = "=x.y.z" in Cargo.toml.

Slint MCU backend

The MCU backend is still a work in progress.

We currently have in-tree backend for

  • the Raspberry Pi Pico and ST7789 based screen:

    The Raspberry Pi Pico uses a RP2040 micro-controller which has 264KB of RAM and 2MB of flash memory.

  • STM32H735G-DK

  • Simulator, which is a way to test the software rendering backend on desktop.

We will make some backend API public so any board supported by rust can easily be supported

How to use

In order to use this backend, the final program must depend on both slint and i_slint_backend_mcu. The main.rs will look something like this

#![no_std]
#![cfg_attr(not(feature = "simulator"), no_main)]
slint::include_modules!();

#[i_slint_backend_mcu::entry]
fn main() -> ! {
    i_slint_backend_mcu::init();
    MainWindow::new().run();
    panic!("The event loop should not return");
}

Since i_slint_backend_mcu is at the moment an internal crate not uploaded to crates.io, you must use the git version of slint, slint-build, and i_slint_backend_mcu

[dependencies]
slint = { git = "https://github.com/slint-ui/slint" }
i_slint_backend_mcu = { git = "https://github.com/slint-ui/slint" }
# ...
[build-dependencies]
slint-build = { git = "https://github.com/slint-ui/slint" }

Run the demo:

The simulator

cargo run -p printerdemo_mcu --features=mcu-simulator --release

On the Raspberry Pi Pico

You need nightly rust because that's the only way to get an allocator.

Build the demo with:

cargo +nightly build -p printerdemo_mcu --features=mcu-pico-st7789 --target=thumbv6m-none-eabi --release

You should process the file with elf2uf2-rs

cargo install elf2uf2-rs
elf2uf2-rs target/thumbv6m-none-eabi/release/printerdemo_mcu

Then upload the demo to the raspberry pi: push the "bootsel" white button on the device while connecting the micro-usb cable to the device, this connect some storage where you can store the binary.

Or from the command on linux: (connect the device while pressing the "bootsel" button.

# mount the device
udisksctl mount -b /dev/sda1
# upload
elf2uf2-rs -d target/thumbv6m-none-eabi/release/printerdemo_mcu

Using probe-run

This require probe-run (cargo install probe-run) and to connect the pico via a probe (for example another pico running the probe)

Then you can simply run with cargo run

CARGO_TARGET_THUMBV6M_NONE_EABI_LINKER="flip-link" CARGO_TARGET_THUMBV6M_NONE_EABI_RUNNER="probe-run --chip RP2040" cargo +nightly run -p printerdemo_mcu --features=mcu-pico-st7789 --target=thumbv6m-none-eabi --release

STM32H735G-DK

Using probe-run (cargo install probe-run)

CARGO_TARGET_THUMBV7EM_NONE_EABIHF_RUNNER="probe-run --chip STM32H735IGKx" cargo +nightly run -p printerdemo_mcu --features=i-slint-backend-mcu/stm32h735g --target=thumbv7em-none-eabihf --release