detect USB console / add timeouts
This commit is contained in:
parent
b7121233f2
commit
cf24dcecb2
4 changed files with 57 additions and 15 deletions
15
debug.asm
15
debug.asm
|
@ -49,7 +49,9 @@ Drive64Write:
|
||||||
sw t3, PI_RD_LEN(t5) // "read" from DRAM to cart
|
sw t3, PI_RD_LEN(t5) // "read" from DRAM to cart
|
||||||
// PI_WAIT() // if we always wait before doing operations, this shouldn't be necessary
|
// PI_WAIT() // if we always wait before doing operations, this shouldn't be necessary
|
||||||
|
|
||||||
Drive64WriteDirect: // TODO: rewrite so this takes a0, a1 instead of a2, a3
|
Drive64WriteDirect: // TODO: rewrite so this takes a0,a1 instead of a2,a3
|
||||||
|
lli v0, 0
|
||||||
|
|
||||||
lui at, 0x0100 // set printf channel
|
lui at, 0x0100 // set printf channel
|
||||||
or a3, a3, at
|
or a3, a3, at
|
||||||
lli t1, 0x08 // WRITE mode
|
lli t1, 0x08 // WRITE mode
|
||||||
|
@ -61,14 +63,17 @@ Drive64WriteDirect: // TODO: rewrite so this takes a0, a1 instead of a2, a3
|
||||||
lui t9, K_BASE
|
lui t9, K_BASE
|
||||||
lw t9, K_CI_BASE(t9)
|
lw t9, K_CI_BASE(t9)
|
||||||
|
|
||||||
CI_USB_WRITE_WAIT() // clobbers t0, requires t9
|
CI_USB_WRITE_WAIT(0x10000) // clobbers t0,v0, requires t9
|
||||||
|
bnez v0, Drive64WriteExit
|
||||||
|
nop
|
||||||
|
|
||||||
sw a2, CI_USB_PARAM_RESULT_0(t9)
|
sw a2, CI_USB_PARAM_RESULT_0(t9)
|
||||||
PI_WAIT() // yes, these waits seem to be necessary
|
PI_WAIT() // yes, these waits seem to be necessary
|
||||||
sw a3, CI_USB_PARAM_RESULT_1(t9)
|
sw a3, CI_USB_PARAM_RESULT_1(t9)
|
||||||
PI_WAIT()
|
PI_WAIT()
|
||||||
sw t1, CI_USB_COMMAND_STATUS(t9)
|
sw t1, CI_USB_COMMAND_STATUS(t9)
|
||||||
// if we always wait before doing operations, this shouldn't be necessary:
|
|
||||||
// CI_USB_WRITE_WAIT()
|
CI_USB_WRITE_WAIT(0x10000) // clobbers t0,v0, requires t9
|
||||||
|
|
||||||
Drive64WriteExit:
|
Drive64WriteExit:
|
||||||
jr ra
|
jr ra
|
||||||
|
@ -102,7 +107,7 @@ DumpAndWrite:
|
||||||
bnez v0, DumpAndWriteExit
|
bnez v0, DumpAndWriteExit
|
||||||
|
|
||||||
lui t0, K_BASE // delay slot
|
lui t0, K_BASE // delay slot
|
||||||
lw t1, K_64DRIVE_MAGIC(t0)
|
lw t1, K_CONSOLE_AVAILABLE(t0)
|
||||||
beqz t1, DumpAndWriteExit
|
beqz t1, DumpAndWriteExit
|
||||||
|
|
||||||
ori a0, s0, r0 // delay slot
|
ori a0, s0, r0 // delay slot
|
||||||
|
|
|
@ -42,11 +42,30 @@ macro CI_WAIT() {
|
||||||
nop
|
nop
|
||||||
}
|
}
|
||||||
|
|
||||||
macro CI_USB_WRITE_WAIT() {
|
macro CI_USB_WRITE_WAIT(timeout) {
|
||||||
PI_WAIT()
|
PI_WAIT()
|
||||||
-
|
|
||||||
lw t0, CI_USB_COMMAND_STATUS(t9)
|
if {timeout} > 0 {
|
||||||
srl t0, t0, 4 // shift out ARM status, leaving WRITE status
|
li v0, {timeout}
|
||||||
bnez t0,-
|
-
|
||||||
nop
|
lw t0, CI_USB_COMMAND_STATUS(t9)
|
||||||
|
beqz v0,+ // die
|
||||||
|
srl t0, t0, 4 // shift out ARM status, leaving WRITE status
|
||||||
|
bnez t0,-
|
||||||
|
subiu v0, v0, 1
|
||||||
|
b ++ // exit normally
|
||||||
|
or v0, r0, r0
|
||||||
|
+
|
||||||
|
li t0, 0xF
|
||||||
|
sw t0, CI_USB_COMMAND_STATUS(t9) // force disarm
|
||||||
|
lli v0, 0xDEAD // return error code
|
||||||
|
+
|
||||||
|
|
||||||
|
} else {
|
||||||
|
-
|
||||||
|
lw t0, CI_USB_COMMAND_STATUS(t9)
|
||||||
|
srl t0, t0, 4 // shift out ARM status, leaving WRITE status
|
||||||
|
bnez t0,-
|
||||||
|
nop
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ constant K_BADVADDR(0x0618)
|
||||||
|
|
||||||
constant K_64DRIVE_MAGIC(0x0700)
|
constant K_64DRIVE_MAGIC(0x0700)
|
||||||
constant K_CI_BASE(0x0704)
|
constant K_CI_BASE(0x0704)
|
||||||
|
constant K_CONSOLE_AVAILABLE(0x0708)
|
||||||
|
|
||||||
constant K_STACK(0x0C00 - 0x10)
|
constant K_STACK(0x0C00 - 0x10)
|
||||||
constant K_XXD(0x0C00) // size: 0x400 (any larger and you overwrite kernel code)
|
constant K_XXD(0x0C00) // size: 0x400 (any larger and you overwrite kernel code)
|
||||||
|
|
25
kernel.asm
25
kernel.asm
|
@ -82,6 +82,17 @@ Drive64Confirmed:
|
||||||
sw t1, CI_COMMAND(t9)
|
sw t1, CI_COMMAND(t9)
|
||||||
CI_WAIT() // clobbers t0, requires t9
|
CI_WAIT() // clobbers t0, requires t9
|
||||||
|
|
||||||
|
Drive64CheckConsole:
|
||||||
|
// NOTE: we only check at boot, so disconnecting the console
|
||||||
|
// while running will cause a ton of lag (timeouts) until reset.
|
||||||
|
sw r0, K_CONSOLE_AVAILABLE(k0)
|
||||||
|
la a2, KConsoleConfirmed
|
||||||
|
jal Drive64WriteDirect
|
||||||
|
lli a3, KConsoleConfirmedX - KConsoleConfirmed
|
||||||
|
lli t0, 1
|
||||||
|
beqzl v0, Drive64Done
|
||||||
|
sw t0, K_CONSOLE_AVAILABLE(k0)
|
||||||
|
|
||||||
Drive64Done:
|
Drive64Done:
|
||||||
|
|
||||||
// delay to empty pipeline?
|
// delay to empty pipeline?
|
||||||
|
@ -258,7 +269,7 @@ if K_DEBUG {
|
||||||
|
|
||||||
IHMain: // free to modify any GPR from here to IHExit
|
IHMain: // free to modify any GPR from here to IHExit
|
||||||
macro KDumpString(str) {
|
macro KDumpString(str) {
|
||||||
lw t1, K_64DRIVE_MAGIC(k0)
|
lw t1, K_CONSOLE_AVAILABLE(k0)
|
||||||
beqz t1,+
|
beqz t1,+
|
||||||
la a2, {str}
|
la a2, {str}
|
||||||
jal Drive64WriteDirect
|
jal Drive64WriteDirect
|
||||||
|
@ -372,18 +383,24 @@ ReturnFromInterrupt:
|
||||||
|
|
||||||
include "debug.asm"
|
include "debug.asm"
|
||||||
|
|
||||||
align(4)
|
align(8)
|
||||||
KString0:
|
KString0:
|
||||||
db " ~~ Interrupt Handled ~~", 10, 0
|
db " ~~ Interrupt Handled ~~", 10, 0
|
||||||
|
|
||||||
align(4)
|
align(8)
|
||||||
KString1:
|
KString1:
|
||||||
db " Interrupt States:", 10, 0
|
db " Interrupt States:", 10, 0
|
||||||
|
|
||||||
align(4)
|
align(8)
|
||||||
KNewline:
|
KNewline:
|
||||||
db 10, 0, 0, 0
|
db 10, 0, 0, 0
|
||||||
dw 0, 0, 0
|
dw 0, 0, 0
|
||||||
|
|
||||||
|
align(8)
|
||||||
|
KConsoleConfirmed:
|
||||||
|
db "USB debug console detected", 10, 0
|
||||||
|
align(16)
|
||||||
|
KConsoleConfirmedX:
|
||||||
|
|
||||||
align(4)
|
align(4)
|
||||||
nops((K_BASE << 16) + 0x10000)
|
nops((K_BASE << 16) + 0x10000)
|
||||||
|
|
Loading…
Add table
Reference in a new issue