osEepromRead.c (2634B)
1 #include "libultra_internal.h" 2 #include "PR/ique.h" 3 #include "controller.h" 4 #include "macros.h" 5 6 #ifdef VERSION_CN 7 8 s32 osEepromRead(UNUSED OSMesgQueue *mq, u8 address, u8 *buffer) { 9 s32 ret = 0; 10 s32 i; 11 12 __osSiGetAccess(); 13 14 if (__osBbEepromSize == 0x200) { 15 if (address >= 0x200 / 8) { 16 ret = -1; 17 } 18 } else if (__osBbEepromSize != 0x800) { 19 ret = 8; 20 } 21 22 if (ret == 0) { 23 for (i = 0; i < 8; i++) { 24 buffer[i] = (__osBbEepromAddress + address * 8)[i]; 25 } 26 } 27 28 __osSiRelAccess(); 29 return ret; 30 } 31 32 #else 33 34 void __osPackEepReadData(u8); 35 36 s32 osEepromRead(OSMesgQueue *mq, u8 address, u8 *buffer) { 37 s32 ret = 0; 38 s32 i = 0; 39 u8 *ptr = (u8 *) &__osEepPifRam.ramarray; 40 OSContStatus sdata; 41 __OSContEepromFormat eepromformat; 42 43 if (address > EEPROM_MAXBLOCKS) { 44 return -1; 45 } 46 47 __osSiGetAccess(); 48 ret = __osEepStatus(mq, &sdata); 49 if (ret != 0 || sdata.type != CONT_EEPROM) { 50 51 return CONT_NO_RESPONSE_ERROR; 52 } 53 54 while (sdata.status & CONT_EEPROM_BUSY) { 55 __osEepStatus(mq, &sdata); 56 } 57 __osPackEepReadData(address); 58 59 ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); 60 osRecvMesg(mq, NULL, OS_MESG_BLOCK); 61 62 for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) { 63 __osEepPifRam.ramarray[i] = CONT_CMD_NOP; 64 } 65 __osEepPifRam.pifstatus = 0; 66 67 ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); 68 __osContLastCmd = CONT_CMD_READ_EEPROM; 69 osRecvMesg(mq, NULL, OS_MESG_BLOCK); 70 71 for (i = 0; i < 4; i++) { 72 ptr++; 73 } 74 75 eepromformat = *(__OSContEepromFormat *) ptr; 76 ret = CHNL_ERR(eepromformat); 77 78 if (ret == 0) { 79 for (i = 0; i < 8; i++) { 80 *buffer++ = eepromformat.data[i]; 81 } 82 } 83 84 __osSiRelAccess(); 85 return ret; 86 } 87 88 void __osPackEepReadData(u8 address) { 89 u8 *ptr = (u8 *) &__osEepPifRam.ramarray; 90 __OSContEepromFormat eepromformat; 91 s32 i; 92 93 for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) { 94 __osEepPifRam.ramarray[i] = CONT_CMD_NOP; 95 } 96 __osEepPifRam.pifstatus = CONT_CMD_EXE; 97 98 eepromformat.txsize = CONT_CMD_READ_EEPROM_TX; 99 eepromformat.rxsize = CONT_CMD_READ_EEPROM_RX; 100 eepromformat.cmd = CONT_CMD_READ_EEPROM; 101 eepromformat.address = address; 102 for (i = 0; i < ARRAY_COUNT(eepromformat.data); i++) { 103 eepromformat.data[i] = 0; 104 } 105 106 for (i = 0; i < 4; i++) { 107 *ptr++ = 0; 108 } 109 110 *(__OSContEepromFormat *) ptr = eepromformat; 111 ptr += sizeof(__OSContEepromFormat); 112 *ptr = CONT_CMD_END; 113 } 114 115 #endif