@ -61,6 +61,12 @@ bool IsTMCBulkINReset = false;
/** Stream callback abort flag for bulk OUT data */
bool IsTMCBulkOUTReset = false ;
/** Last used tag value for bulk IN transfers */
uint8_t NextTransferINTag = 0 ;
/** Last used tag value for bulk IN transfers */
uint8_t NextTransferOUTTag = 0 ;
/** Main program entry point. This routine contains the overall program flow, including initial
* setup of all components and the main program loop .
@ -126,6 +132,8 @@ void EVENT_USB_Device_ConfigurationChanged(void)
void EVENT_USB_Device_UnhandledControlRequest ( void )
{
uint8_t TMCRequestStatus = TMC_REQUEST_STATUS_SUCCESS ;
switch ( USB_ControlRequest . bRequest )
{
case Req_InitiateAbortBulkOut :
@ -133,10 +141,13 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
{
Endpoint_ClearSETUP ( ) ;
/* Check to see if a split request is already being processed before starting a new one */
if ( RequestInProgess ! = 0 )
{
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS ) ;
TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS ;
}
else if ( USB_ControlRequest . wValue ! = NextTransferOUTTag )
{
TMCRequestStatus = TMC_REQUEST_STATUS_TRANSFER_NOT_IN_PROGRESS ;
}
else
{
@ -145,10 +156,11 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
/* Save the split request for later checking when a new request is received */
RequestInProgess = Req_InitiateAbortBulkOut ;
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SUCCESS ) ;
}
/* Write the request response byte */
Endpoint_Write_Byte ( TMCRequestStatus ) ;
Endpoint_ClearIN ( ) ;
Endpoint_ClearStatusStage ( ) ;
}
@ -159,20 +171,17 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
{
Endpoint_ClearSETUP ( ) ;
/* Check to see the correct split request is in progress before the status can be retrieved */
if ( RequestInProgess ! = Req_InitiateAbortBulkOut )
{
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS ) ;
}
TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS ;
else if ( IsTMCBulkOUTReset )
TMCRequestStatus = TMC_REQUEST_STATUS_PENDING ;
else
{
// TODO: CLEAR BULK OUT
/* Clear the pending split request value so that a new request can be made */
RequestInProgess = 0 ;
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SUCCESS ) ;
}
/* Write the request response bytes */
Endpoint_Write_Byte ( TMCRequestStatus ) ;
Endpoint_Write_Word_LE ( 0 ) ;
Endpoint_Write_DWord_LE ( 0 ) ; // TODO - Last transfer length
Endpoint_ClearIN ( ) ;
Endpoint_ClearStatusStage ( ) ;
@ -184,10 +193,13 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
{
Endpoint_ClearSETUP ( ) ;
/* Check to see if a split request is already being processed before starting a new one */
if ( RequestInProgess ! = 0 )
{
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS ) ;
TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS ;
}
else if ( USB_ControlRequest . wValue ! = NextTransferINTag )
{
TMCRequestStatus = TMC_REQUEST_STATUS_TRANSFER_NOT_IN_PROGRESS ;
}
else
{
@ -196,10 +208,12 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
/* Save the split request for later checking when a new request is received */
RequestInProgess = Req_InitiateAbortBulkIn ;
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SUCCESS ) ;
}
/* Write the request response bytes */
Endpoint_Write_Byte ( TMCRequestStatus ) ;
Endpoint_Write_Byte ( NextTransferINTag ) ;
Endpoint_ClearIN ( ) ;
Endpoint_ClearStatusStage ( ) ;
}
@ -210,20 +224,17 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
{
Endpoint_ClearSETUP ( ) ;
/* Check to see the correct split request is in progress before the status can be retrieved */
if ( RequestInProgess ! = Req_InitiateAbortBulkIn )
{
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS ) ;
}
TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS ;
else if ( IsTMCBulkINReset )
TMCRequestStatus = TMC_REQUEST_STATUS_PENDING ;
else
{
// TODO: CLEAR BULK IN
/* Clear the pending split request value so that a new request can be made */
RequestInProgess = 0 ;
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SUCCESS ) ;
}
/* Write the request response bytes */
Endpoint_Write_Byte ( TMCRequestStatus ) ;
Endpoint_Write_Word_LE ( 0 ) ;
Endpoint_Write_DWord_LE ( 0 ) ; // TODO - Last transfer length
Endpoint_ClearIN ( ) ;
Endpoint_ClearStatusStage ( ) ;
@ -235,7 +246,6 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
{
Endpoint_ClearSETUP ( ) ;
/* Check to see if a split request is already being processed before starting a new one */
if ( RequestInProgess ! = 0 )
{
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS ) ;
@ -248,10 +258,11 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
/* Save the split request for later checking when a new request is received */
RequestInProgess = Req_InitiateClear ;
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SUCCESS ) ;
}
/* Write the request response byte */
Endpoint_Write_Byte ( TMCRequestStatus ) ;
Endpoint_ClearIN ( ) ;
Endpoint_ClearStatusStage ( ) ;
}
@ -262,20 +273,16 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
{
Endpoint_ClearSETUP ( ) ;
/* Check to see the correct split request is in progress before the status can be retrieved */
if ( RequestInProgess ! = Req_InitiateClear )
{
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS ) ;
}
TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS ;
else if ( IsTMCBulkINReset | | IsTMCBulkOUTReset )
TMCRequestStatus = TMC_REQUEST_STATUS_PENDING ;
else
{
// TODO: CLEAR STATUS
/* Clear the pending split request value so that a new request can be made */
RequestInProgess = 0 ;
Endpoint_Write_Byte ( TMC_REQUEST_STATUS_SUCCESS ) ;
}
/* Write the request response bytes */
Endpoint_Write_Byte ( TMCRequestStatus ) ;
Endpoint_Write_Byte ( 0 ) ;
Endpoint_ClearIN ( ) ;
Endpoint_ClearStatusStage ( ) ;
@ -313,6 +320,10 @@ void TMC_Task(void)
LEDs_SetAllLEDs ( LEDS_ALL_LEDS ) ;
Endpoint_ClearOUT ( ) ;
}
/* All pending data has been processed - reset the data abort flags */
IsTMCBulkINReset = false ;
IsTMCBulkOUTReset = false ;
}
/** Stream callback function for the Endpoint stream write functions. This callback will abort the current stream transfer