Merge branch 'master' of ssh://webhost.codesrc.com/home/michael/projects/SCSI2SD
[SCSI2SD-V6.git] / software / 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 stored in flash.
27
28         The flash is organised as 2 arrays of 256 rows, with each row
29         having 256 bytes. Total of 128kb.
30
31         Linear flash memory map:
32         -----------------------------------------
33         Array 1 |Row 255 | Bootloader metadata
34                         ---------------------------------
35                         |Row 254 |
36                         |Row 252 | Blank
37                         ---------------------------------
38                         |Row 251 |
39                         | ...    |
40                         |Row 236 | Config target 3
41                         | ...    |
42                         |Row 220 | Config target 2
43                         | ...    |
44                         |Row 204 | Config target 1
45                         | ...    |
46                         |Row 188 | Config target 0
47                         ---------------------------------
48                         |Row 235 |
49                         | ...    |
50                         |Row 0   |
51         --------|        |
52         Array 0 |Row 255 | Blank
53                         ---------------------------------
54                         |Row 121 |
55                         | ...    |
56                         |Row 37  | Application
57                         ---------------------------------
58                         |Row 36  |
59                         | ...    |
60                         |Row 0   | Bootloader
61
62 */
63
64 #include "stdint.h"
65
66 #define MAX_SCSI_TARGETS 4
67 #define SCSI_CONFIG_ARRAY 1
68 #define SCSI_CONFIG_ROWS 16
69
70 // 256 bytes data, 32 bytes ECC
71 #define SCSI_CONFIG_ROW_SIZE 256
72 #define SCSI_CONFIG_ROW_ECC 288
73 #define SCSI_CONFIG_0_ROW 188
74 #define SCSI_CONFIG_1_ROW 204
75 #define SCSI_CONFIG_2_ROW 220
76 #define SCSI_CONFIG_3_ROW 236
77
78 typedef enum
79 {
80         CONFIG_TARGET_ID_BITS = 0x07,
81         CONFIG_TARGET_ENABLED = 0x80
82 } CONFIG_TARGET_FLAGS;
83
84 typedef enum
85 {
86         CONFIG_ENABLE_UNIT_ATTENTION = 1,
87         CONFIG_ENABLE_PARITY = 2,
88         CONFIG_ENABLE_SCSI2 = 4,
89         CONFIG_DISABLE_GLITCH = 8
90 } CONFIG_FLAGS;
91
92 typedef enum
93 {
94         CONFIG_FIXED,
95         CONFIG_REMOVEABLE,
96         CONFIG_OPTICAL,
97         CONFIG_FLOPPY_14MB,
98         CONFIG_MO,
99         CONFIG_SEQUENTIAL
100
101 } CONFIG_TYPE;
102
103 typedef enum
104 {
105         CONFIG_QUIRKS_NONE,
106         CONFIG_QUIRKS_APPLE
107 } CONFIG_QUIRKS;
108
109 typedef struct __attribute__((packed))
110 {
111         uint8_t deviceType;
112         uint8_t pageCode;
113         uint8_t reserved;
114         uint8_t pageLength;
115         uint8_t data[0]; // pageLength bytes.
116 } VPD;
117
118 typedef struct __attribute__((packed))
119 {
120         // bits 7 -> 3 = CONFIG_TARGET_FLAGS
121         // bits 2 -> 0 = target SCSI ID.
122         uint8_t scsiId;
123
124         uint8_t deviceType; // CONFIG_TYPE
125         uint8_t flags; // CONFIG_FLAGS
126         uint8_t deviceTypeModifier; // Used in INQUIRY response.
127
128         uint32_t sdSectorStart;
129         uint32_t scsiSectors;
130
131         uint16_t bytesPerSector;
132
133         // Max allowed by legacy IBM-PC bios is 6 bits (63)
134         uint16_t sectorsPerTrack;
135
136         // MS-Dos up to 7.10 will crash on >= 256 heads.
137         uint16_t headsPerCylinder;
138
139
140         char vendor[8];
141         char prodId[16];
142         char revision[4];
143         char serial[16];
144
145         uint16_t quirks; // CONFIG_QUIRKS
146
147         uint8_t reserved[960]; // Pad out to 1024 bytes for main section.
148
149         uint8_t vpd[3072]; // Total size is 4k.
150 } TargetConfig;
151
152 typedef enum
153 {
154         CONFIG_NONE, // Invalid
155
156         // Command content:
157         // uint8_t CONFIG_PING
158         // Response:
159         // CONFIG_STATUS
160         CONFIG_PING,
161
162         // Command content:
163         // uint8_t CONFIG_WRITEFLASH
164         // uint8_t[256] flashData
165         // uint8_t flashArray
166         // uint8_t flashRow
167         // Response:
168         // CONFIG_STATUS
169         CONFIG_WRITEFLASH,
170
171         // Command content:
172         // uint8_t CONFIG_READFLASH
173         // uint8_t flashArray
174         // uint8_t flashRow
175         // Response:
176         // 256 bytes of flash
177         CONFIG_READFLASH,
178
179         // Command content:
180         // uint8_t CONFIG_REBOOT
181         // Response: None.
182         CONFIG_REBOOT,
183
184         // Command content:
185         // uint8_t CONFIG_INFO
186         // Response:
187         // uint8_t[16] CSD
188         // uint8_t[16] CID
189         CONFIG_SDINFO,
190
191         // Command content:
192         // uint8_t CONFIG_SCSITEST
193         // Response:
194         // CONFIG_STATUS
195         // uint8_t result code (0 = passed)
196         CONFIG_SCSITEST
197 } CONFIG_COMMAND;
198
199 typedef enum
200 {
201         CONFIG_STATUS_GOOD,
202         CONFIG_STATUS_ERR
203 } CONFIG_STATUS;
204
205
206
207
208 #ifdef __cplusplus
209 } // extern "C"
210
211         #include <type_traits>
212         static_assert(
213                 std::is_pod<TargetConfig>::value, "Misuse of TargetConfig struct"
214                 );
215         static_assert(
216                 sizeof(TargetConfig) == 4096,
217                 "TargetConfig struct size mismatch"
218                 );
219
220 #endif
221
222 #endif