Added new USB_DeviceState variable to keep track of the current Device mode USB state.

Added new Endpoint_ClearStatusStage() convenience function to assist with the status stages of control transfers.

Removed vague USB_IsConnected global - test USB_DeviceState or USB_HostState explicitly to gain previous functionality.

Removed USB_IsSuspended global - test USB_DeviceState against DEVICE_STATE_Suspended instead.

Fixed possible enumeration errors from spinloops which may fail to exit if the USB connection is severed before the exit condition becomes true.
This commit is contained in:
Dean Camera 2009-07-21 13:31:21 +00:00
parent 44179abcf8
commit e071f3897a
58 changed files with 666 additions and 463 deletions

View file

@ -117,13 +117,22 @@ void USB_Device_ProcessControlPacket(void)
static void USB_Device_SetAddress(void)
{
uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F);
Endpoint_ClearSETUP();
Endpoint_ClearIN();
while (!(Endpoint_IsINReady()));
while (!(Endpoint_IsINReady()))
{
if (USB_DeviceState == DEVICE_STATE_Unattached)
return;
}
UDADDR = ((1 << ADDEN) | ((uint8_t)USB_ControlRequest.wValue & 0x7F));
UDADDR = ((1 << ADDEN) | DeviceAddress);
if (DeviceAddress)
USB_DeviceState = DEVICE_STATE_Addressed;
return;
}
@ -185,8 +194,17 @@ static void USB_Device_SetConfiguration(void)
Endpoint_ClearIN();
if (!(AlreadyConfigured) && USB_ConfigurationNumber)
EVENT_USB_DeviceEnumerationComplete();
if (USB_ConfigurationNumber)
{
USB_DeviceState = DEVICE_STATE_Configured;
if (!(AlreadyConfigured))
EVENT_USB_DeviceEnumerationComplete();
}
else
{
USB_DeviceState = DEVICE_STATE_Addressed;
}
EVENT_USB_ConfigurationChanged();
}
@ -199,7 +217,12 @@ void USB_Device_GetConfiguration(void)
Endpoint_ClearIN();
while (!(Endpoint_IsOUTReceived()));
while (!(Endpoint_IsOUTReceived()))
{
if (USB_DeviceState == DEVICE_STATE_Unattached)
return;
}
Endpoint_ClearOUT();
}
@ -332,7 +355,12 @@ static void USB_Device_GetStatus(void)
Endpoint_ClearIN();
while (!(Endpoint_IsOUTReceived()));
while (!(Endpoint_IsOUTReceived()))
{
if (USB_DeviceState == DEVICE_STATE_Unattached)
return;
}
Endpoint_ClearOUT();
}