| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 | //	Copyright (C) 2014 Michael McMaster <michael@codesrc.com>////	This file is part of SCSI2SD.////	SCSI2SD is free software: you can redistribute it and/or modify//	it under the terms of the GNU General Public License as published by//	the Free Software Foundation, either version 3 of the License, or//	(at your option) any later version.////	SCSI2SD is distributed in the hope that it will be useful,//	but WITHOUT ANY WARRANTY; without even the implied warranty of//	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the//	GNU General Public License for more details.////	You should have received a copy of the GNU General Public License//	along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.#ifndef scsi2sd_h#define scsi2sd_h#ifdef __cplusplusextern "C" {#endif/* Common type definitions shared between the firmware and config tools	The configuration data is now stored on the SD card, occupying the	last 2 sectors.	BoardConfig	TargetConfig (disk 0)	TargetConfig (disk 1)	TargetConfig (disk 2)	TargetConfig (disk 3)	TargetConfig (disk 4)	TargetConfig (disk 5)	TargetConfig (disk 6)*/#include "stdint.h"#define S2S_MAX_TARGETS 8#define S2S_CFG_SIZE (S2S_MAX_TARGETS * sizeof(S2S_TargetCfg) + sizeof(S2S_BoardCfg))typedef enum{	S2S_CFG_TARGET_ID_BITS = 0x07,	S2S_CFG_TARGET_ENABLED = 0x80} S2S_CFG_TARGET_FLAGS;typedef enum{	S2S_CFG_ENABLE_UNIT_ATTENTION = 1,	S2S_CFG_ENABLE_PARITY = 2,	S2S_CFG_ENABLE_SCSI2 = 4,	S2S_CFG_DISABLE_GLITCH = 8,	S2S_CFG_ENABLE_CACHE = 16,	S2S_CFG_ENABLE_DISCONNECT = 32,	S2S_CFG_ENABLE_SEL_LATCH = 64,	S2S_CFG_MAP_LUNS_TO_IDS = 128} S2S_CFG_FLAGS;typedef enum{	S2S_CFG_ENABLE_TERMINATOR = 1	//S2S_CFG_ENABLE_BLIND_WRITES = 2, // Obsolete} S2S_CFG_FLAGS6;typedef enum{	S2S_CFG_FIXED,	S2S_CFG_REMOVEABLE,	S2S_CFG_OPTICAL,	S2S_CFG_FLOPPY_14MB,	S2S_CFG_MO,	S2S_CFG_SEQUENTIAL} S2S_CFG_TYPE;typedef enum{	S2S_CFG_QUIRKS_NONE = 0,	S2S_CFG_QUIRKS_APPLE = 1,	S2S_CFG_QUIRKS_OMTI = 2,	S2S_CFG_QUIRKS_XEBEC = 4,	S2S_CFG_QUIRKS_VMS = 8,	S2S_CFG_QUIRKS_EMU = 9} S2S_CFG_QUIRKS;typedef enum{	S2S_CFG_SPEED_NoLimit,	S2S_CFG_SPEED_ASYNC_15,	S2S_CFG_SPEED_ASYNC_33,	S2S_CFG_SPEED_ASYNC_50,	S2S_CFG_SPEED_SYNC_5,	S2S_CFG_SPEED_SYNC_10,	S2S_CFG_SPEED_TURBO} S2S_CFG_SPEED;typedef struct __attribute__((packed)){	// bits 7 -> 3 = S2S_CFG_TARGET_FLAGS	// bits 2 -> 0 = target SCSI ID.	uint8_t scsiId;	uint8_t deviceType; // S2S_CFG_TYPE	uint8_t flagsDEPRECATED; // S2S_CFG_FLAGS, removed in v4.5	uint8_t deviceTypeModifier; // Used in INQUIRY response.	uint32_t sdSectorStart;	uint32_t scsiSectors;	uint16_t bytesPerSector;	// Max allowed by legacy IBM-PC bios is 6 bits (63)	uint16_t sectorsPerTrack;	// MS-Dos up to 7.10 will crash on >= 256 heads.	uint16_t headsPerCylinder;	char vendor[8];	char prodId[16];	char revision[4];	char serial[16];	uint16_t quirks; // S2S_CFG_QUIRKS	uint8_t reserved[64]; // Pad out to 128 bytes for main section.} S2S_TargetCfg;typedef struct __attribute__((packed)){	char magic[4]; // 'BCFG'	uint8_t flags; // S2S_CFG_FLAGS	uint8_t startupDelay; // Seconds.	uint8_t selectionDelay; // milliseconds. 255 = auto	uint8_t flags6; // S2S_CFG_FLAGS6	uint8_t scsiSpeed;	uint8_t reserved[119]; // Pad out to 128 bytes} S2S_BoardCfg;typedef enum{	S2S_CMD_NONE, // Invalid	// Command content:	// uint8_t S2S_CFG_PING	// Response:	// S2S_CFG_STATUS	S2S_CMD_PING,	// Command content:	// uint8_t S2S_CFG_WRITEFLASH	// uint8_t[256] flashData	// uint8_t flashArray	// uint8_t flashRow	// Response:	// S2S_CFG_STATUS	S2S_CMD_WRITEFLASH,	// Command content:	// uint8_t S2S_CFG_READFLASH	// uint8_t flashArray	// uint8_t flashRow	// Response:	// 256 bytes of flash	S2S_CMD_READFLASH,	// Command content:	// uint8_t S2S_CFG_REBOOT	// Response: None.	S2S_CMD_REBOOT,	// Command content:	// uint8_t S2S_CFG_INFO	// Response:	// uint8_t[16] CSD	// uint8_t[16] CID	S2S_CMD_SDINFO,	// Command content:	// uint8_t S2S_CFG_SCSITEST	// Response:	// S2S_CFG_STATUS	// uint8_t result code (0 = passed)	S2S_CMD_SCSITEST,	// Command content:	// uint8_t S2S_CFG_DEVINFO	// Response:	// uint16_t protocol version (MSB)	// uint16_t firmware version (MSB)	// uint32_t SD capacity(MSB)	S2S_CMD_DEVINFO,	// Command content:	// uint8_t S2S_CFG_SD_WRITE	// uint32_t Sector Number (MSB)	// uint8_t[512] data	// Response:	// S2S_CFG_STATUS	S2S_CMD_SD_WRITE,	// Command content:	// uint8_t S2S_CFG_SD_READ	// uint32_t Sector Number (MSB)	// Response:	// 512 bytes of data	S2S_CMD_SD_READ,	// Command content:	// uint8_t S2S_CFG_DEBUG	// Response:	S2S_CMD_DEBUG,} S2S_COMMAND;typedef enum{	S2S_CFG_STATUS_GOOD,	S2S_CFG_STATUS_ERR,	S2S_CFG_STATUS_BUSY} S2S_CFG_STATUS;#ifdef __cplusplus} // extern "C"	#include <type_traits>	static_assert(		std::is_pod<S2S_TargetCfg>::value, "Misuse of TargetConfig struct"		);	static_assert(		sizeof(S2S_TargetCfg) == 128,		"TargetConfig struct size mismatch"		);	static_assert(		std::is_pod<S2S_BoardCfg>::value, "Misuse of BoardConfig struct"		);	static_assert(		sizeof(S2S_BoardCfg) == 128,		"BoardConfig struct size mismatch"		);#endif#endif
 |