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 | ||
98 | typedef struct __attribute__((packed)) | |
99 | { | |
100 | uint8_t deviceType; | |
101 | uint8_t pageCode; | |
102 | uint8_t reserved; | |
103 | uint8_t pageLength; | |
104 | uint8_t data[0]; // pageLength bytes. | |
105 | } VPD; | |
106 | ||
107 | typedef struct __attribute__((packed)) | |
108 | { | |
109 | // bits 7 -> 3 = CONFIG_TARGET_FLAGS | |
110 | // bits 2 -> 0 = target SCSI ID. | |
111 | uint8_t scsiId; | |
112 | ||
113 | uint8_t deviceType; // CONFIG_TYPE | |
114 | uint8_t flags; // CONFIG_FLAGS | |
115 | uint8_t pad0; | |
116 | ||
117 | uint32_t sdSectorStart; | |
118 | uint32_t scsiSectors; | |
119 | ||
120 | uint16_t bytesPerSector; | |
121 | ||
122 | // Max allowed by legacy IBM-PC bios is 6 bits (63) | |
123 | uint16_t sectorsPerTrack; | |
124 | ||
125 | // MS-Dos up to 7.10 will crash on >= 256 heads. | |
126 | uint16_t headsPerCylinder; | |
127 | ||
128 | ||
129 | char vendor[8]; | |
130 | char prodId[16]; | |
131 | char revision[4]; | |
132 | char serial[16]; | |
133 | ||
134 | uint8_t reserved[962]; // Pad out to 1024 bytes for main section. | |
135 | ||
136 | uint8_t vpd[3072]; // Total size is 4k. | |
137 | } TargetConfig; | |
138 | ||
139 | typedef enum | |
140 | { | |
141 | CONFIG_NONE, // Invalid | |
142 | ||
143 | // Command content: | |
144 | // uint8_t CONFIG_PING | |
145 | // Response: | |
146 | // CONFIG_STATUS | |
147 | CONFIG_PING, | |
148 | ||
149 | // Command content: | |
150 | // uint8_t CONFIG_WRITEFLASH | |
151 | // uint8_t[256] flashData | |
152 | // uint8_t flashArray | |
153 | // uint8_t flashRow | |
154 | // Response: | |
155 | // CONFIG_STATUS | |
156 | CONFIG_WRITEFLASH, | |
157 | ||
158 | // Command content: | |
159 | // uint8_t CONFIG_READFLASH | |
160 | // uint8_t flashArray | |
161 | // uint8_t flashRow | |
162 | // Response: | |
163 | // 256 bytes of flash | |
164 | CONFIG_READFLASH, | |
165 | ||
166 | // Command content: | |
167 | // uint8_t CONFIG_REBOOT | |
168 | // Response: None. | |
169 | CONFIG_REBOOT | |
170 | } CONFIG_COMMAND; | |
171 | ||
172 | typedef enum | |
173 | { | |
174 | CONFIG_STATUS_GOOD, | |
175 | CONFIG_STATUS_ERR | |
176 | } CONFIG_STATUS; | |
177 | ||
178 | ||
179 | ||
180 | ||
181 | #ifdef __cplusplus | |
182 | } // extern "C" | |
183 | ||
184 | #include <type_traits> | |
185 | static_assert( | |
186 | std::is_pod<TargetConfig>::value, "Misuse of TargetConfig struct" | |
187 | ); | |
188 | static_assert( | |
189 | sizeof(TargetConfig) == 4096, | |
190 | "TargetConfig struct size mismatch" | |
191 | ); | |
192 | ||
193 | #endif | |
194 | ||
195 | #endif |