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