schedule_int_transfer 第 6 形参原为 toggle_ptr: uint8*,却直接转发给 _td_set_token 的值形参 toggle: uint8,命中指针隐式转整数禁令(uhci.vp:160 CastError)。改为 toggle: uint8 值传递,四个调用点去掉取地址,buf 仍以 & 传。同时纳入工作区既有的指针语法迁移:t.CPtr 改 X*、c.Addr 改 &、c.Set(c.Deref(...)) 改 *p = v。
58 lines
1.3 KiB
Plaintext
58 lines
1.3 KiB
Plaintext
import platform.pch.pic as pic
|
||
import drivers.serial.uart.su8250 as su8250
|
||
import asm
|
||
import viperlib
|
||
|
||
|
||
def init():
|
||
# Init COM1 port
|
||
su8250.init(su8250.COM1_PORT)
|
||
# COM1(IRQ4)
|
||
pic.clearMask(4)
|
||
|
||
def putc(cr: char):
|
||
su8250.putchar(su8250.COM1_PORT, cr)
|
||
|
||
def putchar(cr: char):
|
||
su8250.putchar(su8250.COM1_PORT, cr)
|
||
|
||
def getchar() -> char:
|
||
return su8250.getchar(su8250.COM1_PORT)
|
||
|
||
def puts(s: str):
|
||
for i in s:
|
||
putchar(i)
|
||
|
||
def isDataAvailable() -> int:
|
||
return su8250.isDataAvailable(su8250.COM1_PORT)
|
||
|
||
def isTransmitEmpty() -> int:
|
||
return su8250.isTransmitEmpty(su8250.COM1_PORT)
|
||
|
||
def put_hex32(value: uint32):
|
||
hex_digits: []char = ["0123456789ABCDEF"]
|
||
buffer: [9]char
|
||
for i in range(7, -1, -1):
|
||
buffer[i] = hex_digits[value & 0xF]
|
||
value >>= 4
|
||
buffer[8] = '\0'
|
||
puts(buffer)
|
||
|
||
export def printf(fmt: const str, *args) -> int:
|
||
if fmt is None:
|
||
return 0
|
||
buf: [1024]char
|
||
n: int = viperlib.vsnprintf(&buf, 1024, fmt, args)
|
||
puts(buf)
|
||
return n
|
||
|
||
export def fflush(stream: const rawptr) -> int:
|
||
return 0
|
||
|
||
export def exit(status: int) -> int:
|
||
asm.outw(0x604, 0x2000) # QEMU ACPI shutdown
|
||
asm.outw(0xB004, 0x2000) # Bochs/QEMU shutdown
|
||
while True:
|
||
asm.hlt()
|
||
return 0
|