diff --git a/Demos/Device/Keyboard/Keyboard.c b/Demos/Device/Keyboard/Keyboard.c index 7b93172654..928d95b624 100644 --- a/Demos/Device/Keyboard/Keyboard.c +++ b/Demos/Device/Keyboard/Keyboard.c @@ -44,9 +44,7 @@ TASK_LIST { .Task = USB_USBTask , .TaskStatus = TASK_STOP }, #endif - #if !defined(INTERRUPT_DATA_ENDPOINT) { .Task = USB_Keyboard_Report , .TaskStatus = TASK_STOP }, - #endif }; /* Global Variables */ diff --git a/LUFA/Drivers/USB/HighLevel/Events.h b/LUFA/Drivers/USB/HighLevel/Events.h index 36e16c98b4..45ad801dea 100644 --- a/LUFA/Drivers/USB/HighLevel/Events.h +++ b/LUFA/Drivers/USB/HighLevel/Events.h @@ -398,7 +398,7 @@ /* Function Prototypes: */ #if defined(INCLUDE_FROM_EVENTS_C) - void USB_Event_Stub (void) ATTR_CONST; + void USB_Event_Stub(void) ATTR_CONST; #if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER) ALIAS_STUB(USB_VBUSChange); diff --git a/LUFA/Drivers/USB/HighLevel/USBTask.c b/LUFA/Drivers/USB/HighLevel/USBTask.c index 5202cc834e..e2b7e91d50 100644 --- a/LUFA/Drivers/USB/HighLevel/USBTask.c +++ b/LUFA/Drivers/USB/HighLevel/USBTask.c @@ -81,178 +81,11 @@ static void USB_DeviceTask(void) #if defined(USB_CAN_BE_HOST) static void USB_HostTask(void) { - uint8_t ErrorCode = HOST_ENUMERROR_NoError; - uint8_t SubErrorCode = HOST_ENUMERROR_NoError; - uint8_t PrevPipe = Pipe_GetCurrentPipe(); + uint8_t PrevPipe = Pipe_GetCurrentPipe(); - static uint16_t WaitMSRemaining; - static uint8_t PostWaitState; - Pipe_SelectPipe(PIPE_CONTROLPIPE); - switch (USB_HostState) - { - case HOST_STATE_WaitForDevice: - if (WaitMSRemaining) - { - if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) - { - USB_HostState = PostWaitState; - ErrorCode = HOST_ENUMERROR_WaitStage; - break; - } - - WaitMSRemaining--; - } - else - { - USB_HostState = PostWaitState; - } - - break; - case HOST_STATE_Attached: - WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS; - - USB_HostState = HOST_STATE_Attached_WaitForDeviceSettle; - break; - case HOST_STATE_Attached_WaitForDeviceSettle: - _delay_ms(1); - - if (!(WaitMSRemaining--)) - { - USB_Host_VBUS_Manual_Off(); - - USB_OTGPAD_On(); - USB_Host_VBUS_Auto_Enable(); - USB_Host_VBUS_Auto_On(); - - USB_HostState = HOST_STATE_Attached_WaitForConnect; - } - - break; - case HOST_STATE_Attached_WaitForConnect: - if (USB_INT_HasOccurred(USB_INT_DCONNI)) - { - USB_INT_Clear(USB_INT_DCONNI); - USB_INT_Clear(USB_INT_DDISCI); - - USB_INT_Clear(USB_INT_VBERRI); - USB_INT_Enable(USB_INT_VBERRI); - - USB_IsConnected = true; - RAISE_EVENT(USB_Connect); - - USB_Host_ResumeBus(); - Pipe_ClearPipes(); - - HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Attached_DoReset); - } - - break; - case HOST_STATE_Attached_DoReset: - USB_Host_ResetDevice(); - - HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered); - break; - case HOST_STATE_Powered: - Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, - PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP, - PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE); - - if (!(Pipe_IsConfigured())) - { - ErrorCode = HOST_ENUMERROR_PipeConfigError; - SubErrorCode = 0; - break; - } - - USB_HostState = HOST_STATE_Default; - break; - case HOST_STATE_Default: - USB_ControlRequest = (USB_Request_Header_t) - { - .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE), - .bRequest = REQ_GetDescriptor, - .wValue = (DTYPE_Device << 8), - .wIndex = 0, - .wLength = 8, - }; - - uint8_t DataBuffer[8]; - - if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful) - { - ErrorCode = HOST_ENUMERROR_ControlError; - break; - } - - #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES) - USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)]; - #else - USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, bMaxPacketSize0)]; - #endif - - USB_Host_ResetDevice(); - - HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset); - break; - case HOST_STATE_Default_PostReset: - Pipe_DisablePipe(); - Pipe_DeallocateMemory(); - Pipe_ResetPipe(PIPE_CONTROLPIPE); - - Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, - PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP, - USB_ControlPipeSize, PIPE_BANK_SINGLE); - - if (!(Pipe_IsConfigured())) - { - ErrorCode = HOST_ENUMERROR_PipeConfigError; - SubErrorCode = 0; - break; - } - - Pipe_SetInfiniteINRequests(); - - USB_ControlRequest = (USB_Request_Header_t) - { - .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE), - .bRequest = REQ_SetAddress, - .wValue = USB_HOST_DEVICEADDRESS, - .wIndex = 0, - .wLength = 0, - }; - - if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) - { - ErrorCode = HOST_ENUMERROR_ControlError; - break; - } - - HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet); - break; - case HOST_STATE_Default_PostAddressSet: - USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS); - - RAISE_EVENT(USB_DeviceEnumerationComplete); - USB_HostState = HOST_STATE_Addressed; - - break; - } - - if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached)) - { - RAISE_EVENT(USB_DeviceEnumerationFailed, ErrorCode, SubErrorCode); - - USB_Host_VBUS_Auto_Off(); - - RAISE_EVENT(USB_DeviceUnattached); - - if (USB_IsConnected) - RAISE_EVENT(USB_Disconnect); - - USB_ResetInterface(); - } + USB_Host_ProcessNextHostState(); Pipe_SelectPipe(PrevPipe); } diff --git a/LUFA/Drivers/USB/LowLevel/Host.c b/LUFA/Drivers/USB/LowLevel/Host.c index fe02f7cd15..9630b6aa10 100644 --- a/LUFA/Drivers/USB/LowLevel/Host.c +++ b/LUFA/Drivers/USB/LowLevel/Host.c @@ -32,8 +32,179 @@ #if defined(USB_CAN_BE_HOST) +#define INCLUDE_FROM_HOST_C #include "Host.h" +void USB_Host_ProcessNextHostState(void) +{ + uint8_t ErrorCode = HOST_ENUMERROR_NoError; + uint8_t SubErrorCode = HOST_ENUMERROR_NoError; + + static uint16_t WaitMSRemaining; + static uint8_t PostWaitState; + + switch (USB_HostState) + { + case HOST_STATE_WaitForDevice: + if (WaitMSRemaining) + { + if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) + { + USB_HostState = PostWaitState; + ErrorCode = HOST_ENUMERROR_WaitStage; + break; + } + + if (!(WaitMSRemaining--)) + USB_HostState = PostWaitState; + } + + break; + case HOST_STATE_Attached: + WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS; + + USB_HostState = HOST_STATE_Attached_WaitForDeviceSettle; + break; + case HOST_STATE_Attached_WaitForDeviceSettle: + _delay_ms(1); + + if (!(WaitMSRemaining--)) + { + USB_Host_VBUS_Manual_Off(); + + USB_OTGPAD_On(); + USB_Host_VBUS_Auto_Enable(); + USB_Host_VBUS_Auto_On(); + + USB_HostState = HOST_STATE_Attached_WaitForConnect; + } + + break; + case HOST_STATE_Attached_WaitForConnect: + if (USB_INT_HasOccurred(USB_INT_DCONNI)) + { + USB_INT_Clear(USB_INT_DCONNI); + USB_INT_Clear(USB_INT_DDISCI); + + USB_INT_Clear(USB_INT_VBERRI); + USB_INT_Enable(USB_INT_VBERRI); + + USB_IsConnected = true; + RAISE_EVENT(USB_Connect); + + USB_Host_ResumeBus(); + Pipe_ClearPipes(); + + HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Attached_DoReset); + } + + break; + case HOST_STATE_Attached_DoReset: + USB_Host_ResetDevice(); + + HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered); + break; + case HOST_STATE_Powered: + Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, + PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP, + PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE); + + if (!(Pipe_IsConfigured())) + { + ErrorCode = HOST_ENUMERROR_PipeConfigError; + SubErrorCode = 0; + break; + } + + USB_HostState = HOST_STATE_Default; + break; + case HOST_STATE_Default: + USB_ControlRequest = (USB_Request_Header_t) + { + .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE), + .bRequest = REQ_GetDescriptor, + .wValue = (DTYPE_Device << 8), + .wIndex = 0, + .wLength = 8, + }; + + uint8_t DataBuffer[8]; + + if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful) + { + ErrorCode = HOST_ENUMERROR_ControlError; + break; + } + + #if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES) + USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)]; + #else + USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, bMaxPacketSize0)]; + #endif + + USB_Host_ResetDevice(); + + HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset); + break; + case HOST_STATE_Default_PostReset: + Pipe_DisablePipe(); + Pipe_DeallocateMemory(); + Pipe_ResetPipe(PIPE_CONTROLPIPE); + + Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, + PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP, + USB_ControlPipeSize, PIPE_BANK_SINGLE); + + if (!(Pipe_IsConfigured())) + { + ErrorCode = HOST_ENUMERROR_PipeConfigError; + SubErrorCode = 0; + break; + } + + Pipe_SetInfiniteINRequests(); + + USB_ControlRequest = (USB_Request_Header_t) + { + .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE), + .bRequest = REQ_SetAddress, + .wValue = USB_HOST_DEVICEADDRESS, + .wIndex = 0, + .wLength = 0, + }; + + if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) + { + ErrorCode = HOST_ENUMERROR_ControlError; + break; + } + + HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet); + break; + case HOST_STATE_Default_PostAddressSet: + USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS); + + RAISE_EVENT(USB_DeviceEnumerationComplete); + USB_HostState = HOST_STATE_Addressed; + + break; + } + + if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached)) + { + RAISE_EVENT(USB_DeviceEnumerationFailed, ErrorCode, SubErrorCode); + + USB_Host_VBUS_Auto_Off(); + + RAISE_EVENT(USB_DeviceUnattached); + + if (USB_IsConnected) + RAISE_EVENT(USB_Disconnect); + + USB_ResetInterface(); + } +} + uint8_t USB_Host_WaitMS(uint8_t MS) { bool BusSuspended = USB_Host_IsBusSuspended(); @@ -80,7 +251,7 @@ uint8_t USB_Host_WaitMS(uint8_t MS) return ErrorCode; } -void USB_Host_ResetDevice(void) +static void USB_Host_ResetDevice(void) { bool BusSuspended = USB_Host_IsBusSuspended(); diff --git a/LUFA/Drivers/USB/LowLevel/Host.h b/LUFA/Drivers/USB/LowLevel/Host.h index 9ce995f849..4457c07d8f 100644 --- a/LUFA/Drivers/USB/LowLevel/Host.h +++ b/LUFA/Drivers/USB/LowLevel/Host.h @@ -265,8 +265,12 @@ }; /* Function Prototypes: */ + void USB_Host_ProcessNextHostState(void); uint8_t USB_Host_WaitMS(uint8_t MS); - void USB_Host_ResetDevice(void); + + #if defined(INCLUDE_FROM_HOST_C) + static void USB_Host_ResetDevice(void); + #endif #endif /* Disable C linkage for C++ Compilers: */ diff --git a/LUFA/Drivers/USB/LowLevel/LowLevel.h b/LUFA/Drivers/USB/LowLevel/LowLevel.h index a5adf99f15..fad1cbf1f4 100644 --- a/LUFA/Drivers/USB/LowLevel/LowLevel.h +++ b/LUFA/Drivers/USB/LowLevel/LowLevel.h @@ -359,7 +359,7 @@ /* Inline Functions: */ #if defined(USB_CAN_BE_BOTH) - static inline uint8_t USB_GetUSBModeFromUID(void) ATTR_WARN_UNUSED_RESULT; + static inline uint8_t USB_GetUSBModeFromUID(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t USB_GetUSBModeFromUID(void) { if (USBSTA & (1 << ID)) diff --git a/LUFA/Drivers/USB/LowLevel/OTG.h b/LUFA/Drivers/USB/LowLevel/OTG.h index 6d8185c262..d3dee96f3d 100644 --- a/LUFA/Drivers/USB/LowLevel/OTG.h +++ b/LUFA/Drivers/USB/LowLevel/OTG.h @@ -106,7 +106,6 @@ */ static inline void USB_OTG_Dev_InitiateSRP(uint8_t SRPTypeMask); #else - #define USB_OTG_Device_RequestHNP() MACROS{ OTGCON |= (1 << HNPREQ); }MACROE #define USB_OTG_Device_CancelHNPRequest() MACROS{ OTGCON &= ~(1 << HNPREQ); }MACROE diff --git a/LUFA/LUFAPoweredProjects.txt b/LUFA/LUFAPoweredProjects.txt index e1ba65de1c..b93604e2fc 100644 --- a/LUFA/LUFAPoweredProjects.txt +++ b/LUFA/LUFAPoweredProjects.txt @@ -28,4 +28,5 @@ * - SEGA Megadrive/Genesis Development Cartridge: http://www.spritesmind.net/_GenDev/forum/viewtopic.php?t=464 * - CAMTRIG, a remote Camera Trigger device: http://code.astraw.com/projects/motmot/camtrig * - Opendous-JTAG, an open source JTAG device: http://code.google.com/p/opendous-jtag/ + * - Openkubus, an open source hardware-based authentication dongle: http://code.google.com/p/openkubus/ */ \ No newline at end of file