Implemented Stop/Eject command passthrough

Conflicts:
	Downstream/.cproject
	Downstream/Inc/downstream_interface_def.h
	Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc.c
	Downstream/Middlewares/ST/STM32_USB_Host_Library/Class/MSC/Src/usbh_msc_scsi.c
	Downstream/Src/downstream_msc.c
	Upstream/Inc/upstream_interface_def.h
	Upstream/Inc/upstream_msc.h
	Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c
	Upstream/Src/upstream_msc.c
USG_1.0
Robert Fisk 5 years ago
parent 1ea38b2150
commit 1147d2ebf9

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-502463437729405753" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-99090171267255403" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>
@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-536018969469464607" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-132645703007314257" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>

@ -49,8 +49,9 @@ typedef enum
{ {
COMMAND_MSC_TEST_UNIT_READY, //Returns HAL_StatusTypeDef result COMMAND_MSC_TEST_UNIT_READY, //Returns HAL_StatusTypeDef result
COMMAND_MSC_GET_CAPACITY, //Returns uint32_t blk_nbr, uint32_t blk_size COMMAND_MSC_GET_CAPACITY, //Returns uint32_t blk_nbr, uint32_t blk_size
COMMAND_MSC_READ, //Returns HAL_StatusTypeDef result, then data stream COMMAND_MSC_READ, //Returns data stream or error packet
COMMAND_MSC_WRITE, //Returns HAL_OK, HAL_ERROR if medium not present, HAL_BUSY if write-protected result, then waits for data stream COMMAND_MSC_WRITE, //Waits for data stream or returns error packet
COMMAND_MSC_DISCONNECT //Returns same packet after sending Stop command to device
} }
InterfaceCommandMscTypeDef; InterfaceCommandMscTypeDef;
@ -65,8 +66,8 @@ InterfaceCommandHidTypeDef;
typedef enum typedef enum
{ {
COMMAND_ERROR_GENERIC, COMMAND_ERROR_GENERIC, //Something went wrong, time to FREAKOUT
COMMAND_ERROR_DEVICE_DISCONNECTED, COMMAND_ERROR_DEVICE_DISCONNECTED, //Device unexpectedly disconnected
} }
InterfaceCommandErrorTypeDef; InterfaceCommandErrorTypeDef;

@ -56,7 +56,7 @@ typedef enum
MSC_READ, MSC_READ,
MSC_WRITE, MSC_WRITE,
MSC_UNRECOVERED_ERROR, MSC_UNRECOVERED_ERROR,
MSC_PERIODIC_CHECK, MSC_START_STOP,
} }
MSC_StateTypeDef; MSC_StateTypeDef;
@ -99,7 +99,7 @@ typedef struct
MSC_LUNTypeDef; MSC_LUNTypeDef;
typedef void (*MSC_RdWrCompleteCallback)(USBH_StatusTypeDef result); typedef void (*MSC_CmdCompleteCallback)(USBH_StatusTypeDef result);
/* Structure for MSC process */ /* Structure for MSC process */
typedef struct _MSC_Process typedef struct _MSC_Process
@ -121,7 +121,7 @@ typedef struct _MSC_Process
uint16_t rw_lun; uint16_t rw_lun;
uint32_t timeout; uint32_t timeout;
uint32_t retry_timeout; uint32_t retry_timeout;
MSC_RdWrCompleteCallback RdWrCompleteCallback; MSC_CmdCompleteCallback CmdCompleteCallback;
} }
MSC_HandleTypeDef; MSC_HandleTypeDef;
@ -152,6 +152,9 @@ MSC_HandleTypeDef;
#define MSC_STARTUP_TIMEOUT_MS 15000 #define MSC_STARTUP_TIMEOUT_MS 15000
#define MSC_STARTUP_RETRY_TIME_MS 100 #define MSC_STARTUP_RETRY_TIME_MS 100
#define MSC_START_STOP_EJECT_FLAG 0
#define MSC_START_STOP_LOAD_FLAG 1
/** /**
* @} * @}
*/ */
@ -183,7 +186,9 @@ uint8_t USBH_MSC_IsReady (USBH_HandleTypeDef *phost);
/* APIs for LUN */ /* APIs for LUN */
int8_t USBH_MSC_GetMaxLUN (USBH_HandleTypeDef *phost); int8_t USBH_MSC_GetMaxLUN (USBH_HandleTypeDef *phost);
uint8_t USBH_MSC_UnitIsReady (USBH_HandleTypeDef *phost, uint8_t lun); uint8_t USBH_MSC_UnitIsReady (USBH_HandleTypeDef *phost,
uint8_t lun,
MSC_CmdCompleteCallback callback);
USBH_StatusTypeDef USBH_MSC_GetLUNInfo(USBH_HandleTypeDef *phost, uint8_t lun, MSC_LUNTypeDef *info); USBH_StatusTypeDef USBH_MSC_GetLUNInfo(USBH_HandleTypeDef *phost, uint8_t lun, MSC_LUNTypeDef *info);
@ -191,13 +196,19 @@ USBH_StatusTypeDef USBH_MSC_Read(USBH_HandleTypeDef *phost,
uint8_t lun, uint8_t lun,
uint32_t address, uint32_t address,
uint32_t length, uint32_t length,
MSC_RdWrCompleteCallback callback); MSC_CmdCompleteCallback callback);
USBH_StatusTypeDef USBH_MSC_Write(USBH_HandleTypeDef *phost, USBH_StatusTypeDef USBH_MSC_Write(USBH_HandleTypeDef *phost,
uint8_t lun, uint8_t lun,
uint32_t address, uint32_t address,
uint32_t length, uint32_t length,
MSC_RdWrCompleteCallback callback); MSC_CmdCompleteCallback callback);
USBH_StatusTypeDef USBH_MSC_StartStopUnit(USBH_HandleTypeDef *phost,
uint8_t lun,
uint8_t startStop,
MSC_CmdCompleteCallback callback);
/** /**
* @} * @}
*/ */

@ -94,11 +94,13 @@ typedef struct
#define OPCODE_WRITE10 0x2A #define OPCODE_WRITE10 0x2A
#define OPCODE_REQUEST_SENSE 0x03 #define OPCODE_REQUEST_SENSE 0x03
#define OPCODE_INQUIRY 0x12 #define OPCODE_INQUIRY 0x12
#define OPCODE_START_STOP_UNIT 0x1B
#define DATA_LEN_MODE_TEST_UNIT_READY 0 #define DATA_LEN_MODE_TEST_UNIT_READY 0
#define DATA_LEN_READ_CAPACITY10 8 #define DATA_LEN_READ_CAPACITY10 8
#define DATA_LEN_INQUIRY 36 #define DATA_LEN_INQUIRY 36
#define DATA_LEN_REQUEST_SENSE 14 #define DATA_LEN_REQUEST_SENSE 14
#define DATA_LEN_START_STOP_UNIT 0
#define CBW_CB_LENGTH 16 #define CBW_CB_LENGTH 16
#define CBW_LENGTH 10 #define CBW_LENGTH 10
@ -195,6 +197,9 @@ USBH_StatusTypeDef USBH_MSC_SCSI_Read(USBH_HandleTypeDef *phost,
uint32_t address, uint32_t address,
uint32_t length); uint32_t length);
USBH_StatusTypeDef USBH_MSC_SCSI_StartStopUnit (USBH_HandleTypeDef *phost,
uint8_t lun,
uint8_t startStop);
/** /**
* @} * @}

@ -201,7 +201,7 @@ static USBH_StatusTypeDef USBH_MSC_InterfaceInit (USBH_HandleTypeDef *phost)
MSC_Handle->req_state = MSC_REQ_IDLE; MSC_Handle->req_state = MSC_REQ_IDLE;
MSC_Handle->OutPipe = USBH_AllocPipe(phost, MSC_Handle->OutEp); MSC_Handle->OutPipe = USBH_AllocPipe(phost, MSC_Handle->OutEp);
MSC_Handle->InPipe = USBH_AllocPipe(phost, MSC_Handle->InEp); MSC_Handle->InPipe = USBH_AllocPipe(phost, MSC_Handle->InEp);
MSC_Handle->RdWrCompleteCallback = NULL; MSC_Handle->CmdCompleteCallback = NULL;
USBH_MSC_BOT_Init(phost); USBH_MSC_BOT_Init(phost);
@ -346,6 +346,7 @@ static USBH_StatusTypeDef USBH_MSC_Process(USBH_HandleTypeDef *phost)
USBH_StatusTypeDef scsi_status = USBH_BUSY ; USBH_StatusTypeDef scsi_status = USBH_BUSY ;
USBH_StatusTypeDef ready_status = USBH_BUSY ; USBH_StatusTypeDef ready_status = USBH_BUSY ;
switch (MSC_Handle->state) switch (MSC_Handle->state)
{ {
case MSC_INIT: case MSC_INIT:
@ -360,7 +361,7 @@ static USBH_StatusTypeDef USBH_MSC_Process(USBH_HandleTypeDef *phost)
case MSC_INIT: case MSC_INIT:
USBH_UsrLog ("LUN #%d: ", MSC_Handle->current_lun); USBH_UsrLog ("LUN #%d: ", MSC_Handle->current_lun);
MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_READ_INQUIRY; MSC_Handle->unit[MSC_Handle->current_lun].state = MSC_READ_INQUIRY;
MSC_Handle->timeout = phost->Timer; MSC_Handle->timeout = HAL_GetTick();
//Fallthrough //Fallthrough
case MSC_READ_INQUIRY: case MSC_READ_INQUIRY:
@ -519,7 +520,7 @@ static USBH_StatusTypeDef USBH_MSC_Process(USBH_HandleTypeDef *phost)
#endif #endif
case MSC_READ: case MSC_READ:
error = USBH_MSC_RdWrProcess(phost, MSC_Handle->rw_lun); error = USBH_MSC_RdWrProcess(phost, MSC_Handle->rw_lun);
if(((int32_t)(phost->Timer - MSC_Handle->timeout) > 0) || (phost->device.is_connected == 0)) if(((int32_t)(HAL_GetTick() - MSC_Handle->timeout) > 0) || (phost->device.is_connected == 0))
{ {
error = USBH_FAIL; error = USBH_FAIL;
} }
@ -527,10 +528,53 @@ static USBH_StatusTypeDef USBH_MSC_Process(USBH_HandleTypeDef *phost)
if (error != USBH_BUSY) if (error != USBH_BUSY)
{ {
MSC_Handle->state = MSC_IDLE; MSC_Handle->state = MSC_IDLE;
if (MSC_Handle->RdWrCompleteCallback != NULL) if (MSC_Handle->CmdCompleteCallback != NULL)
{
MSC_Handle->CmdCompleteCallback(error);
MSC_Handle->CmdCompleteCallback = NULL;
}
}
break;
case MSC_TEST_UNIT_READY:
error = USBH_MSC_SCSI_TestUnitReady(phost, MSC_Handle->rw_lun);
if (((int32_t)(HAL_GetTick() - MSC_Handle->timeout) > 0) || (phost->device.is_connected == 0))
{
error = USBH_FAIL;
}
if (error != USBH_BUSY)
{
MSC_Handle->state = MSC_IDLE;
if (error == USBH_OK)
{
MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_OK;
}
else
{
MSC_Handle->unit[MSC_Handle->current_lun].error = MSC_NOT_READY;
}
if (MSC_Handle->CmdCompleteCallback != NULL)
{
MSC_Handle->CmdCompleteCallback(error);
MSC_Handle->CmdCompleteCallback = NULL;
}
}
break;
case MSC_START_STOP:
error = USBH_MSC_SCSI_StartStopUnit(phost, MSC_Handle->rw_lun, 0);
if((error != USBH_BUSY) ||
((int32_t)(HAL_GetTick() - MSC_Handle->timeout) > 0) || (phost->device.is_connected == 0))
{
MSC_Handle->state = MSC_IDLE;
error = USBH_OK;
if (MSC_Handle->CmdCompleteCallback != NULL)
{ {
MSC_Handle->RdWrCompleteCallback(error); MSC_Handle->CmdCompleteCallback(USBH_OK);
MSC_Handle->RdWrCompleteCallback = NULL; MSC_Handle->CmdCompleteCallback = NULL;
} }
} }
break; break;
@ -650,26 +694,6 @@ static USBH_StatusTypeDef USBH_MSC_RdWrProcess(USBH_HandleTypeDef *phost, uint8_
} }
/**
* @brief USBH_MSC_IsReady
* The function check if the MSC function is ready
* @param phost: Host handle
* @retval USBH Status
*/
uint8_t USBH_MSC_IsReady (USBH_HandleTypeDef *phost)
{
MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData;
if(phost->gState == HOST_CLASS)
{
return (MSC_Handle->state == MSC_IDLE);
}
else
{
return 0;
}
}
/** /**
* @brief USBH_MSC_GetMaxLUN * @brief USBH_MSC_GetMaxLUN
* The function return the Max LUN supported * The function return the Max LUN supported
@ -694,18 +718,25 @@ int8_t USBH_MSC_GetMaxLUN (USBH_HandleTypeDef *phost)
* @param lun: logical Unit Number * @param lun: logical Unit Number
* @retval Lun status (0: not ready / 1: ready) * @retval Lun status (0: not ready / 1: ready)
*/ */
uint8_t USBH_MSC_UnitIsReady (USBH_HandleTypeDef *phost, uint8_t lun) uint8_t USBH_MSC_UnitIsReady (USBH_HandleTypeDef *phost,
uint8_t lun,
MSC_CmdCompleteCallback callback)
{ {
MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData;
if(phost->gState == HOST_CLASS) if ((phost->device.is_connected == 0) ||
{ (phost->gState != HOST_CLASS) ||
return (MSC_Handle->unit[lun].error == MSC_OK); (MSC_Handle->state != MSC_IDLE))
}
else
{ {
return 0; return USBH_FAIL;
} }
MSC_Handle->state = MSC_TEST_UNIT_READY;
MSC_Handle->rw_lun = lun;
MSC_Handle->CmdCompleteCallback = callback;
MSC_Handle->timeout = HAL_GetTick() + MSC_TIMEOUT_FIXED_MS;
return USBH_MSC_SCSI_TestUnitReady(phost, lun);
} }
/** /**
@ -743,7 +774,7 @@ USBH_StatusTypeDef USBH_MSC_Read(USBH_HandleTypeDef *phost,
uint8_t lun, uint8_t lun,
uint32_t address, uint32_t address,
uint32_t length, uint32_t length,
MSC_RdWrCompleteCallback callback) MSC_CmdCompleteCallback callback)
{ {
MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData;
@ -758,14 +789,13 @@ USBH_StatusTypeDef USBH_MSC_Read(USBH_HandleTypeDef *phost,
MSC_Handle->state = MSC_READ; MSC_Handle->state = MSC_READ;
MSC_Handle->unit[lun].state = MSC_READ; MSC_Handle->unit[lun].state = MSC_READ;
MSC_Handle->rw_lun = lun; MSC_Handle->rw_lun = lun;
MSC_Handle->RdWrCompleteCallback = callback; MSC_Handle->CmdCompleteCallback = callback;
MSC_Handle->timeout = HAL_GetTick() + MSC_TIMEOUT_FIXED_MS; MSC_Handle->timeout = HAL_GetTick() + MSC_TIMEOUT_FIXED_MS;
USBH_MSC_SCSI_Read(phost, return USBH_MSC_SCSI_Read(phost,
lun, lun,
address, address,
length); length);
return USBH_OK;
} }
@ -785,7 +815,7 @@ USBH_StatusTypeDef USBH_MSC_Write(USBH_HandleTypeDef *phost,
uint8_t lun, uint8_t lun,
uint32_t address, uint32_t address,
uint32_t length, uint32_t length,
MSC_RdWrCompleteCallback callback) MSC_CmdCompleteCallback callback)
{ {
MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData;
@ -800,17 +830,43 @@ USBH_StatusTypeDef USBH_MSC_Write(USBH_HandleTypeDef *phost,
MSC_Handle->state = MSC_WRITE; MSC_Handle->state = MSC_WRITE;
MSC_Handle->unit[lun].state = MSC_WRITE; MSC_Handle->unit[lun].state = MSC_WRITE;
MSC_Handle->rw_lun = lun; MSC_Handle->rw_lun = lun;
MSC_Handle->RdWrCompleteCallback = callback; MSC_Handle->CmdCompleteCallback = callback;
MSC_Handle->timeout = HAL_GetTick() + MSC_TIMEOUT_FIXED_MS; MSC_Handle->timeout = HAL_GetTick() + MSC_TIMEOUT_FIXED_MS;
USBH_MSC_SCSI_Write(phost, return USBH_MSC_SCSI_Write(phost,
lun, lun,
address, address,
length); length);
return USBH_OK;
} }
#endif //#ifdef CONFIG_MASS_STORAGE_WRITES_PERMITTED #endif //#ifdef CONFIG_MASS_STORAGE_WRITES_PERMITTED
USBH_StatusTypeDef USBH_MSC_StartStopUnit(USBH_HandleTypeDef *phost,
uint8_t lun,
uint8_t startStop,
MSC_CmdCompleteCallback callback)
{
MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData;
if ((phost->device.is_connected == 0) ||
(phost->gState != HOST_CLASS) ||
(MSC_Handle->state != MSC_IDLE))
{
return USBH_FAIL;
}
MSC_Handle->state = MSC_START_STOP;
MSC_Handle->rw_lun = lun;
MSC_Handle->timeout = HAL_GetTick() + MSC_TIMEOUT_FIXED_MS;
MSC_Handle->CmdCompleteCallback = callback;
return USBH_MSC_SCSI_StartStopUnit(phost,
lun,
startStop);
}
#endif //#ifdef CONFIG_MASS_STORAGE_ENABLED #endif //#ifdef CONFIG_MASS_STORAGE_ENABLED
/** /**

@ -110,13 +110,10 @@
USBH_StatusTypeDef USBH_MSC_SCSI_TestUnitReady (USBH_HandleTypeDef *phost, USBH_StatusTypeDef USBH_MSC_SCSI_TestUnitReady (USBH_HandleTypeDef *phost,
uint8_t lun) uint8_t lun)
{ {
USBH_StatusTypeDef error = USBH_FAIL ;
MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData; MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData;
switch(MSC_Handle->hbot.cmd_state) if (MSC_Handle->hbot.cmd_state == BOT_CMD_SEND)
{ {
case BOT_CMD_SEND:
/*Prepare the CBW and relevent field*/ /*Prepare the CBW and relevent field*/
MSC_Handle->hbot.cbw.field.DataTransferLength = DATA_LEN_MODE_TEST_UNIT_READY; MSC_Handle->hbot.cbw.field.DataTransferLength = DATA_LEN_MODE_TEST_UNIT_READY;
MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_OUT; MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_OUT;
@ -127,18 +124,9 @@ USBH_StatusTypeDef USBH_MSC_SCSI_TestUnitReady (USBH_HandleTypeDef *phost,
MSC_Handle->hbot.state = BOT_SEND_CBW; MSC_Handle->hbot.state = BOT_SEND_CBW;
MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT; MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT;
error = USBH_BUSY;
break;
case BOT_CMD_WAIT:
error = USBH_MSC_BOT_Process(phost, lun);
break;
default:
break;
} }
return error; return USBH_MSC_BOT_Process(phost, lun);
} }
/** /**
@ -431,6 +419,32 @@ USBH_StatusTypeDef USBH_MSC_SCSI_Read(USBH_HandleTypeDef *phost,
return error; return error;
} }
USBH_StatusTypeDef USBH_MSC_SCSI_StartStopUnit(USBH_HandleTypeDef *phost,
uint8_t lun,
uint8_t startStop)
{
MSC_HandleTypeDef *MSC_Handle = (MSC_HandleTypeDef *) phost->pActiveClass->pData;
if (MSC_Handle->hbot.cmd_state == BOT_CMD_SEND)
{
/*Prepare the CBW and relevent field*/
MSC_Handle->hbot.cbw.field.DataTransferLength = DATA_LEN_START_STOP_UNIT;
MSC_Handle->hbot.cbw.field.Flags = USB_EP_DIR_OUT;
MSC_Handle->hbot.cbw.field.CBLength = CBW_LENGTH;
USBH_memset(MSC_Handle->hbot.cbw.field.CB, 0, CBW_CB_LENGTH);
MSC_Handle->hbot.cbw.field.CB[0] = OPCODE_START_STOP_UNIT;
MSC_Handle->hbot.cbw.field.CB[4] = 0x02 | (startStop & 0x01); //LOEJ = 1, START = 0 for eject, START = 1 for load
MSC_Handle->hbot.state = BOT_SEND_CBW;
MSC_Handle->hbot.cmd_state = BOT_CMD_WAIT;
}
return USBH_MSC_BOT_Process(phost, lun);
}
#endif //#ifdef CONFIG_MASS_STORAGE_ENABLED #endif //#ifdef CONFIG_MASS_STORAGE_ENABLED
/** /**

@ -30,12 +30,15 @@ DownstreamPacketTypeDef* ReadStreamPacket;
uint8_t ReadStreamBusy; uint8_t ReadStreamBusy;
void Downstream_MSC_PacketProcessor_TestUnitReady(DownstreamPacketTypeDef* receivedPacket); static void Downstream_MSC_PacketProcessor_TestUnitReady(DownstreamPacketTypeDef* receivedPacket);
void Downstream_MSC_PacketProcessor_GetCapacity(DownstreamPacketTypeDef* receivedPacket); static void Downstream_MSC_PacketProcessor_TestUnitReadyCallback(USBH_StatusTypeDef result);
void Downstream_MSC_PacketProcessor_BeginRead(DownstreamPacketTypeDef* receivedPacket); static void Downstream_MSC_PacketProcessor_GetCapacity(DownstreamPacketTypeDef* receivedPacket);
void Downstream_MSC_PacketProcessor_BeginWrite(DownstreamPacketTypeDef* receivedPacket); static void Downstream_MSC_PacketProcessor_BeginRead(DownstreamPacketTypeDef* receivedPacket);
void Downstream_MSC_PacketProcessor_RdWrCompleteCallback(USBH_StatusTypeDef result); static void Downstream_MSC_PacketProcessor_BeginWrite(DownstreamPacketTypeDef* receivedPacket);
void Downstream_MSC_GetStreamDataPacketCallback(DownstreamPacketTypeDef* receivedPacket); static void Downstream_MSC_PacketProcessor_RdWrCompleteCallback(USBH_StatusTypeDef result);
static void Downstream_MSC_GetStreamDataPacketCallback(DownstreamPacketTypeDef* receivedPacket);
static void Downstream_MSC_PacketProcessor_Disconnect(DownstreamPacketTypeDef* receivedPacket);
static void Downstream_MSC_PacketProcessor_DisconnectCallback(USBH_StatusTypeDef result);
//High-level checks on the connected device. We don't want some weirdly //High-level checks on the connected device. We don't want some weirdly
@ -86,6 +89,10 @@ void Downstream_MSC_PacketProcessor(DownstreamPacketTypeDef* receivedPacket)
break; break;
#endif #endif
case COMMAND_MSC_DISCONNECT:
Downstream_MSC_PacketProcessor_Disconnect(receivedPacket);
break;
default: default:
Downstream_PacketProcessor_FreakOut(); Downstream_PacketProcessor_FreakOut();
} }
@ -93,22 +100,42 @@ void Downstream_MSC_PacketProcessor(DownstreamPacketTypeDef* receivedPacket)
} }
void Downstream_MSC_PacketProcessor_TestUnitReady(DownstreamPacketTypeDef* receivedPacket) static void Downstream_MSC_PacketProcessor_TestUnitReady(DownstreamPacketTypeDef* receivedPacket)
{ {
if (USBH_MSC_UnitIsReady(&hUsbHostFS, MSC_FIXED_LUN)) Downstream_ReleasePacket(receivedPacket);
if (USBH_MSC_UnitIsReady(&hUsbHostFS,
MSC_FIXED_LUN,
Downstream_MSC_PacketProcessor_TestUnitReadyCallback) != USBH_BUSY)
{ {
receivedPacket->Data[0] = HAL_OK; Downstream_MSC_PacketProcessor_TestUnitReadyCallback(USBH_FAIL);
}
}
static void Downstream_MSC_PacketProcessor_TestUnitReadyCallback(USBH_StatusTypeDef result)
{
DownstreamPacketTypeDef* freePacket;
freePacket = Downstream_GetFreePacketImmediately();
freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE;
freePacket->Command = COMMAND_MSC_TEST_UNIT_READY;
freePacket->Length16 = DOWNSTREAM_PACKET_HEADER_LEN_16 + 1;
if (result == USBH_OK)
{
freePacket->Data[0] = HAL_OK;
} }
else else
{ {
receivedPacket->Data[0] = HAL_ERROR; freePacket->Data[0] = HAL_ERROR;
} }
receivedPacket->Length16 = DOWNSTREAM_PACKET_HEADER_LEN_16 + 1; Downstream_PacketProcessor_ClassReply(freePacket);
Downstream_PacketProcessor_ClassReply(receivedPacket);
} }
void Downstream_MSC_PacketProcessor_GetCapacity(DownstreamPacketTypeDef* receivedPacket)
static void Downstream_MSC_PacketProcessor_GetCapacity(DownstreamPacketTypeDef* receivedPacket)
{ {
MSC_HandleTypeDef* MSC_Handle = (MSC_HandleTypeDef*)hUsbHostFS.pActiveClass->pData; MSC_HandleTypeDef* MSC_Handle = (MSC_HandleTypeDef*)hUsbHostFS.pActiveClass->pData;
@ -120,7 +147,7 @@ void Downstream_MSC_PacketProcessor_GetCapacity(DownstreamPacketTypeDef* receive
void Downstream_MSC_PacketProcessor_BeginRead(DownstreamPacketTypeDef* receivedPacket) static void Downstream_MSC_PacketProcessor_BeginRead(DownstreamPacketTypeDef* receivedPacket)
{ {
uint64_t readBlockAddress; uint64_t readBlockAddress;
uint32_t readBlockCount; uint32_t readBlockCount;
@ -146,22 +173,22 @@ void Downstream_MSC_PacketProcessor_BeginRead(DownstreamPacketTypeDef* receivedP
receivedPacket->Data[0] = HAL_ERROR; receivedPacket->Data[0] = HAL_ERROR;
receivedPacket->Length16 = DOWNSTREAM_PACKET_HEADER_LEN_16 + 1; receivedPacket->Length16 = DOWNSTREAM_PACKET_HEADER_LEN_16 + 1;
if (USBH_MSC_UnitIsReady(&hUsbHostFS, MSC_FIXED_LUN))
{
if (USBH_MSC_Read(&hUsbHostFS, if (USBH_MSC_Read(&hUsbHostFS,
MSC_FIXED_LUN, MSC_FIXED_LUN,
(uint32_t)readBlockAddress, (uint32_t)readBlockAddress,
readBlockCount, readBlockCount,
Downstream_MSC_PacketProcessor_RdWrCompleteCallback) == USBH_OK) Downstream_MSC_PacketProcessor_RdWrCompleteCallback) == USBH_BUSY)
{ {
receivedPacket->Data[0] = HAL_OK; Downstream_ReleasePacket(receivedPacket);
} return;
} }
Downstream_TransmitPacket(receivedPacket);
//Fail:
Downstream_PacketProcessor_ClassReply(receivedPacket);
} }
void Downstream_MSC_PacketProcessor_RdWrCompleteCallback(USBH_StatusTypeDef result) static void Downstream_MSC_PacketProcessor_RdWrCompleteCallback(USBH_StatusTypeDef result)
{ {
if (result != USBH_OK) if (result != USBH_OK)
{ {
@ -172,8 +199,9 @@ void Downstream_MSC_PacketProcessor_RdWrCompleteCallback(USBH_StatusTypeDef resu
} }
#ifdef CONFIG_MASS_STORAGE_WRITES_PERMITTED #ifdef CONFIG_MASS_STORAGE_WRITES_PERMITTED
void Downstream_MSC_PacketProcessor_BeginWrite(DownstreamPacketTypeDef* receivedPacket) static void Downstream_MSC_PacketProcessor_BeginWrite(DownstreamPacketTypeDef* receivedPacket)
{ {
uint64_t writeBlockAddress; uint64_t writeBlockAddress;
uint32_t writeBlockCount; uint32_t writeBlockCount;
@ -206,18 +234,18 @@ void Downstream_MSC_PacketProcessor_BeginWrite(DownstreamPacketTypeDef* received
//Our host stack has no way to detect if write-protection is enabled. //Our host stack has no way to detect if write-protection is enabled.
//So currently we can't return HAL_BUSY to Upstream in this situation. //So currently we can't return HAL_BUSY to Upstream in this situation.
if (USBH_MSC_UnitIsReady(&hUsbHostFS, MSC_FIXED_LUN))
{
if (USBH_MSC_Write(&hUsbHostFS, if (USBH_MSC_Write(&hUsbHostFS,
MSC_FIXED_LUN, MSC_FIXED_LUN,
(uint32_t)writeBlockAddress, (uint32_t)writeBlockAddress,
writeBlockCount, writeBlockCount,
Downstream_MSC_PacketProcessor_RdWrCompleteCallback) == USBH_OK) Downstream_MSC_PacketProcessor_RdWrCompleteCallback) == USBH_BUSY)
{ {
receivedPacket->Data[0] = HAL_OK; Downstream_ReleasePacket(receivedPacket);
} return;
} }
Downstream_TransmitPacket(receivedPacket);
//Fail:
Downstream_PacketProcessor_ClassReply(receivedPacket);
} }
#endif #endif
@ -292,5 +320,33 @@ void Downstream_MSC_GetStreamDataPacketCallback(DownstreamPacketTypeDef* receive
} }
#endif //#ifdef CONFIG_MASS_STORAGE_WRITES_PERMITTED #endif //#ifdef CONFIG_MASS_STORAGE_WRITES_PERMITTED
static void Downstream_MSC_PacketProcessor_Disconnect(DownstreamPacketTypeDef* receivedPacket)
{
Downstream_ReleasePacket(receivedPacket);
USBH_MSC_StartStopUnit(&hUsbHostFS,
MSC_FIXED_LUN,
MSC_START_STOP_EJECT_FLAG,
Downstream_MSC_PacketProcessor_DisconnectCallback);
}
static void Downstream_MSC_PacketProcessor_DisconnectCallback(USBH_StatusTypeDef result)
{
DownstreamPacketTypeDef* freePacket;
if (result == USBH_OK)
{
freePacket = Downstream_GetFreePacketImmediately();
freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE;
freePacket->Command = COMMAND_MSC_DISCONNECT;
freePacket->Length16 = DOWNSTREAM_PACKET_HEADER_LEN_16;
Downstream_PacketProcessor_ClassReply(freePacket);
}
}
#endif //#ifdef CONFIG_MASS_STORAGE_ENABLED #endif //#ifdef CONFIG_MASS_STORAGE_ENABLED

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-570684595989247187" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-167311329527096837" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>
@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-571364604890878533" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-167991338428728183" id="ilg.gnuarmeclipse.managedbuild.cross.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT GCC Built-in Compiler Settings Cross ARM" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>

@ -51,8 +51,9 @@ typedef enum
{ {
COMMAND_MSC_TEST_UNIT_READY, //Returns HAL_StatusTypeDef result COMMAND_MSC_TEST_UNIT_READY, //Returns HAL_StatusTypeDef result
COMMAND_MSC_GET_CAPACITY, //Returns uint32_t blk_nbr, uint32_t blk_size COMMAND_MSC_GET_CAPACITY, //Returns uint32_t blk_nbr, uint32_t blk_size
COMMAND_MSC_READ, //Returns HAL_StatusTypeDef result, then data stream COMMAND_MSC_READ, //Returns data stream or error packet
COMMAND_MSC_WRITE, //Returns HAL_OK, HAL_ERROR if medium not present, HAL_BUSY if write-protected result, then waits for data stream COMMAND_MSC_WRITE, //Waits for data stream or returns error packet
COMMAND_MSC_DISCONNECT //Returns same packet after sending Stop command to device
} }
InterfaceCommandMscTypeDef; InterfaceCommandMscTypeDef;
@ -67,8 +68,8 @@ InterfaceCommandHidTypeDef;
typedef enum typedef enum
{ {
COMMAND_ERROR_GENERIC, COMMAND_ERROR_GENERIC, //Something went wrong, time to FREAKOUT
COMMAND_ERROR_DEVICE_DISCONNECTED, COMMAND_ERROR_DEVICE_DISCONNECTED, //Device unexpectedly disconnected
} }
InterfaceCommandErrorTypeDef; InterfaceCommandErrorTypeDef;

@ -42,7 +42,8 @@ HAL_StatusTypeDef Upstream_MSC_BeginWrite(UpstreamMSCCallbackTypeDef callback,
uint32_t writeBlockCount); uint32_t writeBlockCount);
HAL_StatusTypeDef Upstream_MSC_PutStreamDataPacket(UpstreamPacketTypeDef* packetToSend, HAL_StatusTypeDef Upstream_MSC_PutStreamDataPacket(UpstreamPacketTypeDef* packetToSend,
uint32_t dataLength8); uint32_t dataLength8);
void Upstream_MSC_RegisterDisconnect(void); HAL_StatusTypeDef Upstream_MSC_RequestDisconnect(UpstreamMSCCallbackTypeDef callback);
#endif /* INC_UPSTREAM_MSC_H_ */ #endif /* INC_UPSTREAM_MSC_H_ */

@ -24,7 +24,6 @@ typedef enum
STATE_WAIT_DEVICE, STATE_WAIT_DEVICE,
STATE_DEVICE_ACTIVE, STATE_DEVICE_ACTIVE,
STATE_SUSPENDED, STATE_SUSPENDED,
STATE_DISCONNECTING,
STATE_ERROR STATE_ERROR
} UpstreamStateTypeDef; } UpstreamStateTypeDef;
@ -47,7 +46,6 @@ void Upstream_StateMachine_DeviceDisconnected(void);
void Upstream_StateMachine_Suspend(void); void Upstream_StateMachine_Suspend(void);
void Upstream_StateMachine_CheckResume(void); void Upstream_StateMachine_CheckResume(void);
void Upstream_StateMachine_Wakeup(void); void Upstream_StateMachine_Wakeup(void);
void Upstream_StateMachine_RegisterDisconnect(void);

@ -109,18 +109,20 @@ static void SCSI_Read10(void);
static void SCSI_Verify10(void); static void SCSI_Verify10(void);
static int8_t SCSI_CheckAddressRange (uint32_t blk_offset , uint16_t blk_nbr); static int8_t SCSI_CheckAddressRange (uint32_t blk_offset , uint16_t blk_nbr);
void SCSI_TestUnitReadyCallback(HAL_StatusTypeDef result); static void SCSI_TestUnitReadyCallback(HAL_StatusTypeDef result);
void SCSI_ReadCapacity10Callback(UpstreamPacketTypeDef* upstreamPacket, static void SCSI_ReadCapacity10Callback(UpstreamPacketTypeDef* upstreamPacket,
uint32_t result_uint1, uint32_t result_uint1,
uint32_t result_uint2); uint32_t result_uint2);
void SCSI_ReadFormatCapacityCallback(UpstreamPacketTypeDef* upstreamPacket, static void SCSI_ReadFormatCapacityCallback(UpstreamPacketTypeDef* upstreamPacket,
uint32_t result_uint1, uint32_t result_uint1,
uint32_t result_uint2); uint32_t result_uint2);
void SCSI_Read10BeginCallback(HAL_StatusTypeDef result); static void SCSI_Read10BeginCallback(HAL_StatusTypeDef result);
void SCSI_Read10ReplyCallback(UpstreamPacketTypeDef* upstreamPacket, static void SCSI_Read10ReplyCallback(UpstreamPacketTypeDef* upstreamPacket,
uint16_t dataLength); uint16_t dataLength);
void SCSI_Write10BeginCallback(HAL_StatusTypeDef result); static void SCSI_Write10BeginCallback(HAL_StatusTypeDef result);
void SCSI_Write10FreePacketCallback(UpstreamPacketTypeDef* freePacket); static void SCSI_Write10FreePacketCallback(UpstreamPacketTypeDef* freePacket);
static void SCSI_StartStopUnitCallback(HAL_StatusTypeDef result);
/** /**
@ -228,7 +230,7 @@ void SCSI_ProcessCmd(USBD_HandleTypeDef *pdev,
* @param params: Command parameters * @param params: Command parameters
* @retval status * @retval status
*/ */
void SCSI_TestUnitReady(void) static void SCSI_TestUnitReady(void)
{ {
/* case 9 : Hi > D0 */ /* case 9 : Hi > D0 */
if (SCSI_ProcessCmd_hmsc->cbw.dDataLength != 0) if (SCSI_ProcessCmd_hmsc->cbw.dDataLength != 0)
@ -254,7 +256,7 @@ void SCSI_TestUnitReady(void)
} }
void SCSI_TestUnitReadyCallback(HAL_StatusTypeDef result) static void SCSI_TestUnitReadyCallback(HAL_StatusTypeDef result)
{ {
if (result != HAL_OK) if (result != HAL_OK)
{ {
@ -369,6 +371,8 @@ void SCSI_ReadCapacity10Callback(UpstreamPacketTypeDef* upstreamPacket,
SCSI_ProcessCmd_callback(0); SCSI_ProcessCmd_callback(0);
} }
/** /**
* @brief SCSI_ReadFormatCapacity * @brief SCSI_ReadFormatCapacity
* Process Read Format Capacity command * Process Read Format Capacity command
@ -385,7 +389,7 @@ static void SCSI_ReadFormatCapacity(void)
} }
void SCSI_ReadFormatCapacityCallback(UpstreamPacketTypeDef* upstreamPacket, static void SCSI_ReadFormatCapacityCallback(UpstreamPacketTypeDef* upstreamPacket,
uint32_t result_uint1, uint32_t result_uint1,
uint32_t result_uint2) uint32_t result_uint2)
{ {
@ -549,13 +553,28 @@ static void SCSI_StartStopUnit(void)
{ {
if ((SCSI_ProcessCmd_params[4] & START_STOP_DATA_MASK) == START_STOP_DATA_EJECT_STOP_MOTOR) if ((SCSI_ProcessCmd_params[4] & START_STOP_DATA_MASK) == START_STOP_DATA_EJECT_STOP_MOTOR)
{ {
USBD_RequestStop(SCSI_ProcessCmd_pdev); //Host is signalling us to disconnect if (Upstream_MSC_RequestDisconnect(SCSI_StartStopUnitCallback) != HAL_OK) //Host is signalling us to disconnect
Upstream_MSC_RegisterDisconnect(); {
SCSI_StartStopUnitCallback(HAL_ERROR);
}
}
else
{
SCSI_StartStopUnitCallback(HAL_OK);
} }
}
static void SCSI_StartStopUnitCallback(HAL_StatusTypeDef result)
{
if (result == HAL_OK)
{
SCSI_ProcessCmd_hmsc->bot_data_length = 0; SCSI_ProcessCmd_hmsc->bot_data_length = 0;
SCSI_ProcessCmd_callback(0); SCSI_ProcessCmd_callback(0);
} }
}
static void SCSI_AllowMediumRemoval(void) static void SCSI_AllowMediumRemoval(void)
@ -627,7 +646,6 @@ static void SCSI_Read10(void)
return; return;
} }
//hmsc->bot_state is already USBD_BOT_DATA_IN
if (Upstream_MSC_GetStreamDataPacket(SCSI_Read10ReplyCallback) != HAL_OK) if (Upstream_MSC_GetStreamDataPacket(SCSI_Read10ReplyCallback) != HAL_OK)
{ {
SCSI_Read10ReplyCallback(NULL, 0); SCSI_Read10ReplyCallback(NULL, 0);
@ -635,7 +653,7 @@ static void SCSI_Read10(void)
} }
void SCSI_Read10BeginCallback(HAL_StatusTypeDef result) static void SCSI_Read10BeginCallback(HAL_StatusTypeDef result)
{ {
if (result != HAL_OK) if (result != HAL_OK)
{ {
@ -655,7 +673,7 @@ void SCSI_Read10BeginCallback(HAL_StatusTypeDef result)
} }
void SCSI_Read10ReplyCallback(UpstreamPacketTypeDef* upstreamPacket, static void SCSI_Read10ReplyCallback(UpstreamPacketTypeDef* upstreamPacket,
uint16_t dataLength) uint16_t dataLength)
{ {
if (upstreamPacket == NULL) if (upstreamPacket == NULL)
@ -820,7 +838,8 @@ void SCSI_Write10BeginCallback(HAL_StatusTypeDef result)
} }
void SCSI_Write10FreePacketCallback(UpstreamPacketTypeDef* freePacket)
static void SCSI_Write10FreePacketCallback(UpstreamPacketTypeDef* freePacket)
{ {
SCSI_ProcessCmd_hmsc->bot_packet = freePacket; SCSI_ProcessCmd_hmsc->bot_packet = freePacket;
SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data; SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data;

@ -92,7 +92,6 @@ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *
USBD_ClassTypeDef* USBD_DeInit(USBD_HandleTypeDef *pdev); USBD_ClassTypeDef* USBD_DeInit(USBD_HandleTypeDef *pdev);
USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev);
USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev);
USBD_StatusTypeDef USBD_RequestStop(USBD_HandleTypeDef *pdev);
USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass); USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass);
USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev);

@ -226,8 +226,7 @@ typedef struct
typedef enum typedef enum
{ {
USB_STATUS_STOP, USB_STATUS_STOP,
USB_STATUS_START, USB_STATUS_START
USB_STATUS_REQUEST_EJECT
} UsbCoreStatusTypeDef; } UsbCoreStatusTypeDef;

@ -214,17 +214,6 @@ USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev)
} }
USBD_StatusTypeDef USBD_RequestStop(USBD_HandleTypeDef *pdev)
{
if (pdev->usbCoreStatus == USB_STATUS_START)
{
pdev->usbCoreStatus = USB_STATUS_REQUEST_EJECT;
pdev->usbRequestEjectTime = HAL_GetTick() + 5; //Allow > 1ms to transmit the SCSI eject reply before disconnecting
}
return USBD_OK;
}
/** /**
* @brief USBD_RunTestMode * @brief USBD_RunTestMode
* Launch test mode process * Launch test mode process
@ -520,13 +509,6 @@ USBD_StatusTypeDef USBD_SOF(USBD_HandleTypeDef *pdev)
} }
} }
if (pdev->usbCoreStatus == USB_STATUS_REQUEST_EJECT)
{
if ((int32_t)(HAL_GetTick() - pdev->usbRequestEjectTime) >= 0)
{
USBD_Stop(pdev);
}
}
return USBD_OK; return USBD_OK;
} }

@ -23,6 +23,9 @@
//Stuff we need to save for our callbacks to use: //Stuff we need to save for our callbacks to use:
UpstreamMSCCallbackTypeDef TestReadyCallback; UpstreamMSCCallbackTypeDef TestReadyCallback;
UpstreamMSCCallbackTypeDef BeginReadCallback;
UpstreamMSCCallbackTypeDef BeginWriteCallback;
UpstreamMSCCallbackTypeDef DisconnectCallback;
UpstreamMSCCallbackUintPacketTypeDef GetCapacityCallback; UpstreamMSCCallbackUintPacketTypeDef GetCapacityCallback;
UpstreamMSCCallbackPacketTypeDef GetStreamDataCallback; UpstreamMSCCallbackPacketTypeDef GetStreamDataCallback;
uint64_t BlockStart; uint64_t BlockStart;
@ -39,7 +42,8 @@ static void Upstream_MSC_GetCapacityReplyCallback(UpstreamPacketTypeDef* replyPa
static void Upstream_MSC_GetStreamDataPacketCallback(UpstreamPacketTypeDef* replyPacket); static void Upstream_MSC_GetStreamDataPacketCallback(UpstreamPacketTypeDef* replyPacket);
static void Upstream_MSC_BeginReadFreePacketCallback(UpstreamPacketTypeDef* freePacket); static void Upstream_MSC_BeginReadFreePacketCallback(UpstreamPacketTypeDef* freePacket);
static void Upstream_MSC_BeginWriteFreePacketCallback(UpstreamPacketTypeDef* freePacket); static void Upstream_MSC_BeginWriteFreePacketCallback(UpstreamPacketTypeDef* freePacket);
static void Upstream_MSC_BeginWriteReplyCallback(UpstreamPacketTypeDef* replyPacket); static void Upstream_MSC_RequestDisconnectFreePacketCallback(UpstreamPacketTypeDef* freePacket);
static void Upstream_MSC_RequestDisconnectReplyCallback(UpstreamPacketTypeDef* replyPacket);
@ -190,13 +194,13 @@ HAL_StatusTypeDef Upstream_MSC_BeginRead(UpstreamMSCCallbackTypeDef callback,
ReadStreamPacket = NULL; //Prepare for GetStreamDataPacket's use ReadStreamPacket = NULL; //Prepare for GetStreamDataPacket's use
ReadStreamBusy = 0; ReadStreamBusy = 0;
TestReadyCallback = callback; BeginReadCallback = callback;
return Upstream_GetFreePacket(Upstream_MSC_BeginReadFreePacketCallback); return Upstream_GetFreePacket(Upstream_MSC_BeginReadFreePacketCallback);
} }
void Upstream_MSC_BeginReadFreePacketCallback(UpstreamPacketTypeDef* freePacket) static void Upstream_MSC_BeginReadFreePacketCallback(UpstreamPacketTypeDef* freePacket)
{ {
freePacket->Length16 = UPSTREAM_PACKET_HEADER_LEN_16 + ((4 * 3) / 2); freePacket->Length16 = UPSTREAM_PACKET_HEADER_LEN_16 + ((4 * 3) / 2);
freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE;
@ -206,16 +210,13 @@ void Upstream_MSC_BeginReadFreePacketCallback(UpstreamPacketTypeDef* freePacket)
if (Upstream_TransmitPacket(freePacket) == HAL_OK) if (Upstream_TransmitPacket(freePacket) == HAL_OK)
{ {
if (Upstream_ReceivePacket(Upstream_MSC_TestReadyReplyCallback) != HAL_OK) //Re-use TestReadyReplyCallback because it does exactly what we want! BeginReadCallback(HAL_OK);
{
TestReadyCallback(HAL_ERROR);
}
return; return;
} }
//else: //else:
Upstream_ReleasePacket(freePacket); Upstream_ReleasePacket(freePacket);
TestReadyCallback(HAL_ERROR); BeginReadCallback(HAL_ERROR);
} }
@ -299,7 +300,7 @@ HAL_StatusTypeDef Upstream_MSC_BeginWrite(UpstreamMSCCallbackTypeDef callback,
BlockStart = writeBlockStart; BlockStart = writeBlockStart;
BlockCount = writeBlockCount; BlockCount = writeBlockCount;
TestReadyCallback = callback; BeginWriteCallback = callback;
return Upstream_GetFreePacket(Upstream_MSC_BeginWriteFreePacketCallback); return Upstream_GetFreePacket(Upstream_MSC_BeginWriteFreePacketCallback);
} }
@ -315,77 +316,82 @@ void Upstream_MSC_BeginWriteFreePacketCallback(UpstreamPacketTypeDef* freePacket
if (Upstream_TransmitPacket(freePacket) == HAL_OK) if (Upstream_TransmitPacket(freePacket) == HAL_OK)
{ {
if (Upstream_ReceivePacket(Upstream_MSC_BeginWriteReplyCallback) != HAL_OK) BeginWriteCallback(HAL_OK);
{
TestReadyCallback(HAL_ERROR);
}
return; return;
} }
//else: //else:
Upstream_ReleasePacket(freePacket); Upstream_ReleasePacket(freePacket);
TestReadyCallback(HAL_ERROR); BeginWriteCallback(HAL_ERROR);
} }
void Upstream_MSC_BeginWriteReplyCallback(UpstreamPacketTypeDef* replyPacket) HAL_StatusTypeDef Upstream_MSC_PutStreamDataPacket(UpstreamPacketTypeDef* packetToSend,
uint32_t dataLength8)
{ {
uint8_t tempResult;
if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE)
{ {
return; return HAL_ERROR;
} }
if (replyPacket == NULL) if ((dataLength8 % 2) != 0)
{ {
TestReadyCallback(HAL_ERROR); return HAL_ERROR;
return;
} }
if ((replyPacket->Length16 != (UPSTREAM_PACKET_HEADER_LEN_16 + 1)) || packetToSend->Length16 = (dataLength8 / 2) + UPSTREAM_PACKET_HEADER_LEN_16;
((replyPacket->Data[0] != HAL_OK) && (replyPacket->Data[0] != HAL_BUSY))) packetToSend->CommandClass = COMMAND_CLASS_MASS_STORAGE | COMMAND_CLASS_DATA_FLAG;
{ packetToSend->Command = COMMAND_MSC_WRITE;
Upstream_ReleasePacket(replyPacket); return Upstream_TransmitPacket(packetToSend);
TestReadyCallback(HAL_ERROR);
return;
} }
#endif //#ifdef CONFIG_MASS_STORAGE_WRITES_PERMITTED
tempResult = replyPacket->Data[0];
Upstream_ReleasePacket(replyPacket);
TestReadyCallback(tempResult); HAL_StatusTypeDef Upstream_MSC_RequestDisconnect(UpstreamMSCCallbackTypeDef callback)
{
if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) return HAL_ERROR;
DisconnectCallback = callback;
return Upstream_GetFreePacket(Upstream_MSC_RequestDisconnectFreePacketCallback);
} }
HAL_StatusTypeDef Upstream_MSC_PutStreamDataPacket(UpstreamPacketTypeDef* packetToSend, static void Upstream_MSC_RequestDisconnectFreePacketCallback(UpstreamPacketTypeDef* freePacket)
uint32_t dataLength8)
{ {
if (Upstream_StateMachine_CheckActiveClass() != COMMAND_CLASS_MASS_STORAGE) freePacket->Length16 = UPSTREAM_PACKET_HEADER_LEN_16;
{ freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE;
return HAL_ERROR; freePacket->Command = COMMAND_MSC_DISCONNECT;
}
if ((dataLength8 % 2) != 0) if (Upstream_TransmitPacket(freePacket) == HAL_OK)
{ {
return HAL_ERROR; //Upstream_PacketManager will free the packet when the transfer is done
if (Upstream_ReceivePacket(Upstream_MSC_RequestDisconnectReplyCallback) != HAL_OK)
{
DisconnectCallback(HAL_ERROR);
}
return;
} }
packetToSend->Length16 = (dataLength8 / 2) + UPSTREAM_PACKET_HEADER_LEN_16; //else:
packetToSend->CommandClass = COMMAND_CLASS_MASS_STORAGE | COMMAND_CLASS_DATA_FLAG; Upstream_ReleasePacket(freePacket);
packetToSend->Command = COMMAND_MSC_WRITE; DisconnectCallback(HAL_ERROR);
return Upstream_TransmitPacket(packetToSend);
} }
#endif //#ifdef CONFIG_MASS_STORAGE_WRITES_PERMITTED
void Upstream_MSC_RegisterDisconnect(void) static void Upstream_MSC_RequestDisconnectReplyCallback(UpstreamPacketTypeDef* replyPacket)
{ {
Upstream_StateMachine_RegisterDisconnect(); //Acknowledge the SCSI Stop command to host now.
//We will disconnect from host when Downstream replies with COMMAND_ERROR_DEVICE_DISCONNECTED.
Upstream_ReleasePacket(replyPacket);
DisconnectCallback(HAL_OK);
} }
#endif //#ifdef CONFIG_MASS_STORAGE_ENABLED #endif //#ifdef CONFIG_MASS_STORAGE_ENABLED

@ -79,8 +79,7 @@ void Upstream_StateMachine_SetErrorState(void)
InterfaceCommandClassTypeDef Upstream_StateMachine_CheckActiveClass(void) InterfaceCommandClassTypeDef Upstream_StateMachine_CheckActiveClass(void)
{ {
if ((UpstreamState == STATE_ERROR) || if (UpstreamState == STATE_ERROR)
(UpstreamState == STATE_DISCONNECTING))
{ {
return COMMAND_CLASS_ERROR; return COMMAND_CLASS_ERROR;
} }
@ -296,15 +295,3 @@ void Upstream_StateMachine_Wakeup(void)
} }
//Host sends a SCSI motor stop command, so we shouldn't process any more commands.
void Upstream_StateMachine_RegisterDisconnect(void)
{
if ((UpstreamState != STATE_DEVICE_ACTIVE) &&
(UpstreamState != STATE_SUSPENDED))
{
UPSTREAM_STATEMACHINE_FREAKOUT;
return;
}
UpstreamState = STATE_DISCONNECTING;
}

@ -59,5 +59,6 @@
<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> <listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/> <listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
</listAttribute> </listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#10;"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/> <stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

Loading…
Cancel
Save