/** Stream callback abort flag for bulk OUT data */\r
bool IsTMCBulkOUTReset = false;\r
\r
+/** Last used tag value for bulk IN transfers */\r
+uint8_t NextTransferINTag = 0;\r
+\r
+/** Last used tag value for bulk IN transfers */\r
+uint8_t NextTransferOUTTag = 0;\r
+\r
\r
/** Main program entry point. This routine contains the overall program flow, including initial\r
* setup of all components and the main program loop.\r
\r
void EVENT_USB_Device_UnhandledControlRequest(void)\r
{\r
+ uint8_t TMCRequestStatus = TMC_REQUEST_STATUS_SUCCESS;\r
+\r
switch (USB_ControlRequest.bRequest)\r
{\r
case Req_InitiateAbortBulkOut:\r
{\r
Endpoint_ClearSETUP();\r
\r
- /* Check to see if a split request is already being processed before starting a new one */\r
if (RequestInProgess != 0)\r
{\r
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS); \r
+ TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS;\r
+ }\r
+ else if (USB_ControlRequest.wValue != NextTransferOUTTag)\r
+ {\r
+ TMCRequestStatus = TMC_REQUEST_STATUS_TRANSFER_NOT_IN_PROGRESS;\r
}\r
else\r
{\r
\r
/* Save the split request for later checking when a new request is received */\r
RequestInProgess = Req_InitiateAbortBulkOut;\r
-\r
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
}\r
\r
+ /* Write the request response byte */\r
+ Endpoint_Write_Byte(TMCRequestStatus);\r
+\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage();\r
}\r
{\r
Endpoint_ClearSETUP();\r
\r
- /* Check to see the correct split request is in progress before the status can be retrieved */\r
if (RequestInProgess != Req_InitiateAbortBulkOut)\r
- {\r
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS); \r
- }\r
+ TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS; \r
+ else if (IsTMCBulkOUTReset)\r
+ TMCRequestStatus = TMC_REQUEST_STATUS_PENDING;\r
else\r
- {\r
- // TODO: CLEAR BULK OUT\r
+ RequestInProgess = 0; \r
\r
- /* Clear the pending split request value so that a new request can be made */\r
- RequestInProgess = 0;\r
+ /* Write the request response bytes */\r
+ Endpoint_Write_Byte(TMCRequestStatus);\r
+ Endpoint_Write_Word_LE(0);\r
+ Endpoint_Write_DWord_LE(0); // TODO - Last transfer length\r
\r
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
- }\r
- \r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage(); \r
}\r
{\r
Endpoint_ClearSETUP();\r
\r
- /* Check to see if a split request is already being processed before starting a new one */\r
if (RequestInProgess != 0)\r
{\r
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS); \r
+ TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS; \r
+ }\r
+ else if (USB_ControlRequest.wValue != NextTransferINTag)\r
+ {\r
+ TMCRequestStatus = TMC_REQUEST_STATUS_TRANSFER_NOT_IN_PROGRESS;\r
}\r
else\r
{\r
\r
/* Save the split request for later checking when a new request is received */\r
RequestInProgess = Req_InitiateAbortBulkIn;\r
-\r
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
}\r
\r
+ /* Write the request response bytes */\r
+ Endpoint_Write_Byte(TMCRequestStatus);\r
+ Endpoint_Write_Byte(NextTransferINTag);\r
+\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage();\r
}\r
{\r
Endpoint_ClearSETUP();\r
\r
- /* Check to see the correct split request is in progress before the status can be retrieved */\r
if (RequestInProgess != Req_InitiateAbortBulkIn)\r
- {\r
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS); \r
- }\r
+ TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS;\r
+ else if (IsTMCBulkINReset)\r
+ TMCRequestStatus = TMC_REQUEST_STATUS_PENDING;\r
else\r
- {\r
- // TODO: CLEAR BULK IN\r
+ RequestInProgess = 0;\r
\r
- /* Clear the pending split request value so that a new request can be made */\r
- RequestInProgess = 0;\r
+ /* Write the request response bytes */\r
+ Endpoint_Write_Byte(TMCRequestStatus);\r
+ Endpoint_Write_Word_LE(0);\r
+ Endpoint_Write_DWord_LE(0); // TODO - Last transfer length\r
\r
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
- }\r
- \r
Endpoint_ClearIN();\r
- Endpoint_ClearStatusStage(); \r
+ Endpoint_ClearStatusStage();\r
}\r
\r
break;\r
{\r
Endpoint_ClearSETUP();\r
\r
- /* Check to see if a split request is already being processed before starting a new one */\r
if (RequestInProgess != 0)\r
{\r
Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS); \r
\r
/* Save the split request for later checking when a new request is received */\r
RequestInProgess = Req_InitiateClear;\r
-\r
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
}\r
\r
+ /* Write the request response byte */\r
+ Endpoint_Write_Byte(TMCRequestStatus);\r
+\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage();\r
}\r
{\r
Endpoint_ClearSETUP();\r
\r
- /* Check to see the correct split request is in progress before the status can be retrieved */\r
if (RequestInProgess != Req_InitiateClear)\r
- {\r
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS); \r
- }\r
+ TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS; \r
+ else if (IsTMCBulkINReset || IsTMCBulkOUTReset)\r
+ TMCRequestStatus = TMC_REQUEST_STATUS_PENDING;\r
else\r
- {\r
- // TODO: CLEAR STATUS\r
+ RequestInProgess = 0;\r
\r
- /* Clear the pending split request value so that a new request can be made */\r
- RequestInProgess = 0;\r
-\r
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
- }\r
+ /* Write the request response bytes */\r
+ Endpoint_Write_Byte(TMCRequestStatus);\r
+ Endpoint_Write_Byte(0);\r
\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage(); \r
LEDs_SetAllLEDs(LEDS_ALL_LEDS);\r
Endpoint_ClearOUT();\r
}\r
+ \r
+ /* All pending data has been processed - reset the data abort flags */\r
+ IsTMCBulkINReset = false;\r
+ IsTMCBulkOUTReset = false;\r
}\r
\r
/** Stream callback function for the Endpoint stream write functions. This callback will abort the current stream transfer\r