Update osEeprom Read and Write (#608)

This commit is contained in:
MegaMech 2024-04-14 17:15:41 -06:00 committed by GitHub
parent 0bb6992728
commit 3dd4c071e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 192 additions and 198 deletions

View File

@ -53,7 +53,7 @@ extern "C" {
typedef struct {
u16 type; /* Controller Type */
u8 status; /* Controller status */
u8 errno;
u8 errnum;
}OSContStatus;
typedef struct {

View File

@ -15,7 +15,7 @@ s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer) {
ptr = (u8 *)&__osPfsPifRam;
retry = 2;
__osSiGetAccess();
_osLastSentSiCmd = CONT_CMD_READ_MEMPACK;
__osContLastCmd = CONT_CMD_READ_MEMPACK;
__osPackRamReadData(channel, address);
ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);

View File

@ -19,7 +19,7 @@ s32 __osContRamWrite(OSMesgQueue *mq, int channel, u16 address, u8 *buffer, int
return 0;
}
__osSiGetAccess();
_osLastSentSiCmd = CONT_CMD_WRITE_MEMPACK;
__osContLastCmd = CONT_CMD_WRITE_MEMPACK;
__osPackRamWriteData(channel, address, buffer);
ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);

View File

@ -169,7 +169,7 @@ u8 __osContAddressCrc(u16 addr);
u8 __osContDataCrc(u8 *data);
s32 __osPfsGetStatus(OSMesgQueue *queue, int channel);
extern u8 _osLastSentSiCmd;
extern u8 __osContLastCmd;
extern OSTimer __osEepromTimer;
extern OSMesg __osEepromTimerMsg;
extern OSMesgQueue __osEepromTimerQ;

View File

@ -9,7 +9,7 @@ u32 _osContInitialized = 0;
extern u64 osClockRate;
// these probably belong in EEPROMlongread or something
u8 _osLastSentSiCmd;
u8 __osContLastCmd;
u8 _osContNumControllers;
OSTimer D_80196548;
OSMesgQueue _osContMesgQueue;
@ -39,7 +39,7 @@ s32 osContInit(OSMesgQueue *mq, u8 *bitpattern, OSContStatus *status) {
ret = __osSiRawStartDma(OS_READ, _osContCmdBuf);
osRecvMesg(mq, &mesg, OS_MESG_BLOCK);
__osContGetInitData(bitpattern, status);
_osLastSentSiCmd = 0;
__osContLastCmd = 0;
__osSiCreateAccessQueue();
osCreateMesgQueue(&_osContMesgQueue, _osContMesgBuff, 1);
return ret;
@ -54,8 +54,8 @@ void __osContGetInitData(u8 *bitpattern, OSContStatus *status) {
cmdBufPtr = &(_osContCmdBuf[0].request);
for (i = 0; i < _osContNumControllers; i++, cmdBufPtr++, status++) {
response = *(OSContPackedRequest *) cmdBufPtr;
status->errno = (response.rxLen & 0xc0) >> 4;
if (status->errno == 0) {
status->errnum = (response.rxLen & 0xc0) >> 4;
if (status->errnum == 0) {
status->type = response.data2 << 8 | response.data1;
status->status = response.data3;

View File

@ -11,7 +11,7 @@ u32 _osContPifCtrl;
ALIGNED8 OSContPackedStruct _osContCmdBuf[8];
#endif
extern u8 _osLastSentSiCmd;
extern u8 __osContLastCmd;
extern u8 _osContNumControllers;
void __osPackReadData(void);
@ -19,7 +19,7 @@ s32 osContStartReadData(OSMesgQueue *mesg) {
s32 ret = 0;
s32 i;
__osSiGetAccess();
if (_osLastSentSiCmd != 1) {
if (__osContLastCmd != 1) {
__osPackReadData();
ret = __osSiRawStartDma(OS_WRITE, _osContCmdBuf);
osRecvMesg(mesg, NULL, OS_MESG_BLOCK);
@ -30,7 +30,7 @@ s32 osContStartReadData(OSMesgQueue *mesg) {
_osContPifCtrl = 0;
ret = __osSiRawStartDma(OS_READ, _osContCmdBuf);
_osLastSentSiCmd = 1;
__osContLastCmd = 1;
__osSiRelAccess();
return ret;
}

View File

@ -7,7 +7,7 @@ extern OSTimer D_80196548; // not sure what this is yet
extern OSMesgQueue _osContMesgQueue;
extern OSMesg _osContMesgBuff[4];
s32 osEepromLongRead(OSMesgQueue *mq, u8 address, u8 *buffer, int nbytes) {
s32 osEepromLongRead(OSMesgQueue *mq, u8 address, u8 *buffer, s32 nbytes) {
s32 status = 0;
if (address > 0x40) {
return -1;
@ -19,9 +19,9 @@ s32 osEepromLongRead(OSMesgQueue *mq, u8 address, u8 *buffer, int nbytes) {
return status;
}
nbytes -= 8;
address += 1;
buffer += 8;
nbytes -= EEPROM_BLOCK_SIZE;
address++;
buffer += EEPROM_BLOCK_SIZE;
osSetTimer(&D_80196548, 12000 * osClockRate / 1000000, 0, &_osContMesgQueue, _osContMesgBuff);
osRecvMesg(&_osContMesgQueue, NULL, OS_MESG_BLOCK);
}

View File

@ -6,9 +6,9 @@ extern u8 _osContNumControllers;
extern OSTimer D_80196548;
extern OSMesgQueue _osContMesgQueue;
extern OSMesg _osContMesgBuff[4];
// exactly the same as osEepromLongRead except for osEepromWrite call
s32 osEepromLongWrite(OSMesgQueue *mq, u8 address, u8 *buffer, int nbytes) {
// exactly the same as osEepromLongRead except for osEepromWrite call
s32 osEepromLongWrite(OSMesgQueue *mq, u8 address, u8 *buffer, s32 nbytes) {
s32 result = 0;
if (address > 0x40) {
return -1;
@ -20,9 +20,9 @@ s32 osEepromLongWrite(OSMesgQueue *mq, u8 address, u8 *buffer, int nbytes) {
return result;
}
nbytes -= 8;
address += 1;
buffer += 8;
nbytes -= EEPROM_BLOCK_SIZE;
address++;
buffer += EEPROM_BLOCK_SIZE;
osSetTimer(&D_80196548, 12000 * osClockRate / 1000000, 0, &_osContMesgQueue, _osContMesgBuff);
osRecvMesg(&_osContMesgQueue, NULL, OS_MESG_BLOCK);
}

View File

@ -1,24 +1,15 @@
#include "macros.h"
#include "libultra_internal.h"
#include "controller.h"
//! @todo merge with osEepromWrite
typedef struct {
u16 unk00;
u8 unk02;
u8 unk03;
} unkStruct;
s32 __osEepStatus(OSMesgQueue *, unkStruct *);
s32 __osEepStatus(OSMesgQueue *, OSContStatus *);
s32 osEepromProbe(OSMesgQueue *mq) {
s32 status = 0;
unkStruct sp18;
s32 ret = 0;
OSContStatus status;
__osSiGetAccess();
status = __osEepStatus(mq, &sp18);
if (status == 0 && (sp18.unk00 & 0x8000) != 0) {
status = 1;
} else {
status = 0;
}
ret = __osEepStatus(mq, &status);
ret = (ret == 0 && (status.type & CONT_EEPROM) != 0) ? EEPROM_TYPE_4K : 0;
__osSiRelAccess();
return status;
return ret;
}

View File

@ -1,15 +1,11 @@
#include "libultra_internal.h"
#include "controller.h"
#include "macros.h"
extern u8 _osLastSentSiCmd;
extern u8 __osContLastCmd;
extern u32 __osEepPifRam[15];
extern u32 D_8019769C;
extern OSPifRam __osEepPifRam;
typedef struct {
u16 unk00;
u8 unk02;
u8 unk03;
} unkStruct;
typedef struct {
u8 unk00;
u8 unk01;
@ -29,74 +25,84 @@ typedef struct {
unkStruct3 unk04;
} unkStruct2;
s32 __osEepStatus(OSMesgQueue *, unkStruct *);
s32 __osPackEepReadData(u8);
s32 __osEepStatus(OSMesgQueue *, OSContStatus *);
void __osPackEepReadData(u8);
s32 osEepromRead(OSMesgQueue *mq, u8 address, u8 *buffer) {
s32 sp34;
s32 sp30;
u8 *sp2c;
unkStruct sp28;
unkStruct2 sp20;
sp34 = 0;
sp30 = 0;
sp2c = (u8 *) &__osEepPifRam;
if (address > 0x40) {
s32 ret = 0;
s32 i = 0;
u8 *ptr = (u8 *) &__osEepPifRam.ramarray;
OSContStatus sdata;
__OSContEepromFormat eepromformat;
if (address > EEPROM_MAXBLOCKS) {
return -1;
}
__osSiGetAccess();
sp34 = __osEepStatus(mq, &sp28);
if (sp34 != 0 || sp28.unk00 != 0x8000) {
return 8;
__osSiGetAccess();
ret = __osEepStatus(mq, &sdata);
if (ret != 0 || sdata.type != CONT_EEPROM) {
return CONT_NO_RESPONSE_ERROR;
}
while (sp28.unk02 & 0x80) {
__osEepStatus(mq, &sp28);
while (sdata.status & CONT_EEPROM_BUSY) {
__osEepStatus(mq, &sdata);
}
__osPackEepReadData(address);
sp34 = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
for (sp30 = 0; sp30 < 0x10; sp30++) {
__osEepPifRam[sp30] = 255;
for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) {
__osEepPifRam.ramarray[i] = CONT_CMD_NOP;
}
D_8019769C = 0;
sp34 = __osSiRawStartDma(OS_READ, __osEepPifRam);
_osLastSentSiCmd = 4;
__osEepPifRam.pifstatus = 0;
ret = __osSiRawStartDma(OS_READ, &__osEepPifRam);
__osContLastCmd = CONT_CMD_READ_EEPROM;
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
for (sp30 = 0; sp30 < 4; sp30++) {
sp2c++;
for (i = 0; i < 4; i++) {
ptr++;
}
sp20 = *(unkStruct2 *) sp2c;
sp34 = (sp20.unk01 & 0xc0) >> 4;
if (sp34 == 0) {
for (sp30 = 0; sp30 < 8; sp30++) {
*buffer++ = ((u8 *) &sp20.unk04)[sp30];
eepromformat = *(__OSContEepromFormat *) ptr;
ret = CHNL_ERR(eepromformat);
if (ret == 0) {
for (i = 0; i < 8; i++) {
*buffer++ = eepromformat.data[i];
}
}
__osSiRelAccess();
return sp34;
return ret;
}
s32 __osPackEepReadData(u8 address) {
u8 *sp14;
unkStruct2 sp8;
s32 sp4;
sp14 = (u8 *) &__osEepPifRam;
for (sp4 = 0; sp4 < 0x10; sp4++) {
__osEepPifRam[sp4] = 255;
void __osPackEepReadData(u8 address) {
u8 *ptr = (u8 *) &__osEepPifRam.ramarray;
__OSContEepromFormat eepromformat;
s32 i;
for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) {
__osEepPifRam.ramarray[i] = CONT_CMD_NOP;
}
D_8019769C = 1;
sp8.unk00 = 2;
sp8.unk01 = 8;
sp8.unk02 = 4;
sp8.unk03 = address;
for (sp4 = 0; sp4 < 8; sp4++) {
((u8 *) &sp8.unk04)[sp4] = 0;
__osEepPifRam.pifstatus = CONT_CMD_EXE;
eepromformat.txsize = CONT_CMD_READ_EEPROM_TX;
eepromformat.rxsize = CONT_CMD_READ_EEPROM_RX;
eepromformat.cmd = CONT_CMD_READ_EEPROM;
eepromformat.address = address;
for (i = 0; i < ARRAY_COUNT(eepromformat.data); i++) {
eepromformat.data[i] = 0;
}
for (sp4 = 0; sp4 < 4; sp4++) {
*sp14++ = 0;
for (i = 0; i < 4; i++) {
*ptr++ = 0;
}
*(unkStruct2 *) sp14 = sp8;
sp14 += 0xc;
*sp14 = 254;
*(__OSContEepromFormat *) ptr = eepromformat;
ptr += sizeof(__OSContEepromFormat);
*ptr = CONT_CMD_END;
}

View File

@ -1,16 +1,12 @@
#include "libultra_internal.h"
#include "osContInternal.h"
#include "controller.h"
#include "macros.h"
ALIGNED8 u32 __osEepPifRam[15];
u32 D_8019769C;
OSPifRam __osEepPifRam;
extern u8 _osLastSentSiCmd;
extern u8 __osContLastCmd;
typedef struct {
u16 unk00;
u8 unk02;
u8 unk03;
} unkStruct;
typedef struct {
u8 unk00;
u8 unk01;
@ -30,133 +26,134 @@ typedef struct {
unkStruct3 unk04;
} unkStruct2;
s32 __osEepStatus(OSMesgQueue *, unkStruct *);
s32 __osPackEepWriteData(u8, u8 *);
s32 __osEepStatus(OSMesgQueue *, OSContStatus *);
void __osPackEepWriteData(u8, u8 *);
s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) {
s32 sp34;
s32 sp30;
u8 *sp2c;
unkStruct2 sp20;
unkStruct sp1c;
sp34 = 0;
sp2c = (u8 *) &__osEepPifRam;
s32 ret = 0;
s32 i;
u8 *ptr = (u8 *) &__osEepPifRam.ramarray;
__OSContEepromFormat eepromformat;
OSContStatus sdata;
if (address > 0x40) {
if (address > EEPROM_MAXBLOCKS) {
return -1;
}
__osSiGetAccess();
sp34 = __osEepStatus(mq, &sp1c);
ret = __osEepStatus(mq, &sdata);
if (sp34 != 0 || sp1c.unk00 != 0x8000) {
return 8;
if (ret != 0 || sdata.type != CONT_EEPROM) {
return CONT_NO_RESPONSE_ERROR;
}
while (sp1c.unk02 & 0x80) {
__osEepStatus(mq, &sp1c);
while (sdata.status & CONT_EEPROM_BUSY) {
__osEepStatus(mq, &sdata);
}
__osPackEepWriteData(address, buffer);
sp34 = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
for (sp30 = 0; sp30 < 0x10; sp30++) {
(__osEepPifRam)[sp30] = 255;
for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) {
__osEepPifRam.ramarray[i] = CONT_CMD_NOP;
}
D_8019769C = 0;
sp34 = __osSiRawStartDma(OS_READ, __osEepPifRam);
_osLastSentSiCmd = 5;
__osEepPifRam.pifstatus = 0;
ret = __osSiRawStartDma(OS_READ, &__osEepPifRam);
__osContLastCmd = CONT_CMD_WRITE_EEPROM;
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
for (sp30 = 0; sp30 < 4; sp30++) {
sp2c++;
for (i = 0; i < 4; i++) {
ptr++;
}
sp20 = *(unkStruct2 *) sp2c;
sp34 = (sp20.unk01 & 0xc0) >> 4;
eepromformat = *(__OSContEepromFormat *) ptr;
ret = CHNL_ERR(eepromformat);
__osSiRelAccess();
return sp34;
return ret;
}
s32 __osPackEepWriteData(u8 address, u8 *buffer) {
u8 *sp14;
unkStruct2 sp8;
s32 sp4;
sp14 = (u8 *) &__osEepPifRam;
for (sp4 = 0; sp4 < 0x10; sp4++) {
__osEepPifRam[sp4] = 255;
void __osPackEepWriteData(u8 address, u8 *buffer) {
u8 *ptr = (u8 *) &__osEepPifRam.ramarray;
__OSContEepromFormat eepromformat;
s32 i;
for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) {
__osEepPifRam.ramarray[i] = CONT_CMD_NOP;
}
D_8019769C = 1;
sp8.unk00 = 10;
sp8.unk01 = 1;
sp8.unk02 = 5;
sp8.unk03 = address;
for (sp4 = 0; sp4 < 8; sp4++) {
((u8 *) &sp8.unk04)[sp4] = *buffer++;
__osEepPifRam.pifstatus = CONT_CMD_EXE;
eepromformat.txsize = CONT_CMD_WRITE_EEPROM_TX;
eepromformat.rxsize = CONT_CMD_WRITE_EEPROM_RX;
eepromformat.cmd = CONT_CMD_WRITE_EEPROM;
eepromformat.address = address;
for (i = 0; i < ARRAY_COUNT(eepromformat.data); i++) {
eepromformat.data[i] = *buffer++;
}
for (sp4 = 0; sp4 < 4; sp4++) {
*sp14++ = 0;
for (i = 0; i < 4; i++) {
*ptr++ = 0;
}
*(unkStruct2 *) sp14 = sp8;
sp14 += 0xc;
*sp14 = 254;
*(__OSContEepromFormat *) ptr = eepromformat;
ptr += sizeof(__OSContEepromFormat);
*ptr = CONT_CMD_END;
}
s32 __osEepStatus(OSMesgQueue *a0, unkStruct *a1) {
u32 sp2c = 0;
s32 sp28;
u8 *sp24 = (u8 *) __osEepPifRam;
unkStruct3 sp1c;
s32 __osEepStatus(OSMesgQueue *mq, OSContStatus *data) {
u32 ret = 0;
s32 i;
u8 *ptr = (u8 *) __osEepPifRam.ramarray;
__OSContRequesFormat requestformat;
for (sp28 = 0; sp28 < 0x10; sp28++) {
__osEepPifRam[sp28] = 0;
for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) {
__osEepPifRam.ramarray[i] = 0;
}
__osEepPifRam.pifstatus = CONT_CMD_EXE;
ptr = (u8 *) __osEepPifRam.ramarray;
for (i = 0; i < 4; i++) {
*ptr++ = 0;
}
D_8019769C = 1;
sp24 = (u8 *) __osEepPifRam;
for (sp28 = 0; sp28 < 4; sp28++) {
*sp24++ = 0;
requestformat.dummy = CONT_CMD_NOP;
requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX;
requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX;
requestformat.cmd = CONT_CMD_REQUEST_STATUS;
requestformat.typeh = CONT_CMD_NOP;
requestformat.typel = CONT_CMD_NOP;
requestformat.status = CONT_CMD_NOP;
requestformat.dummy1 = CONT_CMD_NOP;
*(__OSContRequesFormat *) ptr = requestformat;
ptr += sizeof(__OSContRequesFormat);
*ptr = CONT_CMD_END;
ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
__osContLastCmd = CONT_CMD_WRITE_EEPROM;
ret = __osSiRawStartDma(OS_READ, &__osEepPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
if (ret != 0) {
return ret;
}
sp1c.unk00 = 255;
sp1c.unk01 = 1;
sp1c.unk02 = 3;
sp1c.unk03 = 0;
sp1c.unk04 = 255;
sp1c.unk05 = 255;
sp1c.unk06 = 255;
sp1c.unk07 = 255;
*(unkStruct3 *) sp24 = sp1c;
sp24 += 8;
sp24[0] = 254;
sp2c = __osSiRawStartDma(OS_WRITE, __osEepPifRam);
osRecvMesg(a0, NULL, OS_MESG_BLOCK);
_osLastSentSiCmd = 5;
sp2c = __osSiRawStartDma(OS_READ, __osEepPifRam);
osRecvMesg(a0, NULL, OS_MESG_BLOCK);
if (sp2c != 0) {
return sp2c;
ptr = (u8 *) __osEepPifRam.ramarray;
for (i = 0; i < 4; i++) {
*ptr++ = 0;
}
sp24 = (u8 *) __osEepPifRam;
for (sp28 = 0; sp28 < 4; sp28++) {
*sp24++ = 0;
}
sp1c = *(unkStruct3 *) sp24;
a1->unk03 = (sp1c.unk02 & 0xc0) >> 4;
a1->unk00 = (sp1c.unk05 << 8) | sp1c.unk04;
a1->unk02 = sp1c.unk06;
if (a1->unk03 != 0) {
return a1->unk03;
requestformat = *(__OSContRequesFormat *) ptr;
data->errnum = CHNL_ERR(requestformat);
data->type = (requestformat.typel << 8) | requestformat.typeh;
data->status = requestformat.status;
if (data->errnum != 0) {
return data->errnum;
}
return 0;
}

View File

@ -41,7 +41,7 @@ s32 __osPfsGetStatus(OSMesgQueue *queue, int channel)
if (((data[channel].status & CONT_CARD_ON) != 0) && ((data[channel].status & CONT_CARD_PULL) != 0))
return PFS_ERR_NEW_PACK;
if ((data[channel].errno != 0) || ((data[channel].status & CONT_CARD_ON) == 0))
if ((data[channel].errnum != 0) || ((data[channel].status & CONT_CARD_ON) == 0))
return PFS_ERR_NOPACK;
if ((data[channel].status & CONT_ADDR_CRC_ER) != 0)
return PFS_ERR_CONTRFAIL;

View File

@ -35,7 +35,7 @@ s32 osPfsIsPlug(OSMesgQueue *queue, u8 *pattern) {
}
if (crc_error_cnt < 1) {
for (channel = 0; channel < _osContNumControllers; channel++) {
if (data[channel].errno == 0 && (data[channel].status & CONT_CARD_ON) != 0) {
if (data[channel].errnum == 0 && (data[channel].status & CONT_CARD_ON) != 0) {
bits |= 1 << channel;
}
}
@ -51,7 +51,7 @@ void __osPfsRequestData(u8 cmd) {
__OSContRequesFormat requestformat;
int i;
_osLastSentSiCmd = cmd;
__osContLastCmd = cmd;
for (i = 0; i < ARRLEN(__osPfsPifRam.ramarray) + 1; i++) { // also clear pifstatus
__osPfsPifRam.ramarray[i] = 0;
@ -84,8 +84,8 @@ void __osPfsGetInitData(u8 *pattern, OSContStatus *data) {
ptr = (u8 *)&__osPfsPifRam;
for (i = 0; i < _osContNumControllers; i++, ptr += sizeof(__OSContRequesFormat)) {
requestformat = *(__OSContRequesFormat *)ptr;
data->errno = CHNL_ERR(requestformat);
if (data->errno == 0) {
data->errnum = CHNL_ERR(requestformat);
if (data->errnum == 0) {
data->type = (requestformat.typel << 8) | (requestformat.typeh);
data->status = requestformat.status;
bits |= 1 << i;