Port XEBEC controller support from v5 firmware
[SCSI2SD-V6.git] / include / scsi2sd.h
1 // Copyright (C) 2014 Michael McMaster <michael@codesrc.com>
2 //
3 // This file is part of SCSI2SD.
4 //
5 // SCSI2SD is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // SCSI2SD is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with SCSI2SD. If not, see <http://www.gnu.org/licenses/>.
17 #ifndef scsi2sd_h
18 #define scsi2sd_h
19
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23
24 /* Common type definitions shared between the firmware and config tools
25
26 The configuration data is now stored on the SD card, occupying the
27 last 2 sectors.
28
29 BoardConfig
30 TargetConfig (disk 0)
31 TargetConfig (disk 1)
32 TargetConfig (disk 2)
33 TargetConfig (disk 3)
34 TargetConfig (disk 4)
35 TargetConfig (disk 5)
36 TargetConfig (disk 6)
37
38 */
39
40 #include "stdint.h"
41
42 #define S2S_MAX_TARGETS 7
43 #define S2S_CFG_SIZE (S2S_MAX_TARGETS * sizeof(S2S_TargetCfg) + sizeof(S2S_BoardCfg))
44
45 typedef enum
46 {
47 S2S_CFG_TARGET_ID_BITS = 0x07,
48 S2S_CFG_TARGET_ENABLED = 0x80
49 } S2S_CFG_TARGET_FLAGS;
50
51 typedef enum
52 {
53 S2S_CFG_ENABLE_UNIT_ATTENTION = 1,
54 S2S_CFG_ENABLE_PARITY = 2,
55 S2S_CFG_ENABLE_SCSI2 = 4,
56 S2S_CFG_DISABLE_GLITCH = 8,
57 S2S_CFG_ENABLE_CACHE = 16,
58 S2S_CFG_ENABLE_DISCONNECT = 32,
59 S2S_CFG_ENABLE_SEL_LATCH = 64,
60 S2S_CFG_MAP_LUNS_TO_IDS = 128
61 } S2S_CFG_FLAGS;
62
63 typedef enum
64 {
65 S2S_CFG_ENABLE_TERMINATOR = 1
66 } S2S_CFG_FLAGS6;
67
68 typedef enum
69 {
70 S2S_CFG_FIXED,
71 S2S_CFG_REMOVEABLE,
72 S2S_CFG_OPTICAL,
73 S2S_CFG_FLOPPY_14MB,
74 S2S_CFG_MO,
75 S2S_CFG_SEQUENTIAL
76
77 } S2S_CFG_TYPE;
78
79 typedef enum
80 {
81 S2S_CFG_QUIRKS_NONE = 0,
82 S2S_CFG_QUIRKS_APPLE = 1,
83 S2S_CFG_QUIRKS_OMTI = 2,
84 S2S_CFG_QUIRKS_XEBEC = 4
85 } S2S_CFG_QUIRKS;
86
87 typedef enum
88 {
89 S2S_CFG_SPEED_NoLimit,
90 S2S_CFG_SPEED_ASYNC_15,
91 S2S_CFG_SPEED_ASYNC_33,
92 S2S_CFG_SPEED_ASYNC_50,
93 S2S_CFG_SPEED_SYNC_5,
94 S2S_CFG_SPEED_SYNC_10,
95 S2S_CFG_SPEED_TURBO
96 } S2S_CFG_SPEED;
97
98 typedef struct __attribute__((packed))
99 {
100 // bits 7 -> 3 = S2S_CFG_TARGET_FLAGS
101 // bits 2 -> 0 = target SCSI ID.
102 uint8_t scsiId;
103
104 uint8_t deviceType; // S2S_CFG_TYPE
105 uint8_t flagsDEPRECATED; // S2S_CFG_FLAGS, removed in v4.5
106 uint8_t deviceTypeModifier; // Used in INQUIRY response.
107
108 uint32_t sdSectorStart;
109 uint32_t scsiSectors;
110
111 uint16_t bytesPerSector;
112
113 // Max allowed by legacy IBM-PC bios is 6 bits (63)
114 uint16_t sectorsPerTrack;
115
116 // MS-Dos up to 7.10 will crash on >= 256 heads.
117 uint16_t headsPerCylinder;
118
119
120 char vendor[8];
121 char prodId[16];
122 char revision[4];
123 char serial[16];
124
125 uint16_t quirks; // S2S_CFG_QUIRKS
126
127 uint8_t reserved[64]; // Pad out to 128 bytes for main section.
128 } S2S_TargetCfg;
129
130 typedef struct __attribute__((packed))
131 {
132 char magic[4]; // 'BCFG'
133 uint8_t flags; // S2S_CFG_FLAGS
134 uint8_t startupDelay; // Seconds.
135 uint8_t selectionDelay; // milliseconds. 255 = auto
136 uint8_t flags6; // S2S_CFG_FLAGS6
137
138 uint8_t scsiSpeed;
139
140 uint8_t reserved[119]; // Pad out to 128 bytes
141 } S2S_BoardCfg;
142
143 typedef enum
144 {
145 S2S_CMD_NONE, // Invalid
146
147 // Command content:
148 // uint8_t S2S_CFG_PING
149 // Response:
150 // S2S_CFG_STATUS
151 S2S_CMD_PING,
152
153 // Command content:
154 // uint8_t S2S_CFG_WRITEFLASH
155 // uint8_t[256] flashData
156 // uint8_t flashArray
157 // uint8_t flashRow
158 // Response:
159 // S2S_CFG_STATUS
160 S2S_CMD_WRITEFLASH,
161
162 // Command content:
163 // uint8_t S2S_CFG_READFLASH
164 // uint8_t flashArray
165 // uint8_t flashRow
166 // Response:
167 // 256 bytes of flash
168 S2S_CMD_READFLASH,
169
170 // Command content:
171 // uint8_t S2S_CFG_REBOOT
172 // Response: None.
173 S2S_CMD_REBOOT,
174
175 // Command content:
176 // uint8_t S2S_CFG_INFO
177 // Response:
178 // uint8_t[16] CSD
179 // uint8_t[16] CID
180 S2S_CMD_SDINFO,
181
182 // Command content:
183 // uint8_t S2S_CFG_SCSITEST
184 // Response:
185 // S2S_CFG_STATUS
186 // uint8_t result code (0 = passed)
187 S2S_CMD_SCSITEST,
188
189 // Command content:
190 // uint8_t S2S_CFG_DEVINFO
191 // Response:
192 // uint16_t protocol version (MSB)
193 // uint16_t firmware version (MSB)
194 // uint32_t SD capacity(MSB)
195 S2S_CMD_DEVINFO,
196
197 // Command content:
198 // uint8_t S2S_CFG_SD_WRITE
199 // uint32_t Sector Number (MSB)
200 // uint8_t[512] data
201 // Response:
202 // S2S_CFG_STATUS
203 S2S_CMD_SD_WRITE,
204
205 // Command content:
206 // uint8_t S2S_CFG_SD_READ
207 // uint32_t Sector Number (MSB)
208 // Response:
209 // 512 bytes of data
210 S2S_CMD_SD_READ,
211
212 // Command content:
213 // uint8_t S2S_CFG_DEBUG
214 // Response:
215 S2S_CMD_DEBUG,
216 } S2S_COMMAND;
217
218 typedef enum
219 {
220 S2S_CFG_STATUS_GOOD,
221 S2S_CFG_STATUS_ERR,
222 S2S_CFG_STATUS_BUSY
223 } S2S_CFG_STATUS;
224
225
226
227
228 #ifdef __cplusplus
229 } // extern "C"
230
231 #include <type_traits>
232 static_assert(
233 std::is_pod<S2S_TargetCfg>::value, "Misuse of TargetConfig struct"
234 );
235 static_assert(
236 sizeof(S2S_TargetCfg) == 128,
237 "TargetConfig struct size mismatch"
238 );
239
240 static_assert(
241 std::is_pod<S2S_BoardCfg>::value, "Misuse of BoardConfig struct"
242 );
243 static_assert(
244 sizeof(S2S_BoardCfg) == 128,
245 "BoardConfig struct size mismatch"
246 );
247
248 #endif
249
250 #endif