TRK: matched serpoll and support; and making more progress (#565)
This commit is contained in:
parent
66a9a044fa
commit
23b7af3bc5
7 changed files with 1053 additions and 859 deletions
|
|
@ -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/msg.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(NonMatching, "TRK_MINNOW_DOLPHIN/dispatch.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(NonMatching, "TRK_MINNOW_DOLPHIN/notify.c"),
|
||||
Object(MatchingFor("GMPE01_00", "GMPE01_01"), "TRK_MINNOW_DOLPHIN/flush_cache.c"),
|
||||
|
|
|
|||
|
|
@ -15,12 +15,12 @@ DSError TRKRequestSend(TRKBuffer* msgBuf, int* bufferId, u32 p1, u32 p2,
|
|||
int p3);
|
||||
|
||||
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,
|
||||
u8 param_3, DSIOResult* ioResult);
|
||||
DSError HandlePositionFileSupportRequest(u32 replyErr, u32* param_2,
|
||||
u8 param_3, u8* ioResult);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
u32 TRKTargetCPUMinorType(void);
|
||||
u8 TRKTargetCPUMinorType(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
|
|
@ -245,4 +245,4 @@ lbl_8037149C:
|
|||
#endif // clang-format on
|
||||
}
|
||||
|
||||
u32 TRKTargetCPUMinorType(void) { return 0x54; }
|
||||
u8 TRKTargetCPUMinorType(void) { return 0x54; }
|
||||
|
|
|
|||
|
|
@ -9,74 +9,133 @@ static TRKFramingState gTRKFramingState;
|
|||
|
||||
void* gTRKInputPendingPtr;
|
||||
|
||||
MessageBufferID TRKTestForPacket()
|
||||
{
|
||||
int bytes;
|
||||
int batch;
|
||||
int err;
|
||||
TRKBuffer* b;
|
||||
int id;
|
||||
static inline BOOL serpoll_inline_00(TRKBuffer* buffer) {
|
||||
if (buffer->length < 2) {
|
||||
TRKStandardACK(buffer, DSMSG_ReplyNAK, DSREPLY_PacketSizeError);
|
||||
if (gTRKFramingState.msgBufID != -1) {
|
||||
TRKReleaseBuffer(gTRKFramingState.msgBufID);
|
||||
gTRKFramingState.msgBufID = -1;
|
||||
}
|
||||
gTRKFramingState.buffer = NULL;
|
||||
gTRKFramingState.receiveState = DSRECV_Wait;
|
||||
return FALSE;
|
||||
}
|
||||
buffer->position = 0;
|
||||
buffer->length--;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bytes = TRKPollUART();
|
||||
if (bytes > 0) {
|
||||
TRKGetFreeBuffer(&id, &b);
|
||||
if (bytes > TRKMSGBUF_SIZE) {
|
||||
for (; bytes > 0; bytes -= batch) {
|
||||
batch = bytes > TRKMSGBUF_SIZE ? TRKMSGBUF_SIZE : bytes;
|
||||
TRKReadUARTN(b->data, batch);
|
||||
}
|
||||
TRKStandardACK(b, 0xff, 6);
|
||||
} else {
|
||||
err = TRKReadUARTN(b->data, bytes);
|
||||
if (err == 0) {
|
||||
b->length = bytes;
|
||||
return id;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (id != -1) {
|
||||
TRKReleaseBuffer(id);
|
||||
}
|
||||
return -1;
|
||||
MessageBufferID TRKTestForPacket(void) {
|
||||
s32 var_r29;
|
||||
s32 var_r3;
|
||||
s8 sp8;
|
||||
s32 temp_r3;
|
||||
|
||||
var_r29 = 0;
|
||||
var_r3 = TRKReadUARTPoll(&sp8);
|
||||
while (var_r3 == 0 && var_r29 == 0) {
|
||||
if (gTRKFramingState.receiveState != DSRECV_InFrame) {
|
||||
gTRKFramingState.isEscape = FALSE;
|
||||
}
|
||||
switch (gTRKFramingState.receiveState) {
|
||||
case DSRECV_Wait:
|
||||
if (sp8 == 0x7E) {
|
||||
var_r29 = TRKGetFreeBuffer(&gTRKFramingState.msgBufID, &gTRKFramingState.buffer);
|
||||
gTRKFramingState.fcsType = 0;
|
||||
gTRKFramingState.receiveState = DSRECV_Found;
|
||||
}
|
||||
break;
|
||||
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)
|
||||
{
|
||||
MessageBufferID id;
|
||||
TRKBuffer* msgBuffer;
|
||||
u8 command;
|
||||
TRKBuffer* msgBuffer;
|
||||
MessageBufferID id;
|
||||
u8 command;
|
||||
|
||||
id = TRKTestForPacket();
|
||||
if (id == -1)
|
||||
return;
|
||||
id = TRKTestForPacket();
|
||||
if (id == -1)
|
||||
return;
|
||||
|
||||
msgBuffer = TRKGetBuffer(id);
|
||||
TRKSetBufferPosition(msgBuffer, 0);
|
||||
TRKReadBuffer1_ui8(msgBuffer, &command);
|
||||
if (command < DSMSG_ReplyACK) {
|
||||
TRKProcessInput(id);
|
||||
} else {
|
||||
TRKReleaseBuffer(id);
|
||||
}
|
||||
msgBuffer = TRKGetBuffer(id);
|
||||
TRKSetBufferPosition(msgBuffer, 0);
|
||||
TRKReadBuffer1_ui8(msgBuffer, &command);
|
||||
if (command < DSMSG_ReplyACK) {
|
||||
TRKProcessInput(id);
|
||||
} else {
|
||||
TRKReleaseBuffer(id);
|
||||
}
|
||||
}
|
||||
|
||||
void TRKProcessInput(int bufferIdx)
|
||||
{
|
||||
TRKEvent event;
|
||||
TRKEvent event;
|
||||
|
||||
TRKConstructEvent(&event, NUBEVENT_Request);
|
||||
gTRKFramingState.msgBufID = -1;
|
||||
event.msgBufID = bufferIdx;
|
||||
TRKPostEvent(&event);
|
||||
TRKConstructEvent(&event, NUBEVENT_Request);
|
||||
gTRKFramingState.msgBufID = -1;
|
||||
event.msgBufID = bufferIdx;
|
||||
TRKPostEvent(&event);
|
||||
}
|
||||
|
||||
DSError TRKInitializeSerialHandler(void)
|
||||
{
|
||||
gTRKFramingState.msgBufID = -1;
|
||||
gTRKFramingState.receiveState = DSRECV_Wait;
|
||||
gTRKFramingState.isEscape = FALSE;
|
||||
gTRKFramingState.msgBufID = -1;
|
||||
gTRKFramingState.receiveState = DSRECV_Wait;
|
||||
gTRKFramingState.isEscape = FALSE;
|
||||
|
||||
return DS_NoError;
|
||||
return DS_NoError;
|
||||
}
|
||||
|
||||
DSError TRKTerminateSerialHandler(void) { return DS_NoError; }
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ DSError TRKSuppAccessFile(u32 file_handle, u8* data, size_t* count,
|
|||
*io_result = DS_IONoError;
|
||||
done = 0;
|
||||
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) {
|
||||
length = 0x800;
|
||||
} else {
|
||||
|
|
@ -175,3 +175,114 @@ DSError TRKRequestSend(TRKBuffer* msgBuf, int* bufferId, u32 p1, u32 p2, int p3)
|
|||
|
||||
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
Loading…
Add table
Add a link
Reference in a new issue