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