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