summaryrefslogtreecommitdiff
path: root/src/drivers/uart.cc
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-07-10 11:31:46 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-07-10 11:31:46 +0800
commite90b72ec3082588b296956730bd2930cf8d5d671 (patch)
tree36ff6916af9b4176ea5a9662219d11e721f0b691 /src/drivers/uart.cc
parent1767d390fbf3d0c65389de46caf0b6d43ef3b6ad (diff)
downloadlume-e90b72ec3082588b296956730bd2930cf8d5d671.tar.gz
lume-e90b72ec3082588b296956730bd2930cf8d5d671.tar.xz
refactor: promote new architecture to repository root
Archive the deprecated implementation under lume-legacy, make the new kernel the default root-level build, and update repository entry points without changing kernel behavior.
Diffstat (limited to 'src/drivers/uart.cc')
-rw-r--r--src/drivers/uart.cc204
1 files changed, 0 insertions, 204 deletions
diff --git a/src/drivers/uart.cc b/src/drivers/uart.cc
deleted file mode 100644
index 397a402..0000000
--- a/src/drivers/uart.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * Copyright (C) 2026 Richard QIn
- */
-#include "drivers/uart.h"
-#include "kernel/riscv.h"
-#include "kernel/spinlock.h"
-#include "kernel/proc.h"
-#include "kernel/mm.h"
-#include "lib/string.h"
-
-namespace Drivers
-{
- struct
- {
- Spinlock lock;
- char buf[128]; // Line buffer
- uint32 r; // Read pointer (position taken by the user)
- uint32 w; // Write pointer (position confirmed by Enter)
- uint32 e; // Editing cursor (current typing position)
- } cons;
-
- // Circular buffer structure
- struct
- {
- Spinlock lock;
- char buf[UART_RX_BUF_SIZE];
- uint32 r; // read index
- uint32 w; // write index
- } uart_rx;
-
- Spinlock uart_tx_lock;
-
- void uart_init()
- {
- uart_rx.lock.init("uart_rx");
- cons.lock.init("console");
- uart_tx_lock.init("uart_tx");
- uart_rx.r = 0;
- uart_rx.w = 0;
-
- // Disable interrupts and configure
- *(volatile uint8 *)(uart_base() + IER) = 0x00;
-
- // Enter baud rate setting mode (LCR_DLAB) = 0x80;
- *(volatile uint8 *)(uart_base() + LCR) = 0x80;
- *(volatile uint8 *)(uart_base() + 0) = 0x03; // DLL: 38.4K baud
- *(volatile uint8 *)(uart_base() + 1) = 0x00; // DLM
-
- // Exit baud rate setting, set 8-bit word length, no parity
- *(volatile uint8 *)(uart_base() + LCR) = 0x03;
-
- // Reset and enable FIFO
- *(volatile uint8 *)(uart_base() + FCR) = 0x07;
-
- // Enable Receive Data Available Interrupt
- *(volatile uint8 *)(uart_base() + IER) = 0x01;
- }
-
- void uart_putc(char c)
- {
- uart_tx_lock.acquire();
- while ((*(volatile uint8 *)(uart_base() + LSR) & LSR_TX_IDLE) == 0)
- ;
- *(volatile uint8 *)(uart_base() + THR) = c;
- uart_tx_lock.release();
- }
-
- void uart_puts(const char *s)
- {
- while (*s)
- uart_putc(*s++);
- }
-
- void uart_put_int(int val)
- {
- char buf[16];
- int i = 0;
- if (val == 0)
- {
- uart_puts("0");
- return;
- }
- if (val < 0)
- {
- uart_puts("-");
- val = -val;
- }
- while (val > 0)
- {
- buf[i++] = (val % 10) + '0';
- val /= 10;
- }
- while (i > 0)
- {
- uart_putc(buf[--i]);
- }
- }
-
- void print_hex(uint64 val)
- {
- char hex[] = "0123456789ABCDEF";
- uart_puts("0x");
- for (int i = 60; i >= 0; i -= 4)
- {
- uart_putc(hex[(val >> i) & 0xF]);
- }
- }
-
- void uart_intr()
- {
- uart_rx.lock.acquire();
-
- while (1)
- {
- if ((*(volatile uint8 *)(uart_base() + LSR) & LSR_RX_READY) == 0)
- break;
-
- char c = *(volatile uint8 *)(uart_base() + RHR);
-
- uart_rx.buf[uart_rx.w % UART_RX_BUF_SIZE] = c;
- uart_rx.w++;
-
- ProcManager::wakeup(&uart_rx);
- }
-
- uart_rx.lock.release();
- }
-
- // Modern console read: Line buffering + Editing Keys + Echo
- int console_read(uint64 target, int len)
- {
- struct Proc *p = myproc();
- int target_idx = 0;
-
- cons.lock.acquire();
-
- while (target_idx < len)
- {
- while (cons.r < cons.w)
- {
- char c = cons.buf[cons.r++ % sizeof(cons.buf)];
- cons.lock.release();
-
- if (VM::copyout(p->pagetable, target + target_idx, &c, 1) < 0)
- return -1;
-
- target_idx++;
- if (c == '\n')
- return target_idx;
- if (target_idx == len)
- return target_idx;
-
- cons.lock.acquire();
- }
-
- uart_rx.lock.acquire();
- while (uart_rx.r == uart_rx.w)
- {
- if (p->xstate)
- {
- uart_rx.lock.release();
- cons.lock.release();
- return -1;
- }
- cons.lock.release();
- ProcManager::sleep(&uart_rx, &uart_rx.lock);
- cons.lock.acquire();
- }
-
- char c = uart_rx.buf[uart_rx.r++ % UART_RX_BUF_SIZE];
- uart_rx.lock.release();
-
- if (c == 127 || c == '\b')
- {
- if (cons.e != cons.w)
- {
- cons.e--;
- uart_putc('\b');
- uart_putc(' ');
- uart_putc('\b');
- }
- }
- else
- {
- if (c == '\r')
- c = '\n';
-
- uart_putc(c);
-
- cons.buf[cons.e++ % sizeof(cons.buf)] = c;
-
- if (c == '\n' || cons.e == cons.w + sizeof(cons.buf))
- {
- cons.w = cons.e;
- ProcManager::wakeup(&cons);
- }
- }
- }
-
- cons.lock.release();
- return target_idx;
- }
-} \ No newline at end of file