Small compatibility improvements, and added scsi2sd-monitor test program
[SCSI2SD-V6.git] / software / include / scsi2sd.h
CommitLineData
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
21extern "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
78typedef enum
79{
80 CONFIG_TARGET_ID_BITS = 0x07,
81 CONFIG_TARGET_ENABLED = 0x80
82} CONFIG_TARGET_FLAGS;
83
84typedef enum
85{
86 CONFIG_ENABLE_UNIT_ATTENTION = 1,
87 CONFIG_ENABLE_PARITY = 2,
88} CONFIG_FLAGS;
89
90typedef 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
98typedef enum
99{
100 CONFIG_QUIRKS_NONE,
101 CONFIG_QUIRKS_APPLE
102} CONFIG_QUIRKS;
103
75f825e6
MM
104typedef 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
113typedef 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
147typedef 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
194typedef 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