First Try

This commit is contained in:
2025-07-20 01:12:47 +02:00
parent d948ad81aa
commit 0d0dc3092f
7 changed files with 118 additions and 4 deletions

View File

@@ -21,7 +21,7 @@ jobs:
- name: Run format check - name: Run format check
run: cargo fmt --check run: cargo fmt --check
- name: Run lint - name: Run lint
run: cargo clippy run: cargo clippy -- -D warnings
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest

109
src/framebuffer.rs Normal file
View File

@@ -0,0 +1,109 @@
use crate::{
mailbox::{read_mailbox, write_mailbox},
peripherals::uart::{print, print_u32},
};
const ALLOCATE_BUFFER: u32 = 0x00040001;
const GET_PHYSICAL_DISPLAY_WH: u32 = 0x00040003;
const SET_PHYSICAL_DISPLAY_WH: u32 = 0x00048003;
const SET_VIRTUAL_DISPLAY_WH: u32 = 0x00048004;
const SET_PIXEL_DEPTH: u32 = 0x00048005;
const SET_PIXEL_ORDER: u32 = 0x00048006;
const SET_FB_OFFSET: u32 = 0x00048009;
pub fn init_fb() {
let mut mailbox = [0; 32];
mailbox[0] = 32 * 4;
mailbox[1] = 0;
mailbox[2] = SET_PHYSICAL_DISPLAY_WH;
mailbox[3] = 8;
mailbox[4] = 8;
mailbox[5] = 1920;
mailbox[6] = 1200;
mailbox[7] = SET_VIRTUAL_DISPLAY_WH;
mailbox[8] = 8;
mailbox[9] = 8;
mailbox[10] = 1920;
mailbox[11] = 1200;
mailbox[12] = SET_PIXEL_DEPTH;
mailbox[13] = 4;
mailbox[14] = 4;
mailbox[15] = 32; // 32 bit per pixel
mailbox[16] = SET_PIXEL_ORDER;
mailbox[17] = 4;
mailbox[18] = 4;
mailbox[19] = 0x1; // RGB
mailbox[20] = SET_FB_OFFSET;
mailbox[21] = 8;
mailbox[22] = 8;
mailbox[24] = 0; // X in pixels
mailbox[25] = 0; // Y in pixels
mailbox[26] = ALLOCATE_BUFFER;
mailbox[27] = 8;
mailbox[28] = 4;
mailbox[29] = 4096; // Alignment
mailbox[30] = 0;
mailbox[31] = 0; // End tag
// TODO: validate responses
let addr = core::ptr::addr_of!(mailbox[0]) as u32;
write_mailbox(8, addr);
let _ = read_mailbox(8);
if mailbox[1] == 0 {
print("Failed\r\n");
}
print_u32(mailbox[29]);
mailbox[29] = (mailbox[29] & 0x00FF_FFFF) | 0x3F00_0000;
let mut fb: *mut u32 = mailbox[29] as *mut u32;
fb = unsafe { fb.add(1920 * 500 + 500) };
for x in 0..500 {
for y in 0..10 {
unsafe {
*fb = 0xFFFFBB00;
fb = fb.add(1);
};
}
}
}
pub fn print_display_resolution() {
let mut mailbox = [0; 8];
mailbox[0] = 8 * 4;
mailbox[1] = 0;
mailbox[2] = GET_PHYSICAL_DISPLAY_WH;
mailbox[3] = 8;
mailbox[4] = 0;
mailbox[5] = 0;
mailbox[6] = 0;
mailbox[7] = 0;
let addr = core::ptr::addr_of!(mailbox[0]) as u32;
write_mailbox(8, addr);
let _ = read_mailbox(8);
if mailbox[1] == 0 {
print("Failed\r\n");
}
print("Width x Height: ");
print_u32(mailbox[5]);
print(" x ");
print_u32(mailbox[6]);
print("\r\n");
}

View File

@@ -9,7 +9,7 @@ use crate::{
gpio::{blink_gpio, SpecificGpio}, gpio::{blink_gpio, SpecificGpio},
uart::print, uart::print,
}, },
timer::{sleep_ms, sleep_s}, timer::sleep_s,
}; };
const INTERRUPT_BASE: u32 = 0x3F00_B000; const INTERRUPT_BASE: u32 = 0x3F00_B000;

View File

@@ -5,6 +5,7 @@ use core::ptr::{read_volatile, write_volatile};
pub mod peripherals; pub mod peripherals;
pub mod configuration; pub mod configuration;
pub mod framebuffer;
pub mod irq_interrupt; pub mod irq_interrupt;
pub mod mailbox; pub mod mailbox;
pub mod timer; pub mod timer;

View File

@@ -34,7 +34,7 @@ pub fn write_mailbox(channel: u32, data: u32) {
} }
pub fn read_soc_temp() -> u32 { pub fn read_soc_temp() -> u32 {
let mut mailbox = [0; 36]; let mut mailbox = [0; 8];
mailbox[0] = 8 * 4; // Total size in bytes mailbox[0] = 8 * 4; // Total size in bytes
mailbox[1] = 0; // Request mailbox[1] = 0; // Request
mailbox[2] = 0x00030006; // Tag mailbox[2] = 0x00030006; // Tag

View File

@@ -9,6 +9,7 @@ use core::{
}; };
use nova::{ use nova::{
framebuffer::{init_fb, print_display_resolution},
irq_interrupt::enable_irq_source, irq_interrupt::enable_irq_source,
mailbox::read_soc_temp, mailbox::read_soc_temp,
peripherals::{ peripherals::{
@@ -92,9 +93,13 @@ pub extern "C" fn kernel_main() -> ! {
gpio_pull_up(26); gpio_pull_up(26);
set_falling_edge_detect(26, true); set_falling_edge_detect(26, true);
print_display_resolution();
init_fb();
loop { loop {
let temp = read_soc_temp(); let temp = read_soc_temp();
print_u32(temp); print_u32(temp);
print("\r\n");
blink_gpio(SpecificGpio::OnboardLed as u8, 500); blink_gpio(SpecificGpio::OnboardLed as u8, 500);
} }

View File

@@ -57,7 +57,6 @@ pub fn print_u32(mut val: u32) {
let s = str::from_utf8(&data).unwrap(); let s = str::from_utf8(&data).unwrap();
print(s); print(s);
} }
print("\r\n");
} }
/// Initialize UART peripheral /// Initialize UART peripheral