detect USB console / add timeouts

This commit is contained in:
Connor Olding 2018-08-18 19:02:54 +02:00
parent b7121233f2
commit cf24dcecb2
4 changed files with 57 additions and 15 deletions

View File

@ -49,7 +49,9 @@ Drive64Write:
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
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
or a3, a3, at
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
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)
PI_WAIT() // yes, these waits seem to be necessary
sw a3, CI_USB_PARAM_RESULT_1(t9)
PI_WAIT()
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:
jr ra
@ -102,7 +107,7 @@ DumpAndWrite:
bnez v0, DumpAndWriteExit
lui t0, K_BASE // delay slot
lw t1, K_64DRIVE_MAGIC(t0)
lw t1, K_CONSOLE_AVAILABLE(t0)
beqz t1, DumpAndWriteExit
ori a0, s0, r0 // delay slot

View File

@ -42,11 +42,30 @@ macro CI_WAIT() {
nop
}
macro CI_USB_WRITE_WAIT() {
macro CI_USB_WRITE_WAIT(timeout) {
PI_WAIT()
-
lw t0, CI_USB_COMMAND_STATUS(t9)
srl t0, t0, 4 // shift out ARM status, leaving WRITE status
bnez t0,-
nop
if {timeout} > 0 {
li v0, {timeout}
-
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
}
}

View File

@ -21,6 +21,7 @@ constant K_BADVADDR(0x0618)
constant K_64DRIVE_MAGIC(0x0700)
constant K_CI_BASE(0x0704)
constant K_CONSOLE_AVAILABLE(0x0708)
constant K_STACK(0x0C00 - 0x10)
constant K_XXD(0x0C00) // size: 0x400 (any larger and you overwrite kernel code)

View File

@ -82,6 +82,17 @@ Drive64Confirmed:
sw t1, CI_COMMAND(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:
// delay to empty pipeline?
@ -258,7 +269,7 @@ if K_DEBUG {
IHMain: // free to modify any GPR from here to IHExit
macro KDumpString(str) {
lw t1, K_64DRIVE_MAGIC(k0)
lw t1, K_CONSOLE_AVAILABLE(k0)
beqz t1,+
la a2, {str}
jal Drive64WriteDirect
@ -372,18 +383,24 @@ ReturnFromInterrupt:
include "debug.asm"
align(4)
align(8)
KString0:
db " ~~ Interrupt Handled ~~", 10, 0
align(4)
align(8)
KString1:
db " Interrupt States:", 10, 0
align(4)
align(8)
KNewline:
db 10, 0, 0, 0
dw 0, 0, 0
align(8)
KConsoleConfirmed:
db "USB debug console detected", 10, 0
align(16)
KConsoleConfirmedX:
align(4)
nops((K_BASE << 16) + 0x10000)