1 // Copyright (C) 2014 Michael McMaster <michael@codesrc.com>
3 // This file is part of SCSI2SD.
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.
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.
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/>.
24 /* Common type definitions shared between the firmware and config tools
26 The configuration data is now stored on the SD card, occupying the
42 #define S2S_MAX_TARGETS 7
43 #define S2S_CFG_SIZE (S2S_MAX_TARGETS * sizeof(S2S_TargetCfg) + sizeof(S2S_BoardCfg))
47 S2S_CFG_TARGET_ID_BITS = 0x07,
48 S2S_CFG_TARGET_ENABLED = 0x80
49 } S2S_CFG_TARGET_FLAGS;
53 S2S_CFG_ENABLE_UNIT_ATTENTION = 1,
54 S2S_CFG_ENABLE_PARITY = 2,
55 S2S_CFG_ENABLE_SCSI2 = 4,
56 S2S_CFG_DISABLE_GLITCH = 8,
57 S2S_CFG_ENABLE_CACHE = 16,
58 S2S_CFG_ENABLE_DISCONNECT = 32,
59 S2S_CFG_ENABLE_SEL_LATCH = 64,
60 S2S_CFG_MAP_LUNS_TO_IDS = 128
65 S2S_CFG_ENABLE_TERMINATOR = 1
88 S2S_CFG_SPEED_NoLimit,
89 S2S_CFG_SPEED_ASYNC_15,
90 S2S_CFG_SPEED_ASYNC_33,
91 S2S_CFG_SPEED_ASYNC_50,
93 S2S_CFG_SPEED_SYNC_10,
97 typedef struct __attribute__((packed))
99 // bits 7 -> 3 = S2S_CFG_TARGET_FLAGS
100 // bits 2 -> 0 = target SCSI ID.
103 uint8_t deviceType; // S2S_CFG_TYPE
104 uint8_t flagsDEPRECATED; // S2S_CFG_FLAGS, removed in v4.5
105 uint8_t deviceTypeModifier; // Used in INQUIRY response.
107 uint32_t sdSectorStart;
108 uint32_t scsiSectors;
110 uint16_t bytesPerSector;
112 // Max allowed by legacy IBM-PC bios is 6 bits (63)
113 uint16_t sectorsPerTrack;
115 // MS-Dos up to 7.10 will crash on >= 256 heads.
116 uint16_t headsPerCylinder;
124 uint16_t quirks; // S2S_CFG_QUIRKS
126 uint8_t reserved[64]; // Pad out to 128 bytes for main section.
129 typedef struct __attribute__((packed))
131 char magic[4]; // 'BCFG'
132 uint8_t flags; // S2S_CFG_FLAGS
133 uint8_t startupDelay; // Seconds.
134 uint8_t selectionDelay; // milliseconds. 255 = auto
135 uint8_t flags6; // S2S_CFG_FLAGS6
139 uint8_t reserved[119]; // Pad out to 128 bytes
144 S2S_CMD_NONE, // Invalid
147 // uint8_t S2S_CFG_PING
153 // uint8_t S2S_CFG_WRITEFLASH
154 // uint8_t[256] flashData
155 // uint8_t flashArray
162 // uint8_t S2S_CFG_READFLASH
163 // uint8_t flashArray
166 // 256 bytes of flash
170 // uint8_t S2S_CFG_REBOOT
175 // uint8_t S2S_CFG_INFO
182 // uint8_t S2S_CFG_SCSITEST
185 // uint8_t result code (0 = passed)
189 // uint8_t S2S_CFG_DEVINFO
191 // uint16_t protocol version (MSB)
192 // uint16_t firmware version (MSB)
193 // uint32_t SD capacity(MSB)
197 // uint8_t S2S_CFG_SD_WRITE
198 // uint32_t Sector Number (MSB)
205 // uint8_t S2S_CFG_SD_READ
206 // uint32_t Sector Number (MSB)
212 // uint8_t S2S_CFG_DEBUG
230 #include <type_traits>
232 std::is_pod<S2S_TargetCfg>::value, "Misuse of TargetConfig struct"
235 sizeof(S2S_TargetCfg) == 128,
236 "TargetConfig struct size mismatch"
240 std::is_pod<S2S_BoardCfg>::value, "Misuse of BoardConfig struct"
243 sizeof(S2S_BoardCfg) == 128,
244 "BoardConfig struct size mismatch"