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:
parent
44179abcf8
commit
e071f3897a
58 changed files with 666 additions and 463 deletions
|
@ -69,7 +69,11 @@ void DataflashManager_WriteBlocks(USB_ClassInfo_MS_Device_t* MSInterfaceInfo, co
|
|||
Dataflash_SendAddressBytes(0, CurrDFPageByte);
|
||||
|
||||
/* Wait until endpoint is ready before continuing */
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
while (TotalBlocks)
|
||||
{
|
||||
|
@ -85,7 +89,11 @@ void DataflashManager_WriteBlocks(USB_ClassInfo_MS_Device_t* MSInterfaceInfo, co
|
|||
Endpoint_ClearOUT();
|
||||
|
||||
/* Wait until the host has sent another packet */
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if end of dataflash page reached */
|
||||
|
@ -197,7 +205,11 @@ void DataflashManager_ReadBlocks(USB_ClassInfo_MS_Device_t* MSInterfaceInfo, con
|
|||
Dataflash_SendByte(0x00);
|
||||
|
||||
/* Wait until endpoint is ready before continuing */
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
while (TotalBlocks)
|
||||
{
|
||||
|
@ -213,7 +225,11 @@ void DataflashManager_ReadBlocks(USB_ClassInfo_MS_Device_t* MSInterfaceInfo, con
|
|||
Endpoint_ClearIN();
|
||||
|
||||
/* Wait until the endpoint is ready for more data */
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if end of dataflash page reached */
|
||||
|
|
|
@ -152,7 +152,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
*/
|
||||
ISR(USART1_RX_vect, ISR_BLOCK)
|
||||
{
|
||||
if (USB_IsConnected)
|
||||
if (USB_DeviceState == DEVICE_STATE_Configured)
|
||||
Buffer_StoreElement(&Tx_Buffer, UDR1);
|
||||
}
|
||||
|
||||
|
|
|
@ -142,7 +142,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
void SideShow_Task(void)
|
||||
{
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
/* Select the SideShow data out endpoint */
|
||||
|
|
|
@ -139,9 +139,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */
|
||||
StreamingAudioInterfaceSelected = ((USB_ControlRequest.wValue) != 0);
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -152,7 +150,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
void USB_Audio_Task(void)
|
||||
{
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
/* Check to see if the streaming interface is selected, if not the host is not receiving audio */
|
||||
|
|
|
@ -166,9 +166,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */
|
||||
StreamingAudioInterfaceSelected = ((USB_ControlRequest.wValue) != 0);
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -181,7 +179,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
void USB_Audio_Task(void)
|
||||
{
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
/* Check to see if the streaming interface is selected, if not the host is not receiving audio */
|
||||
|
|
|
@ -56,12 +56,15 @@ CDC_Line_Coding_t LineCoding = { .BaudRateBPS = 9600,
|
|||
*/
|
||||
|
||||
static int CDC_putchar (char c, FILE *stream)
|
||||
{
|
||||
if (!(USB_IsConnected))
|
||||
return -1;
|
||||
|
||||
{
|
||||
Endpoint_SelectEndpoint(CDC_TX_EPNUM);
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return -1;
|
||||
}
|
||||
|
||||
Endpoint_Write_Byte(c);
|
||||
Endpoint_ClearIN();
|
||||
|
||||
|
@ -76,10 +79,11 @@ static int CDC_getchar (FILE *stream)
|
|||
|
||||
for (;;)
|
||||
{
|
||||
if (!(USB_IsConnected))
|
||||
return -1;
|
||||
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!(Endpoint_BytesInEndpoint()))
|
||||
{
|
||||
|
@ -229,9 +233,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
CONTROL_LINE_OUT_* masks to determine the RTS and DTR line states using the following code:
|
||||
*/
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -244,18 +246,17 @@ void CDC_Task(void)
|
|||
char* ReportString = NULL;
|
||||
uint8_t JoyStatus_LCL = Joystick_GetStatus();
|
||||
static bool ActionSent = false;
|
||||
|
||||
char* JoystickStrings[] =
|
||||
{
|
||||
"Joystick Up\r\n",
|
||||
"Joystick Down\r\n",
|
||||
"Joystick Left\r\n",
|
||||
"Joystick Right\r\n",
|
||||
"Joystick Pressed\r\n",
|
||||
};
|
||||
char* JoystickStrings[] =
|
||||
{
|
||||
"Joystick Up\r\n",
|
||||
"Joystick Down\r\n",
|
||||
"Joystick Left\r\n",
|
||||
"Joystick Right\r\n",
|
||||
"Joystick Pressed\r\n",
|
||||
};
|
||||
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
#if 0
|
||||
|
@ -319,7 +320,11 @@ void CDC_Task(void)
|
|||
if (IsFull)
|
||||
{
|
||||
/* Wait until the endpoint is ready for another packet */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
while (!(Endpoint_IsINReady()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Send an empty packet to ensure that the host does not buffer data sent to it */
|
||||
Endpoint_ClearIN();
|
||||
|
|
|
@ -211,9 +211,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Acknowledge the SETUP packet, ready for data transfer */
|
||||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -228,20 +226,19 @@ void CDC1_Task(void)
|
|||
char* ReportString = NULL;
|
||||
uint8_t JoyStatus_LCL = Joystick_GetStatus();
|
||||
static bool ActionSent = false;
|
||||
|
||||
char* JoystickStrings[] =
|
||||
{
|
||||
"Joystick Up\r\n",
|
||||
"Joystick Down\r\n",
|
||||
"Joystick Left\r\n",
|
||||
"Joystick Right\r\n",
|
||||
"Joystick Pressed\r\n",
|
||||
};
|
||||
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
char* JoystickStrings[] =
|
||||
{
|
||||
"Joystick Up\r\n",
|
||||
"Joystick Down\r\n",
|
||||
"Joystick Left\r\n",
|
||||
"Joystick Right\r\n",
|
||||
"Joystick Pressed\r\n",
|
||||
};
|
||||
|
||||
/* Determine if a joystick action has occurred */
|
||||
if (JoyStatus_LCL & JOY_UP)
|
||||
ReportString = JoystickStrings[0];
|
||||
|
@ -273,7 +270,11 @@ void CDC1_Task(void)
|
|||
Endpoint_ClearIN();
|
||||
|
||||
/* Wait until the endpoint is ready for another packet */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
while (!(Endpoint_IsINReady()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Send an empty packet to ensure that the host does not buffer data sent to it */
|
||||
Endpoint_ClearIN();
|
||||
|
@ -293,7 +294,7 @@ void CDC1_Task(void)
|
|||
void CDC2_Task(void)
|
||||
{
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
/* Select the Serial Rx Endpoint */
|
||||
|
@ -324,7 +325,11 @@ void CDC2_Task(void)
|
|||
Endpoint_ClearIN();
|
||||
|
||||
/* Wait until the endpoint is ready for the next packet */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
while (!(Endpoint_IsINReady()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Send an empty packet to prevent host buffering */
|
||||
Endpoint_ClearIN();
|
||||
|
|
|
@ -148,7 +148,11 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Wait until the generic report has been sent by the host */
|
||||
while (!(Endpoint_IsOUTReceived()));
|
||||
while (!(Endpoint_IsOUTReceived()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
Endpoint_Read_Control_Stream_LE(&GenericData, sizeof(GenericData));
|
||||
|
||||
|
@ -158,7 +162,11 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
Endpoint_ClearOUT();
|
||||
|
||||
/* Wait until the host is ready to receive the request confirmation */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
while (!(Endpoint_IsINReady()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Handshake the request by sending an empty IN packet */
|
||||
Endpoint_ClearIN();
|
||||
|
@ -203,7 +211,7 @@ void CreateGenericHIDReport(uint8_t* DataArray)
|
|||
void HID_Task(void)
|
||||
{
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM);
|
||||
|
|
|
@ -182,7 +182,7 @@ bool GetNextReport(USB_JoystickReport_Data_t* ReportData)
|
|||
void HID_Task(void)
|
||||
{
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
/* Select the Joystick Report Endpoint */
|
||||
|
|
|
@ -172,7 +172,11 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Wait until the LED report has been sent by the host */
|
||||
while (!(Endpoint_IsOUTReceived()));
|
||||
while (!(Endpoint_IsOUTReceived()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Read in the LED report from the host */
|
||||
uint8_t LEDStatus = Endpoint_Read_Byte();
|
||||
|
@ -183,9 +187,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Clear the endpoint data */
|
||||
Endpoint_ClearOUT();
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -200,9 +202,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Send the flag to the host */
|
||||
Endpoint_ClearIN();
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsOUTReceived()));
|
||||
Endpoint_ClearOUT();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -214,9 +214,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Set or clear the flag depending on what the host indicates that the current Protocol should be */
|
||||
UsingReportProtocol = (USB_ControlRequest.wValue != 0);
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -228,9 +226,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Get idle period in MSB, IdleCount must be multiplied by 4 to get number of milliseconds */
|
||||
IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -245,9 +241,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Send the flag to the host */
|
||||
Endpoint_ClearIN();
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsOUTReceived()));
|
||||
Endpoint_ClearOUT();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -378,7 +372,7 @@ void ReceiveNextReport(void)
|
|||
void HID_Task(void)
|
||||
{
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
/* Send the next keypress report to the host */
|
||||
|
|
|
@ -174,7 +174,11 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
Endpoint_ClearSETUP();
|
||||
|
||||
/* Wait until the LED report has been sent by the host */
|
||||
while (!(Endpoint_IsOUTReceived()));
|
||||
while (!(Endpoint_IsOUTReceived()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Read in the LED report from the host */
|
||||
uint8_t LEDStatus = Endpoint_Read_Byte();
|
||||
|
@ -195,9 +199,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Clear the endpoint data */
|
||||
Endpoint_ClearOUT();
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -213,7 +215,7 @@ void Keyboard_HID_Task(void)
|
|||
uint8_t JoyStatus_LCL = Joystick_GetStatus();
|
||||
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
/* Check if board button is not pressed, if so mouse mode enabled */
|
||||
|
@ -284,7 +286,7 @@ void Mouse_HID_Task(void)
|
|||
uint8_t JoyStatus_LCL = Joystick_GetStatus();
|
||||
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
/* Check if board button is pressed, if so mouse mode enabled */
|
||||
|
|
|
@ -117,7 +117,7 @@ void MIDI_Task(void)
|
|||
static uint8_t PrevJoystickStatus;
|
||||
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
Endpoint_SelectEndpoint(MIDI_STREAM_IN_EPNUM);
|
||||
|
|
|
@ -68,8 +68,12 @@ void DataflashManager_WriteBlocks(const uint32_t BlockAddress, uint16_t TotalBlo
|
|||
Dataflash_SendAddressBytes(0, CurrDFPageByte);
|
||||
|
||||
/* Wait until endpoint is ready before continuing */
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
while (TotalBlocks)
|
||||
{
|
||||
uint8_t BytesInBlockDiv16 = 0;
|
||||
|
@ -84,7 +88,11 @@ void DataflashManager_WriteBlocks(const uint32_t BlockAddress, uint16_t TotalBlo
|
|||
Endpoint_ClearOUT();
|
||||
|
||||
/* Wait until the host has sent another packet */
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if end of dataflash page reached */
|
||||
|
@ -195,7 +203,11 @@ void DataflashManager_ReadBlocks(const uint32_t BlockAddress, uint16_t TotalBloc
|
|||
Dataflash_SendByte(0x00);
|
||||
|
||||
/* Wait until endpoint is ready before continuing */
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
while (TotalBlocks)
|
||||
{
|
||||
|
@ -211,7 +223,11 @@ void DataflashManager_ReadBlocks(const uint32_t BlockAddress, uint16_t TotalBloc
|
|||
Endpoint_ClearIN();
|
||||
|
||||
/* Wait until the endpoint is ready for more data */
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if end of dataflash page reached */
|
||||
|
|
|
@ -142,9 +142,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Indicate that the current transfer should be aborted */
|
||||
IsMassStoreReset = true;
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -158,9 +156,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
|
||||
Endpoint_ClearIN();
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsOUTReceived()));
|
||||
Endpoint_ClearOUT();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -172,67 +168,67 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
*/
|
||||
void MassStorage_Task(void)
|
||||
{
|
||||
/* Check if the USB System is connected to a Host */
|
||||
if (USB_IsConnected)
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
/* Select the Data Out Endpoint */
|
||||
Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM);
|
||||
|
||||
/* Check to see if a command from the host has been issued */
|
||||
if (Endpoint_IsReadWriteAllowed())
|
||||
{
|
||||
/* Select the Data Out Endpoint */
|
||||
Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM);
|
||||
|
||||
/* Check to see if a command from the host has been issued */
|
||||
if (Endpoint_IsReadWriteAllowed())
|
||||
/* Indicate busy */
|
||||
LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
|
||||
|
||||
/* Process sent command block from the host */
|
||||
if (ReadInCommandBlock())
|
||||
{
|
||||
/* Indicate busy */
|
||||
LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
|
||||
/* Check direction of command, select Data IN endpoint if data is from the device */
|
||||
if (CommandBlock.Flags & COMMAND_DIRECTION_DATA_IN)
|
||||
Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPNUM);
|
||||
|
||||
/* Process sent command block from the host */
|
||||
if (ReadInCommandBlock())
|
||||
/* Decode the received SCSI command */
|
||||
SCSI_DecodeSCSICommand();
|
||||
|
||||
/* Load in the CBW tag into the CSW to link them together */
|
||||
CommandStatus.Tag = CommandBlock.Tag;
|
||||
|
||||
/* Load in the data residue counter into the CSW */
|
||||
CommandStatus.DataTransferResidue = CommandBlock.DataTransferLength;
|
||||
|
||||
/* Stall the selected data pipe if command failed (if data is still to be transferred) */
|
||||
if ((CommandStatus.Status == Command_Fail) && (CommandStatus.DataTransferResidue))
|
||||
Endpoint_StallTransaction();
|
||||
|
||||
/* Return command status block to the host */
|
||||
ReturnCommandStatus();
|
||||
|
||||
/* Check if a Mass Storage Reset occurred */
|
||||
if (IsMassStoreReset)
|
||||
{
|
||||
/* Check direction of command, select Data IN endpoint if data is from the device */
|
||||
if (CommandBlock.Flags & COMMAND_DIRECTION_DATA_IN)
|
||||
Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPNUM);
|
||||
|
||||
/* Decode the received SCSI command */
|
||||
SCSI_DecodeSCSICommand();
|
||||
|
||||
/* Load in the CBW tag into the CSW to link them together */
|
||||
CommandStatus.Tag = CommandBlock.Tag;
|
||||
|
||||
/* Load in the data residue counter into the CSW */
|
||||
CommandStatus.DataTransferResidue = CommandBlock.DataTransferLength;
|
||||
|
||||
/* Stall the selected data pipe if command failed (if data is still to be transferred) */
|
||||
if ((CommandStatus.Status == Command_Fail) && (CommandStatus.DataTransferResidue))
|
||||
Endpoint_StallTransaction();
|
||||
|
||||
/* Return command status block to the host */
|
||||
ReturnCommandStatus();
|
||||
/* Reset the data endpoint banks */
|
||||
Endpoint_ResetFIFO(MASS_STORAGE_OUT_EPNUM);
|
||||
Endpoint_ResetFIFO(MASS_STORAGE_IN_EPNUM);
|
||||
|
||||
/* Check if a Mass Storage Reset occurred */
|
||||
if (IsMassStoreReset)
|
||||
{
|
||||
/* Reset the data endpoint banks */
|
||||
Endpoint_ResetFIFO(MASS_STORAGE_OUT_EPNUM);
|
||||
Endpoint_ResetFIFO(MASS_STORAGE_IN_EPNUM);
|
||||
|
||||
Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM);
|
||||
Endpoint_ClearStall();
|
||||
Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPNUM);
|
||||
Endpoint_ClearStall();
|
||||
}
|
||||
Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM);
|
||||
Endpoint_ClearStall();
|
||||
Endpoint_SelectEndpoint(MASS_STORAGE_IN_EPNUM);
|
||||
Endpoint_ClearStall();
|
||||
}
|
||||
|
||||
/* Indicate ready */
|
||||
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Indicate error reading in the command block from the host */
|
||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||
}
|
||||
/* Indicate ready */
|
||||
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Indicate error reading in the command block from the host */
|
||||
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
|
||||
}
|
||||
|
||||
/* Clear the abort transfer flag */
|
||||
IsMassStoreReset = false;
|
||||
}
|
||||
|
||||
/* Clear the abort transfer flag */
|
||||
IsMassStoreReset = false;
|
||||
}
|
||||
|
||||
/** Function to read in a command block from the host, via the bulk data OUT endpoint. This function reads in the next command block
|
||||
|
|
|
@ -172,9 +172,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Send the flag to the host */
|
||||
Endpoint_ClearIN();
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsOUTReceived()));
|
||||
Endpoint_ClearOUT();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -186,9 +184,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Set or clear the flag depending on what the host indicates that the current Protocol should be */
|
||||
UsingReportProtocol = (USB_ControlRequest.wValue != 0);
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -200,9 +196,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Get idle period in MSB, must multiply by 4 to get the duration in milliseconds */
|
||||
IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -217,9 +211,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
/* Send the flag to the host */
|
||||
Endpoint_ClearIN();
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsOUTReceived()));
|
||||
Endpoint_ClearOUT();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -314,7 +306,7 @@ void SendNextReport(void)
|
|||
void Mouse_Task(void)
|
||||
{
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
/* Send the next mouse report to the host */
|
||||
|
|
|
@ -285,7 +285,7 @@ void Ethernet_Task(void)
|
|||
Ethernet frame at a time, so the FrameInBuffer bool is used to indicate when the buffers contain data. */
|
||||
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
/* Check if a frame has been written to the IN frame buffer */
|
||||
|
|
|
@ -192,9 +192,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
CONTROL_LINE_OUT_* masks to determine the RTS and DTR line states using the following code:
|
||||
*/
|
||||
|
||||
/* Acknowledge status stage */
|
||||
while (!(Endpoint_IsINReady()));
|
||||
Endpoint_ClearIN();
|
||||
Endpoint_ClearStatusStage();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -205,7 +203,7 @@ void EVENT_USB_UnhandledControlPacket(void)
|
|||
void CDC_Task(void)
|
||||
{
|
||||
/* Device must be connected and configured for the task to run */
|
||||
if (!(USB_IsConnected) || !(USB_ConfigurationNumber))
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
#if 0
|
||||
|
@ -264,7 +262,11 @@ void CDC_Task(void)
|
|||
if (Tx_Buffer.Elements)
|
||||
{
|
||||
/* Wait until Serial Tx Endpoint Ready for Read/Write */
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Write the bytes from the buffer to the endpoint while space is available */
|
||||
while (Tx_Buffer.Elements && Endpoint_IsReadWriteAllowed())
|
||||
|
@ -284,8 +286,12 @@ void CDC_Task(void)
|
|||
if (IsFull && !(Tx_Buffer.Elements))
|
||||
{
|
||||
/* Wait until Serial Tx Endpoint Ready for Read/Write */
|
||||
while (!(Endpoint_IsReadWriteAllowed()));
|
||||
|
||||
while (!(Endpoint_IsReadWriteAllowed()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Send an empty packet to terminate the transfer */
|
||||
Endpoint_ClearIN();
|
||||
}
|
||||
|
@ -298,11 +304,8 @@ void CDC_Task(void)
|
|||
ISR(USART1_RX_vect, ISR_BLOCK)
|
||||
{
|
||||
/* Only store received characters if the USB interface is connected */
|
||||
if (USB_IsConnected)
|
||||
{
|
||||
/* Character received, store it into the buffer */
|
||||
Buffer_StoreElement(&Tx_Buffer, UDR1);
|
||||
}
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
Buffer_StoreElement(&Tx_Buffer, UDR1);
|
||||
}
|
||||
|
||||
/** Reconfigures the USART to match the current serial port settings issued by the host as closely as possible. */
|
||||
|
|
|
@ -114,7 +114,12 @@ void Bluetooth_ProcessHCICommands(void)
|
|||
|
||||
do
|
||||
{
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()));
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()))
|
||||
{
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
Bluetooth_DiscardRemainingHCIEventParameters();
|
||||
} while (HCIEventHeader.EventCode != EVENT_COMMAND_COMPLETE);
|
||||
|
||||
|
@ -133,7 +138,12 @@ void Bluetooth_ProcessHCICommands(void)
|
|||
|
||||
do
|
||||
{
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()));
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()))
|
||||
{
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
Bluetooth_DiscardRemainingHCIEventParameters();
|
||||
} while (HCIEventHeader.EventCode != EVENT_COMMAND_COMPLETE);
|
||||
|
||||
|
@ -155,7 +165,12 @@ void Bluetooth_ProcessHCICommands(void)
|
|||
EventMask[3], EventMask[2], EventMask[1], EventMask[0]);
|
||||
do
|
||||
{
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()));
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()))
|
||||
{
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
Bluetooth_DiscardRemainingHCIEventParameters();
|
||||
} while (HCIEventHeader.EventCode != EVENT_COMMAND_COMPLETE);
|
||||
|
||||
|
@ -176,7 +191,12 @@ void Bluetooth_ProcessHCICommands(void)
|
|||
|
||||
do
|
||||
{
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()));
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()))
|
||||
{
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
Bluetooth_DiscardRemainingHCIEventParameters();
|
||||
} while (HCIEventHeader.EventCode != EVENT_COMMAND_COMPLETE);
|
||||
|
||||
|
@ -195,7 +215,12 @@ void Bluetooth_ProcessHCICommands(void)
|
|||
|
||||
do
|
||||
{
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()));
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()))
|
||||
{
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
Bluetooth_DiscardRemainingHCIEventParameters();
|
||||
} while (HCIEventHeader.EventCode != EVENT_COMMAND_COMPLETE);
|
||||
|
||||
|
@ -215,7 +240,12 @@ void Bluetooth_ProcessHCICommands(void)
|
|||
|
||||
do
|
||||
{
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()));
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()))
|
||||
{
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
Bluetooth_DiscardRemainingHCIEventParameters();
|
||||
} while (HCIEventHeader.EventCode != EVENT_COMMAND_COMPLETE);
|
||||
|
||||
|
@ -366,7 +396,12 @@ void Bluetooth_ProcessHCICommands(void)
|
|||
|
||||
do
|
||||
{
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()));
|
||||
while (!(Bluetooth_GetNextHCIEventHeader()))
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
return;
|
||||
}
|
||||
|
||||
Bluetooth_DiscardRemainingHCIEventParameters();
|
||||
} while (HCIEventHeader.EventCode != EVENT_COMMAND_COMPLETE);
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ Bluetooth_Device_t Bluetooth_DeviceConfiguration ATTR_WEAK =
|
|||
|
||||
void Bluetooth_Stack_Task(void)
|
||||
{
|
||||
if (!(USB_IsConnected) || (USB_HostState != HOST_STATE_Ready))
|
||||
if (USB_HostState != HOST_STATE_Configured)
|
||||
Bluetooth_HCIProcessingState = Bluetooth_Init;
|
||||
|
||||
Bluetooth_ProcessHCICommands();
|
||||
|
|
|
@ -164,15 +164,12 @@ void CDC_Host_Task(void)
|
|||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
puts_P(PSTR("CDC Device Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Configured:
|
||||
puts_P(PSTR("CDC Device Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Ready;
|
||||
break;
|
||||
case HOST_STATE_Ready:
|
||||
/* Select and the data IN pipe */
|
||||
Pipe_SelectPipe(CDC_DATAPIPE_IN);
|
||||
Pipe_Unfreeze();
|
||||
|
|
|
@ -266,14 +266,11 @@ void HID_Host_Task(void)
|
|||
break;
|
||||
}
|
||||
|
||||
puts_P(PSTR("HID Device Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Configured:
|
||||
puts_P(PSTR("HID Device Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Ready;
|
||||
break;
|
||||
case HOST_STATE_Ready:
|
||||
ReadNextReport();
|
||||
|
||||
break;
|
||||
|
|
|
@ -230,9 +230,6 @@ void Keyboard_HID_Task(void)
|
|||
break;
|
||||
}
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Configured:
|
||||
/* HID class request to set the keyboard protocol to the Boot Protocol */
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
|
@ -262,9 +259,9 @@ void Keyboard_HID_Task(void)
|
|||
|
||||
puts_P(PSTR("Keyboard Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Ready;
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Ready:
|
||||
case HOST_STATE_Configured:
|
||||
/* If a report has been received, read and process it */
|
||||
ReadNextReport();
|
||||
|
||||
|
|
|
@ -166,9 +166,6 @@ void Keyboard_HID_Task(void)
|
|||
break;
|
||||
}
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Configured:
|
||||
puts_P(PSTR("Processing HID Report.\r\n"));
|
||||
|
||||
/* Get and process the device's first HID report descriptor */
|
||||
|
@ -187,9 +184,9 @@ void Keyboard_HID_Task(void)
|
|||
|
||||
puts_P(PSTR("Keyboard Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Ready;
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Ready:
|
||||
case HOST_STATE_Configured:
|
||||
/* Select and unfreeze keyboard data pipe */
|
||||
Pipe_SelectPipe(KEYBOARD_DATAPIPE);
|
||||
Pipe_Unfreeze();
|
||||
|
|
|
@ -154,7 +154,7 @@ static uint8_t MassStore_WaitForDataReceived(void)
|
|||
}
|
||||
|
||||
/* Check to see if the device was disconnected, if so exit function */
|
||||
if (!(USB_IsConnected))
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
return PIPE_RWSTREAM_DeviceDisconnected;
|
||||
};
|
||||
|
||||
|
@ -206,7 +206,11 @@ static uint8_t MassStore_SendReceiveData(void* BufferPtr)
|
|||
/* Acknowledge the packet */
|
||||
Pipe_ClearOUT();
|
||||
|
||||
while (!(Pipe_IsOUTReady()));
|
||||
while (!(Pipe_IsOUTReady()))
|
||||
{
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
return PIPE_RWSTREAM_DeviceDisconnected;
|
||||
}
|
||||
}
|
||||
|
||||
/* Freeze used pipe after use */
|
||||
|
|
|
@ -171,14 +171,11 @@ void MassStorage_Task(void)
|
|||
break;
|
||||
}
|
||||
|
||||
puts_P(PSTR("Mass Storage Disk Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Configured:
|
||||
puts_P(PSTR("Mass Storage Disk Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Ready;
|
||||
break;
|
||||
case HOST_STATE_Ready:
|
||||
/* Indicate device busy via the status LEDs */
|
||||
LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
|
||||
|
||||
|
@ -241,7 +238,11 @@ void MassStorage_Task(void)
|
|||
{
|
||||
Serial_TxByte('.');
|
||||
|
||||
if ((ErrorCode = MassStore_TestUnitReady(0)) != 0)
|
||||
/* Abort if device removed */
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
break;
|
||||
|
||||
if ((ErrorCode = MassStore_TestUnitReady(0)) != PIPE_RWSTREAM_NoError)
|
||||
{
|
||||
ShowDiskReadError(PSTR("Test Unit Ready"), false, ErrorCode);
|
||||
|
||||
|
@ -249,11 +250,7 @@ void MassStorage_Task(void)
|
|||
break;
|
||||
}
|
||||
}
|
||||
while ((SCSICommandStatus.Status != Command_Pass) && USB_IsConnected);
|
||||
|
||||
/* Abort if device removed */
|
||||
if (!(USB_IsConnected))
|
||||
break;
|
||||
while (SCSICommandStatus.Status != Command_Pass);
|
||||
|
||||
puts_P(PSTR("\r\nRetrieving Capacity... "));
|
||||
|
||||
|
@ -320,7 +317,7 @@ void MassStorage_Task(void)
|
|||
while (!(Buttons_GetStatus() & BUTTONS_BUTTON1))
|
||||
{
|
||||
/* Abort if device removed */
|
||||
if (!(USB_IsConnected))
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -346,7 +343,7 @@ void MassStorage_Task(void)
|
|||
}
|
||||
|
||||
/* Abort if device removed */
|
||||
if (!(USB_IsConnected))
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -226,9 +226,6 @@ void Mouse_HID_Task(void)
|
|||
break;
|
||||
}
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Configured:
|
||||
/* HID class request to set the mouse protocol to the Boot Protocol */
|
||||
USB_ControlRequest = (USB_Request_Header_t)
|
||||
{
|
||||
|
@ -257,10 +254,10 @@ void Mouse_HID_Task(void)
|
|||
}
|
||||
|
||||
puts_P(PSTR("Mouse Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Ready;
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Ready:
|
||||
case HOST_STATE_Configured:
|
||||
/* If a report has been received, read and process it */
|
||||
ReadNextReport();
|
||||
|
||||
|
|
|
@ -166,9 +166,6 @@ void Mouse_HID_Task(void)
|
|||
break;
|
||||
}
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Configured:
|
||||
puts_P(PSTR("Processing HID Report.\r\n"));
|
||||
|
||||
/* Get and process the device's first HID report descriptor */
|
||||
|
@ -186,10 +183,10 @@ void Mouse_HID_Task(void)
|
|||
}
|
||||
|
||||
puts_P(PSTR("Mouse Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Ready;
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Ready:
|
||||
case HOST_STATE_Configured:
|
||||
/* Select and unfreeze mouse data pipe */
|
||||
Pipe_SelectPipe(MOUSE_DATAPIPE);
|
||||
Pipe_Unfreeze();
|
||||
|
|
|
@ -54,7 +54,11 @@ uint8_t Printer_SendData(Printer_Data_t* PrinterCommands)
|
|||
return ErrorCode;
|
||||
|
||||
Pipe_ClearOUT();
|
||||
while (!(Pipe_IsOUTReady()));
|
||||
while (!(Pipe_IsOUTReady()))
|
||||
{
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
return PIPE_RWSTREAM_DeviceDisconnected;
|
||||
}
|
||||
|
||||
Pipe_Freeze();
|
||||
|
||||
|
|
|
@ -195,9 +195,6 @@ void USB_Printer_Host(void)
|
|||
}
|
||||
}
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Configured:
|
||||
puts_P(PSTR("Retrieving Device ID...\r\n"));
|
||||
|
||||
char DeviceIDString[256];
|
||||
|
@ -217,10 +214,10 @@ void USB_Printer_Host(void)
|
|||
printf_P(PSTR("Printer Device ID: %s\r\n"), DeviceIDString);
|
||||
|
||||
puts_P(PSTR("Printer Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Ready;
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Ready:
|
||||
case HOST_STATE_Configured:
|
||||
/* Indicate device busy via the status LEDs */
|
||||
LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
|
||||
|
||||
|
|
|
@ -152,12 +152,9 @@ uint8_t SImage_RecieveBlockHeader(void)
|
|||
}
|
||||
|
||||
/* Check to see if the device was disconnected, if so exit function */
|
||||
if (!(USB_IsConnected))
|
||||
{
|
||||
/* Return error code */
|
||||
return PIPE_RWSTREAM_DeviceDisconnected;
|
||||
}
|
||||
};
|
||||
if (USB_HostState == HOST_STATE_Unattached)
|
||||
return PIPE_RWSTREAM_DeviceDisconnected;
|
||||
}
|
||||
|
||||
/* Freeze OUT pipe after use */
|
||||
Pipe_SelectPipe(SIMAGE_DATA_OUT_PIPE);
|
||||
|
|
|
@ -166,14 +166,11 @@ void StillImage_Task(void)
|
|||
break;
|
||||
}
|
||||
|
||||
puts_P(PSTR("Still Image Device Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Configured;
|
||||
break;
|
||||
case HOST_STATE_Configured:
|
||||
puts_P(PSTR("Still Image Device Enumerated.\r\n"));
|
||||
|
||||
USB_HostState = HOST_STATE_Ready;
|
||||
break;
|
||||
case HOST_STATE_Ready:
|
||||
/* Indicate device busy via the status LEDs */
|
||||
LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
|
||||
|
||||
|
@ -331,9 +328,7 @@ void StillImage_Task(void)
|
|||
/* Indicate device no longer busy */
|
||||
LEDs_SetAllLEDs(LEDMASK_USB_READY);
|
||||
|
||||
/* Wait until USB device disconnected */
|
||||
while (USB_IsConnected);
|
||||
|
||||
USB_HostState = HOST_STATE_WaitForDeviceRemoval;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue