Initial commit

main
kirbylife 2021-10-11 15:19:54 -05:00
commit 1701f95fa3
8 changed files with 266 additions and 0 deletions

13
.cargo/config 100644
View File

@ -0,0 +1,13 @@
[target.'cfg(all(target_arch = "arm", target_os = "none"))']
rustflags = [
"-C", "linker=flip-link",
"-C", "link-arg=--nmagic",
"-C", "link-arg=-Tlink.x",
"-C", "inline-threshold=5",
"-C", "no-vectorize-loops",
]
[build]
target = "thumbv6m-none-eabi"

14
.gitignore vendored 100644
View File

@ -0,0 +1,14 @@
# Generated by Cargo
# will have compiled files and executables
debug/
target/
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
Cargo.lock
# These are backup files generated by rustfmt
**/*.rs.bk
# MSVC Windows builds of rustc generate these, which store debugging information
*.pdb

33
Cargo.toml 100644
View File

@ -0,0 +1,33 @@
[package]
name = "waveshare_rust_rp2040"
version = "0.1.0"
authors = ["kirbylife <kirbylife@protonmail.com>"]
edition = "2018"
resolver = "2"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
cortex-m = "0.7.3"
cortex-m-rt = "0.7.0"
embedded-hal = { version = "0.2.5", features=["unproven"] }
embedded-time = "0.12.0"
embedded-graphics = "0.6.1"
panic-probe = { version = "0.2.0" }
rp2040-hal = { git = "https://github.com/rp-rs/rp-hal", branch="main", features=["rt"] }
rp2040-boot2 = { git = "https://github.com/rp-rs/rp2040-boot2-rs", branch="main" }
epd-waveshare = "0.4.0"
tinytga = { version = "0.3.2", features = [ "graphics" ] }
# cargo build/run --release
[profile.release]
codegen-units = 1
debug = 2
debug-assertions = false
incremental = false
lto = 'fat'
opt-level = 3
overflow-checks = false

BIN
RustMX.tga 100644

Binary file not shown.

BIN
binary.uf2 100644

Binary file not shown.

14
memory.x 100644
View File

@ -0,0 +1,14 @@
MEMORY {
BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100
FLASH : ORIGIN = 0x10000100, LENGTH = 2048K - 0x100
RAM : ORIGIN = 0x20000000, LENGTH = 256K
}
SECTIONS {
/* ### Boot loader */
.boot2 ORIGIN(BOOT2) :
{
KEEP(*(.boot2));
} > BOOT2
} INSERT BEFORE .text;

30
readme.md 100644
View File

@ -0,0 +1,30 @@
# Waveshare-Rust-RP2040
### This is a template to use a waveshare e-ink screen with the rp-pico board andrp-pico HAT using Rust.
## Prepare your system
- Install the toolchain
- `rustup target install thumbv6m-none-eabi`
- Install the linker (with [flip-link](https://github.com/knurling-rs/flip-link) you will have zero-cost stack overflow)
- `cargo install flip-link`
- Install elf2uf2-rs
- `cargo install elf2uf2-rs`
- Install the pico-sdk
- (search on the Internet, it's really boring and I don't remember how to do it lol)
- Install the gcc-arm corresponding to the board
- (The same as with pico-sdk... sorry)
## Usage
1. Clone the repo
- `git clone https://gitlab.com/kirbylife/waveshare-rust-rp2040`
2. Build with --release
- `cargo build --release`
3. Convert to uf2
- elf2uf2-rs target/thumbv6m-none-eabi/release/waveshare_rust_rp2040 binary.uf2
4. Connect your rp-pico to the PC with in BOOTSEL mode
5. Grab your file `binary.uf2` and drop it inside of the RPI-RP2 volume
6. Enjoy :) (apply restrictions)
## License
This template does not have any license but the [RustMX](https://t.me/RustMX) can have it.
written in Rust the ran originally in the Raspberry Pi Pico with a Waveshare 7.5 inch e-ink screen.

162
src/main.rs 100644
View File

@ -0,0 +1,162 @@
#![no_std]
#![no_main]
use cortex_m_rt::entry;
use embedded_graphics::{
fonts::{Font24x32 as Font, Text},
image::Image,
pixelcolor::BinaryColor,
prelude::*,
primitives::{Circle, Line, Triangle},
style::{PrimitiveStyle, PrimitiveStyleBuilder, TextStyleBuilder},
};
use embedded_hal::digital::v2::OutputPin;
use embedded_time::fixed_point::FixedPoint;
use embedded_time::rate::Extensions;
use epd_waveshare::{
color::*, epd7in5_v2::Display7in5 as EPDisplay, epd7in5_v2::EPD7in5 as EPD, epd7in5_v2::HEIGHT,
epd7in5_v2::WIDTH, graphics::DisplayRotation, prelude::*,
};
use panic_probe as _;
use rp2040_hal as hal;
use tinytga::Tga;
use hal::{
clocks::{init_clocks_and_plls, Clock},
pac,
sio::Sio,
watchdog::Watchdog,
};
// IMPORTANT!! first of all, you need to load the BOOT2 binary (rp-rs courtesy)
#[link_section = ".boot2"]
#[used]
pub static BOOT2: [u8; 256] = rp2040_boot2::BOOT_LOADER_W25Q080;
#[entry]
fn main() -> ! {
// Start all the peripherals
let mut pac = pac::Peripherals::take().unwrap();
let core = pac::CorePeripherals::take().unwrap();
let mut watchdog = Watchdog::new(pac.WATCHDOG);
let sio = Sio::new(pac.SIO);
let external_xtal_freq_hz = 12_000_000u32;
let clocks = init_clocks_and_plls(
external_xtal_freq_hz,
pac.XOSC,
pac.CLOCKS,
pac.PLL_SYS,
pac.PLL_USB,
&mut pac.RESETS,
&mut watchdog,
)
.ok()
.unwrap();
let mut delay = cortex_m::delay::Delay::new(core.SYST, clocks.system_clock.freq().integer());
let pins = hal::gpio::Pins::new(
pac.IO_BANK0,
pac.PADS_BANK0,
sio.gpio_bank0,
&mut pac.RESETS,
);
// End of Start the peripherals
// SPI declaration
let _spi_sclk = pins.gpio10.into_mode::<hal::gpio::FunctionSpi>();
let _spi_mosi = pins.gpio11.into_mode::<hal::gpio::FunctionSpi>();
let spi = hal::spi::Spi::<_, _, 8>::new(pac.SPI1);
let mut spi = spi.init(
&mut pac.RESETS,
clocks.peripheral_clock.freq(),
// you can put cookie (increase the speed) in it but I don't recommend it.
4_000_000u32.Hz(),
&embedded_hal::spi::MODE_0,
);
// End of SPI declaration
// Start the rest of pins needed to communicate with the screen
let mut cs = pins.gpio9.into_push_pull_output(); // CS
cs.set_high().unwrap();
let busy = pins.gpio13.into_pull_up_input(); // BUSY
let dc = pins.gpio8.into_push_pull_output(); // DC
let rst = pins.gpio12.into_push_pull_output(); // RST
// Start the EPD struct
let mut epd = EPD::new(
&mut spi, // SPI
cs, // CS
busy, // BUSY
dc, // DC
rst, // RST
&mut delay, // DELAY
)
.unwrap();
// Start the display buffer
let mut display = EPDisplay::default();
epd.wake_up(&mut spi, &mut delay).unwrap();
// epd.set_background_color(epd_waveshare::color::Color::Black);
// epd.clear_frame(&mut spi).unwrap();
// epd.set_background_color(epd_waveshare::color::Color::White);
epd.clear_frame(&mut spi).unwrap();
display.clear_buffer(Color::Black);
// Start the fun
let style_text = TextStyleBuilder::new(Font)
.text_color(BinaryColor::Off)
.background_color(BinaryColor::On)
.build();
let style_forms = PrimitiveStyleBuilder::new()
.stroke_width(10)
.stroke_color(BinaryColor::Off)
.fill_color(BinaryColor::Off)
.build();
for i in 0..(WIDTH / 10) as i32 {
Line::new(Point::new(i * 10, 0), Point::new(i * 10, HEIGHT as i32))
.into_styled(PrimitiveStyle::with_stroke(BinaryColor::Off, 1))
.draw(&mut display)
.unwrap();
}
for i in 0..(HEIGHT / 10) as i32 {
Line::new(Point::new(0, i * 10), Point::new(WIDTH as i32, i * 10))
.into_styled(PrimitiveStyle::with_stroke(BinaryColor::Off, 1))
.draw(&mut display)
.unwrap();
}
display.set_rotation(DisplayRotation::Rotate270);
let tga = Tga::from_slice(include_bytes!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/RustMX.tga"
)))
.unwrap();
let image: Image<Tga, BinaryColor> = Image::new(&tga, Point::new(50, 100));
image.draw(&mut display).unwrap();
Text::new("RustMX", Point::new(50, 50))
.into_styled(style_text)
.draw(&mut display)
.unwrap();
epd.update_frame(&mut spi, display.buffer()).unwrap();
epd.display_frame(&mut spi).unwrap();
delay.delay_ms(1000);
let mut led_pin = pins.gpio25.into_push_pull_output();
// If the led blink, everything it's ok (big debug skills)
loop {
led_pin.set_high().unwrap();
delay.delay_ms(500);
led_pin.set_low().unwrap();
delay.delay_ms(500);
}
}