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