summaryrefslogtreecommitdiff
path: root/include/ultra64/leoappli.h
blob: ef526ee5a54d445fed15eec32b32b15bd7bb8d29 (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#ifndef ULTRA64_LEOAPPLI_H
#define ULTRA64_LEOAPPLI_H

#include "thread.h"
#include "message.h"

#define LEO_DISK_TYPE_MIN 0
#define LEO_DISK_TYPE_MAX 6

#define LEO_LBA_MIN 0
#define LEO_LBA_MAX 4291

#define LEO_LBA_ROM_TOP  LEO_LBA_MIN
#define LEO_LBA_ROM_END0 1417
#define LEO_LBA_ROM_END1 1965
#define LEO_LBA_ROM_END2 2513
#define LEO_LBA_ROM_END3 3061
#define LEO_LBA_ROM_END4 3609
#define LEO_LBA_ROM_END5 4087
#define LEO_LBA_ROM_END6 LEO_LBA_MAX
#define LEO_LBA_RAM_TOP0 (LEO_LBA_ROM_END0+1)
#define LEO_LBA_RAM_TOP1 (LEO_LBA_ROM_END1+1)
#define LEO_LBA_RAM_TOP2 (LEO_LBA_ROM_END2+1)
#define LEO_LBA_RAM_TOP3 (LEO_LBA_ROM_END3+1)
#define LEO_LBA_RAM_TOP4 (LEO_LBA_ROM_END4+1)
#define LEO_LBA_RAM_TOP5 (LEO_LBA_ROM_END5+1)
#define LEO_LBA_RAM_TOP6 (LEO_LBA_ROM_END6+1)
#define LEO_LBA_RAM_END6 LEO_LBA_MAX

void leoInitialize(OSPri compri, OSPri intpri, OSMesg* command_que_buf, u32 cmd_buff_size);
void leoCommand(void* cmd_blk_addr);
void LeoReset(void);
s32 LeoResetClear(void);

#define LEO_PRIORITY_WRK (OS_PRIORITY_PIMGR-1)
#define LEO_PRIORITY_INT OS_PRIORITY_PIMGR

#define LEO_COMMAND_CLEAR_QUE       0x01
#define LEO_COMMAND_INQUIRY         0x02
#define LEO_COMMAND_TEST_UNIT_READY 0x03
#define LEO_COMMAND_REZERO          0x04
#define LEO_COMMAND_READ            0x05
#define LEO_COMMAND_WRITE           0x06
#define LEO_COMMAND_SEEK            0x07
#define LEO_COMMAND_START_STOP      0x08
#define LEO_COMMAND_READ_CAPACITY   0x09
#define LEO_COMMAND_TRANSLATE       0x0A
#define LEO_COMMAND_MODE_SELECT     0x0B
#define LEO_COMMAND_READ_DISK_ID    0x0C
#define LEO_COMMAND_READ_TIMER      0x0D
#define LEO_COMMAND_SET_TIMER       0x0E
// should be
// #define LEO_COMMAND_CLEAR_RESET 0x0F

#define LEO_CONTROL_POST            0x80   // ENABLE POST QUEUE
#define LEO_CONTROL_START           0x01   // START COMMAND
#define LEO_CONTROL_STBY            0x02   // STAND-BY MODE(NOT SLEEP MODE)
#define LEO_CONTROL_WRT             0x01   // READ RE-WRITE-ABLE CAPACITY
#define LEO_CONTROL_TBL             0x01   // TRANSLATE BYTE TO LBA
#define LEO_CONTROL_BRAKE           0x04   // SLEEP MODE(BRAKE ON)

#define LEO_TEST_UNIT_MR            0x01   // MEDIUM REMOVED
#define LEO_TEST_UNIT_RE            0x02   // HEAD RETRACTED
#define LEO_TEST_UNIT_SS            0x04   // SPINDLE STOPPED

#define LEO_STATUS_GOOD             0x00
#define LEO_STATUS_CHECK_CONDITION  0x02
#define LEO_STATUS_BUSY             0x08

#define LEO_SENSE_NO_ADDITIONAL_SENSE_INFOMATION   00
#define LEO_SENSE_DRIVE_NOT_READY                  01
#define LEO_SENSE_DIAGNOSTIC_FAILURE               02
#define LEO_SENSE_COMMAND_PHASE_ERROR              03
#define LEO_SENSE_DATA_PHASE_ERROR                 04
#define LEO_SENSE_REAL_TIME_CLOCK_FAILURE          05
#define LEO_SENSE_INCOMPATIBLE_MEDIUM_INSTALLED    11
#define LEO_SENSE_UNKNOWN_FORMAT                   11
#define LEO_SENSE_NO_SEEK_COMPLETE                 21
#define LEO_SENSE_WRITE_FAULT                      22
#define LEO_SENSE_UNRECOVERED_READ_ERROR           23
#define LEO_SENSE_NO_REFERENCE_POSITION_FOUND      24
#define LEO_SENSE_TRACK_FOLLOWING_ERROR            25
#define LEO_SENSE_TRACKING_OR_SPDL_SERVO_FAILURE   25
#define LEO_SENSE_INVALID_COMMAND_OPERATION_CODE   31
#define LEO_SENSE_LBA_OUT_OF_RANGE                 32
#define LEO_SENSE_WRITE_PROTECT_ERROR              33
#define LEO_SENSE_COMMAND_TERMINATED               34
#define LEO_SENSE_QUEUE_FULL                       35
#define LEO_SENSE_ILLEGAL_TIMER_VALUE              36
#define LEO_SENSE_WAITING_NMI                      37
#define LEO_SENSE_DEVICE_COMMUNICATION_FAILURE     41
#define LEO_SENSE_MEDIUM_NOT_PRESENT               42
#define LEO_SENSE_POWERONRESET_DEVICERESET_OCCURED 43
#define LEO_SENSE_MEDIUM_MAY_HAVE_CHANGED          47
#define LEO_SENSE_EJECTED_ILLEGALLY_RESUME         49

typedef struct LEOCmdHeader {
    /* 0x0 */ u8 command;
    /* 0x1 */ u8 reserve1;
    /* 0x2 */ u8 control;
    /* 0x3 */ u8 reserve3;
    /* 0x4 */ u8 status;
    /* 0x5 */ u8 sense;
    /* 0x6 */ u8 reserve6;
    /* 0x7 */ u8 reserve7;
    /* 0x8 */ OSMesgQueue* post;
} LEOCmdHeader; // 0xC

typedef struct LEOCmdClearQueue {
    /* 0x0 */ LEOCmdHeader header;
} LEOCmdClearQueue; // 0xC

typedef struct LEOCmdInquiry {
    /* 0x00 */ LEOCmdHeader header;
    /* 0x0C */ u8 devType;
    /* 0x0D */ u8 version;
    /* 0x0E */ u8 devNum;
    /* 0x0F */ u8 leoBiosVer;
    /* 0x10 */ u32 reserve5;
} LEOCmdInquiry; // size = 0x14

typedef struct LEOCmdTestUnitReady {
    /* 0x0 */ LEOCmdHeader header;
    /* 0xC */ u8 test;
    /* 0xD */ u8 reserve2;
    /* 0xE */ u8 reserve3;
    /* 0xF */ u8 reserve4;
} LEOCmdTestUnitReady; // size = 0x10

typedef struct LEOCmdRezero {
    /* 0x0 */ LEOCmdHeader header;
} LEOCmdRezero; // size = 0xC

typedef struct LEOCmdRead {
    /* 0x00 */ LEOCmdHeader header;
    /* 0x0C */ u32 lba;
    /* 0x10 */ u32 transferBlks;
    /* 0x14 */ void* buffPtr;
    /* 0x18 */ u32 rwBytes;
} LEOCmdRead; // size = 0x1C

typedef LEOCmdRead LEOCmdWrite;

typedef struct LEOCmdSeek {
    /* 0x0 */ LEOCmdHeader header;
    /* 0xC */ u32 lba;
} LEOCmdSeek; // size = 0x10

typedef struct LEOCmdStartStop {
    /* 0x0 */ LEOCmdHeader header;
} LEOCmdStartStop; // size = 0xC

typedef struct LEOCmdReadCapacity {
    /* 0x00 */ LEOCmdHeader header;
    /* 0x0C */ u32 startLba;
    /* 0x10 */ u32 endLba;
    /* 0x14 */ u32 capaBytes;
} LEOCmdReadCapacity; // size = 0x18

typedef struct LEOCmdTranslate {
    /* 0x00 */ LEOCmdHeader header;
    /* 0x0C */ u32 startLba;
    /* 0x10 */ u32 inParam;
    /* 0x14 */ u32 outParam;
} LEOCmdTranslate; // size = 0x18

typedef struct LEOCmdModeSelect {
    /* 0x00 */ LEOCmdHeader header;
    /* 0x0C */ u8 pageCode;
    /* 0x0D */ u8 reserve1;
    /* 0x0E */ u8 standbyTime;
    /* 0x0F */ u8 sleepTime;
    /* 0x10 */ u8 ledOnTime;
    /* 0x11 */ u8 ledOffTime;
    /* 0x12 */ u8 reserve18;
    /* 0x13 */ u8 reserve19;
} LEOCmdModeSelect; // size = 0x14

typedef struct LEOCmdReadDiskId {
    /* 0x0 */ LEOCmdHeader header;
    /* 0xC */ void* bufferPointer;
} LEOCmdReadDiskId; // size = 0x10

typedef struct LEOCmdReadTimer {
    /* 0x00 */ LEOCmdHeader header;
    /* 0x0C */ u8 reserve12;
    /* 0x0D */ u8 reserve13;
    /* 0x0E */ u8 year;
    /* 0x0F */ u8 month;
    /* 0x10 */ u8 day;
    /* 0x11 */ u8 hour;
    /* 0x12 */ u8 minute;
    /* 0x13 */ u8 second;
} LEOCmdReadTimer; // size = 0x14

typedef LEOCmdReadTimer LEOCmdSetTimer;

#endif