Make a library

master
D4VID 4 months ago
parent e65e934188
commit 1b16980ed7

1
lwcpu/.gitignore vendored

@ -0,0 +1 @@
/target

7
lwcpu/Cargo.lock generated

@ -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"

@ -0,0 +1,6 @@
[package]
name = "lwcpu"
version = "0.1.0"
edition = "2021"
[dependencies]

@ -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);
}
}
}

5
test/Cargo.lock generated

@ -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",
]

@ -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]

@ -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 {}
}

Loading…
Cancel
Save