Files
ViperOS/VKernel/Kernel/drivers/serial/uart/serial.vp
T

77 lines
2.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import platform.pch.pic as pic
import drivers.serial.uart.su8250 as su8250
import asm
import viperlib
import t, c
# 串口初始化
def init():
# 初始化COM1端口
su8250.init(su8250.COM1_PORT)
# 启用COM1中断(IRQ4)
pic.clearMask(4)
# 发送一个字符到COM1
def putc(cr: t.CChar):
su8250.putchar(su8250.COM1_PORT, cr)
def putchar(cr: t.CChar):
su8250.putchar(su8250.COM1_PORT, cr)
# 从COM1读取一个字符
def getchar() -> t.CChar:
return su8250.getchar(su8250.COM1_PORT)
# 发送一个字符串到COM1
def puts(s: str):
# 逐个字符发送,直接复用putchar的逻辑
for i in s:
putchar(i)
# 检查COM1是否有数据可读
def isDataAvailable() -> t.CInt:
return su8250.isDataAvailable(su8250.COM1_PORT)
# 检查COM1发送缓冲区是否为空
def isTransmitEmpty() -> t.CInt:
return su8250.isTransmitEmpty(su8250.COM1_PORT)
# 发送32位十六进制值到COM1
def put_hex32(value: t.CUInt32T):
hex_digits: t.CArray[t.CChar, None] = ["0123456789ABCDEF"]
buffer: t.CArray[t.CChar, 9]
for i in range(7, -1, -1):
buffer[i] = hex_digits[value & 0xF]
value >>= 4
buffer[8] = '\0'
puts(buffer)
# 格式化输出到串口(printf 实现,覆盖 libc printf 的裸机缺失)
# 内部复用 viperlib.vsnprintf 格式化到栈缓冲,再逐字符送串口。
# print(...) 内建映射到 @printf(stdio extern),此定义提供裸机实现。
def printf(fmt: t.CConst | str, *args) -> t.CInt | t.CExport:
if fmt is None:
return 0
buf: t.CArray[t.CChar, 1024]
n: t.CInt = viperlib.vsnprintf(c.Addr(buf), 1024, fmt, args)
puts(buf)
return n
# 刷新输出流:串口是无缓冲直写(putchar 直接写 UART 端口),flush 即空操作。
# 覆盖 libc fflush 的裸机缺失(memhub 的诊断/终止路径 call @fflush)。
def fflush(stream: t.CConst | t.CVoid | t.CPtr) -> t.CInt | t.CExport:
return 0
# 系统退出:触发硬件关机(QEMU ACPI/Bochs 关机端口),失败则停机兜底。
# 覆盖 libc exit 的裸机缺失(memhub 等致命错误路径 call @exit)。
def exit(status: int) -> t.CInt | t.CExport:
asm.outw(0x604, 0x2000) # QEMU ACPI 关机
asm.outw(0xB004, 0x2000) # Bochs/QEMU 备用端口
while True:
asm.hlt()
return 0