Performance fixes, scsi2sd-util crash fixes, scsi2 config option.
[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_FLAGS;
90
91 typedef enum
92 {
93 CONFIG_FIXED,
94 CONFIG_REMOVEABLE,
95 CONFIG_OPTICAL,
96 CONFIG_FLOPPY_14MB
97 } CONFIG_TYPE;
98
99 typedef enum
100 {
101 CONFIG_QUIRKS_NONE,
102 CONFIG_QUIRKS_APPLE
103 } CONFIG_QUIRKS;
104
105 typedef struct __attribute__((packed))
106 {
107 uint8_t deviceType;
108 uint8_t pageCode;
109 uint8_t reserved;
110 uint8_t pageLength;
111 uint8_t data[0]; // pageLength bytes.
112 } VPD;
113
114 typedef struct __attribute__((packed))
115 {
116 // bits 7 -> 3 = CONFIG_TARGET_FLAGS
117 // bits 2 -> 0 = target SCSI ID.
118 uint8_t scsiId;
119
120 uint8_t deviceType; // CONFIG_TYPE
121 uint8_t flags; // CONFIG_FLAGS
122 uint8_t deviceTypeModifier; // Used in INQUIRY response.
123
124 uint32_t sdSectorStart;
125 uint32_t scsiSectors;
126
127 uint16_t bytesPerSector;
128
129 // Max allowed by legacy IBM-PC bios is 6 bits (63)
130 uint16_t sectorsPerTrack;
131
132 // MS-Dos up to 7.10 will crash on >= 256 heads.
133 uint16_t headsPerCylinder;
134
135
136 char vendor[8];
137 char prodId[16];
138 char revision[4];
139 char serial[16];
140
141 uint16_t quirks; // CONFIG_QUIRKS
142
143 uint8_t reserved[960]; // Pad out to 1024 bytes for main section.
144
145 uint8_t vpd[3072]; // Total size is 4k.
146 } TargetConfig;
147
148 typedef enum
149 {
150 CONFIG_NONE, // Invalid
151
152 // Command content:
153 // uint8_t CONFIG_PING
154 // Response:
155 // CONFIG_STATUS
156 CONFIG_PING,
157
158 // Command content:
159 // uint8_t CONFIG_WRITEFLASH
160 // uint8_t[256] flashData
161 // uint8_t flashArray
162 // uint8_t flashRow
163 // Response:
164 // CONFIG_STATUS
165 CONFIG_WRITEFLASH,
166
167 // Command content:
168 // uint8_t CONFIG_READFLASH
169 // uint8_t flashArray
170 // uint8_t flashRow
171 // Response:
172 // 256 bytes of flash
173 CONFIG_READFLASH,
174
175 // Command content:
176 // uint8_t CONFIG_REBOOT
177 // Response: None.
178 CONFIG_REBOOT,
179
180 // Command content:
181 // uint8_t CONFIG_INFO
182 // Response:
183 // uint8_t[16] CSD
184 // uint8_t[16] CID
185 CONFIG_SDINFO,
186
187 // Command content:
188 // uint8_t CONFIG_SCSITEST
189 // Response:
190 // CONFIG_STATUS
191 // uint8_t result code (0 = passed)
192 CONFIG_SCSITEST
193 } CONFIG_COMMAND;
194
195 typedef enum
196 {
197 CONFIG_STATUS_GOOD,
198 CONFIG_STATUS_ERR
199 } CONFIG_STATUS;
200
201
202
203
204 #ifdef __cplusplus
205 } // extern "C"
206
207 #include <type_traits>
208 static_assert(
209 std::is_pod<TargetConfig>::value, "Misuse of TargetConfig struct"
210 );
211 static_assert(
212 sizeof(TargetConfig) == 4096,
213 "TargetConfig struct size mismatch"
214 );
215
216 #endif
217
218 #endif