7a7217e502ed80c7361732d0fff2ed2de7588bf9
[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