1176a02cfb69c26af717a48ec1efa4432e2a20de
[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