|
|
@@ -0,0 +1,61 @@ |
|
|
|
#![no_std] |
|
|
|
|
|
|
|
use core::panic::PanicInfo; |
|
|
|
use core::ptr::{read_volatile, write_volatile}; |
|
|
|
|
|
|
|
const UART_DR: u32 = 0x3f20_1000; |
|
|
|
const UART_FR: u32 = 0x3f20_1018; |
|
|
|
|
|
|
|
fn mmio_write(reg: u32, val: u32) { |
|
|
|
unsafe { write_volatile(reg as *mut u32, val) } |
|
|
|
} |
|
|
|
|
|
|
|
fn mmio_read(reg: u32) -> u32 { |
|
|
|
unsafe { read_volatile(reg as *const u32) } |
|
|
|
} |
|
|
|
|
|
|
|
fn transmit_fifo_full() -> bool { |
|
|
|
mmio_read(UART_FR) & (1 << 5) > 0 |
|
|
|
} |
|
|
|
|
|
|
|
fn receive_fifo_empty() -> bool { |
|
|
|
mmio_read(UART_FR) & (1 << 4) > 0 |
|
|
|
} |
|
|
|
|
|
|
|
fn writec(c: u8) { |
|
|
|
while transmit_fifo_full() {} |
|
|
|
mmio_write(UART_DR, c as u32); |
|
|
|
} |
|
|
|
|
|
|
|
fn getc() -> u8 { |
|
|
|
while receive_fifo_empty() {} |
|
|
|
mmio_read(UART_DR) as u8 |
|
|
|
} |
|
|
|
|
|
|
|
fn write(msg: &str) { |
|
|
|
for c in msg.bytes() { |
|
|
|
writec(c); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#[no_mangle] |
|
|
|
pub extern "C" fn kernel_main() { |
|
|
|
write("hello rust raspberry pi kernel"); |
|
|
|
loop { |
|
|
|
writec(getc()) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#[no_mangle] |
|
|
|
pub extern "C" fn __aeabi_unwind_cpp_pr0() {} |
|
|
|
|
|
|
|
#[panic_handler] |
|
|
|
fn panic(_info: &PanicInfo) -> ! { |
|
|
|
loop {} |
|
|
|
} |
|
|
|
|
|
|
|
#[allow(non_snake_case)] |
|
|
|
#[no_mangle] |
|
|
|
pub extern "C" fn _Unwind_Resume() { |
|
|
|
loop {} |
|
|
|
} |