blob: e9f45d07266ce493de19a63e97b56b8e54c672d6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
#include "libultra_internal.h"
#include "macros.h"
#include "controller.h"
extern u8 _osLastSentSiCmd;
extern OSPifRam __osEepPifRam;
s32 __osEepStatus(OSMesgQueue*, OSContStatus*);
void __osPackEepReadData(u8);
s32 osEepromRead(OSMesgQueue* mq, u8 address, u8* buffer) {
s32 ret = 0;
s32 i = 0;
u8* ptr = (u8*) &__osEepPifRam.ramarray;
OSContStatus sdata;
__OSContEepromFormat eepromformat;
if (address > EEPROM_MAXBLOCKS) {
return -1;
}
__osSiGetAccess();
ret = __osEepStatus(mq, &sdata);
if (ret != 0 || sdata.type != CONT_EEPROM) {
return CONT_NO_RESPONSE_ERROR;
}
while (sdata.status & CONT_EEPROM_BUSY) {
__osEepStatus(mq, &sdata);
}
__osPackEepReadData(address);
ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
for (i = 0; i < ARRLEN(__osEepPifRam.ramarray) + 1; i++) {
__osEepPifRam.ramarray[i] = CONT_CMD_NOP;
}
__osEepPifRam.pifstatus = 0;
ret = __osSiRawStartDma(OS_READ, &__osEepPifRam);
__osContLastCmd = CONT_CMD_READ_EEPROM;
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
for (i = 0; i < 4; i++) {
ptr++;
}
eepromformat = *(__OSContEepromFormat*) ptr;
ret = CHNL_ERR(eepromformat);
if (ret == 0) {
for (i = 0; i < 8; i++) {
*buffer++ = eepromformat.data[i];
}
}
__osSiRelAccess();
return ret;
}
void __osPackEepReadData(u8 address) {
u8* ptr = (u8*) &__osEepPifRam.ramarray;
__OSContEepromFormat eepromformat;
s32 i;
for (i = 0; i < ARRLEN(__osEepPifRam.ramarray) + 1; i++) {
__osEepPifRam.ramarray[i] = CONT_CMD_NOP;
}
__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 < ARRLEN(eepromformat.data); i++) {
eepromformat.data[i] = 0;
}
for (i = 0; i < 4; i++) {
*ptr++ = 0;
}
*(__OSContEepromFormat*) ptr = eepromformat;
ptr += sizeof(__OSContEepromFormat);
*ptr = CONT_CMD_END;
}
|