Add stream callback flags and class specific control request handler code to the...
authorDean Camera <dean@fourwalledcubicle.com>
Mon, 26 Jul 2010 04:26:47 +0000 (04:26 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Mon, 26 Jul 2010 04:26:47 +0000 (04:26 +0000)
Change over the keyboard demo's manufacturer name back to the primary author of the demo.

Demos/Device/ClassDriver/Keyboard/Descriptors.c
Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.h
Demos/Device/Incomplete/TestAndMeasurement/makefile
Demos/Device/LowLevel/Keyboard/Descriptors.c

index bf4b16d..d2e52b5 100644 (file)
@@ -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,
index d56a7f7..c3e54ab 100644 (file)
@@ -43,7 +43,7 @@ TMC_Capabilities_t Capabilities =
                        {\r
                                .ListenOnly             = false,\r
                                .TalkOnly               = false,\r
-                               .PulseIndicateSupported = true,\r
+                               .PulseIndicateSupported = false,\r
                        },\r
 \r
                .Device     =\r
@@ -52,6 +52,15 @@ TMC_Capabilities_t Capabilities =
                        },\r
        };\r
 \r
+/** Current TMC control request that is being processed */\r
+uint8_t RequestInProgess = 0;\r
+\r
+/** Stream callback abort flag for bulk IN data */\r
+bool IsTMCBulkINReset    = false;\r
+\r
+/** Stream callback abort flag for bulk OUT data */\r
+bool IsTMCBulkOUTReset   = false;\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
@@ -122,42 +131,154 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                case Req_InitiateAbortBulkOut:\r
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))\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
+                               }\r
+                               else\r
+                               {\r
+                                       /* Indicate that all in-progress/pending data OUT requests should be aborted */\r
+                                       IsTMCBulkOUTReset = true;\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
+                               Endpoint_ClearIN();\r
+                               Endpoint_ClearStatusStage();\r
                        }\r
                        \r
                        break;\r
                case Req_CheckAbortBulkOutStatus:\r
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))\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
+                               else\r
+                               {\r
+                                       // TODO: CLEAR BULK OUT\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
+                               \r
+                               Endpoint_ClearIN();\r
+                               Endpoint_ClearStatusStage();                            \r
                        }\r
                        \r
                        break;\r
                case Req_InitiateAbortBulkIn:\r
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))\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
+                               }\r
+                               else\r
+                               {\r
+                                       /* Indicate that all in-progress/pending data IN requests should be aborted */\r
+                                       IsTMCBulkINReset  = true;\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
+                               Endpoint_ClearIN();\r
+                               Endpoint_ClearStatusStage();\r
                        }\r
                        \r
                        break;\r
                case Req_CheckAbortBulkInStatus:\r
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT))\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
+                               else\r
+                               {\r
+                                       // TODO: CLEAR BULK IN\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
+                               \r
+                               Endpoint_ClearIN();\r
+                               Endpoint_ClearStatusStage();                            \r
                        }\r
                        \r
                        break;\r
                case Req_InitiateClear:\r
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))\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
+                               }\r
+                               else\r
+                               {\r
+                                       /* Indicate that all in-progress/pending data IN and OUT requests should be aborted */\r
+                                       IsTMCBulkINReset  = true;\r
+                                       IsTMCBulkOUTReset = true;\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
+                               Endpoint_ClearIN();\r
+                               Endpoint_ClearStatusStage();\r
                        }\r
                        \r
                        break;\r
                case Req_CheckClearStatus:\r
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))\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
+                               else\r
+                               {\r
+                                       // TODO: CLEAR STATUS\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
+                               \r
+                               Endpoint_ClearIN();\r
+                               Endpoint_ClearStatusStage();                            \r
                        }\r
                        \r
                        break;\r
@@ -193,3 +314,29 @@ void TMC_Task(void)
                Endpoint_ClearOUT();\r
        }\r
 }\r
+\r
+/** Stream callback function for the Endpoint stream write functions. This callback will abort the current stream transfer\r
+ *  if a TMC Abort Bulk IN request has been issued to the control endpoint.\r
+ */\r
+uint8_t StreamCallback_AbortINOnRequest(void)\r
+{      \r
+       /* Abort if a TMC Bulk Data IN abort was received */\r
+       if (IsTMCBulkINReset)\r
+         return STREAMCALLBACK_Abort;\r
+       \r
+       /* Continue with the current stream operation */\r
+       return STREAMCALLBACK_Continue;\r
+}\r
+\r
+/** Stream callback function for the Endpoint stream read functions. This callback will abort the current stream transfer\r
+ *  if a TMC Abort Bulk OUT request has been issued to the control endpoint.\r
+ */\r
+uint8_t StreamCallback_AbortOUTOnRequest(void)\r
+{      \r
+       /* Abort if a TMC Bulk Data IN abort was received */\r
+       if (IsTMCBulkOUTReset)\r
+         return STREAMCALLBACK_Abort;\r
+       \r
+       /* Continue with the current stream operation */\r
+       return STREAMCALLBACK_Continue;\r
+}\r
index bd9aee6..53f65a1 100644 (file)
                #define Req_GetCapabilities                   0x07\r
                #define Req_IndicatorPulse                    0x40\r
                \r
-               #define TMC_REQUEST_STATUS_SUCCESS            0x01\r
-               #define TMC_REQUEST_STATUS_PENDING            0x02\r
-               #define TMC_REQUEST_STATUS_FAILED             0x80\r
-               #define TMC_REQUEST_STATUS_NOTRANSFER         0x81\r
-               #define TMC_REQUEST_STATUS_NOCHECKINITIATED   0x82\r
-               #define TMC_REQUEST_STATUS_CHECKINPROGRESS    0x83\r
+               #define TMC_REQUEST_STATUS_SUCCESS                   0x01\r
+               #define TMC_REQUEST_STATUS_PENDING                   0x02\r
+               #define TMC_REQUEST_STATUS_FAILED                    0x80\r
+               #define TMC_REQUEST_STATUS_TRANSFER_NOT_IN_PROGRESS  0x81\r
+               #define TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS     0x82\r
+               #define TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS         0x83\r
 \r
        /* Type Defines */\r
                typedef struct\r
                void EVENT_USB_Device_ConfigurationChanged(void);\r
                void EVENT_USB_Device_UnhandledControlRequest(void);\r
 \r
+               uint8_t StreamCallback_AbortINOnRequest(void);\r
+               uint8_t StreamCallback_AbortOUTOnRequest(void);\r
+\r
 #endif\r
index 3e3b6ea..43f8b8f 100644 (file)
@@ -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
index 6a2dfb5..4963c7b 100644 (file)
@@ -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,