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>
This commit is contained in:
EllipticEllipsis 2021-11-11 03:43:08 +00:00 committed by GitHub
parent 6b4c24014e
commit 29746156af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 134 additions and 43 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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();

View File

@ -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;
}

View File

@ -8,7 +8,7 @@ s32 osContSetCh(u8 ch) {
} else {
__osMaxControllers = ch;
}
__osContLastCmd = -2;
__osContLastPoll = -2;
__osSiRelAccess();
return 0;

View File

@ -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]);

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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),