aboutsummaryrefslogtreecommitdiffstats
path: root/Demos/Device
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-07-26 04:26:47 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-07-26 04:26:47 +0000
commit89a32baf585c8881fa972a2cb1963fb67e70d642 (patch)
treeac28f6a12d87c91f2d243bbaadb1dc7ef8e397cc /Demos/Device
parent4c9425c0d52fbfe45f6697d9124b022842049af6 (diff)
downloadlufa-89a32baf585c8881fa972a2cb1963fb67e70d642.tar.gz
lufa-89a32baf585c8881fa972a2cb1963fb67e70d642.tar.bz2
lufa-89a32baf585c8881fa972a2cb1963fb67e70d642.zip
Add stream callback flags and class specific control request handler code to the incomplete Test and Measurement Class device demo.
Change over the keyboard demo's manufacturer name back to the primary author of the demo.
Diffstat (limited to 'Demos/Device')
-rw-r--r--Demos/Device/ClassDriver/Keyboard/Descriptors.c4
-rw-r--r--Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c161
-rw-r--r--Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.h15
-rw-r--r--Demos/Device/Incomplete/TestAndMeasurement/makefile1
-rw-r--r--Demos/Device/LowLevel/Keyboard/Descriptors.c4
5 files changed, 167 insertions, 18 deletions
diff --git a/Demos/Device/ClassDriver/Keyboard/Descriptors.c b/Demos/Device/ClassDriver/Keyboard/Descriptors.c
index bf4b16d01..d2e52b519 100644
--- a/Demos/Device/ClassDriver/Keyboard/Descriptors.c
+++ b/Demos/Device/ClassDriver/Keyboard/Descriptors.c
@@ -183,9 +183,9 @@ USB_Descriptor_String_t PROGMEM LanguageString =
*/
USB_Descriptor_String_t PROGMEM ManufacturerString =
{
- .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String},
+ .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
- .UnicodeString = L"Denver Gingerich"
+ .UnicodeString = L"Dean Camera"
};
/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
diff --git a/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c b/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
index d56a7f7bc..c3e54ab3a 100644
--- a/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
+++ b/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
@@ -43,7 +43,7 @@ TMC_Capabilities_t Capabilities =
{
.ListenOnly = false,
.TalkOnly = false,
- .PulseIndicateSupported = true,
+ .PulseIndicateSupported = false,
},
.Device =
@@ -52,6 +52,15 @@ TMC_Capabilities_t Capabilities =
},
};
+/** Current TMC control request that is being processed */
+uint8_t RequestInProgess = 0;
+
+/** Stream callback abort flag for bulk IN data */
+bool IsTMCBulkINReset = false;
+
+/** Stream callback abort flag for bulk OUT data */
+bool IsTMCBulkOUTReset = false;
+
/** Main program entry point. This routine contains the overall program flow, including initial
* setup of all components and the main program loop.
@@ -122,42 +131,154 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
case Req_InitiateAbortBulkOut:
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))
{
-
+ 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);
+ }
+ else
+ {
+ /* Indicate that all in-progress/pending data OUT requests should be aborted */
+ IsTMCBulkOUTReset = true;
+
+ /* Save the split request for later checking when a new request is received */
+ RequestInProgess = Req_InitiateAbortBulkOut;
+
+ Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);
+ }
+
+ Endpoint_ClearIN();
+ Endpoint_ClearStatusStage();
}
break;
case Req_CheckAbortBulkOutStatus:
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))
{
-
+ 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);
+ }
+ 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);
+ }
+
+ Endpoint_ClearIN();
+ Endpoint_ClearStatusStage();
}
break;
case Req_InitiateAbortBulkIn:
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))
{
-
+ 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);
+ }
+ else
+ {
+ /* Indicate that all in-progress/pending data IN requests should be aborted */
+ IsTMCBulkINReset = true;
+
+ /* Save the split request for later checking when a new request is received */
+ RequestInProgess = Req_InitiateAbortBulkIn;
+
+ Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);
+ }
+
+ Endpoint_ClearIN();
+ Endpoint_ClearStatusStage();
}
break;
case Req_CheckAbortBulkInStatus:
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))
{
-
+ 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);
+ }
+ 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);
+ }
+
+ Endpoint_ClearIN();
+ Endpoint_ClearStatusStage();
}
break;
case Req_InitiateClear:
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
{
-
+ 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);
+ }
+ else
+ {
+ /* Indicate that all in-progress/pending data IN and OUT requests should be aborted */
+ IsTMCBulkINReset = true;
+ IsTMCBulkOUTReset = true;
+
+ /* Save the split request for later checking when a new request is received */
+ RequestInProgess = Req_InitiateClear;
+
+ Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);
+ }
+
+ Endpoint_ClearIN();
+ Endpoint_ClearStatusStage();
}
break;
case Req_CheckClearStatus:
if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
{
-
+ 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);
+ }
+ 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);
+ }
+
+ Endpoint_ClearIN();
+ Endpoint_ClearStatusStage();
}
break;
@@ -193,3 +314,29 @@ void TMC_Task(void)
Endpoint_ClearOUT();
}
}
+
+/** Stream callback function for the Endpoint stream write functions. This callback will abort the current stream transfer
+ * if a TMC Abort Bulk IN request has been issued to the control endpoint.
+ */
+uint8_t StreamCallback_AbortINOnRequest(void)
+{
+ /* Abort if a TMC Bulk Data IN abort was received */
+ if (IsTMCBulkINReset)
+ return STREAMCALLBACK_Abort;
+
+ /* Continue with the current stream operation */
+ return STREAMCALLBACK_Continue;
+}
+
+/** Stream callback function for the Endpoint stream read functions. This callback will abort the current stream transfer
+ * if a TMC Abort Bulk OUT request has been issued to the control endpoint.
+ */
+uint8_t StreamCallback_AbortOUTOnRequest(void)
+{
+ /* Abort if a TMC Bulk Data IN abort was received */
+ if (IsTMCBulkOUTReset)
+ return STREAMCALLBACK_Abort;
+
+ /* Continue with the current stream operation */
+ return STREAMCALLBACK_Continue;
+}
diff --git a/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.h b/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.h
index bd9aee689..53f65a1bd 100644
--- a/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.h
+++ b/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.h
@@ -65,12 +65,12 @@
#define Req_GetCapabilities 0x07
#define Req_IndicatorPulse 0x40
- #define TMC_REQUEST_STATUS_SUCCESS 0x01
- #define TMC_REQUEST_STATUS_PENDING 0x02
- #define TMC_REQUEST_STATUS_FAILED 0x80
- #define TMC_REQUEST_STATUS_NOTRANSFER 0x81
- #define TMC_REQUEST_STATUS_NOCHECKINITIATED 0x82
- #define TMC_REQUEST_STATUS_CHECKINPROGRESS 0x83
+ #define TMC_REQUEST_STATUS_SUCCESS 0x01
+ #define TMC_REQUEST_STATUS_PENDING 0x02
+ #define TMC_REQUEST_STATUS_FAILED 0x80
+ #define TMC_REQUEST_STATUS_TRANSFER_NOT_IN_PROGRESS 0x81
+ #define TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS 0x82
+ #define TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS 0x83
/* Type Defines */
typedef struct
@@ -107,4 +107,7 @@
void EVENT_USB_Device_ConfigurationChanged(void);
void EVENT_USB_Device_UnhandledControlRequest(void);
+ uint8_t StreamCallback_AbortINOnRequest(void);
+ uint8_t StreamCallback_AbortOUTOnRequest(void);
+
#endif
diff --git a/Demos/Device/Incomplete/TestAndMeasurement/makefile b/Demos/Device/Incomplete/TestAndMeasurement/makefile
index 3e3b6eabc..43f8b8fbd 100644
--- a/Demos/Device/Incomplete/TestAndMeasurement/makefile
+++ b/Demos/Device/Incomplete/TestAndMeasurement/makefile
@@ -121,7 +121,6 @@ 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 NO_STREAM_CALLBACKS
# Create the LUFA source path variables by including the LUFA root makefile
diff --git a/Demos/Device/LowLevel/Keyboard/Descriptors.c b/Demos/Device/LowLevel/Keyboard/Descriptors.c
index 6a2dfb5c7..4963c7b1a 100644
--- a/Demos/Device/LowLevel/Keyboard/Descriptors.c
+++ b/Demos/Device/LowLevel/Keyboard/Descriptors.c
@@ -194,9 +194,9 @@ USB_Descriptor_String_t PROGMEM LanguageString =
*/
USB_Descriptor_String_t PROGMEM ManufacturerString =
{
- .Header = {.Size = USB_STRING_LEN(16), .Type = DTYPE_String},
+ .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
- .UnicodeString = L"Denver Gingerich"
+ .UnicodeString = L"Dean Camera"
};
/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,