osEepromWrite.c (4180B)
1 #include "libultra_internal.h" 2 #include "osContInternal.h" 3 #include "PR/ique.h" 4 #include "controller.h" 5 #include "macros.h" 6 7 #ifdef VERSION_CN 8 9 s32 osEepromWrite(UNUSED OSMesgQueue *mq, u8 address, u8 *buffer) { 10 s32 ret = 0; 11 s32 i; 12 13 __osSiGetAccess(); 14 15 if (__osBbEepromSize == 0x200) { 16 if (address >= 0x200 / 8) { 17 ret = -1; 18 } 19 } else if (__osBbEepromSize != 0x800) { 20 ret = 8; 21 } 22 23 if (ret == 0) { 24 for (i = 0; i < 8; i++) { 25 (__osBbEepromAddress + address * 8)[i] = buffer[i]; 26 } 27 } 28 29 __osSiRelAccess(); 30 return ret; 31 } 32 33 #else 34 35 OSPifRam __osEepPifRam; 36 37 void __osPackEepWriteData(u8, u8 *); 38 39 s32 osEepromWrite(OSMesgQueue *mq, u8 address, u8 *buffer) { 40 s32 ret = 0; 41 s32 i; 42 u8 *ptr = (u8 *) &__osEepPifRam.ramarray; 43 __OSContEepromFormat eepromformat; 44 OSContStatus sdata; 45 46 if (address > EEPROM_MAXBLOCKS) { 47 return -1; 48 } 49 50 __osSiGetAccess(); 51 ret = __osEepStatus(mq, &sdata); 52 53 if (ret != 0 || sdata.type != CONT_EEPROM) { 54 return CONT_NO_RESPONSE_ERROR; 55 } 56 57 while (sdata.status & CONT_EEPROM_BUSY) { 58 __osEepStatus(mq, &sdata); 59 } 60 61 __osPackEepWriteData(address, buffer); 62 63 ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); 64 osRecvMesg(mq, NULL, OS_MESG_BLOCK); 65 66 for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) { 67 __osEepPifRam.ramarray[i] = CONT_CMD_NOP; 68 } 69 70 __osEepPifRam.pifstatus = 0; 71 ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); 72 __osContLastCmd = CONT_CMD_WRITE_EEPROM; 73 osRecvMesg(mq, NULL, OS_MESG_BLOCK); 74 75 for (i = 0; i < 4; i++) { 76 ptr++; 77 } 78 79 eepromformat = *(__OSContEepromFormat *) ptr; 80 ret = CHNL_ERR(eepromformat); 81 __osSiRelAccess(); 82 return ret; 83 } 84 85 void __osPackEepWriteData(u8 address, u8 *buffer) { 86 u8 *ptr = (u8 *) &__osEepPifRam.ramarray; 87 __OSContEepromFormat eepromformat; 88 s32 i; 89 90 for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) { 91 __osEepPifRam.ramarray[i] = CONT_CMD_NOP; 92 } 93 __osEepPifRam.pifstatus = CONT_CMD_EXE; 94 95 eepromformat.txsize = CONT_CMD_WRITE_EEPROM_TX; 96 eepromformat.rxsize = CONT_CMD_WRITE_EEPROM_RX; 97 eepromformat.cmd = CONT_CMD_WRITE_EEPROM; 98 eepromformat.address = address; 99 100 for (i = 0; i < ARRAY_COUNT(eepromformat.data); i++) { 101 eepromformat.data[i] = *buffer++; 102 } 103 104 for (i = 0; i < 4; i++) { 105 *ptr++ = 0; 106 } 107 *(__OSContEepromFormat *) ptr = eepromformat; 108 ptr += sizeof(__OSContEepromFormat); 109 *ptr = CONT_CMD_END; 110 } 111 112 s32 __osEepStatus(OSMesgQueue *mq, OSContStatus *data) { 113 u32 ret = 0; 114 s32 i; 115 u8 *ptr = (u8 *) __osEepPifRam.ramarray; 116 __OSContRequesFormat requestformat; 117 118 for (i = 0; i < ARRAY_COUNT(__osEepPifRam.ramarray) + 1; i++) { 119 __osEepPifRam.ramarray[i] = 0; 120 } 121 __osEepPifRam.pifstatus = CONT_CMD_EXE; 122 123 ptr = (u8 *) __osEepPifRam.ramarray; 124 for (i = 0; i < 4; i++) { 125 *ptr++ = 0; 126 } 127 128 requestformat.dummy = CONT_CMD_NOP; 129 requestformat.txsize = CONT_CMD_REQUEST_STATUS_TX; 130 requestformat.rxsize = CONT_CMD_REQUEST_STATUS_RX; 131 requestformat.cmd = CONT_CMD_REQUEST_STATUS; 132 requestformat.typeh = CONT_CMD_NOP; 133 requestformat.typel = CONT_CMD_NOP; 134 requestformat.status = CONT_CMD_NOP; 135 requestformat.dummy1 = CONT_CMD_NOP; 136 *(__OSContRequesFormat *) ptr = requestformat; 137 138 ptr += sizeof(__OSContRequesFormat); 139 *ptr = CONT_CMD_END; 140 141 ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam); 142 osRecvMesg(mq, NULL, OS_MESG_BLOCK); 143 144 __osContLastCmd = CONT_CMD_WRITE_EEPROM; 145 146 ret = __osSiRawStartDma(OS_READ, &__osEepPifRam); 147 osRecvMesg(mq, NULL, OS_MESG_BLOCK); 148 149 if (ret != 0) { 150 return ret; 151 } 152 153 ptr = (u8 *) __osEepPifRam.ramarray; 154 for (i = 0; i < 4; i++) { 155 *ptr++ = 0; 156 } 157 158 requestformat = *(__OSContRequesFormat *) ptr; 159 data->errnum = CHNL_ERR(requestformat); 160 data->type = (requestformat.typel << 8) | requestformat.typeh; 161 data->status = requestformat.status; 162 if (data->errnum != 0) { 163 return data->errnum; 164 } 165 return 0; 166 } 167 168 #endif