memcpy(scsiDev.data, SimpleTOC, len);
uint32_t capacity = getScsiCapacity(
- scsoDev.target->device,
+ scsiDev.target->device,
scsiDev.target->cfg->sdSectorStart,
scsiDev.target->state.bytesPerSector,
scsiDev.target->cfg->scsiSectors);
static int usbDebugEpState;\r
static int usbReady;\r
\r
-static void initBoardConfig(BoardConfig* config) {\r
+static void initBoardConfig(S2S_BoardConfig* config) {\r
memcpy(\r
config,\r
(\r
(CY_FLASH_SIZEOF_ARRAY * (size_t) SCSI_CONFIG_ARRAY) +\r
(CY_FLASH_SIZEOF_ROW * SCSI_CONFIG_BOARD_ROW)\r
),\r
- sizeof(BoardConfig));\r
+ sizeof(S2S_BoardConfig));\r
\r
if (memcmp(config->magic, "BCFG", 4)) {\r
// Set a default from the deprecated flags, or 0 if\r
}\r
}\r
\r
-void configInit(BoardConfig* config)\r
+void configInit(S2S_BoardConfig* config)\r
{\r
// The USB block will be powered by an internal 3.3V regulator.\r
// The PSoC must be operating between 4.6V and 5V for the regulator\r
usbReady = 0; // We don't know if host is connected yet.\r
\r
int invalid = 1;\r
- uint8_t* rawConfig = getConfigByIndex(0);\r
+ uint8_t* rawConfig = (uint8_t*)getConfigByIndex(0);\r
int i;\r
for (i = 0; i < 64; ++i)\r
{\r
int cfgIdx;\r
for (cfgIdx = 0; cfgIdx < MAX_SCSI_TARGETS; ++cfgIdx)\r
{\r
- const TargetConfig* tgt = getConfigByIndex(cfgIdx);\r
+ const S2S_TargetCfg* tgt = getConfigByIndex(cfgIdx);\r
if ((tgt->scsiId & CONFIG_TARGET_ID_BITS) == scsiId)\r
{\r
// Save row to flash\r
// We only save the first row of the configuration\r
// this contains the parameters changeable by a MODE SELECT command\r
uint8_t rowData[CYDEV_FLS_ROW_SIZE];\r
- TargetConfig* rowCfgData = (TargetConfig*)&rowData;\r
+ S2S_TargetCfg* rowCfgData = (S2S_TargetCfg*)&rowData;\r
memcpy(rowCfgData, tgt, sizeof(rowData));\r
rowCfgData->bytesPerSector = bytesPerSector;\r
\r
}\r
\r
\r
-const TargetConfig* getConfigByIndex(int i)\r
+const S2S_TargetCfg* getConfigByIndex(int i)\r
{\r
if (i <= 3)\r
{\r
size_t row = SCSI_CONFIG_0_ROW + (i * SCSI_CONFIG_ROWS);\r
- return (const TargetConfig*)\r
+ return (const S2S_TargetCfg*)\r
(\r
CY_FLASH_BASE +\r
(CY_FLASH_SIZEOF_ARRAY * (size_t) SCSI_CONFIG_ARRAY) +\r
);\r
} else {\r
size_t row = SCSI_CONFIG_4_ROW + ((i-4) * SCSI_CONFIG_ROWS);\r
- return (const TargetConfig*)\r
+ return (const S2S_TargetCfg*)\r
(\r
CY_FLASH_BASE +\r
(CY_FLASH_SIZEOF_ARRAY * (size_t) SCSI_CONFIG_ARRAY) +\r
}\r
}\r
\r
-const TargetConfig* getConfigById(int scsiId)\r
+const S2S_TargetCfg* getConfigById(int scsiId)\r
{\r
int i;\r
for (i = 0; i < MAX_SCSI_TARGETS; ++i)\r
{\r
- const TargetConfig* tgt = getConfigByIndex(i);\r
+ const S2S_TargetCfg* tgt = getConfigByIndex(i);\r
if ((tgt->scsiId & CONFIG_TARGET_ID_BITS) == scsiId)\r
{\r
return tgt;\r
#include "device.h"\r
#include "scsi2sd.h"\r
\r
-void configInit(BoardConfig* config);\r
+void configInit(S2S_BoardConfig* config);\r
void debugInit(void);\r
void configPoll(void);\r
void configSave(int scsiId, uint16_t byesPerSector);\r
\r
-const TargetConfig* getConfigByIndex(int index);\r
-const TargetConfig* getConfigById(int scsiId);\r
+const S2S_TargetCfg* getConfigByIndex(int index);\r
+const S2S_TargetCfg* getConfigById(int scsiId);\r
\r
#endif\r
{\r
// Save the "MODE SELECT savable parameters"\r
configSave(\r
- scsiDev.target->targetId,\r
+ scsiDev.target->cfg->scsiId & CONFIG_TARGET_ID_BITS,\r
scsiDev.target->state.bytesPerSector);\r
}\r
\r
\r
uint32_t capacity = getScsiCapacity(\r
scsiDev.target->device,\r
- scsiDev.device,\r
scsiDev.target->cfg->sdSectorStart,\r
scsiDev.target->state.bytesPerSector,\r
scsiDev.target->cfg->scsiSectors);\r
}\r
else if (unlikely(((uint64) lba) + blocks >\r
getScsiCapacity(\r
- scsiDev->device,\r
+ scsiDev.target->device,\r
scsiDev.target->cfg->sdSectorStart,\r
bytesPerSector,\r
scsiDev.target->cfg->scsiSectors\r
}\r
\r
uint32_t capacity = getScsiCapacity(\r
+ scsiDev.target->device,\r
scsiDev.target->cfg->sdSectorStart,\r
scsiDev.target->state.bytesPerSector,\r
scsiDev.target->cfg->scsiSectors);\r
{\r
if (lba >=\r
getScsiCapacity(\r
+ scsiDev.target->device,\r
scsiDev.target->cfg->sdSectorStart,\r
scsiDev.target->state.bytesPerSector,\r
scsiDev.target->cfg->scsiSectors)\r
#include <string.h>\r
\r
uint32_t getScsiCapacity(\r
+ S2S_Device* device,\r
uint32_t sdSectorStart,\r
uint16_t bytesPerSector,\r
uint32_t scsiSectors)\r
{\r
+ uint32_t devCapacity = device->getCapacity(device);\r
+ \r
uint32_t capacity =\r
- (sdDev.capacity - sdSectorStart) /\r
+ (devCapacity - sdSectorStart) /\r
SDSectorsPerSCSISector(bytesPerSector);\r
\r
- if (sdDev.capacity == 0)\r
+ if (devCapacity == 0)\r
{\r
capacity = 0;\r
}\r
- else if (sdSectorStart >= sdDev.capacity)\r
+ else if (sdSectorStart >= devCapacity)\r
{\r
capacity = 0;\r
}\r
#include "config.h"
#include "storedevice.h"
-
+#include "sd.h"
+
typedef enum
{
ADDRESS_BLOCK = 0,
'S','C','S','I','-','2'
};
-static void useCustomVPD(const TargetConfig* cfg, int pageCode)
+static void useCustomVPD(const S2S_TargetCfg* cfg, int pageCode)
{
int cfgIdx = 0;
int found = 0;
}
else
{
- const TargetConfig* config = scsiDev.target->cfg;
+ const S2S_TargetCfg* config = scsiDev.target->cfg;
memcpy(scsiDev.data, StandardResponse, sizeof(StandardResponse));
scsiDev.data[1] = scsiDev.target->cfg->deviceTypeModifier;
{
memcpy(scsiDev.data, UnitSerialNumber, sizeof(UnitSerialNumber));
scsiDev.dataLen = sizeof(UnitSerialNumber);
- const TargetConfig* config = scsiDev.target->cfg;
+ const S2S_TargetCfg* config = scsiDev.target->cfg;
memcpy(&scsiDev.data[4], config->serial, sizeof(config->serial));
scsiDev.phase = DATA_IN;
}
configInit(&scsiDev.boardCfg);\r
debugInit();\r
\r
-\r
scsiPhyConfig();\r
\r
scsiInit();\r
scsiDev.target &&\r
(scsiDev.target->device->mediaState & MEDIA_PRESENT))\r
{\r
- scsiDev.target->device->pollMediaBusy();\r
+ scsiDev.target->device->pollMediaBusy(scsiDev.target->device);\r
}\r
}\r
return 0;\r
}\r
}\r
\r
-static int useCustomPages(const TargetConfig* cfg, int pc, int pageCode, int* idx)\r
+static int useCustomPages(const S2S_TargetCfg* cfg, int pc, int pageCode, int* idx)\r
{\r
int found = 0;\r
int cfgIdx = 0;\r
scsiDev.target->state.bytesPerSector = bytesPerSector;\r
if (bytesPerSector != scsiDev.target->cfg->bytesPerSector)\r
{\r
- configSave(scsiDev.target->targetId, bytesPerSector);\r
+ configSave(scsiDev.target->cfg->scsiId & CONFIG_TARGET_ID_BITS, bytesPerSector);\r
}\r
}\r
}\r
scsiDev.target->state.bytesPerSector = bytesPerSector;\r
if (scsiDev.cdb[1] & 1) // SP Save Pages flag\r
{\r
- configSave(scsiDev.target->targetId, bytesPerSector);\r
+ configSave(scsiDev.target->cfg->scsiId & CONFIG_TARGET_ID_BITS, bytesPerSector);\r
}\r
}\r
break;\r
if ((scsiDev.lun > 0) && (scsiDev.boardCfg.flags & CONFIG_MAP_LUNS_TO_IDS))\r
{\r
S2S_Target* lunTarget = s2s_DeviceFindByScsiId(scsiDev.lun);\r
- if (lunTarget! = NULL)\r
+ if (lunTarget != NULL)\r
{\r
scsiDev.target = lunTarget;\r
scsiDev.lun = 0;\r
control = scsiDev.cdb[scsiDev.cdbLen - 1];\r
\r
scsiDev.cmdCount++;\r
- const TargetConfig* cfg = scsiDev.target->cfg;\r
+ const S2S_TargetCfg* cfg = scsiDev.target->cfg;\r
\r
if (unlikely(scsiDev.resetFlag))\r
{\r
int atnFlag = SCSI_ReadFilt(SCSI_Filt_ATN);\r
\r
S2S_Target* target = NULL;\r
- for (int testIdx = 0; testtIndex < 8; ++testtIndex)\r
+ for (int testIdx = 0; testIdx < 8; ++testIdx)\r
{\r
target = s2s_DeviceFindByScsiId(1 << testIdx);\r
if (target)\r
// SCSI1/SASI initiators may not set their own ID.\r
{\r
int i;\r
- uint8_t initiatorMask = mask ^ (1 << target->targetId);\r
+ uint8_t initiatorMask = mask ^ (1 << (target->cfg->scsiId & CONFIG_TARGET_ID_BITS));\r
scsiDev.initiatorId = -1;\r
for (i = 0; i < 8; ++i)\r
{\r
for (int devIdx = 0; devIdx < deviceCount; ++devIdx)\r
{\r
int targetCount;\r
- S2S_Target* targets = devices[deviceIdx].getTargets(devices + deviceIdx, &targetCount);\r
+ S2S_Target* targets = allDevices[devIdx].getTargets(allDevices + devIdx, &targetCount);\r
\r
for (int i = 0; i < targetCount; ++i)\r
{\r
S2S_TargetState* state = &(targets[i].state);\r
\r
- scsiDev.targets[i].state.reservedId = -1;\r
- scsiDev.targets[i].state.reserverId = -1;\r
- scsiDev.targets[i].state.unitAttention = POWER_ON_RESET;\r
- scsiDev.targets[i].state.sense.code = NO_SENSE;\r
- scsiDev.targets[i].state.sense.asc = NO_ADDITIONAL_SENSE_INFORMATION;\r
+ state->reservedId = -1;\r
+ state->reserverId = -1;\r
+ state->unitAttention = POWER_ON_RESET;\r
+ state->sense.code = NO_SENSE;\r
+ state->sense.asc = NO_ADDITIONAL_SENSE_INFORMATION;\r
\r
state->bytesPerSector = targets[i].cfg->bytesPerSector;\r
}\r
{\r
// Arbitrate.\r
ledOn();\r
- uint8_t scsiIdMask = 1 << scsiDev.target->targetId;\r
+ uint8_t scsiIdMask = 1 << (scsiDev.target->cfg->scsiId & CONFIG_TARGET_ID_BITS);\r
SCSI_Out_Bits_Write(scsiIdMask);\r
SCSI_Out_Ctl_Write(1); // Write bits manually.\r
SCSI_SetPin(SCSI_Out_BSY);\r
typedef struct
{
S2S_Target* target;
+ S2S_BoardConfig boardCfg;
// Set to true (1) if the ATN flag was set, and we need to
// enter the MESSAGE_OUT phase.
static void sd_pollMediaBusy(S2S_Device* dev);\r
\r
// Global\r
-SdCard sdCard S2S_DMA_ALIGN = {\r
+SdCard sdCard = {\r
{\r
sd_earlyInit,\r
sd_getTargets,\r
// LOGICAL_UNIT_NOT_READY_INITIALIZING_COMMAND_REQUIRED sense\r
// code, even if they stopped it first with\r
// START STOP UNIT command.\r
- blockDev.state |= DISK_STARTED;\r
+ sdCard.dev.mediaState |= MEDIA_STARTED;\r
\r
if (!firstInit)\r
{\r
int i;\r
for (i = 0; i < MAX_SCSI_TARGETS; ++i)\r
{\r
- scsiDev.targets[i].unitAttention = PARAMETERS_CHANGED;\r
+ sdCard.targets[i].state.unitAttention = PARAMETERS_CHANGED;\r
}\r
}\r
firstInit = 0;\r
{\r
SdCard* sdCardDevice = (SdCard*)dev;\r
\r
- for (int i = 0; i < MAX_TARGETS; ++i)\r
+ for (int i = 0; i < MAX_SCSI_TARGETS; ++i)\r
{\r
sdCardDevice->targets[i].device = dev;\r
sdCardDevice->targets[i].cfg = getConfigByIndex(i);\r
}\r
- sdCardDevice->lastPollMediaTime = s2s_getTime_ms();\r
+ sdCardDevice->lastPollMediaTime = getTime_ms();\r
\r
// Don't require the host to send us a START STOP UNIT command\r
sdCardDevice->dev.mediaState = MEDIA_STARTED;\r
static S2S_Target* sd_getTargets(S2S_Device* dev, int* count)\r
{\r
SdCard* sdCardDevice = (SdCard*)dev;\r
- *count = MAX_TARGETS;\r
+ *count = MAX_SCSI_TARGETS;\r
return sdCardDevice->targets;\r
}\r
\r
static int sd_pollMediaChange(S2S_Device* dev)\r
{\r
SdCard* sdCardDevice = (SdCard*)dev;\r
- if (s2s_elapsedTime_ms(sdCardDevice->lastPollMediaTime) > 200)\r
+ if (elapsedTime_ms(sdCardDevice->lastPollMediaTime) > 200)\r
{\r
- sdCardDevice->lastPollMediaTime = s2s_getTime_ms();\r
+ sdCardDevice->lastPollMediaTime = getTime_ms();\r
sdCheckPresent();\r
return 0;\r
}\r
static void sd_pollMediaBusy(S2S_Device* dev)\r
{\r
SdCard* sdCardDevice = (SdCard*)dev;\r
- sdCardDevice->lastPollMediaTime = s2s_getTime_ms();\r
+ sdCardDevice->lastPollMediaTime = getTime_ms();\r
}\r
\r
{
S2S_Device dev;
- S2S_Target targets[MAX_TARGETS];
+ S2S_Target targets[MAX_SCSI_TARGETS];
int version; // SDHC = version 2.
int ccs; // Card Capacity Status. 1 = SDHC or SDXC
- uint32 capacity; // in 512 byte blocks
+ uint32_t capacity; // in 512 byte blocks
uint8_t csd[16]; // Unparsed CSD
uint8_t cid[16]; // Unparsed CID
typedef struct
{
- uint8 code;
- uint16 asc;
+ uint8_t code;
+ uint16_t asc;
} ScsiSense;
#endif
{
S2S_Target* target = targets + targetIdx;
if (target &&
- (target->cfg->scsiId & S2S_CFG_TARGET_ENABLED) &&
- ((target->cfg->scsiId & S2S_CFG_TARGET_ID_BITS) == scsiId))
+ (target->cfg->scsiId & CONFIG_TARGET_ENABLED) &&
+ ((target->cfg->scsiId & CONFIG_TARGET_ID_BITS) == scsiId))
{
return target;
}
<build_action v="SOURCE_C;;;;" />
<PropertyDeltas />
</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
+<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
+<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="storedevice.c" persistent="..\..\src\storedevice.c">
+<Hidden v="False" />
+</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
+<build_action v="SOURCE_C;;;;" />
+<PropertyDeltas />
+</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
</dependencies>
</CyGuid_0820c2e7-528d-4137-9a08-97257b946089>
</CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8>
<build_action v="HEADER;;;;" />
<PropertyDeltas />
</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
+<CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtFileSerialize" version="3" xml_contents_version="1">
+<CyGuid_31768f72-0253-412b-af77-e7dba74d1330 type_name="CyDesigner.Common.ProjMgmt.Model.CyPrjMgmtItemSerialize" version="2" name="storedevice.h" persistent="..\..\src\storedevice.h">
+<Hidden v="False" />
+</CyGuid_31768f72-0253-412b-af77-e7dba74d1330>
+<build_action v="HEADER;;;;" />
+<PropertyDeltas />
+</CyGuid_8b8ab257-35d3-4473-b57b-36315200b38b>
</dependencies>
</CyGuid_0820c2e7-528d-4137-9a08-97257b946089>
</CyGuid_2f73275c-45bf-46ba-b3b1-00a2fe0c8dd8>
uint8_t modePages[1024];
uint8_t vpd[1024];
uint8_t unused[1024]; // Total size is 4k.
-} TargetConfig;
+} S2S_TargetCfg;
typedef struct __attribute__((packed))
{
uint8_t reserved[247]; // Pad out to 256 bytes
-} BoardConfig;
+} S2S_BoardConfig;
typedef enum
{