aboutsummaryrefslogtreecommitdiffstats
path: root/Demos/Device/LowLevel/MassStorage/MassStorage.c
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2011-01-10 18:43:34 +0000
committerDean Camera <dean@fourwalledcubicle.com>2011-01-10 18:43:34 +0000
commitf555ad7ced743a19eb1eefaf5eaf536fcbe58d80 (patch)
treef4b5a0aca1ac3898544effcc366380935a97d720 /Demos/Device/LowLevel/MassStorage/MassStorage.c
parent477a2047f48d4c59bdcef37a18847f0c6a4d758b (diff)
downloadlufa-f555ad7ced743a19eb1eefaf5eaf536fcbe58d80.tar.gz
lufa-f555ad7ced743a19eb1eefaf5eaf536fcbe58d80.tar.bz2
lufa-f555ad7ced743a19eb1eefaf5eaf536fcbe58d80.zip
Altered all endpoint/pipe stream transfers so that the new BytesProcessed parameter now points to a location where the number of bytes in the transfer that have been completed can be stored (or NULL if entire transaction should be performed in one chunk).
Added new Endpoint_Null_Stream() and Pipe_Null_stream() functions. Removed the NO_STREAM_CALLBACKS compile time option due to the new partial stream transfer feature replacing it. Fixed errors in the incomplete Test and Measurement device demo preventing proper operation (thanks to Pavel Plotnikov).
Diffstat (limited to 'Demos/Device/LowLevel/MassStorage/MassStorage.c')
-rw-r--r--Demos/Device/LowLevel/MassStorage/MassStorage.c63
1 files changed, 29 insertions, 34 deletions
diff --git a/Demos/Device/LowLevel/MassStorage/MassStorage.c b/Demos/Device/LowLevel/MassStorage/MassStorage.c
index fe8a3f7a0..cbfef0fbf 100644
--- a/Demos/Device/LowLevel/MassStorage/MassStorage.c
+++ b/Demos/Device/LowLevel/MassStorage/MassStorage.c
@@ -221,6 +221,8 @@ void MassStorage_Task(void)
*/
static bool ReadInCommandBlock(void)
{
+ uint16_t BytesTransferred;
+
/* Select the Data Out endpoint */
Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM);
@@ -229,12 +231,14 @@ static bool ReadInCommandBlock(void)
return false;
/* Read in command block header */
- Endpoint_Read_Stream_LE(&CommandBlock, (sizeof(CommandBlock) - sizeof(CommandBlock.SCSICommandData)),
- StreamCallback_AbortOnMassStoreReset);
-
- /* Check if the current command is being aborted by the host */
- if (IsMassStoreReset)
- return false;
+ BytesTransferred = 0;
+ while (Endpoint_Read_Stream_LE(&CommandBlock, (sizeof(CommandBlock) - sizeof(CommandBlock.SCSICommandData)),
+ &BytesTransferred) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+ {
+ /* Check if the current command is being aborted by the host */
+ if (IsMassStoreReset)
+ return false;
+ }
/* Verify the command block - abort if invalid */
if ((CommandBlock.Signature != MS_CBW_SIGNATURE) ||
@@ -252,13 +256,14 @@ static bool ReadInCommandBlock(void)
}
/* Read in command block command data */
- Endpoint_Read_Stream_LE(&CommandBlock.SCSICommandData,
- CommandBlock.SCSICommandLength,
- StreamCallback_AbortOnMassStoreReset);
-
- /* Check if the current command is being aborted by the host */
- if (IsMassStoreReset)
- return false;
+ BytesTransferred = 0;
+ while (Endpoint_Read_Stream_LE(&CommandBlock.SCSICommandData, CommandBlock.SCSICommandLength,
+ &BytesTransferred) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+ {
+ /* Check if the current command is being aborted by the host */
+ if (IsMassStoreReset)
+ return false;
+ }
/* Finalize the stream transfer to send the last packet */
Endpoint_ClearOUT();
@@ -271,6 +276,8 @@ static bool ReadInCommandBlock(void)
*/
static void ReturnCommandStatus(void)
{
+ uint16_t BytesTransferred;
+
/* Select the Data Out endpoint */
Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM);
@@ -294,27 +301,15 @@ static void ReturnCommandStatus(void)
}
/* Write the CSW to the endpoint */
- Endpoint_Write_Stream_LE(&CommandStatus, sizeof(CommandStatus),
- StreamCallback_AbortOnMassStoreReset);
-
- /* Check if the current command is being aborted by the host */
- if (IsMassStoreReset)
- return;
-
+ BytesTransferred = 0;
+ while (Endpoint_Write_Stream_LE(&CommandStatus, sizeof(CommandStatus),
+ &BytesTransferred) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+ {
+ /* Check if the current command is being aborted by the host */
+ if (IsMassStoreReset)
+ return;
+ }
+
/* Finalize the stream transfer to send the last packet */
Endpoint_ClearIN();
}
-
-/** Stream callback function for the Endpoint stream read and write functions. This callback will abort the current stream transfer
- * if a Mass Storage Reset request has been issued to the control endpoint.
- */
-uint8_t StreamCallback_AbortOnMassStoreReset(void)
-{
- /* Abort if a Mass Storage reset command was received */
- if (IsMassStoreReset)
- return STREAMCALLBACK_Abort;
-
- /* Continue with the current stream operation */
- return STREAMCALLBACK_Continue;
-}
-