Bring up minos on the Allwinner D1 (Lichee RV) over FEL/xfel and add bidirectional UART so the console can read keystrokes, not just print. D1 / Lichee RV boot: - riscv arch.c: select UART0 base by -DBOARD_D1 (0x02500000 vs QEMU 0x10000000) and add a reg-shift abstraction (uart_rd/uart_wr): the D1's Synopsys DW-8250 uses 32-bit registers at 4-byte spacing, which is what made the first hardware boot silent. - d1_uart0_init(): gate/deassert UART0 clock, mux PB8/PB9 to UART0, set 115200 8N1, clear FIFOs, force non-loopback, drain stale RX. - link-d1.ld: link for DRAM at 0x40000000 (xfel exec target, M-mode). - Makefile: 'lichee' builds the flat binary; 'run-lichee' loads it via xfel (ddr d1 / write / exec). - arch_name() reports the concrete board. UART input (all archs): - arch contract gains arch_uart_getc() and arch_uart_rx_ready(), implemented for riscv, x86 (COM1) and arm (Cadence UART). - console gains getc() and drain_rx(). - kmain() runs an interactive echo loop (seed of the M3 console). Verified: echo works under QEMU on x86/riscv/arm, and on real D1 hardware (banner once, then live keystroke echo over UART0 @115200).
45 lines
1.4 KiB
C
45 lines
1.4 KiB
C
/* main.c — the arch-agnostic OS entry point.
|
|
*
|
|
* By the time kmain() runs, the arch's asm entry has: set up a stack,
|
|
* cleared .bss (or the arch stub did), and jumped here. Everything below
|
|
* is identical C for x86, RISC-V and ARM — that's the whole point of the
|
|
* exercise: same core, three ISAs. */
|
|
#include "arch.h"
|
|
#include "console.h"
|
|
|
|
void kmain(void)
|
|
{
|
|
arch_early_init();
|
|
arch_set_trap_vector();
|
|
|
|
puts("\n");
|
|
puts("========================================\n");
|
|
puts(" minos — minimal multi-arch kernel\n");
|
|
puts(" arch: ");
|
|
puts(arch_name());
|
|
puts("\n");
|
|
puts(" cpu mode: ");
|
|
puts(arch_cpu_mode());
|
|
puts(" (most privileged; no user mode yet)\n");
|
|
puts(" M1: booted, UART up, trap vector set\n");
|
|
puts("========================================\n");
|
|
puts("hello from kmain()\n");
|
|
|
|
/* Interactive echo: proves UART input (RX) works. Type on the serial
|
|
* console and minos echoes each key back. This is the seed of a real
|
|
* console — M3 will turn it into a command interface. */
|
|
puts("\nType something (keys are echoed back):\n> ");
|
|
drain_rx(); /* drop any bytes already sitting in the RX FIFO */
|
|
for (;;) {
|
|
char c = getc();
|
|
if (c == '\r' || c == '\n') {
|
|
puts("\n> "); /* newline + fresh prompt */
|
|
continue;
|
|
}
|
|
if (c == 0x7f || c == 0x08) { /* DEL / backspace */
|
|
puts("\b \b");
|
|
continue;
|
|
}
|
|
putc(c); /* echo the key */
|
|
}
|
|
}
|