From 29746156af1871fd987bb8b6349aa24091007ce3 Mon Sep 17 00:00:00 2001 From: EllipticEllipsis <73679967+EllipticEllipsis@users.noreply.github.com> Date: Thu, 11 Nov 2021 03:43:08 +0000 Subject: [PATCH] pfsisplug OK (#430) * pfsisplug OK * Remove duplicate struct * Apply suggestions from code review Co-authored-by: Tharo <17233964+Thar0@users.noreply.github.com> Co-authored-by: Tharo <17233964+Thar0@users.noreply.github.com> --- include/io/controller.h | 21 ++++--- src/libultra/io/contquery.c | 4 +- src/libultra/io/contreaddata.c | 4 +- src/libultra/io/controller.c | 44 ++++++------- src/libultra/io/contsetch.c | 2 +- src/libultra/io/motor.c | 2 +- src/libultra/io/pfsisplug.c | 96 ++++++++++++++++++++++++++++- src/libultra/voice/voicegetstatus.c | 2 +- tools/disasm/variables.txt | 2 +- 9 files changed, 134 insertions(+), 43 deletions(-) diff --git a/include/io/controller.h b/include/io/controller.h index 91cbd51f8b..cbd4963ae8 100644 --- a/include/io/controller.h +++ b/include/io/controller.h @@ -114,16 +114,17 @@ typedef struct { } __OSContReadFormat; +// Original name: __OSContRequesFormat typedef struct { - /* 0x0 */ u8 dummy; - /* 0x1 */ u8 txsize; - /* 0x2 */ u8 rxsize; - /* 0x3 */ u8 cmd; - /* 0x4 */ u8 typeh; - /* 0x5 */ u8 typel; - /* 0x6 */ u8 status; - /* 0x7 */ u8 dummy1; -} __OSContRequesFormat; + /* 0x00 */ u8 align; + /* 0x01 */ u8 txsize; + /* 0x02 */ u8 rxsize; + /* 0x03 */ u8 poll; + /* 0x04 */ u8 typeh; + /* 0x05 */ u8 typel; + /* 0x06 */ u8 status; + /* 0x07 */ u8 align1; +} __OSContRequestHeader; // size = 0x8 typedef struct { /* 0x00 */ u8 txsize; @@ -147,7 +148,7 @@ typedef struct { extern OSPifRam __osContPifRam; // extern UNK_TYPE1 D_8009CF0C; -extern u8 __osContLastCmd; +extern u8 __osContLastPoll; extern u8 __osMaxControllers; // extern OSMesgQueue D_8009CF38; // extern OSMesg D_8009CF50; diff --git a/src/libultra/io/contquery.c b/src/libultra/io/contquery.c index 5c351241af..7cb681fdeb 100644 --- a/src/libultra/io/contquery.c +++ b/src/libultra/io/contquery.c @@ -5,7 +5,7 @@ s32 osContStartQuery(OSMesgQueue* mq) { __osSiGetAccess(); - if (__osContLastCmd != 0) { + if (__osContLastPoll != 0) { __osPackRequestData(0); __osSiRawStartDma(1, &__osContPifRam); osRecvMesg(mq, NULL, OS_MESG_BLOCK); @@ -13,7 +13,7 @@ s32 osContStartQuery(OSMesgQueue* mq) { ret = __osSiRawStartDma(0, &__osContPifRam); - __osContLastCmd = 0; + __osContLastPoll = 0; __osSiRelAccess(); diff --git a/src/libultra/io/contreaddata.c b/src/libultra/io/contreaddata.c index 0356634868..0017a42226 100644 --- a/src/libultra/io/contreaddata.c +++ b/src/libultra/io/contreaddata.c @@ -6,14 +6,14 @@ s32 osContStartReadData(OSMesgQueue* mq) { __osSiGetAccess(); - if (__osContLastCmd != 1) { + if (__osContLastPoll != 1) { __osPackReadData(); __osSiRawStartDma(1, &__osContPifRam); osRecvMesg(mq, NULL, 1); } ret = __osSiRawStartDma(0, &__osContPifRam); - __osContLastCmd = 1; + __osContLastPoll = 1; __osSiRelAccess(); diff --git a/src/libultra/io/controller.c b/src/libultra/io/controller.c index 21e376d582..a048575a72 100644 --- a/src/libultra/io/controller.c +++ b/src/libultra/io/controller.c @@ -3,7 +3,7 @@ UNK_TYPE4 D_80097E40 = 0; OSPifRam __osContPifRam; -u8 __osContLastCmd; +u8 __osContLastPoll; u8 __osMaxControllers; OSTimer __osEepromTimer; @@ -41,7 +41,7 @@ s32 osContInit(OSMesgQueue* mq, u8* bitpattern, OSContStatus* data) { osRecvMesg(mq, &dummy, 1); __osContGetInitData(bitpattern, data); - __osContLastCmd = 0; + __osContLastPoll = 0; __osSiCreateAccessQueue(); osCreateMesgQueue(&D_8009CF38, D_8009CF50, 1); @@ -50,18 +50,18 @@ s32 osContInit(OSMesgQueue* mq, u8* bitpattern, OSContStatus* data) { void __osContGetInitData(u8* pattern, OSContStatus* data) { u8* ptr; - __OSContRequesFormat requestformat; - int i; + __OSContRequestHeader requestHeader; + s32 i; u8 bits; bits = 0; ptr = (u8*)__osContPifRam.ramarray; - for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(requestformat), data++) { - requestformat = *(__OSContRequesFormat*)ptr; - data->errno = (requestformat.rxsize & 0xc0) >> 4; + for (i = 0; i < __osMaxControllers; i++, ptr += sizeof(requestHeader), data++) { + requestHeader = *(__OSContRequestHeader*)ptr; + data->errno = (requestHeader.rxsize & 0xc0) >> 4; if (data->errno == 0) { - data->type = requestformat.typel << 8 | requestformat.typeh; - data->status = requestformat.status; + data->type = requestHeader.typel << 8 | requestHeader.typeh; + data->status = requestHeader.status; bits |= 1 << i; } @@ -69,10 +69,10 @@ void __osContGetInitData(u8* pattern, OSContStatus* data) { *pattern = bits; } -void __osPackRequestData(u8 cmd) { +void __osPackRequestData(u8 poll) { u8* ptr; - __OSContRequesFormat requestformat; - int i; + __OSContRequestHeader requestHeader; + s32 i; for (i = 0; i < 0xF; i++) { __osContPifRam.ramarray[i] = 0; @@ -80,18 +80,18 @@ void __osPackRequestData(u8 cmd) { __osContPifRam.pifstatus = 1; ptr = (u8*)__osContPifRam.ramarray; - requestformat.dummy = 255; - requestformat.txsize = 1; - requestformat.rxsize = 3; - requestformat.cmd = cmd; - requestformat.typeh = 255; - requestformat.typel = 255; - requestformat.status = 255; - requestformat.dummy1 = 255; + requestHeader.align = 255; + requestHeader.txsize = 1; + requestHeader.rxsize = 3; + requestHeader.poll = poll; + requestHeader.typeh = 255; + requestHeader.typel = 255; + requestHeader.status = 255; + requestHeader.align1 = 255; for (i = 0; i < __osMaxControllers; i++) { - *(__OSContRequesFormat*)ptr = requestformat; - ptr += sizeof(requestformat); + *(__OSContRequestHeader*)ptr = requestHeader; + ptr += sizeof(requestHeader); } *ptr = 254; } diff --git a/src/libultra/io/contsetch.c b/src/libultra/io/contsetch.c index bd1c96698e..e2740489c5 100644 --- a/src/libultra/io/contsetch.c +++ b/src/libultra/io/contsetch.c @@ -8,7 +8,7 @@ s32 osContSetCh(u8 ch) { } else { __osMaxControllers = ch; } - __osContLastCmd = -2; + __osContLastPoll = -2; __osSiRelAccess(); return 0; diff --git a/src/libultra/io/motor.c b/src/libultra/io/motor.c index 4c0bfb67a1..b8216dfc78 100644 --- a/src/libultra/io/motor.c +++ b/src/libultra/io/motor.c @@ -26,7 +26,7 @@ s32 __osMotorAccess(OSPfs* pfs, u32 vibrate) { ((__OSContRamReadFormat*)buf)->data[i] = vibrate; } - __osContLastCmd = CONT_CMD_END; + __osContLastPoll = CONT_CMD_END; __osSiRawStartDma(OS_WRITE, &osPifBuffers[pfs->channel]); osRecvMesg(pfs->queue, NULL, OS_MESG_BLOCK); __osSiRawStartDma(OS_READ, &osPifBuffers[pfs->channel]); diff --git a/src/libultra/io/pfsisplug.c b/src/libultra/io/pfsisplug.c index 2c479e35b3..358af0c985 100644 --- a/src/libultra/io/pfsisplug.c +++ b/src/libultra/io/pfsisplug.c @@ -1,7 +1,97 @@ +#include "PR/pfs.h" +#include "io/controller.h" #include "global.h" -#pragma GLOBAL_ASM("asm/non_matchings/boot/pfsisplug/osPfsIsPlug.s") +void __osPfsRequestData(u8 poll); +void __osPfsGetInitData(u8* pattern, OSContStatus* contData); -#pragma GLOBAL_ASM("asm/non_matchings/boot/pfsisplug/__osPfsRequestData.s") +s32 osPfsIsPlug(OSMesgQueue* mq, u8* pattern) { + s32 ret = 0; + OSMesg msg; + u8 bitpattern; + OSContStatus contData[MAXCONTROLLERS]; + s32 channel; + u8 bits = 0; + s32 crcErrorCount = 3; -#pragma GLOBAL_ASM("asm/non_matchings/boot/pfsisplug/__osPfsGetInitData.s") + __osSiGetAccess(); + + do { + __osPfsRequestData(CONT_CMD_REQUEST_STATUS); + + ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam); + osRecvMesg(mq, &msg, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam); + osRecvMesg(mq, &msg, OS_MESG_BLOCK); + + __osPfsGetInitData(&bitpattern, &contData[0]); + + for (channel = 0; channel < __osMaxControllers; channel++) { + if (!(contData[channel].status & CONT_ADDR_CRC_ER)) { + crcErrorCount--; + break; + } + } + if (channel == __osMaxControllers) { + crcErrorCount = 0; + } + } while (crcErrorCount > 0); + + for (channel = 0; channel < __osMaxControllers; channel++) { + if ((contData[channel].errno == 0) && (contData[channel].status & CONT_CARD_ON)) { + bits |= (1 << channel); + } + } + __osSiRelAccess(); + *pattern = bits; + return ret; +} + +void __osPfsRequestData(u8 poll) { + u8* bufPtr = (u8*)&__osPfsPifRam; + __OSContRequestHeader req; + s32 i; + + __osContLastPoll = poll; + + __osPfsPifRam.pifstatus = 1; + + req.align = 0xFF; + req.txsize = 1; + req.rxsize = 3; + req.poll = poll; + req.typeh = 0xFF; + req.typel = 0xFF; + req.status = 0xFF; + req.align1 = 0xFF; + + for (i = 0; i < __osMaxControllers; i++) { + *((__OSContRequestHeader*)bufPtr) = req; + bufPtr += sizeof(req); + } + *((u8*)bufPtr) = CONT_CMD_END; +} + +void __osPfsGetInitData(u8* pattern, OSContStatus* contData) { + u8* bufptr; + __OSContRequestHeader req; + s32 i; + u8 bits = 0; + + bufptr = (u8*)&__osPfsPifRam; + + for (i = 0; i < __osMaxControllers; i++, bufptr += sizeof(req), contData++) { + req = *((__OSContRequestHeader*)bufptr); + contData->errno = ((req.rxsize & 0xC0) >> 4); + + if (contData->errno) { + continue; + } + + contData->type = ((req.typel << 8) | req.typeh); + contData->status = req.status; + bits |= (1 << i); + } + *pattern = bits; +} diff --git a/src/libultra/voice/voicegetstatus.c b/src/libultra/voice/voicegetstatus.c index 1711eb56d0..833f5ad272 100644 --- a/src/libultra/voice/voicegetstatus.c +++ b/src/libultra/voice/voicegetstatus.c @@ -24,7 +24,7 @@ s32 __osVoiceGetStatus(OSMesgQueue* mq, s32 port, u8* status) { ptr += 4; *ptr = CONT_CMD_END; - __osContLastCmd = CONT_CMD_END; + __osContLastPoll = CONT_CMD_END; ret = __osSiRawStartDma(OS_WRITE, &__osContPifRam); osRecvMesg(mq, NULL, OS_MESG_BLOCK); } diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index b320e233f2..2978ee0724 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -331,7 +331,7 @@ 0x8009CEB8:("__osSiAccessQueue","OSMesgQueue","",0x18), 0x8009CED0:("__osContPifRam","OSPifRam","",0x40), 0x8009CF0C:("D_8009CF0C","UNK_TYPE1","",0x1), - 0x8009CF10:("__osContLastCmd","u8","",0x1), + 0x8009CF10:("__osContLastPoll","u8","",0x1), 0x8009CF11:("__osMaxControllers","u8","",0x1), 0x8009CF18:("__osEepromTimer","OSTimer","",0x20), 0x8009CF38:("D_8009CF38","OSMesgQueue","",0x18),