From 1701f95fa3180a2559ad2e7e668efe253f18bac2 Mon Sep 17 00:00:00 2001 From: kirbylife Date: Mon, 11 Oct 2021 15:19:54 -0500 Subject: [PATCH] Initial commit --- .cargo/config | 13 ++++ .gitignore | 14 +++++ Cargo.toml | 33 ++++++++++ RustMX.tga | Bin 0 -> 90044 bytes binary.uf2 | Bin 0 -> 256000 bytes memory.x | 14 +++++ readme.md | 30 ++++++++++ src/main.rs | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 266 insertions(+) create mode 100644 .cargo/config create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 RustMX.tga create mode 100644 binary.uf2 create mode 100644 memory.x create mode 100644 readme.md create mode 100644 src/main.rs diff --git a/.cargo/config b/.cargo/config new file mode 100644 index 0000000..4faea99 --- /dev/null +++ b/.cargo/config @@ -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" \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ada8be9 --- /dev/null +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..99469b5 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "waveshare_rust_rp2040" +version = "0.1.0" +authors = ["kirbylife "] +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 diff --git a/RustMX.tga b/RustMX.tga new file mode 100644 index 0000000000000000000000000000000000000000..dd09db09dabfec0c4b34099df23f86d9a7f8dd07 GIT binary patch literal 90044 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 LjA7T_P4fSLd;rZ} literal 0 HcmV?d00001 diff --git a/memory.x b/memory.x new file mode 100644 index 0000000..46aab3a --- /dev/null +++ b/memory.x @@ -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; diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..ba5f8e5 --- /dev/null +++ b/readme.md @@ -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. diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..bb8c716 --- /dev/null +++ b/src/main.rs @@ -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::(); + let _spi_mosi = pins.gpio11.into_mode::(); + 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 = 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); + } +}