Fix for VMS 5.5-2 for incorrect Inquiry command allocation lengths
[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_VMS = 8
86 } S2S_CFG_QUIRKS;
87
88 typedef enum
89 {
90 S2S_CFG_SPEED_NoLimit,
91 S2S_CFG_SPEED_ASYNC_15,
92 S2S_CFG_SPEED_ASYNC_33,
93 S2S_CFG_SPEED_ASYNC_50,
94 S2S_CFG_SPEED_SYNC_5,
95 S2S_CFG_SPEED_SYNC_10,
96 S2S_CFG_SPEED_TURBO
97 } S2S_CFG_SPEED;
98
99 typedef struct __attribute__((packed))
100 {
101 // bits 7 -> 3 = S2S_CFG_TARGET_FLAGS
102 // bits 2 -> 0 = target SCSI ID.
103 uint8_t scsiId;
104
105 uint8_t deviceType; // S2S_CFG_TYPE
106 uint8_t flagsDEPRECATED; // S2S_CFG_FLAGS, removed in v4.5
107 uint8_t deviceTypeModifier; // Used in INQUIRY response.
108
109 uint32_t sdSectorStart;
110 uint32_t scsiSectors;
111
112 uint16_t bytesPerSector;
113
114 // Max allowed by legacy IBM-PC bios is 6 bits (63)
115 uint16_t sectorsPerTrack;
116
117 // MS-Dos up to 7.10 will crash on >= 256 heads.
118 uint16_t headsPerCylinder;
119
120
121 char vendor[8];
122 char prodId[16];
123 char revision[4];
124 char serial[16];
125
126 uint16_t quirks; // S2S_CFG_QUIRKS
127
128 uint8_t reserved[64]; // Pad out to 128 bytes for main section.
129 } S2S_TargetCfg;
130
131 typedef struct __attribute__((packed))
132 {
133 char magic[4]; // 'BCFG'
134 uint8_t flags; // S2S_CFG_FLAGS
135 uint8_t startupDelay; // Seconds.
136 uint8_t selectionDelay; // milliseconds. 255 = auto
137 uint8_t flags6; // S2S_CFG_FLAGS6
138
139 uint8_t scsiSpeed;
140
141 uint8_t reserved[119]; // Pad out to 128 bytes
142 } S2S_BoardCfg;
143
144 typedef enum
145 {
146 S2S_CMD_NONE, // Invalid
147
148 // Command content:
149 // uint8_t S2S_CFG_PING
150 // Response:
151 // S2S_CFG_STATUS
152 S2S_CMD_PING,
153
154 // Command content:
155 // uint8_t S2S_CFG_WRITEFLASH
156 // uint8_t[256] flashData
157 // uint8_t flashArray
158 // uint8_t flashRow
159 // Response:
160 // S2S_CFG_STATUS
161 S2S_CMD_WRITEFLASH,
162
163 // Command content:
164 // uint8_t S2S_CFG_READFLASH
165 // uint8_t flashArray
166 // uint8_t flashRow
167 // Response:
168 // 256 bytes of flash
169 S2S_CMD_READFLASH,
170
171 // Command content:
172 // uint8_t S2S_CFG_REBOOT
173 // Response: None.
174 S2S_CMD_REBOOT,
175
176 // Command content:
177 // uint8_t S2S_CFG_INFO
178 // Response:
179 // uint8_t[16] CSD
180 // uint8_t[16] CID
181 S2S_CMD_SDINFO,
182
183 // Command content:
184 // uint8_t S2S_CFG_SCSITEST
185 // Response:
186 // S2S_CFG_STATUS
187 // uint8_t result code (0 = passed)
188 S2S_CMD_SCSITEST,
189
190 // Command content:
191 // uint8_t S2S_CFG_DEVINFO
192 // Response:
193 // uint16_t protocol version (MSB)
194 // uint16_t firmware version (MSB)
195 // uint32_t SD capacity(MSB)
196 S2S_CMD_DEVINFO,
197
198 // Command content:
199 // uint8_t S2S_CFG_SD_WRITE
200 // uint32_t Sector Number (MSB)
201 // uint8_t[512] data
202 // Response:
203 // S2S_CFG_STATUS
204 S2S_CMD_SD_WRITE,
205
206 // Command content:
207 // uint8_t S2S_CFG_SD_READ
208 // uint32_t Sector Number (MSB)
209 // Response:
210 // 512 bytes of data
211 S2S_CMD_SD_READ,
212
213 // Command content:
214 // uint8_t S2S_CFG_DEBUG
215 // Response:
216 S2S_CMD_DEBUG,
217 } S2S_COMMAND;
218
219 typedef enum
220 {
221 S2S_CFG_STATUS_GOOD,
222 S2S_CFG_STATUS_ERR,
223 S2S_CFG_STATUS_BUSY
224 } S2S_CFG_STATUS;
225
226
227
228
229 #ifdef __cplusplus
230 } // extern "C"
231
232 #include <type_traits>
233 static_assert(
234 std::is_pod<S2S_TargetCfg>::value, "Misuse of TargetConfig struct"
235 );
236 static_assert(
237 sizeof(S2S_TargetCfg) == 128,
238 "TargetConfig struct size mismatch"
239 );
240
241 static_assert(
242 std::is_pod<S2S_BoardCfg>::value, "Misuse of BoardConfig struct"
243 );
244 static_assert(
245 sizeof(S2S_BoardCfg) == 128,
246 "BoardConfig struct size mismatch"
247 );
248
249 #endif
250
251 #endif