Initial commit
commit
1701f95fa3
|
@ -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"
|
|
@ -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
|
|
@ -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
|
Binary file not shown.
Binary file not shown.
|
@ -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;
|
|
@ -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.
|
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue