Added new HOST_STATE_WaitForDeviceRemoval host state machine state for non-blocking...
authorDean Camera <dean@fourwalledcubicle.com>
Mon, 13 Jul 2009 05:34:43 +0000 (05:34 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Mon, 13 Jul 2009 05:34:43 +0000 (05:34 +0000)
Added verbose documentation for each of the USB Host state machine states.

18 files changed:
Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c
Demos/Host/Incomplete/BluetoothHost/DeviceDescriptor.c
Demos/Host/Incomplete/PrinterHost/PrinterHost.c
Demos/Host/LowLevel/CDCHost/CDCHost.c
Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
Demos/Host/LowLevel/KeyboardHost/KeyboardHost.c
Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c
Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c
Demos/Host/LowLevel/MouseHost/MouseHost.c
Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c
Demos/Host/LowLevel/StillImageHost/StillImageHost.c
LUFA/Drivers/USB/Class/Host/CDC.c
LUFA/Drivers/USB/LowLevel/Host.c
LUFA/Drivers/USB/LowLevel/Host.h
LUFA/ManPages/ChangeLog.txt
LUFA/ManPages/CompileTimeTokens.txt
LUFA/ManPages/FutureChanges.txt
Projects/MissileLauncher/MissileLauncher.c

index b8e87cb..3222b77 100644 (file)
@@ -139,14 +139,11 @@ void Bluetooth_Management_Task(void)
                                LEDs_SetAllLEDs(LEDS_LED1);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
                        puts_P(PSTR("Bluetooth Dongle Detected.\r\n"));\r
-                               \r
-                       /* Select the control pipe for the request transfer */\r
-                       Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
 \r
                        /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */\r
                        if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)\r
@@ -158,7 +155,7 @@ void Bluetooth_Management_Task(void)
                                LEDs_SetAllLEDs(LEDS_LED1);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                                \r
@@ -181,7 +178,7 @@ void Bluetooth_Management_Task(void)
                                LEDs_SetAllLEDs(LEDS_LED1);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -189,9 +186,5 @@ void Bluetooth_Management_Task(void)
 \r
                        USB_HostState = HOST_STATE_Ready;\r
                        break;\r
-               case HOST_STATE_Ready:\r
-                       /* Do nothing, Bluetooth stack will take care of enumeration */\r
-                       \r
-                       break;\r
        }\r
 }\r
index e9f575c..f68f957 100644 (file)
@@ -34,28 +34,15 @@ uint8_t ProcessDeviceDescriptor(void)
 {\r
        USB_Descriptor_Device_t DeviceDescriptor;\r
 \r
-       /* Standard request to get the device descriptor */\r
-       USB_ControlRequest = (USB_Request_Header_t)\r
-               {\r
-                       bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),\r
-                       bRequest:      REQ_GetDescriptor,\r
-                       wValue:        (DTYPE_Device << 8),\r
-                       wIndex:        0,\r
-                       wLength:       sizeof(USB_Descriptor_Device_t),\r
-               };\r
-\r
-       /* Select the control pipe for the request transfer */\r
-       Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
-\r
        /* Send the request to retrieve the device descriptor */\r
-       if (USB_Host_SendControlRequest((void*)&DeviceDescriptor) != HOST_SENDCONTROL_Successful)\r
+       if (USB_Host_GetDeviceDescriptor(&DeviceDescriptor) != HOST_SENDCONTROL_Successful)\r
          return ControlErrorDuringDeviceRead;\r
          \r
        /* Validate returned data - ensure the returned data is a device descriptor */\r
        if (DeviceDescriptor.Header.Type != DTYPE_Device)\r
          return InvalidDeviceDataReturned;\r
          \r
-       if ((DeviceDescriptor.Class != BLUETOOTH_DEVICE_CLASS) ||\r
+       if ((DeviceDescriptor.Class    != BLUETOOTH_DEVICE_CLASS)    ||\r
            (DeviceDescriptor.SubClass != BLUETOOTH_DEVICE_SUBCLASS) ||\r
            (DeviceDescriptor.Protocol != BLUETOOTH_DEVICE_PROTOCOL))\r
        {\r
index df80789..7b98542 100644 (file)
@@ -133,7 +133,7 @@ void USB_Printer_Host(void)
                                LEDs_SetAllLEDs(LEDS_LED1);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                                \r
@@ -147,7 +147,7 @@ void USB_Printer_Host(void)
                                LEDs_SetAllLEDs(LEDS_LED1);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -173,7 +173,7 @@ void USB_Printer_Host(void)
                                LEDs_SetAllLEDs(LEDS_LED1);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -181,10 +181,8 @@ void USB_Printer_Host(void)
                \r
                        /* Indicate device no longer busy */\r
                        LEDs_SetAllLEDs(LEDS_LED4);\r
-                       \r
-                       /* Wait until USB device disconnected */\r
-                       while (USB_IsConnected);\r
-                       \r
+\r
+                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                        break;\r
        }\r
 }\r
index b3e0674..de7ab88 100644 (file)
@@ -148,7 +148,7 @@ void CDC_Host_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
@@ -162,7 +162,7 @@ void CDC_Host_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                                \r
index 9f7da59..a1b62ac 100644 (file)
@@ -249,7 +249,7 @@ void HID_Host_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -263,7 +263,7 @@ void HID_Host_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
                                \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
index 734ef2a..2517848 100644 (file)
@@ -213,7 +213,7 @@ void Keyboard_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                \r
@@ -227,7 +227,7 @@ void Keyboard_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                                \r
@@ -257,7 +257,7 @@ void Keyboard_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
                                \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
index 4e78b0d..2ef15e7 100644 (file)
@@ -148,7 +148,7 @@ void Keyboard_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -163,7 +163,7 @@ void Keyboard_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                                \r
@@ -182,7 +182,7 @@ void Keyboard_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
                                \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;  \r
                        }\r
 \r
index 2f84d0f..1bb94f6 100644 (file)
@@ -154,7 +154,7 @@ void MassStorage_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -168,7 +168,7 @@ void MassStorage_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                                \r
@@ -187,6 +187,8 @@ void MassStorage_Task(void)
                        if ((ErrorCode = MassStore_GetMaxLUN(&MassStore_MaxLUNIndex)) != HOST_SENDCONTROL_Successful)\r
                        {       \r
                                ShowDiskReadError(PSTR("Get Max LUN"), false, ErrorCode);\r
+\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
@@ -197,6 +199,8 @@ void MassStorage_Task(void)
                        if ((ErrorCode = MassStore_MassStorageReset()) != HOST_SENDCONTROL_Successful)\r
                        {\r
                                ShowDiskReadError(PSTR("Mass Storage Reset"), false, ErrorCode);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
@@ -213,6 +217,8 @@ void MassStorage_Task(void)
                        if (((ErrorCode = MassStore_PreventAllowMediumRemoval(0, true)) != 0) || (SCSICommandStatus.Status != Command_Pass))\r
                        {\r
                                ShowDiskReadError(PSTR("Prevent/Allow Medium Removal"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -221,6 +227,8 @@ void MassStorage_Task(void)
                        if (((ErrorCode = MassStore_Inquiry(0, &InquiryData)) != 0) || (SCSICommandStatus.Status != Command_Pass))\r
                        {\r
                                ShowDiskReadError(PSTR("Inquiry"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -237,7 +245,9 @@ void MassStorage_Task(void)
                                if ((ErrorCode = MassStore_TestUnitReady(0)) != 0)\r
                                {\r
                                        ShowDiskReadError(PSTR("Test Unit Ready"), false, ErrorCode);\r
-                                       break;                          \r
+\r
+                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
+                                       break;\r
                                }\r
                        }\r
                        while ((SCSICommandStatus.Status != Command_Pass) && USB_IsConnected);\r
@@ -255,6 +265,8 @@ void MassStorage_Task(void)
                        if (((ErrorCode = MassStore_ReadCapacity(0, &DiskCapacity)) != 0) || (SCSICommandStatus.Status != Command_Pass))\r
                        {\r
                                ShowDiskReadError(PSTR("Read Capacity"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
@@ -269,6 +281,8 @@ void MassStorage_Task(void)
                            (SCSICommandStatus.Status != Command_Pass))\r
                        {\r
                                ShowDiskReadError(PSTR("Read Device Block"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
@@ -319,6 +333,8 @@ void MassStorage_Task(void)
                                    (SCSICommandStatus.Status != Command_Pass))\r
                                {\r
                                        ShowDiskReadError(PSTR("Read Device Block"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);\r
+                                       \r
+                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                        break;\r
                                }\r
 \r
@@ -339,8 +355,7 @@ void MassStorage_Task(void)
                        LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
                        \r
                        /* Wait until USB device disconnected */\r
-                       while (USB_IsConnected);\r
-                       \r
+                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                        break;\r
        }\r
 }\r
@@ -372,7 +387,4 @@ void ShowDiskReadError(char* CommandString, bool FailedAtSCSILayer, uint8_t Erro
 \r
        /* Indicate device error via the status LEDs */\r
        LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-\r
-       /* Wait until USB device disconnected */\r
-       while (USB_IsConnected);\r
 }\r
index 2a2e1b9..d5c4bf9 100644 (file)
@@ -209,7 +209,7 @@ void Mouse_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -223,7 +223,7 @@ void Mouse_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
                                \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
@@ -253,7 +253,7 @@ void Mouse_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
                                \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
index d7a9471..1e93123 100644 (file)
@@ -149,7 +149,7 @@ void Mouse_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                \r
@@ -163,7 +163,7 @@ void Mouse_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
                                \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
@@ -182,7 +182,7 @@ void Mouse_HID_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
                                \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;                  \r
                        }\r
 \r
index 5243871..0f511ad 100644 (file)
@@ -149,7 +149,7 @@ void StillImage_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -162,7 +162,7 @@ void StillImage_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                                \r
@@ -195,6 +195,8 @@ void StillImage_Task(void)
                        if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)\r
                        {\r
                                ShowCommandError(ErrorCode, false);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
@@ -246,6 +248,8 @@ void StillImage_Task(void)
                        if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)\r
                        {\r
                                ShowCommandError(ErrorCode, false);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
@@ -253,6 +257,8 @@ void StillImage_Task(void)
                        if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))\r
                        {\r
                                ShowCommandError(PIMA_ReceivedBlock.Code, true);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
@@ -274,6 +280,8 @@ void StillImage_Task(void)
                        if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)\r
                        {\r
                                ShowCommandError(ErrorCode, false);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r
@@ -281,6 +289,8 @@ void StillImage_Task(void)
                        if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))\r
                        {\r
                                ShowCommandError(PIMA_ReceivedBlock.Code, true);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -302,6 +312,8 @@ void StillImage_Task(void)
                        if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)\r
                        {\r
                                ShowCommandError(ErrorCode, false);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -309,6 +321,8 @@ void StillImage_Task(void)
                        if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))\r
                        {\r
                                ShowCommandError(PIMA_ReceivedBlock.Code, true);\r
+                               \r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -363,7 +377,4 @@ void ShowCommandError(uint8_t ErrorCode, bool ResponseCodeError)
                        \r
        /* Indicate error via status LEDs */\r
        LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-                               \r
-       /* Wait until USB device disconnected */\r
-       while (USB_IsConnected);\r
 }\r
index 943cb73..688143c 100644 (file)
@@ -203,12 +203,12 @@ void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo)
                case HOST_STATE_Addressed:\r
                        if ((ErrorCode = CDC_Host_ProcessConfigDescriptor(CDCInterfaceInfo)) != CDC_ENUMERROR_NoError)\r
                        {\r
-                               USB_HostState = HOST_STATE_Unattached;\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                        }\r
 \r
                        if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)\r
                        {\r
-                               USB_HostState = HOST_STATE_Unattached;\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                        }\r
                                \r
                        USB_HostState = HOST_STATE_Configured;\r
index 037e6d8..78a9ca8 100644 (file)
@@ -66,6 +66,7 @@ void USB_Host_ProcessNextHostState(void)
                        USB_HostState = HOST_STATE_Attached_WaitForDeviceSettle;\r
                        break;\r
                case HOST_STATE_Attached_WaitForDeviceSettle:\r
+                       #if HOST_DEVICE_SETTLE_DELAY_MS > 0\r
                        _delay_ms(1);\r
 \r
                        if (!(WaitMSRemaining--))\r
@@ -78,6 +79,9 @@ void USB_Host_ProcessNextHostState(void)
                                \r
                                USB_HostState = HOST_STATE_Attached_WaitForConnect;\r
                        }\r
+                       #else\r
+                       USB_HostState = HOST_STATE_Attached_WaitForConnect;                     \r
+                       #endif\r
                        \r
                        break;\r
                case HOST_STATE_Attached_WaitForConnect:                \r
index 08b21f6..d91c1d8 100644 (file)
                         */\r
                        enum USB_Host_States_t\r
                        {\r
-                               HOST_STATE_WaitForDevice                = 0,  /**< Internally implemented by the library. */\r
-                               HOST_STATE_Unattached                   = 1,  /**< Internally implemented by the library. */\r
-                               HOST_STATE_Attached                     = 2,  /**< Internally implemented by the library. */\r
-                               HOST_STATE_Attached_WaitForDeviceSettle = 3,  /**< Internally implemented by the library. */\r
-                               HOST_STATE_Attached_WaitForConnect      = 4,  /**< Internally implemented by the library. */\r
-                               HOST_STATE_Attached_DoReset             = 5,  /**< Internally implemented by the library. */\r
-                               HOST_STATE_Powered                      = 6,  /**< Internally implemented by the library. */\r
-                               HOST_STATE_Default                      = 7,  /**< Internally implemented by the library. */\r
-                               HOST_STATE_Default_PostReset            = 8,  /**< Internally implemented by the library. */\r
-                               HOST_STATE_Default_PostAddressSet       = 9,  /**< Internally implemented by the library. */\r
-                               HOST_STATE_Addressed                    = 10, /**< May be implemented by the user project. */\r
-                               HOST_STATE_Configured                   = 11, /**< May be implemented by the user project. */\r
-                               HOST_STATE_Ready                        = 12, /**< May be implemented by the user project. */\r
-                               HOST_STATE_Suspended                    = 13, /**< May be implemented by the user project. */\r
+                               HOST_STATE_WaitForDeviceRemoval         = 0,  /**< Internally implemented by the library. This state can be\r
+                                                                              *   used by the library to wait until the attached device is\r
+                                                                              *   removed by the user - useful for when an error occurs or\r
+                                                                              *   further communication with the device is not needed. This\r
+                                                                              *   allows for other code to run while the state machine is\r
+                                                                              *   effectively disabled.\r
+                                                                              */\r
+                               HOST_STATE_WaitForDevice                = 1,  /**< Internally implemented by the library. This state indicates\r
+                                                                              *   that the stack is waiting for an interval to elapse before\r
+                                                                              *   continuing with the next step of the device enumeration\r
+                                                                              *   process.\r
+                                                                              *\r
+                                                                              *   \note Do not manually change to this state in the user code.\r
+                                                                              */\r
+                               HOST_STATE_Unattached                   = 2,  /**< Internally implemented by the library. This state indicates\r
+                                                                              *   that the host state machine is waiting for a device to be\r
+                                                                              *   attached so that it can start the enumeration process.\r
+                                                                              *   \r
+                                                                              *   \note Do not manually change to this state in the user code.\r
+                                                                              */\r
+                               HOST_STATE_Attached                     = 3,  /**< Internally implemented by the library. This state indicates\r
+                                                                              *   that a device has been attached, and the library's internals\r
+                                                                              *   are being configured to begin the enumeration process.\r
+                                                                              *   \r
+                                                                              *   \note Do not manually change to this state in the user code.\r
+                                                                              */\r
+                               HOST_STATE_Attached_WaitForDeviceSettle = 4,  /**< Internally implemented by the library. This state indicates\r
+                                                                              *   that the stack is waiting for the initial settling period to\r
+                                                                              *   elapse before beginning the enumeration process.\r
+                                                                              *   \r
+                                                                              *   \note Do not manually change to this state in the user code.\r
+                                                                              */\r
+                               HOST_STATE_Attached_WaitForConnect      = 5,  /**< Internally implemented by the library. This state indicates\r
+                                                                              *   that the stack is waiting for a connection event from the USB\r
+                                                                              *   controller to indicate a valid USB device has been attached to\r
+                                                                              *   the bus and is ready to be enumerated.\r
+                                                                              *   \r
+                                                                              *   \note Do not manually change to this state in the user code.\r
+                                                                              */\r
+                               HOST_STATE_Attached_DoReset             = 6,  /**< Internally implemented by the library. This state indicates\r
+                                                                              *   that a valid USB device has been attached, and that it is\r
+                                                                              *   will now be reset to ensure it is ready for enumeration.\r
+                                                                              *   \r
+                                                                              *   \note Do not manually change to this state in the user code.\r
+                                                                              */\r
+                               HOST_STATE_Powered                      = 7,  /**< Internally implemented by the library. This state indicates\r
+                                                                              *   that the attached device is currently powered and reset, and\r
+                                                                              *   that the control pipe is now being configured by the stack.\r
+                                                                              *   \r
+                                                                              *   \note Do not manually change to this state in the user code.\r
+                                                                              */\r
+                               HOST_STATE_Default                      = 8,  /**< Internally implemented by the library. This state indicates\r
+                                                                              *   that the stack is currently retrieving the control endpoint's\r
+                                                                              *   size from the device, so that the control pipe can be altered\r
+                                                                              *   to match.\r
+                                                                              *   \r
+                                                                              *   \note Do not manually change to this state in the user code.\r
+                                                                              */\r
+                               HOST_STATE_Default_PostReset            = 9,  /**< Internally implemented by the library. This state indicates that\r
+                                                                              *   the control pipe is being reconfigured to match the retrieved\r
+                                                                              *   control endpoint size from the device, and the device's USB bus\r
+                                                                              *   address is being set.\r
+                                                                              *   \r
+                                                                              *   \note Do not manually change to this state in the user code.\r
+                                                                              */\r
+                               HOST_STATE_Default_PostAddressSet       = 10, /**< Internally implemented by the library. This state indicates that\r
+                                                                              *   the device's address has now been set, and the stack is has now\r
+                                                                              *   completed the device enumeration process. This state causes the\r
+                                                                              *   stack to change the current USB device address to that set for\r
+                                                                              *   the connected device, before progressing to the user-implemented\r
+                                                                              *   HOST_STATE_Addressed state for further communications.\r
+                                                                              *   \r
+                                                                              *   \note Do not manually change to this state in the user code.\r
+                                                                              */\r
+                               HOST_STATE_Addressed                    = 11, /**< May be implemented by the user project. This state should\r
+                                                                              *   set the device configuration before progressing to the\r
+                                                                              *   HOST_STATE_Configured state. Other processing (such as the\r
+                                                                              *   retrieval and processing of the device descriptor) should also\r
+                                                                              *   be placed in this state.\r
+                                                                              */\r
+                               HOST_STATE_Configured                   = 12, /**< May be implemented by the user project. This state should\r
+                                                                              *   implement any extra device configuration (such as the setting of\r
+                                                                              *   class-specific parameters) before normal communication is begun\r
+                                                                              *   in the HOST_STATE_Ready state.\r
+                                                                              */\r
+                               HOST_STATE_Ready                        = 13, /**< May be implemented by the user project. This state should\r
+                                                                              *   contain the main communications with the attached device. From this\r
+                                                                              *   this state the host state machine should be changed to either\r
+                                                                              *   HOST_STATE_Suspended (after the bus is manually suspended using the\r
+                                                                              *   USB_Host_SuspendBus() macro) or HOST_STATE_WaitForDeviceRemoval as\r
+                                                                              *   needed.\r
+                                                                              */\r
+                               HOST_STATE_Suspended                    = 15, /**< May be implemented by the user project. This state should be maintained\r
+                                                                              *   while the bus is suspended, and changed to either the HOST_STATE_Ready\r
+                                                                              *   (after resuming the bus with the USB_Host_ResumeBus() macro) or the\r
+                                                                              *   HOST_STATE_WaitForDeviceRemoval states as needed.\r
+                                                                              */\r
                        };\r
                        \r
                        /** Enum for the error codes for the \ref EVENT_USB_HostError() event.\r
index 0f582a6..f22a9ff 100644 (file)
@@ -21,6 +21,8 @@
   *    added NO_INTERNAL_SERIAL compile time option to turn off new serial number reading code\r
   *  - Added new DATAFLASH_CHIP_MASK() macro to the Dataflash driver, which returns the Dataflash select mask for the given chip index\r
   *  - Updated MassStorage device block write routines to use ping-pong Dataflash buffering to increase throughput by around 30%\r
+  *  - Added new HOST_STATE_WaitForDeviceRemoval host state machine state for non-blocking disabling of device communications until the\r
+  *    device has been removed (for use when an error occurs or communications with the device have completed)\r
   *  \r
   *  <b>Changed:</b>\r
   *  - Deprecated psuedo-scheduler and removed dynamic memory allocator from the library (first no longer needed and second unused)\r
index bc49ba2..796ee84 100644 (file)
  *  <b>HOST_DEVICE_SETTLE_DELAY_MS</b> - ( \ref Group_Host ) \n\r
  *  Some devices require a delay of up to 5 seconds after they are connected to VBUS before the enumeration process can be started, or\r
  *  they will fail to enumerate correctly. By placing a delay before the enumeration process, it can be ensured that the bus has settled\r
- *  back to a known idle state before communications occur with the device. This token may be defined to a non-zero 16-bit value to set\r
- *  the device settle period, specified in milliseconds. If not defined, the default value specified in Host.h is used instead.\r
+ *  back to a known idle state before communications occur with the device. This token may be defined to a 16-bit value to set the device\r
+ *  settle period, specified in milliseconds. If not defined, the default value specified in Host.h is used instead.\r
  *\r
  *  <b>USE_STATIC_OPTIONS</b> - ( \ref Group_USBManagement ) \n\r
  *  By default, the USB_Init() function accepts dynamic options at runtime to alter the library behaviour, including whether the USB pad\r
index 59a2790..2e348d5 100644 (file)
@@ -19,9 +19,9 @@
   *     -# Re-enable Host mode Class driver builds after completion\r
   *     -# Update Host mode Class Driver demo .txt files\r
   *  - Add standardized descriptor names to device and host class driver structures\r
-  *  - Remove USE_NONSTANDARD_DESCRIPTOR_NAMES, make all typedefs unions to allow either naming scheme to be used\r
   *  - Add in INTERRUPT_CONTROL_PIPE to use HSOFI to trigger calls to the host state machine\r
   *  - Make Suspend host state suspend USB bus frames\r
+  *  - Split StillImageHost demo into lib directory\r
   *  - Add in Stream functions for PROGMEM, EEPROM -- move to templated system\r
   *  - Debug mode for pipe/endpoint calls\r
   *  - Test and document new FAST_STREAM_TRANSFERS compile time option\r
index 192ca33..046c132 100644 (file)
@@ -318,7 +318,7 @@ void HID_Host_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
 \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
 \r
@@ -329,7 +329,7 @@ void HID_Host_Task(void)
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
                                \r
                                /* Wait until USB device disconnected */\r
-                               while (USB_IsConnected);\r
+                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
                                break;\r
                        }\r
                        \r