TRK: matched serpoll and support; and making more progress (#565)

This commit is contained in:
mrshigure 2025-02-10 19:49:23 -08:00 committed by GitHub
parent 66a9a044fa
commit 23b7af3bc5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 1053 additions and 859 deletions

View file

@ -743,11 +743,11 @@ config.libs = [
Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/nubinit.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/nubinit.c"),
Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/msg.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/msg.c"),
Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/msgbuf.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/msgbuf.c"),
Object(NonMatching, "TRK_MINNOW_DOLPHIN/serpoll.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/serpoll.c"),
Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/usr_put.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/usr_put.c"),
Object(NonMatching, "TRK_MINNOW_DOLPHIN/dispatch.c"), Object(NonMatching, "TRK_MINNOW_DOLPHIN/dispatch.c"),
Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/msghndlr.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/msghndlr.c"),
Object(NonMatching, "TRK_MINNOW_DOLPHIN/support.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/support.c"),
Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/mutex_TRK.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/mutex_TRK.c"),
Object(NonMatching, "TRK_MINNOW_DOLPHIN/notify.c"), Object(NonMatching, "TRK_MINNOW_DOLPHIN/notify.c"),
Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/flush_cache.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/flush_cache.c"),

View file

@ -15,12 +15,12 @@ DSError TRKRequestSend(TRKBuffer* msgBuf, int* bufferId, u32 p1, u32 p2,
int p3); int p3);
DSError HandleOpenFileSupportRequest(const char* path, u8 replyError, DSError HandleOpenFileSupportRequest(const char* path, u8 replyError,
u32* param_3, DSIOResult* ioResult); u32* param_3, u8* ioResult);
DSError HandleCloseFileSupportRequest(int replyError, DSIOResult* ioResult); DSError HandleCloseFileSupportRequest(int replyError, u8* ioResult);
DSError HandlePositionFileSupportRequest(DSReplyError replyErr, u32* param_2, DSError HandlePositionFileSupportRequest(u32 replyErr, u32* param_2,
u8 param_3, DSIOResult* ioResult); u8 param_3, u8* ioResult);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -7,7 +7,7 @@
extern "C" { extern "C" {
#endif #endif
u32 TRKTargetCPUMinorType(void); u8 TRKTargetCPUMinorType(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -245,4 +245,4 @@ lbl_8037149C:
#endif // clang-format on #endif // clang-format on
} }
u32 TRKTargetCPUMinorType(void) { return 0x54; } u8 TRKTargetCPUMinorType(void) { return 0x54; }

View file

@ -9,74 +9,133 @@ static TRKFramingState gTRKFramingState;
void* gTRKInputPendingPtr; void* gTRKInputPendingPtr;
MessageBufferID TRKTestForPacket() static inline BOOL serpoll_inline_00(TRKBuffer* buffer) {
{ if (buffer->length < 2) {
int bytes; TRKStandardACK(buffer, DSMSG_ReplyNAK, DSREPLY_PacketSizeError);
int batch; if (gTRKFramingState.msgBufID != -1) {
int err; TRKReleaseBuffer(gTRKFramingState.msgBufID);
TRKBuffer* b; gTRKFramingState.msgBufID = -1;
int id; }
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
return FALSE;
}
buffer->position = 0;
buffer->length--;
return TRUE;
}
bytes = TRKPollUART(); MessageBufferID TRKTestForPacket(void) {
if (bytes > 0) { s32 var_r29;
TRKGetFreeBuffer(&id, &b); s32 var_r3;
if (bytes > TRKMSGBUF_SIZE) { s8 sp8;
for (; bytes > 0; bytes -= batch) { s32 temp_r3;
batch = bytes > TRKMSGBUF_SIZE ? TRKMSGBUF_SIZE : bytes;
TRKReadUARTN(b->data, batch); var_r29 = 0;
} var_r3 = TRKReadUARTPoll(&sp8);
TRKStandardACK(b, 0xff, 6); while (var_r3 == 0 && var_r29 == 0) {
} else { if (gTRKFramingState.receiveState != DSRECV_InFrame) {
err = TRKReadUARTN(b->data, bytes); gTRKFramingState.isEscape = FALSE;
if (err == 0) { }
b->length = bytes; switch (gTRKFramingState.receiveState) {
return id; case DSRECV_Wait:
} if (sp8 == 0x7E) {
} var_r29 = TRKGetFreeBuffer(&gTRKFramingState.msgBufID, &gTRKFramingState.buffer);
} gTRKFramingState.fcsType = 0;
if (id != -1) { gTRKFramingState.receiveState = DSRECV_Found;
TRKReleaseBuffer(id); }
} break;
return -1; case DSRECV_Found:
if (sp8 == 0x7E) {
break;
}
gTRKFramingState.receiveState = DSRECV_InFrame;
/* fallthrough */
case DSRECV_InFrame:
if (sp8 == 0x7E) {
if (gTRKFramingState.isEscape) {
TRKStandardACK(gTRKFramingState.buffer, DSMSG_ReplyNAK, DSREPLY_EscapeError);
if (gTRKFramingState.msgBufID != -1) {
TRKReleaseBuffer(gTRKFramingState.msgBufID);
gTRKFramingState.msgBufID = -1;
}
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
break;
}
if (serpoll_inline_00(gTRKFramingState.buffer)) {
temp_r3 = gTRKFramingState.msgBufID;
gTRKFramingState.msgBufID = -1;
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
return temp_r3;
}
gTRKFramingState.receiveState = DSRECV_Wait;
} else {
if (gTRKFramingState.isEscape) {
sp8 ^= 0x20;
gTRKFramingState.isEscape = FALSE;
} else if (sp8 == 0x7D) {
gTRKFramingState.isEscape = TRUE;
break;
}
var_r29 = TRKAppendBuffer1_ui8(gTRKFramingState.buffer, sp8);
gTRKFramingState.fcsType += sp8;
}
break;
case DSRECV_FrameOverflow:
if (sp8 == 0x7E) {
if (gTRKFramingState.msgBufID != -1) {
TRKReleaseBuffer(gTRKFramingState.msgBufID);
gTRKFramingState.msgBufID = -1;
}
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
}
break;
}
var_r3 = TRKReadUARTPoll(&sp8);
}
return -1;
} }
void TRKGetInput(void) void TRKGetInput(void)
{ {
MessageBufferID id; TRKBuffer* msgBuffer;
TRKBuffer* msgBuffer; MessageBufferID id;
u8 command; u8 command;
id = TRKTestForPacket(); id = TRKTestForPacket();
if (id == -1) if (id == -1)
return; return;
msgBuffer = TRKGetBuffer(id); msgBuffer = TRKGetBuffer(id);
TRKSetBufferPosition(msgBuffer, 0); TRKSetBufferPosition(msgBuffer, 0);
TRKReadBuffer1_ui8(msgBuffer, &command); TRKReadBuffer1_ui8(msgBuffer, &command);
if (command < DSMSG_ReplyACK) { if (command < DSMSG_ReplyACK) {
TRKProcessInput(id); TRKProcessInput(id);
} else { } else {
TRKReleaseBuffer(id); TRKReleaseBuffer(id);
} }
} }
void TRKProcessInput(int bufferIdx) void TRKProcessInput(int bufferIdx)
{ {
TRKEvent event; TRKEvent event;
TRKConstructEvent(&event, NUBEVENT_Request); TRKConstructEvent(&event, NUBEVENT_Request);
gTRKFramingState.msgBufID = -1; gTRKFramingState.msgBufID = -1;
event.msgBufID = bufferIdx; event.msgBufID = bufferIdx;
TRKPostEvent(&event); TRKPostEvent(&event);
} }
DSError TRKInitializeSerialHandler(void) DSError TRKInitializeSerialHandler(void)
{ {
gTRKFramingState.msgBufID = -1; gTRKFramingState.msgBufID = -1;
gTRKFramingState.receiveState = DSRECV_Wait; gTRKFramingState.receiveState = DSRECV_Wait;
gTRKFramingState.isEscape = FALSE; gTRKFramingState.isEscape = FALSE;
return DS_NoError; return DS_NoError;
} }
DSError TRKTerminateSerialHandler(void) { return DS_NoError; } DSError TRKTerminateSerialHandler(void) { return DS_NoError; }

View file

@ -28,7 +28,7 @@ DSError TRKSuppAccessFile(u32 file_handle, u8* data, size_t* count,
*io_result = DS_IONoError; *io_result = DS_IONoError;
done = 0; done = 0;
error = DS_NoError; error = DS_NoError;
while (!exit && done < *count && error == DS_NoError && *io_result == 0) { while (!exit && done < *count && error == DS_NoError && *io_result == DS_IONoError) {
if (*count - done > 0x800) { if (*count - done > 0x800) {
length = 0x800; length = 0x800;
} else { } else {
@ -175,3 +175,114 @@ DSError TRKRequestSend(TRKBuffer* msgBuf, int* bufferId, u32 p1, u32 p2, int p3)
return error; return error;
} }
DSError HandleOpenFileSupportRequest(const char* path, u8 replyError, u32* param_3, u8* ioResult) {
int sp10;
int spC;
TRKBuffer* sp8;
TRKBuffer* var_r31;
DSError var_r26;
*param_3 = 0;
var_r26 = TRKGetFreeBuffer(&spC, &sp8);
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer1_ui8(sp8, 0xD2);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer1_ui8(sp8, replyError);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer1_ui16(sp8, strlen(path) + 1);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer_ui8(sp8, (u8*) path, strlen(path) + 1);
}
if (var_r26 == DS_NoError) {
*ioResult = 0;
var_r26 = TRKRequestSend(sp8, &sp10, 7, 3, 0);
if (var_r26 == DS_NoError) {
var_r31 = TRKGetBuffer(sp10);
TRKSetBufferPosition(var_r31, 2);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKReadBuffer1_ui8(var_r31, ioResult);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKReadBuffer1_ui32(var_r31, param_3);
}
TRKReleaseBuffer(sp10);
}
TRKReleaseBuffer(spC);
return var_r26;
}
DSError HandleCloseFileSupportRequest(int replyError, u8* ioResult) {
int sp10;
int spC;
DSError var_r31;
TRKBuffer* sp8;
TRKBuffer* var_r30;
var_r31 = TRKGetFreeBuffer(&spC, &sp8);
if (var_r31 == DS_NoError) {
var_r31 = TRKAppendBuffer1_ui8(sp8, 0xD3);
}
if (var_r31 == DS_NoError) {
var_r31 = TRKAppendBuffer1_ui32(sp8, replyError);
}
if (var_r31 == DS_NoError) {
*ioResult = DS_IONoError;
var_r31 = TRKRequestSend(sp8, &sp10, 3, 3, 0);
if (var_r31 == DS_NoError) {
var_r30 = TRKGetBuffer(sp10);
TRKSetBufferPosition(var_r30, 2);
}
if (var_r31 == DS_NoError) {
var_r31 = TRKReadBuffer1_ui8(var_r30, ioResult);
}
TRKReleaseBuffer(sp10);
}
TRKReleaseBuffer(spC);
return var_r31;
}
DSError HandlePositionFileSupportRequest(u32 replyErr, u32* param_2, u8 param_3, u8* ioResult) {
int sp10;
int spC;
TRKBuffer* sp8;
TRKBuffer* var_r31;
DSError var_r27;
var_r27 = TRKGetFreeBuffer(&spC, &sp8);
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui8(sp8, 0xD4);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui32(sp8, replyErr);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui32(sp8, *param_2);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui8(sp8, param_3);
}
if (var_r27 == DS_NoError) {
*ioResult = DS_IONoError;
var_r27 = TRKRequestSend(sp8, &sp10, 3, 3, 0);
if (var_r27 == DS_NoError) {
var_r31 = TRKGetBuffer(sp10);
TRKSetBufferPosition(var_r31, 2);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKReadBuffer1_ui8(var_r31, ioResult);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKReadBuffer1_ui32(var_r31, param_2);
} else {
*param_2 = -1;
}
TRKReleaseBuffer(sp10);
}
TRKReleaseBuffer(spC);
return var_r27;
}

File diff suppressed because it is too large Load diff