mirror of https://github.com/zeldaret/mm.git
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:
parent
6b4c24014e
commit
29746156af
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ s32 osContSetCh(u8 ch) {
|
|||
} else {
|
||||
__osMaxControllers = ch;
|
||||
}
|
||||
__osContLastCmd = -2;
|
||||
__osContLastPoll = -2;
|
||||
|
||||
__osSiRelAccess();
|
||||
return 0;
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Reference in New Issue