diff options
Diffstat (limited to 'Demos/Device/Incomplete/TestAndMeasurement')
-rw-r--r-- | Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c | 101 | ||||
-rw-r--r-- | Demos/Device/Incomplete/TestAndMeasurement/makefile | 1 |
2 files changed, 57 insertions, 45 deletions
diff --git a/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c b/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c index c3e54ab3a..184e2e23c 100644 --- a/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c +++ b/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c @@ -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,21 +171,18 @@ 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
+ RequestInProgess = 0;
- /* Clear the pending split request value so that a new request can be made */
- RequestInProgess = 0;
+ /* Write the request response bytes */
+ Endpoint_Write_Byte(TMCRequestStatus);
+ Endpoint_Write_Word_LE(0);
+ Endpoint_Write_DWord_LE(0); // TODO - Last transfer length
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);
- }
-
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,23 +224,20 @@ 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
+ RequestInProgess = 0;
- /* Clear the pending split request value so that a new request can be made */
- RequestInProgess = 0;
+ /* Write the request response bytes */
+ Endpoint_Write_Byte(TMCRequestStatus);
+ Endpoint_Write_Word_LE(0);
+ Endpoint_Write_DWord_LE(0); // TODO - Last transfer length
- Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);
- }
-
Endpoint_ClearIN();
- Endpoint_ClearStatusStage();
+ Endpoint_ClearStatusStage();
}
break;
@@ -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
+ RequestInProgess = 0;
- /* 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
diff --git a/Demos/Device/Incomplete/TestAndMeasurement/makefile b/Demos/Device/Incomplete/TestAndMeasurement/makefile index 43f8b8fbd..856fc2bcb 100644 --- a/Demos/Device/Incomplete/TestAndMeasurement/makefile +++ b/Demos/Device/Incomplete/TestAndMeasurement/makefile @@ -121,6 +121,7 @@ LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 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 |