Alter Test and Measurement Class demo's request handlers to accept, process and correctly return the fields indicated in the specification.
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
# Create the LUFA source path variables by including the LUFA root makefile
# Create the LUFA source path variables by including the LUFA root makefile
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
# Create the LUFA source path variables by including the LUFA root makefile
# Create the LUFA source path variables by including the LUFA root makefile
/** Stream callback abort flag for bulk OUT data */\r
bool IsTMCBulkOUTReset = false;\r
\r
/** 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
/** 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
\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
switch (USB_ControlRequest.bRequest)\r
{\r
case Req_InitiateAbortBulkOut:\r
{\r
Endpoint_ClearSETUP();\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
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
/* Save the split request for later checking when a new request is received */\r
RequestInProgess = Req_InitiateAbortBulkOut;\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
+ /* Write the request response byte */\r
+ Endpoint_Write_Byte(TMCRequestStatus);\r
+\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage();\r
}\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage();\r
}\r
{\r
Endpoint_ClearSETUP();\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
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
- {\r
- // TODO: CLEAR BULK OUT\r
+ RequestInProgess = 0; \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
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
- }\r
- \r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage(); \r
}\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage(); \r
}\r
{\r
Endpoint_ClearSETUP();\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
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
/* Save the split request for later checking when a new request is received */\r
RequestInProgess = Req_InitiateAbortBulkIn;\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
+ /* Write the request response bytes */\r
+ Endpoint_Write_Byte(TMCRequestStatus);\r
+ Endpoint_Write_Byte(NextTransferINTag);\r
+\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage();\r
}\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage();\r
}\r
{\r
Endpoint_ClearSETUP();\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
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
- {\r
- // TODO: CLEAR BULK IN\r
+ RequestInProgess = 0;\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
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
- }\r
- \r
- Endpoint_ClearStatusStage(); \r
+ Endpoint_ClearStatusStage();\r
{\r
Endpoint_ClearSETUP();\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
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
/* 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
+ /* Write the request response byte */\r
+ Endpoint_Write_Byte(TMCRequestStatus);\r
+\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage();\r
}\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage();\r
}\r
{\r
Endpoint_ClearSETUP();\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
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
- {\r
- // TODO: CLEAR STATUS\r
+ RequestInProgess = 0;\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
\r
Endpoint_ClearIN();\r
Endpoint_ClearStatusStage(); \r
LEDs_SetAllLEDs(LEDS_ALL_LEDS);\r
Endpoint_ClearOUT();\r
}\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
}\r
\r
/** Stream callback function for the Endpoint stream write functions. This callback will abort the current stream transfer\r
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
# Create the LUFA source path variables by including the LUFA root makefile
# Create the LUFA source path variables by including the LUFA root makefile
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
# Create the LUFA source path variables by including the LUFA root makefile
# Create the LUFA source path variables by including the LUFA root makefile
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
#LUFA_OPTS += -D DUMMY_RTC
#LUFA_OPTS += -D DUMMY_RTC
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D FAST_STREAM_TRANSFERS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D FAST_STREAM_TRANSFERS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
LUFA_OPTS += -D ENABLE_DHCP_CLIENT
LUFA_OPTS += -D ENABLE_TELNET_SERVER
LUFA_OPTS += -D ENABLE_DHCP_CLIENT
LUFA_OPTS += -D ENABLE_TELNET_SERVER