From 1b16980ed7212c76b62b10a579f0abf730f85604 Mon Sep 17 00:00:00 2001 From: D4VID Date: Mon, 19 May 2025 22:32:33 +0200 Subject: [PATCH] Make a library --- lwcpu/.gitignore | 1 + lwcpu/Cargo.lock | 7 +++++ lwcpu/Cargo.toml | 6 +++++ lwcpu/src/lib.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ test/Cargo.lock | 5 ++++ test/Cargo.toml | 1 + test/src/main.rs | 26 +++++------------- 7 files changed, 96 insertions(+), 20 deletions(-) create mode 100644 lwcpu/.gitignore create mode 100644 lwcpu/Cargo.lock create mode 100644 lwcpu/Cargo.toml create mode 100644 lwcpu/src/lib.rs diff --git a/lwcpu/.gitignore b/lwcpu/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/lwcpu/.gitignore @@ -0,0 +1 @@ +/target diff --git a/lwcpu/Cargo.lock b/lwcpu/Cargo.lock new file mode 100644 index 0000000..3da8965 --- /dev/null +++ b/lwcpu/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "lwcpu" +version = "0.1.0" diff --git a/lwcpu/Cargo.toml b/lwcpu/Cargo.toml new file mode 100644 index 0000000..ff3d212 --- /dev/null +++ b/lwcpu/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "lwcpu" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/lwcpu/src/lib.rs b/lwcpu/src/lib.rs new file mode 100644 index 0000000..7d2c9f4 --- /dev/null +++ b/lwcpu/src/lib.rs @@ -0,0 +1,70 @@ +#![no_std] + +use core::ptr::{read_volatile, write_volatile}; + +const BASE_POINTER: u32 = 0x2000_0000; + +const NUMBER_DISPLAY_OFFSET : u32 = 0x00; +const RANDOM_NUMBER_OFFSET : u32 = 0x04; +const BUTTONS_OFFSET : u32 = 0x08; +const TEXT_DISPLAY_OFFSET : u32 = 0x0C; +const KEYBOARD_OFFSET : u32 = 0x10; +const SCREEN_OFFSET : u32 = 0x80; + +const NUMBER_DISPLAY_POINTER : *mut u32 = (BASE_POINTER + NUMBER_DISPLAY_OFFSET) as *mut u32; +const RANDOM_NUMBER_POINTER : *mut u32 = (BASE_POINTER + RANDOM_NUMBER_OFFSET) as *mut u32; +const BUTTONS_POINTER : *mut u8 = (BASE_POINTER + BUTTONS_OFFSET) as *mut u8; +const TEXT_DISPLAY_POINTER : *mut u8 = (BASE_POINTER + TEXT_DISPLAY_OFFSET) as *mut u8; +const KEYBOARD_POINTER : *mut u32 = (BASE_POINTER + KEYBOARD_OFFSET) as *mut u32; +const SCREEN_POINTER : *mut u32 = (BASE_POINTER + SCREEN_OFFSET) as *mut u32; + + +pub struct Screen {} +impl Screen { + #[inline] + pub fn clear() { + } + #[inline] + pub fn turn_pixel_on(x: u8, y: u8) { + unsafe { + let mut row = read_volatile(SCREEN_POINTER.offset(y as isize)); + row |= 1 << x; + write_volatile(SCREEN_POINTER.offset(y as isize), row); + } + } + #[inline] + pub fn turn_pixel_off(x: u8, y: u8) { + unsafe { + let mut row = read_volatile(SCREEN_POINTER.offset(y as isize)); + row &= !(1 << x); + write_volatile(SCREEN_POINTER.offset(y as isize), row); + } + } + #[inline] + pub fn set_line(y: u8, value: u32) { + unsafe { + write_volatile(SCREEN_POINTER.offset(y as isize), value); + } + } +} + +pub struct TextDisplay {} +impl TextDisplay { + #[inline] + pub fn put_char(ch: u8) { + unsafe { + write_volatile(TEXT_DISPLAY_POINTER, ch); + } + } +} + +pub struct NumberDisplay {} +impl NumberDisplay { + #[inline] + pub fn display_number(number: u32) { + unsafe { + write_volatile(NUMBER_DISPLAY_POINTER, number); + } + } +} + diff --git a/test/Cargo.lock b/test/Cargo.lock index ff3ed61..3ec0c97 100644 --- a/test/Cargo.lock +++ b/test/Cargo.lock @@ -14,6 +14,10 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89" +[[package]] +name = "lwcpu" +version = "0.1.0" + [[package]] name = "paste" version = "1.0.15" @@ -105,6 +109,7 @@ dependencies = [ name = "test" version = "0.1.0" dependencies = [ + "lwcpu", "riscv", "riscv-rt", ] diff --git a/test/Cargo.toml b/test/Cargo.toml index 805e70a..f5a403b 100644 --- a/test/Cargo.toml +++ b/test/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] riscv = "0.12.1" riscv-rt = "0.13.0" +lwcpu = { path = "../lwcpu" } # https://docs.rust-embedded.org/book/unsorted/speed-vs-size.html [profile.release] diff --git a/test/src/main.rs b/test/src/main.rs index b8f8e44..c5e2dbf 100644 --- a/test/src/main.rs +++ b/test/src/main.rs @@ -2,39 +2,25 @@ #![no_main] use core::panic::PanicInfo; +use lwcpu::{self, NumberDisplay, Screen, TextDisplay}; use riscv_rt::entry; #[panic_handler] fn panic_handler(_info: &PanicInfo) -> ! { - unsafe { - OUTPUT.write_volatile(0xDEADC0DE); - } + NumberDisplay::display_number(0xDEADC0DE); loop {} } -const OUTPUT: *mut u32 = 0x2000_0000 as *mut u32; -const BTNS: *mut u8 = 0x2000_0008 as *mut u8; -const TEXT: *mut u32 = 0x2000_000C as *mut u32; -const SCREEN: *mut u32 = 0x2000_0080 as *mut u32; - const HELLO_WORLD: &[u8; 13] = b" Hello world!"; #[entry] fn main() -> ! { - unsafe { - SCREEN.write_volatile(0b101); - } for i in 0..31 { - unsafe { - let mut x = SCREEN.offset(i).read_volatile(); - x <<= 1; - SCREEN.offset(i + 1).write_volatile(x); - } + Screen::set_line(i, 1 << i); } - for ch in HELLO_WORLD { - unsafe { - TEXT.write_volatile(*ch as u32); + loop { + for ch in HELLO_WORLD { + TextDisplay::put_char(*ch); } } - loop {} }