diff --git a/Bootloaders/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c index e87d471725..cb2672c758 100644 --- a/Bootloaders/CDC/BootloaderCDC.c +++ b/Bootloaders/CDC/BootloaderCDC.c @@ -90,7 +90,7 @@ int main(void) Endpoint_SelectEndpoint(CDC_TX_EPNUM); /* Wait until any pending transmissions have completed before shutting down */ - while (!(Endpoint_ReadWriteAllowed())); + while (!(Endpoint_IsINReady())); /* Shut down the USB subsystem */ USB_ShutDown(); @@ -160,45 +160,45 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_GetLineEncoding: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); for (uint8_t i = 0; i < sizeof(LineCoding); i++) Endpoint_Write_Byte(*(LineCodingData++)); - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); } break; case REQ_SetLineEncoding: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); - while (!(Endpoint_IsSetupOUTReceived())); + while (!(Endpoint_IsOUTReceived())); for (uint8_t i = 0; i < sizeof(LineCoding); i++) *(LineCodingData++) = Endpoint_Read_Byte(); - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; case REQ_SetControlLineState: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; @@ -332,10 +332,10 @@ static uint8_t FetchNextCommandByte(void) Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* If OUT endpoint empty, clear it and wait for the next packet from the host */ - if (!(Endpoint_ReadWriteAllowed())) + while (!(Endpoint_IsReadWriteAllowed())) { - Endpoint_ClearCurrentBank(); - while (!(Endpoint_ReadWriteAllowed())); + Endpoint_ClearOUT(); + while (!(Endpoint_IsOUTReceived())); } /* Fetch the next byte from the OUT endpoint */ @@ -353,10 +353,10 @@ static void WriteNextResponseByte(const uint8_t Response) Endpoint_SelectEndpoint(CDC_TX_EPNUM); /* If OUT endpoint empty, clear it and wait for the next packet from the host */ - if (!(Endpoint_ReadWriteAllowed())) + if (!(Endpoint_IsReadWriteAllowed())) { - Endpoint_ClearCurrentBank(); - while (!(Endpoint_ReadWriteAllowed())); + Endpoint_ClearIN(); + while (!(Endpoint_IsINReady())); } /* Write the next byte to the OUT endpoint */ @@ -372,7 +372,7 @@ TASK(CDC_Task) Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* Check if endpoint has a command in it sent from the host */ - if (Endpoint_ReadWriteAllowed()) + if (Endpoint_IsOUTReceived()) { /* Read in the bootloader command (first byte sent from host) */ uint8_t Command = FetchNextCommandByte(); @@ -557,22 +557,22 @@ TASK(CDC_Task) Endpoint_SelectEndpoint(CDC_TX_EPNUM); /* Remember if the endpoint is completely full before clearing it */ - bool IsEndpointFull = !(Endpoint_ReadWriteAllowed()); + bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); /* Send the endpoint data to the host */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ if (IsEndpointFull) { - while (!(Endpoint_ReadWriteAllowed())); - Endpoint_ClearCurrentBank(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearIN(); } /* Select the OUT endpoint */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* Acknowledge the command from the host */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); } } diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c index 5375b9c9db..f3580163e3 100644 --- a/Bootloaders/DFU/BootloaderDFU.c +++ b/Bootloaders/DFU/BootloaderDFU.c @@ -163,7 +163,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) switch (bRequest) { case DFU_DNLOAD: - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Check if bootloader is waiting to terminate */ if (WaitForExit) @@ -178,7 +178,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* If the request has a data stage, load it into the command struct */ if (SentCommand.DataSize) { - while (!(Endpoint_IsSetupOUTReceived())); + while (!(Endpoint_IsOUTReceived())); /* First byte of the data stage is the DNLOAD request's command */ SentCommand.Command = Endpoint_Read_Byte(); @@ -235,8 +235,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ if (!(Endpoint_BytesInEndpoint())) { - Endpoint_ClearSetupOUT(); - while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearControlOUT(); + while (!(Endpoint_IsOUTReceived())); } /* Write the next word into the current flash page */ @@ -279,8 +279,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ if (!(Endpoint_BytesInEndpoint())) { - Endpoint_ClearSetupOUT(); - while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearControlOUT(); + while (!(Endpoint_IsOUTReceived())); } /* Read the byte from the USB interface and write to to the EEPROM */ @@ -296,17 +296,17 @@ EVENT_HANDLER(USB_UnhandledControlPacket) } } - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); break; case DFU_UPLOAD: - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); - while (!(Endpoint_IsSetupINReady())); + while (!(Endpoint_IsINReady())); if (DFU_State != dfuUPLOAD_IDLE) { @@ -343,8 +343,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Check if endpoint is full - if so clear it and wait until ready for next packet */ if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE) { - Endpoint_ClearSetupIN(); - while (!(Endpoint_IsSetupINReady())); + Endpoint_ClearControlIN(); + while (!(Endpoint_IsINReady())); } /* Read the flash word and send it via USB to the host */ @@ -368,8 +368,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Check if endpoint is full - if so clear it and wait until ready for next packet */ if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE) { - Endpoint_ClearSetupIN(); - while (!(Endpoint_IsSetupINReady())); + Endpoint_ClearControlIN(); + while (!(Endpoint_IsINReady())); } /* Read the EEPROM byte and send it via USB to the host */ @@ -384,15 +384,15 @@ EVENT_HANDLER(USB_UnhandledControlPacket) DFU_State = dfuIDLE; } - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); break; case DFU_GETSTATUS: - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write 8-bit status value */ Endpoint_Write_Byte(DFU_Status); @@ -407,46 +407,46 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Write 8-bit state string ID number */ Endpoint_Write_Byte(0); - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); break; case DFU_CLRSTATUS: - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Reset the status value variable to the default OK status */ DFU_Status = OK; /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); break; case DFU_GETSTATE: - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the current device state to the endpoint */ Endpoint_Write_Byte(DFU_State); - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); break; case DFU_ABORT: - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Reset the current state variable to the default idle state */ DFU_State = dfuIDLE; /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); break; } @@ -463,10 +463,10 @@ static void DiscardFillerBytes(uint8_t NumberOfBytes) { if (!(Endpoint_BytesInEndpoint())) { - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); /* Wait until next data packet received */ - while (!(Endpoint_IsSetupOUTReceived())); + while (!(Endpoint_IsOUTReceived())); } Endpoint_Discard_Byte(); diff --git a/Bootloaders/TeensyHID/TeensyHID.c b/Bootloaders/TeensyHID/TeensyHID.c index 93f062195b..f82e28e729 100644 --- a/Bootloaders/TeensyHID/TeensyHID.c +++ b/Bootloaders/TeensyHID/TeensyHID.c @@ -101,10 +101,10 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_SetReport: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Wait until the command (report) has been sent by the host */ - while (!(Endpoint_IsSetupOUTReceived())); + while (!(Endpoint_IsOUTReceived())); /* Read in the write destination address */ uint16_t PageAddress = Endpoint_Read_Word_LE(); @@ -126,8 +126,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Check if endpoint is empty - if so clear it and wait until ready for next packet */ if (!(Endpoint_BytesInEndpoint())) { - Endpoint_ClearSetupOUT(); - while (!(Endpoint_IsSetupOUTReceived())); + Endpoint_ClearControlOUT(); + while (!(Endpoint_IsOUTReceived())); } /* Write the next data word to the FLASH page */ @@ -142,11 +142,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket) boot_rww_enable(); } - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; diff --git a/Demos/Device/AudioInput/AudioInput.c b/Demos/Device/AudioInput/AudioInput.c index fca24c360e..c0166944b5 100644 --- a/Demos/Device/AudioInput/AudioInput.c +++ b/Demos/Device/AudioInput/AudioInput.c @@ -36,12 +36,6 @@ #include "AudioInput.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA AudioIn App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -145,7 +139,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) { uint16_t wValue = Endpoint_Read_Word_LE(); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */ if (wValue) @@ -160,8 +154,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) } /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; @@ -201,8 +195,8 @@ TASK(USB_Audio_Task) /* Select the audio stream endpoint */ Endpoint_SelectEndpoint(AUDIO_STREAM_EPNUM); - /* Check if the current endpoint can be read from (contains a packet) and that the next sample should be stored */ - if (Endpoint_ReadWriteAllowed() && (TIFR0 & (1 << OCF0A))) + /* Check if the current endpoint can be written to and that the next sample should be stored */ + if (Endpoint_IsINReady() && (TIFR0 & (1 << OCF0A))) { /* Clear the sample reload timer */ TIFR0 |= (1 << OCF0A); @@ -219,10 +213,10 @@ TASK(USB_Audio_Task) Endpoint_Write_Word_LE(AudioSample); /* Check to see if the bank is now full */ - if (!(Endpoint_ReadWriteAllowed())) + if (!(Endpoint_IsReadWriteAllowed())) { /* Send the full packet to the host */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); } } } diff --git a/Demos/Device/AudioInput/AudioInput.h b/Demos/Device/AudioInput/AudioInput.h index 02c838039c..c068baff99 100644 --- a/Demos/Device/AudioInput/AudioInput.h +++ b/Demos/Device/AudioInput/AudioInput.h @@ -44,7 +44,6 @@ #include "Descriptors.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // LEDs driver #include // ADC driver diff --git a/Demos/Device/AudioOutput/AudioOutput.c b/Demos/Device/AudioOutput/AudioOutput.c index ffeee418ee..fcd8812777 100644 --- a/Demos/Device/AudioOutput/AudioOutput.c +++ b/Demos/Device/AudioOutput/AudioOutput.c @@ -36,12 +36,6 @@ #include "AudioOutput.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA AudioOut App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -172,7 +166,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) { uint16_t wValue = Endpoint_Read_Word_LE(); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Check if the host is enabling the audio interface (setting AlternateSetting to 1) */ if (wValue) @@ -187,8 +181,8 @@ EVENT_HANDLER(USB_UnhandledControlPacket) } /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; @@ -231,7 +225,7 @@ TASK(USB_Audio_Task) Endpoint_SelectEndpoint(AUDIO_STREAM_EPNUM); /* Check if the current endpoint can be read from (contains a packet) and that the next sample should be read */ - if (Endpoint_ReadWriteAllowed() && (TIFR0 & (1 << OCF0A))) + if (Endpoint_IsOUTReceived() && (TIFR0 & (1 << OCF0A))) { /* Clear the sample reload timer */ TIFR0 |= (1 << OCF0A); @@ -241,10 +235,10 @@ TASK(USB_Audio_Task) int16_t RightSample_16Bit = (int16_t)Endpoint_Read_Word_LE(); /* Check to see if the bank is now empty */ - if (!(Endpoint_ReadWriteAllowed())) + if (!(Endpoint_IsReadWriteAllowed())) { /* Acknowledge the packet, clear the bank ready for the next packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); } /* Massage signed 16-bit left and right audio samples into signed 8-bit */ diff --git a/Demos/Device/AudioOutput/AudioOutput.h b/Demos/Device/AudioOutput/AudioOutput.h index 0ad9e5bf9d..05b24ad07f 100644 --- a/Demos/Device/AudioOutput/AudioOutput.h +++ b/Demos/Device/AudioOutput/AudioOutput.h @@ -44,7 +44,6 @@ #include "Descriptors.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // LEDs driver #include // Simple scheduler for task management diff --git a/Demos/Device/CDC/CDC.c b/Demos/Device/CDC/CDC.c index 5e153f6524..3dc624057d 100644 --- a/Demos/Device/CDC/CDC.c +++ b/Demos/Device/CDC/CDC.c @@ -36,12 +36,6 @@ #include "CDC.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA CDC App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -172,13 +166,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the line coding data to the control endpoint */ Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t)); /* Finalize the stream transfer to send the last packet or clear the host abort */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); } break; @@ -186,13 +180,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Read the line coding data in from the host into the global struct */ Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t)); /* Finalize the stream transfer to clear the last packet from the host */ - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); } break; @@ -211,11 +205,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket) #endif /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; @@ -276,7 +270,7 @@ TASK(CDC_Task) Endpoint_SelectEndpoint(CDC_NOTIFICATION_EPNUM); Endpoint_Write_Stream_LE(&Notification, sizeof(Notification)); Endpoint_Write_Stream_LE(&LineStateMask, sizeof(LineStateMask)); - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); #endif /* Determine if a joystick action has occurred */ @@ -307,19 +301,19 @@ TASK(CDC_Task) Endpoint_Write_Stream_LE(ReportString, strlen(ReportString)); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* Wait until the endpoint is ready for another packet */ - while (!(Endpoint_ReadWriteAllowed())); + while (!(Endpoint_IsINReady())); /* Send an empty packet to ensure that the host does not buffer data sent to it */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); } /* Select the Serial Rx Endpoint */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* Throw away any received data from the host */ - if (Endpoint_ReadWriteAllowed()) - Endpoint_ClearCurrentBank(); + if (Endpoint_IsOUTReceived()) + Endpoint_ClearOUT(); } diff --git a/Demos/Device/CDC/CDC.h b/Demos/Device/CDC/CDC.h index a36fdc9217..1537f0ba3c 100644 --- a/Demos/Device/CDC/CDC.h +++ b/Demos/Device/CDC/CDC.h @@ -45,7 +45,6 @@ #include "Descriptors.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // Joystick driver #include // LEDs driver diff --git a/Demos/Device/DualCDC/DualCDC.c b/Demos/Device/DualCDC/DualCDC.c index fecbaff605..56eebb305b 100644 --- a/Demos/Device/DualCDC/DualCDC.c +++ b/Demos/Device/DualCDC/DualCDC.c @@ -36,12 +36,6 @@ #include "DualCDC.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA DualCDC App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -195,7 +189,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) uint8_t* LineCodingData; /* Discard the unused wValue parameter */ - Endpoint_Ignore_Word(); + Endpoint_Discard_Word(); /* wIndex indicates the interface being controlled */ uint16_t wIndex = Endpoint_Read_Word_LE(); @@ -210,13 +204,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the line coding data to the control endpoint */ Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t)); /* Finalize the stream transfer to send the last packet or clear the host abort */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); } break; @@ -224,13 +218,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Read the line coding data in from the host into the global struct */ Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t)); /* Finalize the stream transfer to clear the last packet from the host */ - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); } break; @@ -238,11 +232,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; @@ -313,15 +307,21 @@ TASK(CDC1_Task) Endpoint_Write_Stream_LE(ReportString, strlen(ReportString)); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); + + /* Wait until the endpoint is ready for another packet */ + while (!(Endpoint_IsINReady())); + + /* Send an empty packet to ensure that the host does not buffer data sent to it */ + Endpoint_ClearIN(); } /* Select the Serial Rx Endpoint */ Endpoint_SelectEndpoint(CDC1_RX_EPNUM); /* Throw away any received data from the host */ - if (Endpoint_ReadWriteAllowed()) - Endpoint_ClearCurrentBank(); + if (Endpoint_IsOUTReceived()) + Endpoint_ClearOUT(); } /** Function to manage CDC data transmission and reception to and from the host for the second CDC interface, which echoes back @@ -333,7 +333,7 @@ TASK(CDC2_Task) Endpoint_SelectEndpoint(CDC2_RX_EPNUM); /* Check to see if any data has been received */ - if (Endpoint_ReadWriteAllowed()) + if (Endpoint_IsOUTReceived()) { /* Create a temp buffer big enough to hold the incoming endpoint packet */ uint8_t Buffer[Endpoint_BytesInEndpoint()]; @@ -345,7 +345,7 @@ TASK(CDC2_Task) Endpoint_Read_Stream_LE(&Buffer, DataLength); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); /* Select the Serial Tx Endpoint */ Endpoint_SelectEndpoint(CDC2_TX_EPNUM); @@ -354,6 +354,12 @@ TASK(CDC2_Task) Endpoint_Write_Stream_LE(&Buffer, DataLength); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); + + /* Wait until the endpoint is ready for the next packet */ + while (!(Endpoint_IsINReady())); + + /* Send an empty packet to prevent host buffering */ + Endpoint_ClearIN(); } } diff --git a/Demos/Device/DualCDC/DualCDC.h b/Demos/Device/DualCDC/DualCDC.h index 84be114e9f..65f661f97c 100644 --- a/Demos/Device/DualCDC/DualCDC.h +++ b/Demos/Device/DualCDC/DualCDC.h @@ -45,7 +45,6 @@ #include "Descriptors.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // Joystick driver #include // LEDs driver diff --git a/Demos/Device/GenericHID/GenericHID.c b/Demos/Device/GenericHID/GenericHID.c index 3b5f97267f..a9ecfa7d72 100644 --- a/Demos/Device/GenericHID/GenericHID.c +++ b/Demos/Device/GenericHID/GenericHID.c @@ -36,12 +36,6 @@ #include "GenericHID.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA GenHID App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -171,7 +165,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_GetReport: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); uint8_t GenericData[GENERIC_REPORT_SIZE]; @@ -181,32 +175,32 @@ EVENT_HANDLER(USB_UnhandledControlPacket) Endpoint_Write_Control_Stream_LE(&GenericData, sizeof(GenericData)); /* Finalize the stream transfer to send the last packet or clear the host abort */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); } break; case REQ_SetReport: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Wait until the generic report has been sent by the host */ - while (!(Endpoint_IsSetupOUTReceived())); + while (!(Endpoint_IsOUTReceived())); uint8_t GenericData[GENERIC_REPORT_SIZE]; - Endpoint_Read_Control_Stream(&GenericData, sizeof(GenericData)); + Endpoint_Read_Control_Stream_LE(&GenericData, sizeof(GenericData)); ProcessGenericHIDReport(GenericData); /* Clear the endpoint data */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); /* Wait until the host is ready to receive the request confirmation */ - while (!(Endpoint_IsSetupINReady())); + while (!(Endpoint_IsINReady())); /* Handshake the request by sending an empty IN packet */ - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); } break; @@ -280,24 +274,30 @@ TASK(USB_HID_Report) { Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM); - if (Endpoint_ReadWriteAllowed()) + /* Check to see if a packet has been sent from the host */ + if (Endpoint_IsOUTReceived()) { - /* Create a temporary buffer to hold the read in report from the host */ - uint8_t GenericData[GENERIC_REPORT_SIZE]; - - /* Read Generic Report Data */ - Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData)); - - /* Process Generic Report Data */ - ProcessGenericHIDReport(GenericData); + /* Check to see if the packet contains data */ + if (Endpoint_IsReadWriteAllowed()) + { + /* Create a temporary buffer to hold the read in report from the host */ + uint8_t GenericData[GENERIC_REPORT_SIZE]; + + /* Read Generic Report Data */ + Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData)); + + /* Process Generic Report Data */ + ProcessGenericHIDReport(GenericData); + } /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); } Endpoint_SelectEndpoint(GENERIC_IN_EPNUM); - if (Endpoint_ReadWriteAllowed()) + /* Check to see if the host is ready to accept another packet */ + if (Endpoint_IsINReady()) { /* Create a temporary buffer to hold the report to send to the host */ uint8_t GenericData[GENERIC_REPORT_SIZE]; @@ -309,7 +309,7 @@ TASK(USB_HID_Report) Endpoint_Write_Stream_LE(&GenericData, sizeof(GenericData)); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); } } } @@ -363,7 +363,7 @@ ISR(ENDPOINT_PIPE_vect, ISR_BLOCK) Endpoint_Write_Stream_LE(&GenericData, sizeof(GenericData)); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); } /* Check if Generic OUT endpoint has interrupted */ @@ -388,7 +388,7 @@ ISR(ENDPOINT_PIPE_vect, ISR_BLOCK) ProcessGenericHIDReport(GenericData); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); } #endif diff --git a/Demos/Device/GenericHID/GenericHID.h b/Demos/Device/GenericHID/GenericHID.h index d13e6debfe..817d377481 100644 --- a/Demos/Device/GenericHID/GenericHID.h +++ b/Demos/Device/GenericHID/GenericHID.h @@ -48,7 +48,6 @@ #include // Library Version Information #include // Simple scheduler for task management - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // LEDs driver diff --git a/Demos/Device/Joystick/Joystick.c b/Demos/Device/Joystick/Joystick.c index cd8822705b..c5d90e76fc 100644 --- a/Demos/Device/Joystick/Joystick.c +++ b/Demos/Device/Joystick/Joystick.c @@ -36,12 +36,6 @@ #include "Joystick.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA Joystick App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -151,13 +145,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (wLength > sizeof(JoystickReportData)) wLength = sizeof(JoystickReportData); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the report data to the control endpoint */ Endpoint_Write_Control_Stream_LE(&JoystickReportData, wLength); /* Finalize the stream transfer to send the last packet or clear the host abort */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); } break; @@ -241,8 +235,8 @@ TASK(USB_Joystick_Report) /* Select the Joystick Report Endpoint */ Endpoint_SelectEndpoint(JOYSTICK_EPNUM); - /* Check if Joystick Endpoint Ready for Read/Write */ - if (Endpoint_ReadWriteAllowed()) + /* Check to see if the host is ready for another packet */ + if (Endpoint_IsINReady()) { USB_JoystickReport_Data_t JoystickReportData; @@ -253,12 +247,10 @@ TASK(USB_Joystick_Report) Endpoint_Write_Stream_LE(&JoystickReportData, sizeof(JoystickReportData)); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* Clear the report data afterwards */ - JoystickReportData.X = 0; - JoystickReportData.Y = 0; - JoystickReportData.Button = 0; + memset(&JoystickReportData, 0, sizeof(JoystickReportData)); } } } diff --git a/Demos/Device/Joystick/Joystick.h b/Demos/Device/Joystick/Joystick.h index 79c7e498fb..2a5cc25882 100644 --- a/Demos/Device/Joystick/Joystick.h +++ b/Demos/Device/Joystick/Joystick.h @@ -45,7 +45,6 @@ #include "Descriptors.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // Joystick driver #include // LEDs driver diff --git a/Demos/Device/Keyboard/Keyboard.c b/Demos/Device/Keyboard/Keyboard.c index d118edea6f..8c4157a56f 100644 --- a/Demos/Device/Keyboard/Keyboard.c +++ b/Demos/Device/Keyboard/Keyboard.c @@ -37,12 +37,6 @@ #include "Keyboard.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA Keyboard App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -222,23 +216,23 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (wLength > sizeof(KeyboardReportData)) wLength = sizeof(KeyboardReportData); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the report data to the control endpoint */ Endpoint_Write_Control_Stream_LE(&KeyboardReportData, wLength); /* Finalize the stream transfer to send the last packet or clear the host abort */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); } break; case REQ_SetReport: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Wait until the LED report has been sent by the host */ - while (!(Endpoint_IsSetupOUTReceived())); + while (!(Endpoint_IsOUTReceived())); /* Read in the LED report from the host */ uint8_t LEDStatus = Endpoint_Read_Byte(); @@ -247,28 +241,28 @@ EVENT_HANDLER(USB_UnhandledControlPacket) ProcessLEDReport(LEDStatus); /* Clear the endpoint data */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; case REQ_GetProtocol: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the current protocol flag to the host */ Endpoint_Write_Byte(UsingReportProtocol); /* Send the flag to the host */ - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); } break; @@ -278,14 +272,14 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Read in the wValue parameter containing the new protocol mode */ uint16_t wValue = Endpoint_Read_Word_LE(); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Set or clear the flag depending on what the host indicates that the current Protocol should be */ UsingReportProtocol = (wValue != 0x0000); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; @@ -295,31 +289,31 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Read in the wValue parameter containing the idle period */ uint16_t wValue = Endpoint_Read_Word_LE(); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Get idle period in MSB */ IdleCount = (wValue >> 8); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; case REQ_GetIdle: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the current idle duration to the host */ Endpoint_Write_Byte(IdleCount); /* Send the flag to the host */ - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); } break; @@ -415,13 +409,13 @@ static inline void SendNextReport(void) Endpoint_SelectEndpoint(KEYBOARD_EPNUM); /* Check if Keyboard Endpoint Ready for Read/Write, and if we should send a report */ - if (Endpoint_ReadWriteAllowed() && SendReport) + if (Endpoint_IsReadWriteAllowed() && SendReport) { /* Write Keyboard Report Data */ Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData)); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); } } @@ -431,18 +425,22 @@ static inline void ReceiveNextReport(void) /* Select the Keyboard LED Report Endpoint */ Endpoint_SelectEndpoint(KEYBOARD_LEDS_EPNUM); - /* Check if Keyboard LED Endpoint Ready for Read/Write */ - if (!(Endpoint_ReadWriteAllowed())) - return; + /* Check if Keyboard LED Endpoint contains a packet */ + if (Endpoint_IsOUTReceived()) + { + /* Check to see if the packet contains data */ + if (Endpoint_IsReadWriteAllowed()) + { + /* Read in the LED report from the host */ + uint8_t LEDReport = Endpoint_Read_Byte(); - /* Read in the LED report from the host */ - uint8_t LEDReport = Endpoint_Read_Byte(); + /* Process the read LED report from the host */ + ProcessLEDReport(LEDReport); + } - /* Handshake the OUT Endpoint - clear endpoint and ready for next report */ - Endpoint_ClearCurrentBank(); - - /* Process the read LED report from the host */ - ProcessLEDReport(LEDReport); + /* Handshake the OUT Endpoint - clear endpoint and ready for next report */ + Endpoint_ClearOUT(); + } } /** Function to manage status updates to the user. This is done via LEDs on the given board, if available, but may be changed to diff --git a/Demos/Device/Keyboard/Keyboard.h b/Demos/Device/Keyboard/Keyboard.h index 143ffc654b..76b770582b 100644 --- a/Demos/Device/Keyboard/Keyboard.h +++ b/Demos/Device/Keyboard/Keyboard.h @@ -49,7 +49,6 @@ #include // Library Version Information #include // Simple scheduler for task management - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // Joystick driver #include // LEDs driver diff --git a/Demos/Device/KeyboardMouse/KeyboardMouse.c b/Demos/Device/KeyboardMouse/KeyboardMouse.c index 3ee101b8db..71e23ab1ed 100644 --- a/Demos/Device/KeyboardMouse/KeyboardMouse.c +++ b/Demos/Device/KeyboardMouse/KeyboardMouse.c @@ -37,12 +37,6 @@ #include "KeyboardMouse.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA MouseKBD App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -150,7 +144,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_GetReport: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_Ignore_Word(); + Endpoint_Discard_Word(); uint16_t wIndex = Endpoint_Read_Word_LE(); @@ -173,7 +167,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (wLength > ReportSize) wLength = ReportSize; - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the report data to the control endpoint */ Endpoint_Write_Control_Stream_LE(ReportData, wLength); @@ -182,17 +176,17 @@ EVENT_HANDLER(USB_UnhandledControlPacket) memset(ReportData, 0, ReportSize); /* Finalize the stream transfer to send the last packet or clear the host abort */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); } break; case REQ_SetReport: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Wait until the LED report has been sent by the host */ - while (!(Endpoint_IsSetupOUTReceived())); + while (!(Endpoint_IsOUTReceived())); /* Read in the LED report from the host */ uint8_t LEDStatus = Endpoint_Read_Byte(); @@ -211,11 +205,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket) LEDs_SetAllLEDs(LEDMask); /* Clear the endpoint data */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; @@ -281,13 +275,13 @@ TASK(USB_Keyboard) Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM); /* Check if Keyboard Endpoint Ready for Read/Write */ - if (Endpoint_ReadWriteAllowed()) + if (Endpoint_IsReadWriteAllowed()) { /* Write Keyboard Report Data */ Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData)); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* Clear the report data afterwards */ memset(&KeyboardReportData, 0, sizeof(KeyboardReportData)); @@ -297,7 +291,7 @@ TASK(USB_Keyboard) Endpoint_SelectEndpoint(KEYBOARD_OUT_EPNUM); /* Check if Keyboard LED Endpoint Ready for Read/Write */ - if (Endpoint_ReadWriteAllowed()) + if (Endpoint_IsReadWriteAllowed()) { /* Read in the LED report from the host */ uint8_t LEDStatus = Endpoint_Read_Byte(); @@ -316,7 +310,7 @@ TASK(USB_Keyboard) LEDs_SetAllLEDs(LEDMask); /* Handshake the OUT Endpoint - clear endpoint and ready for next report */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); } } } @@ -352,13 +346,13 @@ TASK(USB_Mouse) Endpoint_SelectEndpoint(MOUSE_IN_EPNUM); /* Check if Mouse Endpoint Ready for Read/Write */ - if (Endpoint_ReadWriteAllowed()) + if (Endpoint_IsReadWriteAllowed()) { /* Write Mouse Report Data */ Endpoint_Write_Stream_LE(&MouseReportData, sizeof(MouseReportData)); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* Clear the report data afterwards */ memset(&MouseReportData, 0, sizeof(MouseReportData)); diff --git a/Demos/Device/KeyboardMouse/KeyboardMouse.h b/Demos/Device/KeyboardMouse/KeyboardMouse.h index 9794159fc3..a69293c412 100644 --- a/Demos/Device/KeyboardMouse/KeyboardMouse.h +++ b/Demos/Device/KeyboardMouse/KeyboardMouse.h @@ -42,7 +42,6 @@ #include "Descriptors.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // Joystick driver #include // LEDs driver diff --git a/Demos/Device/MIDI/MIDI.c b/Demos/Device/MIDI/MIDI.c index c0e4f9df9f..e286dcbd6b 100644 --- a/Demos/Device/MIDI/MIDI.c +++ b/Demos/Device/MIDI/MIDI.c @@ -36,12 +36,6 @@ #include "MIDI.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA MIDI App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -134,7 +128,7 @@ TASK(USB_MIDI_Task) Endpoint_SelectEndpoint(MIDI_STREAM_IN_EPNUM); /* Check if endpoint is ready to be written to */ - if (Endpoint_ReadWriteAllowed()) + if (Endpoint_IsINReady()) { /* Get current joystick mask, XOR with previous to detect joystick changes */ uint8_t JoystickStatus = Joystick_GetStatus(); @@ -166,8 +160,8 @@ TASK(USB_MIDI_Task) Endpoint_SelectEndpoint(MIDI_STREAM_OUT_EPNUM); /* Check if endpoint is ready to be read from, if so discard its (unused) data */ - if (Endpoint_ReadWriteAllowed()) - Endpoint_ClearCurrentBank(); + if (Endpoint_IsOUTReceived()) + Endpoint_ClearOUT(); } /** Function to manage status updates to the user. This is done via LEDs on the given board, if available, but may be changed to @@ -207,7 +201,7 @@ void UpdateStatus(uint8_t CurrentStatus) void SendMIDINoteChange(const uint8_t Pitch, const bool OnOff, const uint8_t CableID, const uint8_t Channel) { /* Wait until endpoint ready for more data */ - while (!(Endpoint_ReadWriteAllowed())); + while (!(Endpoint_IsReadWriteAllowed())); /* Check if the message should be a Note On or Note Off command */ uint8_t Command = ((OnOff)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); @@ -221,5 +215,5 @@ void SendMIDINoteChange(const uint8_t Pitch, const bool OnOff, const uint8_t Cab Endpoint_Write_Byte(MIDI_STANDARD_VELOCITY); /* Send the data in the endpoint to the host */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); } diff --git a/Demos/Device/MIDI/MIDI.h b/Demos/Device/MIDI/MIDI.h index 733a7baedf..4e81c8c2ad 100644 --- a/Demos/Device/MIDI/MIDI.h +++ b/Demos/Device/MIDI/MIDI.h @@ -45,7 +45,6 @@ #include "Descriptors.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // Joystick driver #include // LEDs driver diff --git a/Demos/Device/MassStorage/DataflashManager.c b/Demos/Device/MassStorage/DataflashManager.c index 7b02ed6c8b..4b624190f9 100644 --- a/Demos/Device/MassStorage/DataflashManager.c +++ b/Demos/Device/MassStorage/DataflashManager.c @@ -64,7 +64,7 @@ void DataflashManager_WriteBlocks(const uint32_t BlockAddress, uint16_t TotalBlo Dataflash_SendAddressBytes(0, CurrDFPageByte); /* Wait until endpoint is ready before continuing */ - while (!(Endpoint_ReadWriteAllowed())); + while (!(Endpoint_IsReadWriteAllowed())); while (TotalBlocks) { @@ -74,13 +74,13 @@ void DataflashManager_WriteBlocks(const uint32_t BlockAddress, uint16_t TotalBlo while (BytesInBlockDiv16 < (VIRTUAL_MEMORY_BLOCK_SIZE >> 4)) { /* Check if the endpoint is currently empty */ - if (!(Endpoint_ReadWriteAllowed())) + if (!(Endpoint_IsReadWriteAllowed())) { /* Clear the current endpoint bank */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); /* Wait until the host has sent another packet */ - while (!(Endpoint_ReadWriteAllowed())); + while (!(Endpoint_IsReadWriteAllowed())); } /* Check if end of dataflash page reached */ @@ -157,8 +157,8 @@ void DataflashManager_WriteBlocks(const uint32_t BlockAddress, uint16_t TotalBlo Dataflash_WaitWhileBusy(); /* If the endpoint is empty, clear it ready for the next packet from the host */ - if (!(Endpoint_ReadWriteAllowed())) - Endpoint_ClearCurrentBank(); + if (!(Endpoint_IsReadWriteAllowed())) + Endpoint_ClearOUT(); /* Deselect all dataflash chips */ Dataflash_DeselectChip(); @@ -187,7 +187,7 @@ void DataflashManager_ReadBlocks(const uint32_t BlockAddress, uint16_t TotalBloc Dataflash_SendByte(0x00); /* Wait until endpoint is ready before continuing */ - while (!(Endpoint_ReadWriteAllowed())); + while (!(Endpoint_IsReadWriteAllowed())); while (TotalBlocks) { @@ -197,13 +197,13 @@ void DataflashManager_ReadBlocks(const uint32_t BlockAddress, uint16_t TotalBloc while (BytesInBlockDiv16 < (VIRTUAL_MEMORY_BLOCK_SIZE >> 4)) { /* Check if the endpoint is currently full */ - if (!(Endpoint_ReadWriteAllowed())) + if (!(Endpoint_IsReadWriteAllowed())) { /* Clear the endpoint bank to send its contents to the host */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* Wait until the endpoint is ready for more data */ - while (!(Endpoint_ReadWriteAllowed())); + while (!(Endpoint_IsReadWriteAllowed())); } /* Check if end of dataflash page reached */ @@ -259,8 +259,8 @@ void DataflashManager_ReadBlocks(const uint32_t BlockAddress, uint16_t TotalBloc } /* If the endpoint is full, send its contents to the host */ - if (!(Endpoint_ReadWriteAllowed())) - Endpoint_ClearCurrentBank(); + if (!(Endpoint_IsReadWriteAllowed())) + Endpoint_ClearIN(); /* Deselect all dataflash chips */ Dataflash_DeselectChip(); diff --git a/Demos/Device/MassStorage/MassStorage.c b/Demos/Device/MassStorage/MassStorage.c index 56bc19a943..48ce5f34d8 100644 --- a/Demos/Device/MassStorage/MassStorage.c +++ b/Demos/Device/MassStorage/MassStorage.c @@ -37,12 +37,6 @@ #define INCLUDE_FROM_MASSSTORAGE_C #include "MassStorage.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA MassStore App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -159,30 +153,30 @@ EVENT_HANDLER(USB_UnhandledControlPacket) case REQ_MassStorageReset: if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Indicate that the current transfer should be aborted */ IsMassStoreReset = true; /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; case REQ_GetMaxLUN: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - /* Indicate to the host the number of supported LUNs (virtual disks) on the device */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); + /* Indicate to the host the number of supported LUNs (virtual disks) on the device */ Endpoint_Write_Byte(TOTAL_LUNS - 1); - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); } break; @@ -234,7 +228,7 @@ TASK(USB_MassStorage) Endpoint_SelectEndpoint(MASS_STORAGE_OUT_EPNUM); /* Check to see if a command from the host has been issued */ - if (Endpoint_ReadWriteAllowed()) + if (Endpoint_IsReadWriteAllowed()) { /* Indicate busy */ UpdateStatus(Status_ProcessingCommandBlock); @@ -326,7 +320,7 @@ static bool ReadInCommandBlock(void) return false; /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); return true; } @@ -367,7 +361,7 @@ static void ReturnCommandStatus(void) return; /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); } /** Stream callback function for the Endpoint stream read and write functions. This callback will abort the current stream transfer diff --git a/Demos/Device/MassStorage/MassStorage.h b/Demos/Device/MassStorage/MassStorage.h index a30e7f7466..17acca6b7f 100644 --- a/Demos/Device/MassStorage/MassStorage.h +++ b/Demos/Device/MassStorage/MassStorage.h @@ -46,7 +46,6 @@ #include "DataflashManager.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // LEDs driver #include // Dataflash chip driver diff --git a/Demos/Device/MassStorage/SCSI.c b/Demos/Device/MassStorage/SCSI.c index d50f63d91a..e92be7ff83 100644 --- a/Demos/Device/MassStorage/SCSI.c +++ b/Demos/Device/MassStorage/SCSI.c @@ -174,7 +174,7 @@ static bool SCSI_Command_Inquiry(void) Endpoint_Write_Stream_LE(&PadBytes, (AllocationLength - BytesTransferred), AbortOnMassStoreReset); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* Succeed the command and update the bytes transferred counter */ CommandBlock.DataTransferLength -= BytesTransferred; @@ -201,7 +201,7 @@ static bool SCSI_Command_Request_Sense(void) Endpoint_Write_Stream_LE(&PadBytes, (AllocationLength - BytesTransferred), AbortOnMassStoreReset); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* Succeed the command and update the bytes transferred counter */ CommandBlock.DataTransferLength -= BytesTransferred; @@ -227,7 +227,7 @@ static bool SCSI_Command_Read_Capacity_10(void) return false; /* Send the endpoint data packet to the host */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* Succeed the command and update the bytes transferred counter */ CommandBlock.DataTransferLength -= 8; diff --git a/Demos/Device/Mouse/Mouse.c b/Demos/Device/Mouse/Mouse.c index 076ac5bbdc..e74002b7c4 100644 --- a/Demos/Device/Mouse/Mouse.c +++ b/Demos/Device/Mouse/Mouse.c @@ -36,12 +36,6 @@ #include "Mouse.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA Mouse App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -212,7 +206,7 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (wLength > sizeof(MouseReportData)) wLength = sizeof(MouseReportData); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the report data to the control endpoint */ Endpoint_Write_Control_Stream_LE(&MouseReportData, wLength); @@ -221,24 +215,24 @@ EVENT_HANDLER(USB_UnhandledControlPacket) memset(&MouseReportData, 0, sizeof(MouseReportData)); /* Finalize the stream transfer to send the last packet or clear the host abort */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); } break; case REQ_GetProtocol: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the current protocol flag to the host */ Endpoint_Write_Byte(UsingReportProtocol); /* Send the flag to the host */ - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); } break; @@ -248,14 +242,14 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Read in the wValue parameter containing the new protocol mode */ uint16_t wValue = Endpoint_Read_Word_LE(); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Set or clear the flag depending on what the host indicates that the current Protocol should be */ UsingReportProtocol = (wValue != 0x0000); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; @@ -265,31 +259,31 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Read in the wValue parameter containing the idle period */ uint16_t wValue = Endpoint_Read_Word_LE(); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Get idle period in MSB */ IdleCount = (wValue >> 8); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; case REQ_GetIdle: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the current idle duration to the host */ Endpoint_Write_Byte(IdleCount); /* Send the flag to the host */ - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); } break; @@ -367,13 +361,13 @@ static inline void SendNextReport(void) Endpoint_SelectEndpoint(MOUSE_EPNUM); /* Check if Mouse Endpoint Ready for Read/Write and if we should send a new report */ - if (Endpoint_ReadWriteAllowed() && SendReport) + if (Endpoint_IsReadWriteAllowed() && SendReport) { /* Write Mouse Report Data */ Endpoint_Write_Stream_LE(&MouseReportData, sizeof(MouseReportData)); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); } } diff --git a/Demos/Device/Mouse/Mouse.h b/Demos/Device/Mouse/Mouse.h index c9854a8f92..714f8d6e83 100644 --- a/Demos/Device/Mouse/Mouse.h +++ b/Demos/Device/Mouse/Mouse.h @@ -47,7 +47,6 @@ #include "Descriptors.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // Joystick driver #include // LEDs driver diff --git a/Demos/Device/RNDISEthernet/RNDISEthernet.c b/Demos/Device/RNDISEthernet/RNDISEthernet.c index d573a769bc..5e14bb76a3 100644 --- a/Demos/Device/RNDISEthernet/RNDISEthernet.c +++ b/Demos/Device/RNDISEthernet/RNDISEthernet.c @@ -36,12 +36,6 @@ #include "RNDISEthernet.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA RNDIS App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -162,13 +156,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { /* Clear the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Read in the RNDIS message into the message buffer */ Endpoint_Read_Control_Stream_LE(RNDISMessageBuffer, wLength); /* Finalize the stream transfer to clear the last packet from the host */ - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Process the RNDIS message */ ProcessRNDISControlMessage(); @@ -191,13 +185,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket) wLength = MessageHeader->MessageLength; /* Clear the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the message response data to the endpoint */ Endpoint_Write_Control_Stream_LE(RNDISMessageBuffer, wLength); /* Finalize the stream transfer to send the last packet or clear the host abort */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); /* Reset the message header once again after transmission */ MessageHeader->MessageLength = 0; @@ -247,7 +241,7 @@ TASK(RNDIS_Task) Endpoint_SelectEndpoint(CDC_NOTIFICATION_EPNUM); /* Check if a message response is ready for the host */ - if (Endpoint_ReadWriteAllowed() && ResponseReady) + if (Endpoint_IsINReady() && ResponseReady) { USB_Notification_t Notification = (USB_Notification_t) { @@ -262,7 +256,7 @@ TASK(RNDIS_Task) Endpoint_Write_Stream_LE(&Notification, sizeof(Notification)); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* Indicate a response is no longer ready */ ResponseReady = false; @@ -278,7 +272,7 @@ TASK(RNDIS_Task) Endpoint_SelectEndpoint(CDC_RX_EPNUM); /* Check if the data OUT endpoint contains data, and that the IN buffer is empty */ - if (Endpoint_ReadWriteAllowed() && !(FrameIN.FrameInBuffer)) + if (Endpoint_IsOUTReceived() && !(FrameIN.FrameInBuffer)) { /* Read in the packet message header */ Endpoint_Read_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_PACKET_MSG_t)); @@ -294,7 +288,7 @@ TASK(RNDIS_Task) Endpoint_Read_Stream_LE(FrameIN.FrameData, RNDISPacketHeader.DataLength); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); /* Store the size of the Ethernet frame */ FrameIN.FrameLength = RNDISPacketHeader.DataLength; @@ -307,7 +301,7 @@ TASK(RNDIS_Task) Endpoint_SelectEndpoint(CDC_TX_EPNUM); /* Check if the data IN endpoint is ready for more data, and that the IN buffer is full */ - if (Endpoint_ReadWriteAllowed() && FrameOUT.FrameInBuffer) + if (Endpoint_IsINReady() && FrameOUT.FrameInBuffer) { /* Clear the packet header with all 0s so that the relevant fields can be filled */ memset(&RNDISPacketHeader, 0, sizeof(RNDIS_PACKET_MSG_t)); @@ -325,7 +319,7 @@ TASK(RNDIS_Task) Endpoint_Write_Stream_LE(FrameOUT.FrameData, RNDISPacketHeader.DataLength); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* Indicate Ethernet OUT buffer no longer full */ FrameOUT.FrameInBuffer = false; diff --git a/Demos/Device/RNDISEthernet/RNDISEthernet.h b/Demos/Device/RNDISEthernet/RNDISEthernet.h index 83e49ce84c..f21ace774b 100644 --- a/Demos/Device/RNDISEthernet/RNDISEthernet.h +++ b/Demos/Device/RNDISEthernet/RNDISEthernet.h @@ -52,7 +52,6 @@ #include "Webserver.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // LEDs driver #include // Simple scheduler for task management diff --git a/Demos/Device/USBtoSerial/USBtoSerial.c b/Demos/Device/USBtoSerial/USBtoSerial.c index a9f0434cb7..87d531c4d4 100644 --- a/Demos/Device/USBtoSerial/USBtoSerial.c +++ b/Demos/Device/USBtoSerial/USBtoSerial.c @@ -30,12 +30,6 @@ #include "USBtoSerial.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA USB RS232 App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -165,13 +159,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the line coding data to the control endpoint */ Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(LineCoding)); /* Finalize the stream transfer to send the last packet or clear the host abort */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); } break; @@ -179,13 +173,13 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Read the line coding data in from the host into the global struct */ Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(LineCoding)); /* Finalize the stream transfer to clear the last packet from the host */ - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Reconfigure the USART with the new settings */ ReconfigureUSART(); @@ -207,11 +201,11 @@ EVENT_HANDLER(USB_UnhandledControlPacket) #endif /* Acknowledge the SETUP packet, ready for data transfer */ - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; @@ -244,13 +238,13 @@ TASK(CDC_Task) Endpoint_SelectEndpoint(CDC_NOTIFICATION_EPNUM); Endpoint_Write_Stream_LE(&Notification, sizeof(Notification)); Endpoint_Write_Stream_LE(&LineStateMask, sizeof(LineStateMask)); - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); #endif /* Select the Serial Rx Endpoint */ Endpoint_SelectEndpoint(CDC_RX_EPNUM); - if (Endpoint_ReadWriteAllowed()) + if (Endpoint_IsOUTReceived()) { /* Read the received data endpoint into the transmission buffer */ while (Endpoint_BytesInEndpoint()) @@ -263,7 +257,7 @@ TASK(CDC_Task) } /* Clear the endpoint buffer */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); } /* Check if Rx buffer contains data */ @@ -284,27 +278,20 @@ TASK(CDC_Task) if (Tx_Buffer.Elements) { /* Wait until Serial Tx Endpoint Ready for Read/Write */ - while (!(Endpoint_ReadWriteAllowed())); - - /* Check before sending the data if the endpoint is completely full */ - bool IsFull = (Endpoint_BytesInEndpoint() == CDC_TXRX_EPSIZE); + while (!(Endpoint_IsReadWriteAllowed())); /* Write the transmission buffer contents to the received data endpoint */ while (Tx_Buffer.Elements && (Endpoint_BytesInEndpoint() < CDC_TXRX_EPSIZE)) Endpoint_Write_Byte(Buffer_GetElement(&Tx_Buffer)); /* Send the data */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); - /* If a full endpoint was sent, we need to send an empty packet afterwards to terminate the transfer */ - if (IsFull) - { - /* Wait until Serial Tx Endpoint Ready for Read/Write */ - while (!(Endpoint_ReadWriteAllowed())); + /* Wait until Serial Tx Endpoint Ready for Read/Write */ + while (!(Endpoint_IsReadWriteAllowed())); - /* Send an empty packet to terminate the transfer */ - Endpoint_ClearCurrentBank(); - } + /* Send an empty packet to terminate the transfer */ + Endpoint_ClearIN(); } } } diff --git a/Demos/Device/USBtoSerial/USBtoSerial.h b/Demos/Device/USBtoSerial/USBtoSerial.h index 0926600695..8fb2c16176 100644 --- a/Demos/Device/USBtoSerial/USBtoSerial.h +++ b/Demos/Device/USBtoSerial/USBtoSerial.h @@ -46,7 +46,6 @@ #include "RingBuff.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // USART driver #include // LEDs driver diff --git a/Demos/Host/CDCHost/CDCHost.c b/Demos/Host/CDCHost/CDCHost.c index 9ecf060b3f..80d993953b 100644 --- a/Demos/Host/CDCHost/CDCHost.c +++ b/Demos/Host/CDCHost/CDCHost.c @@ -36,12 +36,6 @@ #include "CDCHost.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA CDC Host App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -244,33 +238,37 @@ TASK(USB_CDC_Host) /* Select and the data IN pipe */ Pipe_SelectPipe(CDC_DATAPIPE_IN); - /* Check if data is in the pipe */ - if (Pipe_ReadWriteAllowed()) + /* Check to see if a packet has been received */ + if (Pipe_IsINReceived()) { - /* Get the length of the pipe data, and create a new buffer to hold it */ - uint16_t BufferLength = Pipe_BytesInPipe(); - uint8_t Buffer[BufferLength]; - - /* Read in the pipe data to the temporary buffer */ - Pipe_Read_Stream_LE(Buffer, BufferLength); - + /* Check if data is in the pipe */ + if (Pipe_IsReadWriteAllowed()) + { + /* Get the length of the pipe data, and create a new buffer to hold it */ + uint16_t BufferLength = Pipe_BytesInPipe(); + uint8_t Buffer[BufferLength]; + + /* Read in the pipe data to the temporary buffer */ + Pipe_Read_Stream_LE(Buffer, BufferLength); + + /* Print out the buffer contents to the USART */ + for (uint16_t BufferByte = 0; BufferByte < BufferLength; BufferByte++) + putchar(Buffer[BufferByte]); + } + /* Clear the pipe after it is read, ready for the next packet */ - Pipe_ClearCurrentBank(); - - /* Print out the buffer contents to the USART */ - for (uint16_t BufferByte = 0; BufferByte < BufferLength; BufferByte++) - putchar(Buffer[BufferByte]); + Pipe_ClearIN(); } /* Select and unfreeze the notification pipe */ Pipe_SelectPipe(CDC_NOTIFICATIONPIPE); Pipe_Unfreeze(); - /* Check if data is in the pipe */ - if (Pipe_ReadWriteAllowed()) + /* Check if a packet has been received */ + if (Pipe_IsINReceived()) { /* Discard the event notification */ - Pipe_ClearCurrentBank(); + Pipe_ClearIN(); } /* Freeze notification IN pipe after use */ diff --git a/Demos/Host/CDCHost/CDCHost.h b/Demos/Host/CDCHost/CDCHost.h index 21b9d67eda..c348acaefe 100644 --- a/Demos/Host/CDCHost/CDCHost.h +++ b/Demos/Host/CDCHost/CDCHost.h @@ -44,7 +44,6 @@ #include #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // ANSI Terminal Escape Codes #include // USB Functionality #include // Serial stream driver diff --git a/Demos/Host/CDCHost/ConfigDescriptor.h b/Demos/Host/CDCHost/ConfigDescriptor.h index 9db4b6505c..ea00f610f3 100644 --- a/Demos/Host/CDCHost/ConfigDescriptor.h +++ b/Demos/Host/CDCHost/ConfigDescriptor.h @@ -38,7 +38,6 @@ /* Includes: */ #include // USB Functionality - #include // Configuration Descriptor Parser #include "CDCHost.h" diff --git a/Demos/Host/GenericHIDHost/ConfigDescriptor.h b/Demos/Host/GenericHIDHost/ConfigDescriptor.h index e35801a016..fac772979c 100644 --- a/Demos/Host/GenericHIDHost/ConfigDescriptor.h +++ b/Demos/Host/GenericHIDHost/ConfigDescriptor.h @@ -38,7 +38,6 @@ /* Includes: */ #include // USB Functionality - #include // Configuration Descriptor Parser #include "GenericHIDHost.h" diff --git a/Demos/Host/GenericHIDHost/GenericHIDHost.c b/Demos/Host/GenericHIDHost/GenericHIDHost.c index 716f1c333d..b047841f6f 100644 --- a/Demos/Host/GenericHIDHost/GenericHIDHost.c +++ b/Demos/Host/GenericHIDHost/GenericHIDHost.c @@ -36,12 +36,6 @@ #include "GenericHIDHost.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA GenHid Host App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -185,30 +179,34 @@ void ReadNextReport(void) Pipe_SelectPipe(HID_DATA_IN_PIPE); Pipe_Unfreeze(); - /* Ensure pipe contains data and is ready to be read before continuing */ - if (!(Pipe_ReadWriteAllowed())) + /* Check to see if a packet has been received */ + if (!(Pipe_IsINReceived())) { #if !defined(INTERRUPT_DATA_PIPE) /* Refreeze HID data IN pipe */ Pipe_Freeze(); #endif - + return; } - uint8_t ReportINData[Pipe_BytesInPipe()]; + /* Ensure pipe contains data before trying to read from it */ + if (Pipe_IsReadWriteAllowed()) + { + uint8_t ReportINData[Pipe_BytesInPipe()]; - /* Read in HID report data */ - Pipe_Read_Stream_LE(&ReportINData, sizeof(ReportINData)); + /* Read in HID report data */ + Pipe_Read_Stream_LE(&ReportINData, sizeof(ReportINData)); + + /* Print report data through the serial port */ + for (uint16_t CurrByte = 0; CurrByte < sizeof(ReportINData); CurrByte++) + printf_P(PSTR("0x%02X "), ReportINData[CurrByte]); + + puts_P(PSTR("\r\n")); + } /* Clear the IN endpoint, ready for next data packet */ - Pipe_ClearCurrentBank(); - - /* Print report data through the serial port */ - for (uint16_t CurrByte = 0; CurrByte < sizeof(ReportINData); CurrByte++) - printf_P(PSTR("0x%02X "), ReportINData[CurrByte]); - - puts_P(PSTR("\r\n")); + Pipe_ClearIN(); #if !defined(INTERRUPT_DATA_PIPE) /* Refreeze HID data IN pipe */ @@ -235,7 +233,7 @@ void WriteNextReport(uint8_t* ReportOUTData, uint8_t ReportIndex, uint8_t Report Pipe_Unfreeze(); /* Ensure pipe is ready to be written to before continuing */ - if (!(Pipe_ReadWriteAllowed())) + if (!(Pipe_IsOUTReady())) { /* Refreeze the data OUT pipe */ Pipe_Freeze(); @@ -251,7 +249,7 @@ void WriteNextReport(uint8_t* ReportOUTData, uint8_t ReportIndex, uint8_t Report Pipe_Write_Stream_LE(ReportOUTData, ReportLength); /* Clear the OUT endpoint, send last data packet */ - Pipe_ClearCurrentBank(); + Pipe_ClearOUT(); /* Refreeze the data OUT pipe */ Pipe_Freeze(); diff --git a/Demos/Host/GenericHIDHost/GenericHIDHost.h b/Demos/Host/GenericHIDHost/GenericHIDHost.h index 99b4599f1a..8483fa6863 100644 --- a/Demos/Host/GenericHIDHost/GenericHIDHost.h +++ b/Demos/Host/GenericHIDHost/GenericHIDHost.h @@ -45,7 +45,6 @@ #include #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // ANSI Terminal Escape Codes #include // USB Functionality #include // Serial stream driver @@ -94,6 +93,6 @@ /* Function Prototypes: */ void UpdateStatus(uint8_t CurrentStatus); void ReadNextReport(void); - void WriteNextReport(uint8_t* ReportOUTData, uint16_t ReportLength); + void WriteNextReport(uint8_t* ReportOUTData, uint8_t ReportIndex, uint8_t ReportType, uint16_t ReportLength); #endif diff --git a/Demos/Host/KeyboardHost/ConfigDescriptor.h b/Demos/Host/KeyboardHost/ConfigDescriptor.h index 1d168b4532..416315b97b 100644 --- a/Demos/Host/KeyboardHost/ConfigDescriptor.h +++ b/Demos/Host/KeyboardHost/ConfigDescriptor.h @@ -38,7 +38,6 @@ /* Includes: */ #include // USB Functionality - #include // Configuration Descriptor Parser #include "KeyboardHost.h" diff --git a/Demos/Host/KeyboardHost/KeyboardHost.c b/Demos/Host/KeyboardHost/KeyboardHost.c index 947f23281a..35055ca797 100644 --- a/Demos/Host/KeyboardHost/KeyboardHost.c +++ b/Demos/Host/KeyboardHost/KeyboardHost.c @@ -36,12 +36,6 @@ #include "KeyboardHost.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA KBD Host App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -191,52 +185,57 @@ void ReadNextReport(void) Pipe_Unfreeze(); #endif - /* Ensure pipe contains data and is ready to be read before continuing */ - if (!(Pipe_ReadWriteAllowed())) + /* Check to see if a packet has been received */ + if (!(Pipe_IsINReceived())) { #if !defined(INTERRUPT_DATA_PIPE) - /* Refreeze keyboard data pipe */ + /* Refreeze HID data IN pipe */ Pipe_Freeze(); #endif - + return; } - /* Read in keyboard report data */ - Pipe_Read_Stream_LE(&KeyboardReport, sizeof(KeyboardReport)); - - /* Clear the IN endpoint, ready for next data packet */ - Pipe_ClearCurrentBank(); - - /* Indicate if the modifier byte is non-zero (special key such as shift is being pressed) */ - LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0); - - /* Check if a key has been pressed */ - if (KeyboardReport.KeyCode) + /* Ensure pipe contains data before trying to read from it */ + if (Pipe_IsReadWriteAllowed()) { - /* Toggle status LED to indicate keypress */ - if (LEDs_GetLEDs() & LEDS_LED2) - LEDs_TurnOffLEDs(LEDS_LED2); - else - LEDs_TurnOnLEDs(LEDS_LED2); - - char PressedKey = 0; + /* Read in keyboard report data */ + Pipe_Read_Stream_LE(&KeyboardReport, sizeof(KeyboardReport)); - /* Retrieve pressed key character if alphanumeric */ - if ((KeyboardReport.KeyCode >= 0x04) && (KeyboardReport.KeyCode <= 0x1D)) - PressedKey = (KeyboardReport.KeyCode - 0x04) + 'A'; - else if ((KeyboardReport.KeyCode >= 0x1E) && (KeyboardReport.KeyCode <= 0x27)) - PressedKey = (KeyboardReport.KeyCode - 0x1E) + '0'; - else if (KeyboardReport.KeyCode == 0x2C) - PressedKey = ' '; - else if (KeyboardReport.KeyCode == 0x28) - PressedKey = '\n'; - - /* Print the pressed key character out through the serial port if valid */ - if (PressedKey) - putchar(PressedKey); + /* Indicate if the modifier byte is non-zero (special key such as shift is being pressed) */ + LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0); + + /* Check if a key has been pressed */ + if (KeyboardReport.KeyCode) + { + /* Toggle status LED to indicate keypress */ + if (LEDs_GetLEDs() & LEDS_LED2) + LEDs_TurnOffLEDs(LEDS_LED2); + else + LEDs_TurnOnLEDs(LEDS_LED2); + + char PressedKey = 0; + + /* Retrieve pressed key character if alphanumeric */ + if ((KeyboardReport.KeyCode >= 0x04) && (KeyboardReport.KeyCode <= 0x1D)) + PressedKey = (KeyboardReport.KeyCode - 0x04) + 'A'; + else if ((KeyboardReport.KeyCode >= 0x1E) && (KeyboardReport.KeyCode <= 0x27)) + PressedKey = (KeyboardReport.KeyCode - 0x1E) + '0'; + else if (KeyboardReport.KeyCode == 0x2C) + PressedKey = ' '; + else if (KeyboardReport.KeyCode == 0x28) + PressedKey = '\n'; + + /* Print the pressed key character out through the serial port if valid */ + if (PressedKey) + putchar(PressedKey); + } } + + /* Clear the IN endpoint, ready for next data packet */ + Pipe_ClearIN(); + #if !defined(INTERRUPT_DATA_PIPE) /* Refreeze keyboard data pipe */ Pipe_Freeze(); diff --git a/Demos/Host/KeyboardHost/KeyboardHost.h b/Demos/Host/KeyboardHost/KeyboardHost.h index 8c1a709154..2c541f6a53 100644 --- a/Demos/Host/KeyboardHost/KeyboardHost.h +++ b/Demos/Host/KeyboardHost/KeyboardHost.h @@ -45,7 +45,6 @@ #include #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // ANSI Terminal Escape Codes #include // USB Functionality #include // Serial stream driver diff --git a/Demos/Host/KeyboardHostWithParser/ConfigDescriptor.h b/Demos/Host/KeyboardHostWithParser/ConfigDescriptor.h index e007a942af..1deff6328b 100644 --- a/Demos/Host/KeyboardHostWithParser/ConfigDescriptor.h +++ b/Demos/Host/KeyboardHostWithParser/ConfigDescriptor.h @@ -38,7 +38,6 @@ /* Includes: */ #include // USB Functionality - #include // Configuration Descriptor Parser #include "HIDReport.h" diff --git a/Demos/Host/KeyboardHostWithParser/HIDReport.h b/Demos/Host/KeyboardHostWithParser/HIDReport.h index 7c59138c27..a128b8e97c 100644 --- a/Demos/Host/KeyboardHostWithParser/HIDReport.h +++ b/Demos/Host/KeyboardHostWithParser/HIDReport.h @@ -37,7 +37,7 @@ #define _HID_REPORT_H_ /* Includes: */ - #include // HID Class Report Parser + #include // USB Functionality #include "KeyboardHostWithParser.h" diff --git a/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c b/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c index d19929d4d1..d7d5f94143 100644 --- a/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c +++ b/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.c @@ -36,12 +36,6 @@ #include "KeyboardHostWithParser.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA KBD Host App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -270,70 +264,24 @@ TASK(USB_Keyboard_Host) Pipe_SelectPipe(KEYBOARD_DATAPIPE); Pipe_Unfreeze(); - /* Check if data has been received from the attached keyboard */ - if (Pipe_ReadWriteAllowed()) + /* Check to see if a packet has been received */ + if (Pipe_IsINReceived()) { - /* Create buffer big enough for the report */ - uint8_t KeyboardReport[Pipe_BytesInPipe()]; + /* Check if data has been received from the attached keyboard */ + if (Pipe_IsReadWriteAllowed()) + { + /* Create buffer big enough for the report */ + uint8_t KeyboardReport[Pipe_BytesInPipe()]; - /* Load in the keyboard report */ - Pipe_Read_Stream_LE(KeyboardReport, Pipe_BytesInPipe()); + /* Load in the keyboard report */ + Pipe_Read_Stream_LE(KeyboardReport, Pipe_BytesInPipe()); + + /* Process the read in keyboard report from the device */ + ProcessKeyboardReport(KeyboardReport); + } /* Clear the IN endpoint, ready for next data packet */ - Pipe_ClearCurrentBank(); - - /* Check each HID report item in turn, looking for keyboard scan code reports */ - for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++) - { - /* Create a temporary item pointer to the next report item */ - HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber]; - - /* Check if the current report item is a keyboard scancode */ - if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_KEYBOARD) && - (ReportItem->Attributes.BitSize == 8) && - (ReportItem->Attributes.Logical.Maximum > 1) && - (ReportItem->ItemType == REPORT_ITEM_TYPE_In)) - { - /* Retrieve the keyboard scancode from the report data retrieved from the device */ - bool FoundData = GetReportItemInfo(KeyboardReport, ReportItem); - - /* For multi-report devices - if the requested data was not in the issued report, continue */ - if (!(FoundData)) - continue; - - /* Key code is an unsigned char in length, cast to the appropriate type */ - uint8_t KeyCode = (uint8_t)ReportItem->Value; - - /* If scancode is non-zero, a key is being pressed */ - if (KeyCode) - { - /* Toggle status LED to indicate keypress */ - if (LEDs_GetLEDs() & LEDS_LED2) - LEDs_TurnOffLEDs(LEDS_LED2); - else - LEDs_TurnOnLEDs(LEDS_LED2); - - char PressedKey = 0; - - /* Convert scancode to printable character if alphanumeric */ - if ((KeyCode >= 0x04) && (KeyCode <= 0x1D)) - PressedKey = (KeyCode - 0x04) + 'A'; - else if ((KeyCode >= 0x1E) && (KeyCode <= 0x27)) - PressedKey = (KeyCode - 0x1E) + '0'; - else if (KeyCode == 0x2C) - PressedKey = ' '; - else if (KeyCode == 0x28) - PressedKey = '\n'; - - /* Print the pressed key character out through the serial port if valid */ - if (PressedKey) - putchar(PressedKey); - } - - /* Once a scancode is found, stop scanning through the report items */ - break; - } - } + Pipe_ClearIN(); } /* Freeze keyboard data pipe */ @@ -341,3 +289,64 @@ TASK(USB_Keyboard_Host) break; } } + +/** Processes a read HID report from an attached keyboard, extracting out elements via the HID parser results + * as required and prints pressed characters to the serial port. Each time a key is typed, a board LED is toggled. + * + * \param KeyboardReport Pointer to a HID report from an attached keyboard device + */ +void ProcessKeyboardReport(uint8_t* KeyboardReport) +{ + /* Check each HID report item in turn, looking for keyboard scan code reports */ + for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++) + { + /* Create a temporary item pointer to the next report item */ + HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber]; + + /* Check if the current report item is a keyboard scancode */ + if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_KEYBOARD) && + (ReportItem->Attributes.BitSize == 8) && + (ReportItem->Attributes.Logical.Maximum > 1) && + (ReportItem->ItemType == REPORT_ITEM_TYPE_In)) + { + /* Retrieve the keyboard scancode from the report data retrieved from the device */ + bool FoundData = GetReportItemInfo(KeyboardReport, ReportItem); + + /* For multi-report devices - if the requested data was not in the issued report, continue */ + if (!(FoundData)) + continue; + + /* Key code is an unsigned char in length, cast to the appropriate type */ + uint8_t KeyCode = (uint8_t)ReportItem->Value; + + /* If scancode is non-zero, a key is being pressed */ + if (KeyCode) + { + /* Toggle status LED to indicate keypress */ + if (LEDs_GetLEDs() & LEDS_LED2) + LEDs_TurnOffLEDs(LEDS_LED2); + else + LEDs_TurnOnLEDs(LEDS_LED2); + + char PressedKey = 0; + + /* Convert scancode to printable character if alphanumeric */ + if ((KeyCode >= 0x04) && (KeyCode <= 0x1D)) + PressedKey = (KeyCode - 0x04) + 'A'; + else if ((KeyCode >= 0x1E) && (KeyCode <= 0x27)) + PressedKey = (KeyCode - 0x1E) + '0'; + else if (KeyCode == 0x2C) + PressedKey = ' '; + else if (KeyCode == 0x28) + PressedKey = '\n'; + + /* Print the pressed key character out through the serial port if valid */ + if (PressedKey) + putchar(PressedKey); + } + + /* Once a scancode is found, stop scanning through the report items */ + break; + } + } +} diff --git a/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.h b/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.h index fece679718..112dbfdecf 100644 --- a/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.h +++ b/Demos/Host/KeyboardHostWithParser/KeyboardHostWithParser.h @@ -39,7 +39,6 @@ #include #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // ANSI Terminal Escape Codes #include // USB Functionality #include // Serial stream driver @@ -77,5 +76,6 @@ /* Function Prototypes: */ void UpdateStatus(uint8_t CurrentStatus); + void ProcessKeyboardReport(uint8_t* KeyboardReport); #endif diff --git a/Demos/Host/MassStorageHost/ConfigDescriptor.h b/Demos/Host/MassStorageHost/ConfigDescriptor.h index 908cc2ba57..b02e088284 100644 --- a/Demos/Host/MassStorageHost/ConfigDescriptor.h +++ b/Demos/Host/MassStorageHost/ConfigDescriptor.h @@ -38,7 +38,6 @@ /* Includes: */ #include // USB Functionality - #include // Configuration Descriptor Parser #include "MassStorageHost.h" diff --git a/Demos/Host/MassStorageHost/MassStorageHost.c b/Demos/Host/MassStorageHost/MassStorageHost.c index ec5bc6107b..1c56e6eedb 100644 --- a/Demos/Host/MassStorageHost/MassStorageHost.c +++ b/Demos/Host/MassStorageHost/MassStorageHost.c @@ -36,12 +36,6 @@ #include "MassStorageHost.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA MS Host App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { diff --git a/Demos/Host/MassStorageHost/MassStorageHost.h b/Demos/Host/MassStorageHost/MassStorageHost.h index 33e2d25389..73a69c0d8d 100644 --- a/Demos/Host/MassStorageHost/MassStorageHost.h +++ b/Demos/Host/MassStorageHost/MassStorageHost.h @@ -48,7 +48,6 @@ #include "MassStoreCommands.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // ANSI Terminal Escape Codes #include // USB Functionality #include // Serial stream driver diff --git a/Demos/Host/MassStorageHost/MassStoreCommands.c b/Demos/Host/MassStorageHost/MassStoreCommands.c index bf736e79c4..41c59dc431 100644 --- a/Demos/Host/MassStorageHost/MassStoreCommands.c +++ b/Demos/Host/MassStorageHost/MassStoreCommands.c @@ -88,7 +88,7 @@ static uint8_t MassStore_SendCommand(void) return ErrorCode; /* Send the data in the OUT pipe to the attached device */ - Pipe_ClearCurrentBank(); + Pipe_ClearOUT(); /* Some buggy devices require a delay here before the pipe freezing or they will lock up */ USB_Host_WaitMS(1); @@ -117,7 +117,7 @@ static uint8_t MassStore_WaitForDataReceived(void) Pipe_Unfreeze(); /* Wait until data received in the IN pipe */ - while (!(Pipe_ReadWriteAllowed())) + while (!(Pipe_IsINReceived())) { /* Check to see if a new frame has been issued (1ms elapsed) */ if (USB_INT_HasOccurred(USB_INT_HSOFI)) @@ -183,6 +183,9 @@ static uint8_t MassStore_SendReceiveData(void* BufferPtr) /* Read in the block data from the pipe */ if ((ErrorCode = Pipe_Read_Stream_LE(BufferPtr, BytesRem)) != PIPE_RWSTREAM_ERROR_NoError) return ErrorCode; + + /* Acknowledge the packet */ + Pipe_ClearIN(); } else { @@ -193,10 +196,10 @@ static uint8_t MassStore_SendReceiveData(void* BufferPtr) /* Write the block data to the pipe */ if ((ErrorCode = Pipe_Write_Stream_LE(BufferPtr, BytesRem)) != PIPE_RWSTREAM_ERROR_NoError) return ErrorCode; + + /* Acknowledge the packet */ + Pipe_ClearOUT(); } - - /* Acknowledge the packet */ - Pipe_ClearCurrentBank(); /* Some buggy devices require a delay here before the pipe freezing or they will lock up */ USB_Host_WaitMS(1); @@ -216,8 +219,8 @@ static uint8_t MassStore_GetReturnedStatus(void) uint8_t ErrorCode = PIPE_RWSTREAM_ERROR_NoError; /* If an error in the command ocurred, abort */ - if (MassStore_WaitForDataReceived() != NoError) - return; + if ((ErrorCode == MassStore_WaitForDataReceived()) != PIPE_RWSTREAM_ERROR_NoError) + return ErrorCode; /* Select the IN data pipe for data reception */ Pipe_SelectPipe(MASS_STORE_DATA_IN_PIPE); @@ -228,7 +231,7 @@ static uint8_t MassStore_GetReturnedStatus(void) return ErrorCode; /* Clear the data ready for next reception */ - Pipe_ClearCurrentBank(); + Pipe_ClearIN(); /* Some buggy devices require a delay here before the pipe freezing or they will lock up */ USB_Host_WaitMS(1); diff --git a/Demos/Host/MouseHost/ConfigDescriptor.h b/Demos/Host/MouseHost/ConfigDescriptor.h index 22e7337148..40286e546e 100644 --- a/Demos/Host/MouseHost/ConfigDescriptor.h +++ b/Demos/Host/MouseHost/ConfigDescriptor.h @@ -38,7 +38,6 @@ /* Includes: */ #include // USB Functionality - #include // Configuration Descriptor Parser #include "MouseHost.h" diff --git a/Demos/Host/MouseHost/MouseHost.c b/Demos/Host/MouseHost/MouseHost.c index ff2542834e..6a59b4d596 100644 --- a/Demos/Host/MouseHost/MouseHost.c +++ b/Demos/Host/MouseHost/MouseHost.c @@ -36,12 +36,6 @@ #include "MouseHost.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA Mouse Host App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -188,49 +182,53 @@ void ReadNextReport(void) Pipe_SelectPipe(MOUSE_DATAPIPE); #if !defined(INTERRUPT_DATA_PIPE) - /* Unfreeze mouse data pipe */ + /* Unfreeze keyboard data pipe */ Pipe_Unfreeze(); #endif - /* Ensure pipe contains data and is ready to be read before continuing */ - if (!(Pipe_ReadWriteAllowed())) + /* Check to see if a packet has been received */ + if (!(Pipe_IsINReceived())) { #if !defined(INTERRUPT_DATA_PIPE) - /* Refreeze mouse data pipe */ + /* Refreeze HID data IN pipe */ Pipe_Freeze(); #endif - + return; } - /* Read in mouse report data */ - Pipe_Read_Stream_LE(&MouseReport, sizeof(MouseReport)); - - /* Clear the IN endpoint, ready for next data packet */ - Pipe_ClearCurrentBank(); - - /* Alter status LEDs according to mouse X movement */ - if (MouseReport.X > 0) - LEDMask |= LEDS_LED1; - else if (MouseReport.X < 0) - LEDMask |= LEDS_LED2; - - /* Alter status LEDs according to mouse Y movement */ - if (MouseReport.Y > 0) - LEDMask |= LEDS_LED3; - else if (MouseReport.Y < 0) - LEDMask |= LEDS_LED4; + /* Ensure pipe contains data before trying to read from it */ + if (Pipe_IsReadWriteAllowed()) + { + /* Read in mouse report data */ + Pipe_Read_Stream_LE(&MouseReport, sizeof(MouseReport)); - /* Alter status LEDs according to mouse button position */ - if (MouseReport.Button) - LEDMask = LEDS_ALL_LEDS; - - LEDs_SetAllLEDs(LEDMask); - - /* Print mouse report data through the serial port */ - printf_P(PSTR("dX:%2d dY:%2d Button:%d\r\n"), MouseReport.X, - MouseReport.Y, - MouseReport.Button); + /* Alter status LEDs according to mouse X movement */ + if (MouseReport.X > 0) + LEDMask |= LEDS_LED1; + else if (MouseReport.X < 0) + LEDMask |= LEDS_LED2; + + /* Alter status LEDs according to mouse Y movement */ + if (MouseReport.Y > 0) + LEDMask |= LEDS_LED3; + else if (MouseReport.Y < 0) + LEDMask |= LEDS_LED4; + + /* Alter status LEDs according to mouse button position */ + if (MouseReport.Button) + LEDMask = LEDS_ALL_LEDS; + + LEDs_SetAllLEDs(LEDMask); + + /* Print mouse report data through the serial port */ + printf_P(PSTR("dX:%2d dY:%2d Button:%d\r\n"), MouseReport.X, + MouseReport.Y, + MouseReport.Button); + } + + /* Clear the IN endpoint, ready for next data packet */ + Pipe_ClearIN(); #if !defined(INTERRUPT_DATA_PIPE) /* Refreeze mouse data pipe */ diff --git a/Demos/Host/MouseHost/MouseHost.h b/Demos/Host/MouseHost/MouseHost.h index b72e09cd27..c7e5d2be2c 100644 --- a/Demos/Host/MouseHost/MouseHost.h +++ b/Demos/Host/MouseHost/MouseHost.h @@ -45,7 +45,6 @@ #include #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // ANSI Terminal Escape Codes #include // USB Functionality #include // Serial stream driver diff --git a/Demos/Host/MouseHostWithParser/ConfigDescriptor.h b/Demos/Host/MouseHostWithParser/ConfigDescriptor.h index 971bdfeef9..7cb12dbca9 100644 --- a/Demos/Host/MouseHostWithParser/ConfigDescriptor.h +++ b/Demos/Host/MouseHostWithParser/ConfigDescriptor.h @@ -38,7 +38,6 @@ /* Includes: */ #include // USB Functionality - #include // Configuration Descriptor Parser #include "HIDReport.h" diff --git a/Demos/Host/MouseHostWithParser/HIDReport.h b/Demos/Host/MouseHostWithParser/HIDReport.h index aa259a1145..f5ad40be31 100644 --- a/Demos/Host/MouseHostWithParser/HIDReport.h +++ b/Demos/Host/MouseHostWithParser/HIDReport.h @@ -37,7 +37,7 @@ #define _HID_REPORT_H_ /* Includes: */ - #include // HID Class Report Parser + #include // HID Class Report Parser #include "MouseHostWithParser.h" diff --git a/Demos/Host/MouseHostWithParser/MouseHostWithParser.c b/Demos/Host/MouseHostWithParser/MouseHostWithParser.c index 6aeca4ba56..259da2a60e 100644 --- a/Demos/Host/MouseHostWithParser/MouseHostWithParser.c +++ b/Demos/Host/MouseHostWithParser/MouseHostWithParser.c @@ -36,12 +36,6 @@ #include "MouseHostWithParser.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA Mouse Host App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -271,79 +265,24 @@ TASK(USB_Mouse_Host) Pipe_SelectPipe(MOUSE_DATAPIPE); Pipe_Unfreeze(); - /* Check if data has been received from the attached mouse */ - if (Pipe_ReadWriteAllowed()) + /* Check to see if a packet has been received */ + if (Pipe_IsINReceived()) { - uint8_t LEDMask = LEDS_NO_LEDS; - - /* Create buffer big enough for the report */ - uint8_t MouseReport[Pipe_BytesInPipe()]; - - /* Load in the mouse report */ - Pipe_Read_Stream_LE(MouseReport, Pipe_BytesInPipe()); - - /* Clear the IN endpoint, ready for next data packet */ - Pipe_ClearCurrentBank(); - - /* Check each HID report item in turn, looking for mouse X/Y/button reports */ - for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++) + /* Check if data has been received from the attached mouse */ + if (Pipe_IsReadWriteAllowed()) { - /* Create a temporary item pointer to the next report item */ - HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber]; - - bool FoundData; + /* Create buffer big enough for the report */ + uint8_t MouseReport[Pipe_BytesInPipe()]; - if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_BUTTON) && - (ReportItem->ItemType == REPORT_ITEM_TYPE_In)) - { - /* Get the mouse button value */ - FoundData = GetReportItemInfo(MouseReport, ReportItem); - - /* For multi-report devices - if the requested data was not in the issued report, continue */ - if (!(FoundData)) - continue; - - /* If button is pressed, all LEDs are turned on */ - if (ReportItem->Value) - LEDMask = LEDS_ALL_LEDS; - } - else if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_GENERIC_DCTRL) && - ((ReportItem->Attributes.Usage.Usage == USAGE_X) || - (ReportItem->Attributes.Usage.Usage == USAGE_Y)) && - (ReportItem->ItemType == REPORT_ITEM_TYPE_In)) - { - /* Get the mouse relative position value */ - FoundData = GetReportItemInfo(MouseReport, ReportItem); - - /* For multi-report devices - if the requested data was not in the issued report, continue */ - if (!(FoundData)) - continue; - - int16_t DeltaMovement; - - if (ReportItem->Attributes.BitSize > 8) - DeltaMovement = (int16_t)ReportItem->Value; - else - DeltaMovement = (int8_t)ReportItem->Value; - - /* Determine if the report is for the X or Y delta movement */ - if (ReportItem->Attributes.Usage.Usage == USAGE_X) - { - /* Turn on the appropriate LED according to direction if the delta is non-zero */ - if (DeltaMovement) - LEDMask |= ((DeltaMovement > 0) ? LEDS_LED1 : LEDS_LED2); - } - else - { - /* Turn on the appropriate LED according to direction if the delta is non-zero */ - if (DeltaMovement) - LEDMask |= ((DeltaMovement > 0) ? LEDS_LED3 : LEDS_LED4); - } - } + /* Load in the mouse report */ + Pipe_Read_Stream_LE(MouseReport, Pipe_BytesInPipe()); + + /* Process the read in mouse report from the device */ + ProcessMouseReport(MouseReport); } - /* Display the button information on the board LEDs */ - LEDs_SetAllLEDs(LEDMask); + /* Clear the IN endpoint, ready for next data packet */ + Pipe_ClearIN(); } /* Freeze mouse data pipe */ @@ -352,3 +291,72 @@ TASK(USB_Mouse_Host) } } +/** Processes a read HID report from an attached mouse, extracting out elements via the HID parser results + * as required and displays movement and button presses on the board LEDs. + * + * \param MouseReport Pointer to a HID report from an attached mouse device + */ +void ProcessMouseReport(uint8_t* MouseReport) +{ + uint8_t LEDMask = LEDS_NO_LEDS; + + /* Check each HID report item in turn, looking for mouse X/Y/button reports */ + for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++) + { + /* Create a temporary item pointer to the next report item */ + HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber]; + + bool FoundData; + + if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_BUTTON) && + (ReportItem->ItemType == REPORT_ITEM_TYPE_In)) + { + /* Get the mouse button value */ + FoundData = GetReportItemInfo(MouseReport, ReportItem); + + /* For multi-report devices - if the requested data was not in the issued report, continue */ + if (!(FoundData)) + continue; + + /* If button is pressed, all LEDs are turned on */ + if (ReportItem->Value) + LEDMask = LEDS_ALL_LEDS; + } + else if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_GENERIC_DCTRL) && + ((ReportItem->Attributes.Usage.Usage == USAGE_X) || + (ReportItem->Attributes.Usage.Usage == USAGE_Y)) && + (ReportItem->ItemType == REPORT_ITEM_TYPE_In)) + { + /* Get the mouse relative position value */ + FoundData = GetReportItemInfo(MouseReport, ReportItem); + + /* For multi-report devices - if the requested data was not in the issued report, continue */ + if (!(FoundData)) + continue; + + int16_t DeltaMovement; + + if (ReportItem->Attributes.BitSize > 8) + DeltaMovement = (int16_t)ReportItem->Value; + else + DeltaMovement = (int8_t)ReportItem->Value; + + /* Determine if the report is for the X or Y delta movement */ + if (ReportItem->Attributes.Usage.Usage == USAGE_X) + { + /* Turn on the appropriate LED according to direction if the delta is non-zero */ + if (DeltaMovement) + LEDMask |= ((DeltaMovement > 0) ? LEDS_LED1 : LEDS_LED2); + } + else + { + /* Turn on the appropriate LED according to direction if the delta is non-zero */ + if (DeltaMovement) + LEDMask |= ((DeltaMovement > 0) ? LEDS_LED3 : LEDS_LED4); + } + } + } + + /* Display the button information on the board LEDs */ + LEDs_SetAllLEDs(LEDMask); +} \ No newline at end of file diff --git a/Demos/Host/MouseHostWithParser/MouseHostWithParser.h b/Demos/Host/MouseHostWithParser/MouseHostWithParser.h index b59ab9a789..f808745d75 100644 --- a/Demos/Host/MouseHostWithParser/MouseHostWithParser.h +++ b/Demos/Host/MouseHostWithParser/MouseHostWithParser.h @@ -39,7 +39,6 @@ #include #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // ANSI Terminal Escape Codes #include // USB Functionality #include // Serial stream driver @@ -77,5 +76,6 @@ /* Function Prototypes: */ void UpdateStatus(uint8_t CurrentStatus); - + void ProcessMouseReport(uint8_t* MouseReport); + #endif diff --git a/Demos/Host/StillImageHost/ConfigDescriptor.h b/Demos/Host/StillImageHost/ConfigDescriptor.h index f791488b11..cb4de5f463 100644 --- a/Demos/Host/StillImageHost/ConfigDescriptor.h +++ b/Demos/Host/StillImageHost/ConfigDescriptor.h @@ -38,7 +38,6 @@ /* Includes: */ #include // USB Functionality - #include // Configuration Descriptor Parser #include "StillImageHost.h" diff --git a/Demos/Host/StillImageHost/StillImageCommands.c b/Demos/Host/StillImageHost/StillImageCommands.c index 43e57e126e..ebf20b0b29 100644 --- a/Demos/Host/StillImageHost/StillImageCommands.c +++ b/Demos/Host/StillImageHost/StillImageCommands.c @@ -72,7 +72,7 @@ void SImage_SendBlockHeader(void) } /* Send the PIMA command block to the attached device */ - Pipe_ClearCurrentBank(); + Pipe_ClearOUT(); } /* Freeze pipe after use */ @@ -90,7 +90,7 @@ void SImage_RecieveEventHeader(void) Pipe_Read_Stream_LE(&PIMA_EventBlock, sizeof(PIMA_EventBlock)); /* Clear the pipe after read complete to prepare for next event */ - Pipe_ClearCurrentBank(); + Pipe_ClearIN(); /* Freeze the event pipe again after use */ Pipe_Freeze(); @@ -106,7 +106,7 @@ uint8_t SImage_RecieveBlockHeader(void) Pipe_Unfreeze(); /* Wait until data received on the IN pipe */ - while (!(Pipe_ReadWriteAllowed())) + while (!(Pipe_IsReadWriteAllowed())) { /* Check to see if a new frame has been issued (1ms elapsed) */ if (USB_INT_HasOccurred(USB_INT_HSOFI)) @@ -179,7 +179,7 @@ uint8_t SImage_RecieveBlockHeader(void) } /* Clear pipe bank after use */ - Pipe_ClearCurrentBank(); + Pipe_ClearIN(); } /* Freeze the IN pipe after use */ @@ -203,7 +203,7 @@ void SImage_SendData(void* Buffer, uint16_t Bytes) Pipe_Write_Stream_LE(Buffer, Bytes); /* Send the last packet to the attached device */ - Pipe_ClearCurrentBank(); + Pipe_ClearOUT(); /* Freeze the pipe again after use */ Pipe_Freeze(); diff --git a/Demos/Host/StillImageHost/StillImageHost.c b/Demos/Host/StillImageHost/StillImageHost.c index 1694322ee8..d9dd7ce3f9 100644 --- a/Demos/Host/StillImageHost/StillImageHost.c +++ b/Demos/Host/StillImageHost/StillImageHost.c @@ -36,11 +36,6 @@ #include "StillImageHost.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA SIMG Host App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); - /* Scheduler Task List */ TASK_LIST { @@ -243,7 +238,7 @@ TASK(USB_SImage_Host) SImage_ReadData(DeviceInfo, DeviceInfoSize); /* Once all the data has been read, the pipe must be cleared before the response can be sent */ - Pipe_ClearCurrentBank(); + Pipe_ClearIN(); /* Create a pointer for walking through the info dataset */ uint8_t* DeviceInfoPos = DeviceInfo; diff --git a/Demos/Host/StillImageHost/StillImageHost.h b/Demos/Host/StillImageHost/StillImageHost.h index 7757b08077..e4d2e85f88 100644 --- a/Demos/Host/StillImageHost/StillImageHost.h +++ b/Demos/Host/StillImageHost/StillImageHost.h @@ -46,7 +46,6 @@ #include "PIMACodes.h" #include "StillImageCommands.h" - #include // PROGMEM tags readable by the ButtLoad project #include // ANSI Terminal Escape Codes #include // USB Functionality #include // Serial stream driver diff --git a/Demos/OTG/TestApp/TestApp.c b/Demos/OTG/TestApp/TestApp.c index 49fdf67827..e72c191b3a 100644 --- a/Demos/OTG/TestApp/TestApp.c +++ b/Demos/OTG/TestApp/TestApp.c @@ -36,12 +36,6 @@ #include "TestApp.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "LUFA Test App"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { diff --git a/Demos/OTG/TestApp/TestApp.h b/Demos/OTG/TestApp/TestApp.h index cb262397dd..bf2d56098e 100644 --- a/Demos/OTG/TestApp/TestApp.h +++ b/Demos/OTG/TestApp/TestApp.h @@ -46,7 +46,6 @@ #include // USB Functionality #include // Simple scheduler for task management #include // Auto-defragmenting Dynamic Memory allocation - #include // PROGMEM tags readable by the ButtLoad project #include // ANSI Terminal Escape Codes #include // ADC driver #include // USART Stream driver diff --git a/LUFA.pnproj b/LUFA.pnproj index d2007eac4e..d5bb11eeb6 100644 --- a/LUFA.pnproj +++ b/LUFA.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/LUFA/ChangeLog.txt b/LUFA/ChangeLog.txt index 0b4b6d659d..4aa75cbf50 100644 --- a/LUFA/ChangeLog.txt +++ b/LUFA/ChangeLog.txt @@ -34,7 +34,20 @@ * - The USB_Host_SendControlRequest() function no longer automatically selects the Control pipe (pipe 0), so that other control type * pipes can be used with the function * - The USB Host management task now saves and restores the currently selected pipe before and after the task completes - * - Fixed GenericHIDHost demo report write routine incorrect for control type requests (thanks to Andrei) + * - Fixed GenericHIDHost demo report write routine incorrect for control type requests (thanks to Andrei Krainev) + * - Removed Endpoint_ClearCurrentBank() and Pipe_ClearCurrentBank() in favour of new Endpoint_ClearIN(), Endpoint_ClearOUT(), + * Endpoint_ClearControlIN(), Endpoint_ClearControlOUT(), Pipe_ClearIN(), Pipe_ClearOUT(), Pipe_ClearControlIN() and + * Pipe_ClearControlOUT() macros (done to allow for the detection of packets of zero length) + * - Renamed *_ReadWriteAllowed() macros to *_IsReadWriteAllowed() to remain consistent with the rest of the LUFA API + * - Endpoint_IsSetupReceived() macro has been renamed to Endpoint_IsSETUPReceived(), Endpoint_ClearSetupReceived() macro has been + * renamed to Endpoint_ClearControlSETUP(), the Pipe_IsSetupSent() macro has been renamed to Pipe_IsSETUPSent() and the + * Pipe_ClearSetupSent() macro is no longer applicable and should be removed - changes made to compliment the new endpoint and pipe + * bank management API + * - Updated all demos, bootloaders and projects to use the new endpoint and pipe management APIs (thanks to Roman Thiel) + * - Updated library doxygen documentation, added groups, changed documentation macro functions to real functions for clarity + * - Removed old endpoint and pipe aliased read/write/discard routines which did not have an explicit endian specifier for clarity + * - Removed the ButtLoadTag.h header file, as no one used for its intended purpose anyway + * * * \section Sec_ChangeLog090401 Version 090401 * diff --git a/LUFA/Common/BoardTypes.h b/LUFA/Common/BoardTypes.h index d4a36550ee..a4daa18773 100644 --- a/LUFA/Common/BoardTypes.h +++ b/LUFA/Common/BoardTypes.h @@ -36,6 +36,15 @@ * \note Do not include this file directly, rather include the Common.h header file instead to gain this file's * functionality. */ + +/** \ingroup Group_Common + * @defgroup Group_BoardTypes Board Types + * + * Macros for indicating the chosen physical board hardware to the library. These macros should be used when + * defining the BOARD token to the chosen hardware via the -D switch in the project makefile. + * + * @{ + */ #ifndef __BOARDTYPES_H__ #define __BOARDTYPES_H__ @@ -70,3 +79,5 @@ #define BOARD_USER 5 #endif + +/** @} */ diff --git a/LUFA/Common/ButtLoadTag.h b/LUFA/Common/ButtLoadTag.h deleted file mode 100644 index 54fab0f02f..0000000000 --- a/LUFA/Common/ButtLoadTag.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2009. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, and distribute this software - and its documentation for any purpose and without fee is hereby - granted, provided that the above copyright notice appear in all - copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * - * This file contains macros for the embedding of compile-time strings into the resultant project binary for - * identification purposes. It is designed to prefix "tags" with the magic string of "@(#)" so that the tags - * can easily be identified in the binary data. - * - * These tags are compatible with the ButtLoad project at http://www.fourwalledcubicle.com/ButtLoad.php . - */ - -#ifndef __BUTTLOADTAG_H__ -#define __BUTTLOADTAG_H__ - - /* Includes: */ - #include - #include - - /* Public Interface - May be used in end-application: */ - /* Macros: */ - /** Creates a new tag in the resultant binary, containing the specified data array. The macro id - * parameter is only for identification purposes (so that the tag data can be referenced in code) - * and is not visible in the compiled binary. - */ - #define BUTTLOADTAG(id, data) const struct ButtLoadTagData BUTTTAG_##id \ - PROGMEM __attribute__((used, externally_visible)) = \ - {MagicString: BT_TAGHEADER, TagData: data} - - /** Macro for retrieving a reference to the specified tag's contents. The tag data is located in - * the program memory (FLASH) space, and so must be read out with the macros in avr-libc which - * deal with embedded data. - */ - #define BUTTLOADTAG_DATA(id) BUTTTAG_##id.TagData - - /* Structures: */ - /** Structure for ButtLoad compatible binary tags. */ - struct ButtLoadTagData - { - char MagicString[4]; /**< Magic tag header, containing the string "@(#)". */ - char TagData[]; /**< Tag contents as a char array. */ - }; - - /* Private Interface - For use in library only: */ - #if !defined(__DOXYGEN__) - /* Macros: */ - #define BT_TAGHEADER {'@','(','#',')'} - #endif - -#endif diff --git a/LUFA/Common/Common.h b/LUFA/Common/Common.h index 36d9e3f6f5..0923d513bb 100644 --- a/LUFA/Common/Common.h +++ b/LUFA/Common/Common.h @@ -33,6 +33,24 @@ * This file contains macros which are common to all library elements, and which may be useful in user code. It * also includes other common headers, such as Atomic.h, FunctionAttributes.h and BoardTypes.h. */ + +/** @defgroup Group_Common Common Utility Headers - LUFA/Drivers/Common/Common.h + * + * Common utility headers containing macros, functions, enums and types which are common to all + * aspects of the library. + * + * @{ + */ + +/** @defgroup Group_Debugging Debugging Macros + * + * Macros for debugging use. + */ + +/** @defgroup Group_BitManip Endian and Bit Macros + * + * Functions for swapping endianness and reversing bit orders. + */ #ifndef __COMMON_H__ #define __COMMON_H__ @@ -66,14 +84,22 @@ /** Defines a volatile NOP statement which cannot be optimized out by the compiler, and thus can always * be set as a breakpoint in the resulting code. Useful for debugging purposes, where the optimizer * removes/reorders code to the point where break points cannot reliably be set. + * + * \ingroup Group_Debugging */ #define JTAG_DEBUG_POINT() asm volatile ("NOP" ::) /** Defines an explicit JTAG break point in the resulting binary via the ASM BREAK statement. When - * a JTAG is used, this causes the program execution to halt when reached until manually resumed. */ + * a JTAG is used, this causes the program execution to halt when reached until manually resumed. + * + * \ingroup Group_Debugging + */ #define JTAG_DEBUG_BREAK() asm volatile ("BREAK" ::) - /** Macro for testing condition "x" and breaking via JTAG_DEBUG_BREAK() if the condition is false. */ + /** Macro for testing condition "x" and breaking via JTAG_DEBUG_BREAK() if the condition is false. + * + * \ingroup Group_Debugging + */ #define JTAG_DEBUG_ASSERT(x) MACROS{ if (!(x)) { JTAG_DEBUG_BREAK(); } }MACROE /** Macro for testing condition "x" and writing debug data to the serial stream if false. As a @@ -81,6 +107,8 @@ * * The serial output takes the form "{FILENAME}: Function {FUNCTION NAME}, Line {LINE NUMBER}: Assertion * {x} failed." + * + * \ingroup Group_Debugging */ #define SERIAL_STREAM_ASSERT(x) MACROS{ if (!(x)) { printf_P(PSTR("%s: Function \"%s\", Line %d: " \ "Assertion \"%s\" failed.\r\n"), \ @@ -91,6 +119,8 @@ /** Function to reverse the individual bits in a byte - i.e. bit 7 is moved to bit 0, bit 6 to bit 1, * etc. * + * \ingroup Group_BitManip + * * \param Byte Byte of data whose bits are to be reversed */ static inline uint8_t BitReverse(uint8_t Byte) ATTR_WARN_UNUSED_RESULT ATTR_CONST; @@ -104,6 +134,8 @@ } /** Function to reverse the byte ordering of the individual bytes in a 16 bit number. + * + * \ingroup Group_BitManip * * \param Word Word of data whose bytes are to be swapped */ @@ -114,6 +146,8 @@ } /** Function to reverse the byte ordering of the individual bytes in a 32 bit number. + * + * \ingroup Group_BitManip * * \param DWord Double word of data whose bytes are to be swapped */ @@ -127,6 +161,8 @@ } /** Function to reverse the byte ordering of the individual bytes in a n byte number. + * + * \ingroup Group_BitManip * * \param Data Pointer to a number containing an even number of bytes to be reversed * \param Bytes Length of the data in bytes @@ -148,3 +184,5 @@ } #endif + +/** @} */ diff --git a/LUFA/Common/FunctionAttributes.h b/LUFA/Common/FunctionAttributes.h index cd406734d1..9efa440e5e 100644 --- a/LUFA/Common/FunctionAttributes.h +++ b/LUFA/Common/FunctionAttributes.h @@ -37,6 +37,14 @@ * \note Do not include this file directly, rather include the Common.h header file instead to gain this file's * functionality. */ + +/** \ingroup Group_Common + * @defgroup Group_FuncAttr Function Attributes + * + * Macros for easy access GCC function attributes, which can be applied to function prototypes. + * + * @{ + */ #ifndef __FUNCATTR_H__ #define __FUNCATTR_H__ @@ -108,3 +116,5 @@ #define ATTR_ALIAS(x) __attribute__ ((alias( #x ))) #endif + +/** @} */ diff --git a/LUFA/Doxygen.conf b/LUFA/Doxygen.conf index 7cb1c71e58..136a72335b 100644 --- a/LUFA/Doxygen.conf +++ b/LUFA/Doxygen.conf @@ -408,7 +408,7 @@ SORT_BRIEF_DOCS = NO # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. -SORT_GROUP_NAMES = NO +SORT_GROUP_NAMES = YES # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to @@ -607,7 +607,7 @@ EXCLUDE_SYMLINKS = NO # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* -EXCLUDE_PATTERNS = */LowLevel/USBMode.h +EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the @@ -936,7 +936,7 @@ GENERATE_TREEVIEW = YES # used to set the initial width (in pixels) of the frame in which the tree # is shown. -TREEVIEW_WIDTH = 250 +TREEVIEW_WIDTH = 300 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that @@ -1228,7 +1228,7 @@ PREDEFINED = __DOXYGEN__ # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. -EXPAND_AS_DEFINED = BUTTLOADTAG +EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone @@ -1356,7 +1356,7 @@ COLLABORATION_GRAPH = NO # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies -GROUP_GRAPHS = NO +GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling @@ -1374,14 +1374,14 @@ TEMPLATE_RELATIONS = NO # file showing the direct and indirect include dependencies of the file with # other documented files. -INCLUDE_GRAPH = NO +INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. -INCLUDED_BY_GRAPH = NO +INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function @@ -1389,7 +1389,7 @@ INCLUDED_BY_GRAPH = NO # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. -CALL_GRAPH = NO +CALL_GRAPH = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function @@ -1409,7 +1409,7 @@ GRAPHICAL_HIERARCHY = NO # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. -DIRECTORY_GRAPH = NO +DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif diff --git a/LUFA/Drivers/AT90USBXXX/ADC.h b/LUFA/Drivers/AT90USBXXX/ADC.h index 341b4e1940..12e168834d 100644 --- a/LUFA/Drivers/AT90USBXXX/ADC.h +++ b/LUFA/Drivers/AT90USBXXX/ADC.h @@ -35,6 +35,10 @@ * User code should include this file, which will in turn include the correct ADC driver header file for the * currently selected AVR model. */ + +/** \ingroup Group_SubsystemDrivers + * @defgroup Group_ADC ADC Driver - LUFA/Drivers/AT90USBXXX/ADC.h + */ #ifndef __ADC_H__ #define __ADC_H__ @@ -55,4 +59,29 @@ #error "ADC is not available for the currently selected AVR model." #endif + /* Public Interface - May be used in end-application: */ + /* Inline Functions: */ + /** Starts the reading of the given channel, but does not wait until the conversion has completed. + * Once executed, the conversion status can be determined via the ADC_IsReadingComplete() macro and + * the result read via the ADC_GetResult() macro. + * + * \param MUXMask Mask comprising of an ADC channel number, reference mask and adjustment mask + */ + static inline void ADC_StartReading(const uint8_t MUXMask); + + /** Performs a complete single reading from channel, including a polling spinloop to wait for the + * conversion to complete, and the returning of the converted value. + * + * \param MUXMask Mask comprising of an ADC channel number, reference mask and adjustment mask + */ + static inline uint16_t ADC_GetChannelReading(const uint8_t MUXMask) ATTR_WARN_UNUSED_RESULT; + + /** Configures the given ADC channel, ready for ADC conversions. This function sets the + * associated port pin as an input and disables the digital portion of the I/O to reduce + * power consumption. + * + * \param Channel ADC channel number to set up for conversions + */ + static inline void ADC_SetupChannel(const uint8_t Channel); + #endif diff --git a/LUFA/Drivers/AT90USBXXX/AT90USBXXX67/ADC.h b/LUFA/Drivers/AT90USBXXX/AT90USBXXX67/ADC.h index c86203fe00..c6169c18ae 100644 --- a/LUFA/Drivers/AT90USBXXX/AT90USBXXX67/ADC.h +++ b/LUFA/Drivers/AT90USBXXX/AT90USBXXX67/ADC.h @@ -36,15 +36,21 @@ * dispatch header located in LUFA/Drivers/AT90USBXXX/ADC.h. */ +/** \ingroup Group_ADC + * @defgroup Group_ADC_AT90USBXXX67 AT90USBXXX6 and AT90USBXXX7 Models + * + * @{ + */ + #ifndef __ADC_AT90USBXXX67_H__ #define __ADC_AT90USBXXX67_H__ /* Includes: */ + #include "../../../Common/Common.h" + #include #include - #include "../../../Common/Common.h" - /* Enable C linkage for C++ Compilers: */ #if defined(__cplusplus) extern "C" { @@ -175,3 +181,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/AT90USBXXX/SPI.h b/LUFA/Drivers/AT90USBXXX/SPI.h index d1c9cede44..f0b43e0df9 100644 --- a/LUFA/Drivers/AT90USBXXX/SPI.h +++ b/LUFA/Drivers/AT90USBXXX/SPI.h @@ -33,6 +33,14 @@ * Hardware SPI subsystem driver for the supported USB AVRs models. */ +/** \ingroup Group_SubsystemDrivers + * @defgroup Group_SPI SPI Driver - LUFA/Drivers/AT90USBXXX/SPI.h + * + * Functions, macros, variables, enums and types related to the setup of a the SPI port. + * + * @{ + */ + #ifndef __SPI_H__ #define __SPI_H__ @@ -137,3 +145,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/AT90USBXXX/Serial.h b/LUFA/Drivers/AT90USBXXX/Serial.h index bbf3044faa..f08f9a0394 100644 --- a/LUFA/Drivers/AT90USBXXX/Serial.h +++ b/LUFA/Drivers/AT90USBXXX/Serial.h @@ -33,6 +33,14 @@ * Driver for the USART subsystem on supported USB AVRs. */ +/** \ingroup Group_SubsystemDrivers + * @defgroup Group_Serial Serial USART Driver - LUFA/Drivers/AT90USBXXX/Serial.h + * + * Functions, macros, variables, enums and types related to the setup of the USART for serial communications. + * + * @{ + */ + #ifndef __SERIAL_H__ #define __SERIAL_H__ @@ -113,3 +121,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/AT90USBXXX/Serial_Stream.h b/LUFA/Drivers/AT90USBXXX/Serial_Stream.h index adde5b95e5..d5034bb531 100644 --- a/LUFA/Drivers/AT90USBXXX/Serial_Stream.h +++ b/LUFA/Drivers/AT90USBXXX/Serial_Stream.h @@ -35,6 +35,15 @@ * USART. **/ +/** \ingroup Group_SubsystemDrivers + * @defgroup Group_SerialStream Serial Stream Driver - LUFA/Drivers/AT90USBXXX/Serial_Stream.h + * + * Functions, macros, variables, enums and types related to the setup of a serial stream, so that standard printf and other + * C stream functions can be used on the serial port. + * + * @{ + */ + #ifndef __SERIAL_STREAM_H__ #define __SERIAL_STREAM_H__ @@ -80,3 +89,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/ATAVRUSBRF01/HWB.h b/LUFA/Drivers/Board/ATAVRUSBRF01/HWB.h index edf4f8c50d..9d9982ba22 100644 --- a/LUFA/Drivers/Board/ATAVRUSBRF01/HWB.h +++ b/LUFA/Drivers/Board/ATAVRUSBRF01/HWB.h @@ -35,6 +35,12 @@ * \note This file should not be included directly. It is automatically included as needed by the HWB driver * dispatch header located in LUFA/Drivers/Board/HWB.h. */ + +/** \ingroup Group_HWB + * @defgroup Group_HWB_ATAVRUSBRF01 ATAVRUSBRF01 + * + * @{ + */ #ifndef __HWB_ATAVRUSBRF01_H__ #define __HWB_ATAVRUSBRF01_H__ @@ -77,3 +83,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/ATAVRUSBRF01/LEDs.h b/LUFA/Drivers/Board/ATAVRUSBRF01/LEDs.h index 626d8cecf3..a073d2ef55 100644 --- a/LUFA/Drivers/Board/ATAVRUSBRF01/LEDs.h +++ b/LUFA/Drivers/Board/ATAVRUSBRF01/LEDs.h @@ -36,6 +36,12 @@ * dispatch header located in LUFA/Drivers/Board/LEDs.h. */ +/** \ingroup Group_LEDs + * @defgroup Group_LEDs_ATAVRUSBRF01 ATAVRUSBRF01 + * + * @{ + */ + #ifndef __LEDS_ATAVRUSBRF01_H__ #define __LEDS_ATAVRUSBRF01_H__ @@ -118,3 +124,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/Dataflash.h b/LUFA/Drivers/Board/Dataflash.h index aa0c0892f1..4e61a6bce5 100644 --- a/LUFA/Drivers/Board/Dataflash.h +++ b/LUFA/Drivers/Board/Dataflash.h @@ -40,6 +40,14 @@ * directory. */ +/** \ingroup Group_BoardDrivers + * @defgroup Group_Dataflash Dataflash Driver - LUFA/Drivers/Board/Dataflash.h + * + * Functions, macros, variables, enums and types related to the control of board Dataflash ICs. + * + * @{ + */ + #ifndef __DATAFLASH_H__ #define __DATAFLASH_H__ @@ -59,21 +67,33 @@ #endif /* Public Interface - May be used in end-application: */ - /* Macros: */ - /** Returns the mask of the currently selected Dataflash chip, either DATAFLASH_NO_CHIP or a - * DATAFLASH_CHIPn mask (where n is the chip number). - */ - #define Dataflash_GetSelectedChip() (DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK) + /* Psuedo-Function Macros: */ + #if defined(__DOXYGEN__) + /** Determines the currently selected dataflash chip. + * + * \return Mask of the currently selected Dataflash chip, either DATAFLASH_NO_CHIP if no chip is selected + * or a DATAFLASH_CHIPn mask (where n is the chip number). + */ + static inline uint8_t Dataflash_GetSelectedChip(void); - /** Selects the dataflash chip given as a chip mask, in the form of DATAFLASH_CHIPn (where n - * is the chip number). - */ - #define Dataflash_SelectChip(mask) MACROS{ DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT \ - & ~DATAFLASH_CHIPCS_MASK) | mask); }MACROE + /** Selects the given dataflash chip. + * + * \param ChipMask Mask of the Dataflash IC to select, in the form of DATAFLASH_CHIPn mask (where n is + * the chip number). + */ + static inline void Dataflash_SelectChip(uint8_t ChipMask); + + /** Deselects the current dataflash chip, so that no dataflash is selected. */ + static inline void Dataflash_DeselectChip(void); + #else + #define Dataflash_GetSelectedChip() (DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK) + + #define Dataflash_SelectChip(mask) MACROS{ DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT \ + & ~DATAFLASH_CHIPCS_MASK) | mask); }MACROE + + #define Dataflash_DeselectChip() Dataflash_SelectChip(DATAFLASH_NO_CHIP) + #endif - /** Deselects the current dataflash chip, so that no dataflash is selected. */ - #define Dataflash_DeselectChip() Dataflash_SelectChip(DATAFLASH_NO_CHIP) - /* Inline Functions: */ /** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash. * @@ -182,3 +202,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/HWB.h b/LUFA/Drivers/Board/HWB.h index 6ad2fa821b..049fd2378d 100644 --- a/LUFA/Drivers/Board/HWB.h +++ b/LUFA/Drivers/Board/HWB.h @@ -39,7 +39,15 @@ * If the BOARD value is set to BOARD_USER, this will include the /Board/HWB.h file in the user project * directory. */ - + +/** \ingroup Group_BoardDrivers + * @defgroup Group_HWB HWB Driver - LUFA/Drivers/Board/HWB.h + * + * Functions, macros, variables, enums and types related to the control of board HWB. + * + * @{ + */ + #ifndef __HWB_H__ #define __HWB_H__ @@ -85,3 +93,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/Joystick.h b/LUFA/Drivers/Board/Joystick.h index a3f70b8a45..86a02cfe72 100644 --- a/LUFA/Drivers/Board/Joystick.h +++ b/LUFA/Drivers/Board/Joystick.h @@ -40,6 +40,14 @@ * directory. */ +/** \ingroup Group_BoardDrivers + * @defgroup Group_Joystick Joystick Driver - LUFA/Drivers/Board/Joystick.h + * + * Functions, macros, variables, enums and types related to the control of board joystick. + * + * @{ + */ + #ifndef __JOYSTICK_H__ #define __JOYSTICK_H__ @@ -83,3 +91,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/LEDs.h b/LUFA/Drivers/Board/LEDs.h index 03e0db5e84..c40042ddc9 100644 --- a/LUFA/Drivers/Board/LEDs.h +++ b/LUFA/Drivers/Board/LEDs.h @@ -39,7 +39,15 @@ * If the BOARD value is set to BOARD_USER, this will include the /Board/LEDs.h file in the user project * directory. */ - + +/** \ingroup Group_BoardDrivers + * @defgroup Group_LEDs LEDs Driver - LUFA/Drivers/Board/LEDs.h + * + * Functions, macros, variables, enums and types related to the control of board LEDs. + * + * @{ + */ + #ifndef __LEDS_H__ #define __LEDS_H__ @@ -111,3 +119,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/RZUSBSTICK/LEDs.h b/LUFA/Drivers/Board/RZUSBSTICK/LEDs.h index 38cbed0cff..24977ea5e5 100644 --- a/LUFA/Drivers/Board/RZUSBSTICK/LEDs.h +++ b/LUFA/Drivers/Board/RZUSBSTICK/LEDs.h @@ -35,6 +35,12 @@ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver * dispatch header located in LUFA/Drivers/Board/LEDs.h. */ + +/** \ingroup Group_LEDs + * @defgroup Group_LEDs_RZUSBSTICK RZUSBSTICK + * + * @{ + */ #ifndef __LEDS_RZUSBSTICK_H__ #define __LEDS_RZUSBSTICK_H__ @@ -139,3 +145,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/STK525/AT45DB321C.h b/LUFA/Drivers/Board/STK525/AT45DB321C.h index ac29967e6b..6879c10355 100644 --- a/LUFA/Drivers/Board/STK525/AT45DB321C.h +++ b/LUFA/Drivers/Board/STK525/AT45DB321C.h @@ -36,6 +36,12 @@ * dispatch header located in LUFA/Drivers/Board/Dataflash.h. */ +/** \ingroup Group_Dataflash_STK525 + * @defgroup Group_Dataflash_STK525_AT45DB321C AT45DB321C + * + * @{ + */ + #ifndef __DATAFLASH_CMDS_H__ #define __DATAFLASH_CMDS_H__ @@ -82,3 +88,5 @@ #define DF_CMD_READMANUFACTURERDEVICEINFO 0x9F #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/STK525/Dataflash.h b/LUFA/Drivers/Board/STK525/Dataflash.h index e4e2f52371..b2ea1b8e9e 100644 --- a/LUFA/Drivers/Board/STK525/Dataflash.h +++ b/LUFA/Drivers/Board/STK525/Dataflash.h @@ -36,6 +36,12 @@ * dispatch header located in LUFA/Drivers/Board/Dataflash.h. */ +/** \ingroup Group_Dataflash + * @defgroup Group_Dataflash_STK525 STK525 + * + * @{ + */ + #ifndef __DATAFLASH_STK525_H__ #define __DATAFLASH_STK525_H__ @@ -106,3 +112,5 @@ } #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/STK525/HWB.h b/LUFA/Drivers/Board/STK525/HWB.h index a0ff72de13..a91890cd35 100644 --- a/LUFA/Drivers/Board/STK525/HWB.h +++ b/LUFA/Drivers/Board/STK525/HWB.h @@ -35,7 +35,13 @@ * \note This file should not be included directly. It is automatically included as needed by the HWB driver * dispatch header located in LUFA/Drivers/Board/HWB.h. */ - + +/** \ingroup Group_HWB + * @defgroup Group_HWB_STK525 STK525 + * + * @{ + */ + #ifndef __HWB_STK525_H__ #define __HWB_STK525_H__ @@ -77,3 +83,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/STK525/Joystick.h b/LUFA/Drivers/Board/STK525/Joystick.h index 58aed4f80d..b74655ecae 100644 --- a/LUFA/Drivers/Board/STK525/Joystick.h +++ b/LUFA/Drivers/Board/STK525/Joystick.h @@ -36,6 +36,12 @@ * dispatch header located in LUFA/Drivers/Board/Joystick.h. */ +/** \ingroup Group_Joystick + * @defgroup Group_Joystick_STK525 STK525 + * + * @{ + */ + #ifndef __JOYSTICK_STK525_H__ #define __JOYSTICK_STK525_H__ @@ -102,3 +108,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/STK525/LEDs.h b/LUFA/Drivers/Board/STK525/LEDs.h index 13f626c2b0..a769f16d08 100644 --- a/LUFA/Drivers/Board/STK525/LEDs.h +++ b/LUFA/Drivers/Board/STK525/LEDs.h @@ -35,6 +35,12 @@ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver * dispatch header located in LUFA/Drivers/Board/LEDs.h. */ + +/** \ingroup Group_LEDs + * @defgroup Group_LEDs_STK525 STK525 + * + * @{ + */ #ifndef __LEDS_STK525_H__ #define __LEDS_STK525_H__ @@ -115,3 +121,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/STK526/AT45DB642D.h b/LUFA/Drivers/Board/STK526/AT45DB642D.h index dd38ed1dfe..d6974659fc 100644 --- a/LUFA/Drivers/Board/STK526/AT45DB642D.h +++ b/LUFA/Drivers/Board/STK526/AT45DB642D.h @@ -36,6 +36,12 @@ * dispatch header located in LUFA/Drivers/Board/Dataflash.h. */ +/** \ingroup Group_Dataflash_STK526 + * @defgroup Group_Dataflash_STK526_AT45DB642D AT45DB642D + * + * @{ + */ + #ifndef __DATAFLASH_CMDS_H__ #define __DATAFLASH_CMDS_H__ @@ -92,3 +98,5 @@ #define DF_CMD_READMANUFACTURERDEVICEINFO 0x9F #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/STK526/Dataflash.h b/LUFA/Drivers/Board/STK526/Dataflash.h index 443c1a754d..65c5e202cd 100644 --- a/LUFA/Drivers/Board/STK526/Dataflash.h +++ b/LUFA/Drivers/Board/STK526/Dataflash.h @@ -36,6 +36,12 @@ * dispatch header located in LUFA/Drivers/Board/Dataflash.h. */ +/** \ingroup Group_Dataflash + * @defgroup Group_Dataflash_STK526 STK526 + * + * @{ + */ + #ifndef __DATAFLASH_STK526_H__ #define __DATAFLASH_STK526_H__ @@ -106,3 +112,5 @@ } #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/STK526/HWB.h b/LUFA/Drivers/Board/STK526/HWB.h index 3bd2f9952f..0d4fd7e03d 100644 --- a/LUFA/Drivers/Board/STK526/HWB.h +++ b/LUFA/Drivers/Board/STK526/HWB.h @@ -35,7 +35,13 @@ * \note This file should not be included directly. It is automatically included as needed by the HWB driver * dispatch header located in LUFA/Drivers/Board/HWB.h. */ - + +/** \ingroup Group_HWB + * @defgroup Group_HWB_STK526 STK526 + * + * @{ + */ + #ifndef __HWB_STK526_H__ #define __HWB_STK526_H__ @@ -77,3 +83,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/STK526/Joystick.h b/LUFA/Drivers/Board/STK526/Joystick.h index e5cd2e47c6..c15b21284c 100644 --- a/LUFA/Drivers/Board/STK526/Joystick.h +++ b/LUFA/Drivers/Board/STK526/Joystick.h @@ -35,6 +35,12 @@ * \note This file should not be included directly. It is automatically included as needed by the joystick driver * dispatch header located in LUFA/Drivers/Board/Joystick.h. */ + +/** \ingroup Group_Joystick + * @defgroup Group_Joystick_STK526 STK526 + * + * @{ + */ #ifndef __JOYSTICK_STK526_H__ #define __JOYSTICK_STK526_H__ @@ -99,3 +105,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/STK526/LEDs.h b/LUFA/Drivers/Board/STK526/LEDs.h index fc88a57339..6b17ab1c8c 100644 --- a/LUFA/Drivers/Board/STK526/LEDs.h +++ b/LUFA/Drivers/Board/STK526/LEDs.h @@ -35,6 +35,12 @@ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver * dispatch header located in LUFA/Drivers/Board/LEDs.h. */ + +/** \ingroup Group_LEDs + * @defgroup Group_LEDs_STK526 STK526 + * + * @{ + */ #ifndef __LEDS_STK526_H__ #define __LEDS_STK526_H__ @@ -115,3 +121,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/Temperature.h b/LUFA/Drivers/Board/Temperature.h index 17b8acfe15..6e1827edd0 100644 --- a/LUFA/Drivers/Board/Temperature.h +++ b/LUFA/Drivers/Board/Temperature.h @@ -33,6 +33,14 @@ * Temperature sensor board driver for the USB boards which contain a temperature sensor. */ +/** \ingroup Group_BoardDrivers + * @defgroup Group_Temperature Temperature Driver - LUFA/Drivers/Board/Temperature.h + * + * Functions, macros, variables, enums and types related to the control of board temperature sensors. + * + * @{ + */ + #ifndef __TEMPERATURE_H__ #define __TEMPERATURE_H__ @@ -68,14 +76,19 @@ /** Maximum returnable temperature from the Temperature_GetTemperature() function. */ #define TEMP_MAX_TEMP ((TEMP_TABLE_SIZE - 1) + TEMP_TABLE_OFFSET) - - /** Initializes the temperature sensor driver, including setting up the appropriate ADC channel. - * This must be called before any other temperature sensor routines. - * - * The ADC itself (not the ADC channel) must be configured separately before calling the temperature - * sensor functions. - */ - #define Temperature_Init() ADC_SetupChannel(TEMP_ADC_CHANNEL); + + /* Psuedo-Functions: */ + #if defined(__DOXYGEN__) + /** Initializes the temperature sensor driver, including setting up the appropriate ADC channel. + * This must be called before any other temperature sensor routines. + * + * The ADC itself (not the ADC channel) must be configured separately before calling the temperature + * sensor functions. + */ + static inline void Temperature_Init(void); + #else + #define Temperature_Init() ADC_SetupChannel(TEMP_ADC_CHANNEL); + #endif /* Function Prototypes: */ /** Performs a complete ADC on the temperature sensor channel, and converts the result into a @@ -98,3 +111,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/USBKEY/AT45DB642D.h b/LUFA/Drivers/Board/USBKEY/AT45DB642D.h index 197be1c618..672dd7c3d7 100644 --- a/LUFA/Drivers/Board/USBKEY/AT45DB642D.h +++ b/LUFA/Drivers/Board/USBKEY/AT45DB642D.h @@ -36,6 +36,12 @@ * dispatch header located in LUFA/Drivers/Board/Dataflash.h. */ +/** \ingroup Group_Dataflash_USBKEY + * @defgroup Group_Dataflash_USBKEY_AT45DB642D AT45DB642D + * + * @{ + */ + #ifndef __DATAFLASH_CMDS_H__ #define __DATAFLASH_CMDS_H__ @@ -92,3 +98,5 @@ #define DF_CMD_READMANUFACTURERDEVICEINFO 0x9F #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/USBKEY/Dataflash.h b/LUFA/Drivers/Board/USBKEY/Dataflash.h index 2b3956f04d..cae62fd490 100644 --- a/LUFA/Drivers/Board/USBKEY/Dataflash.h +++ b/LUFA/Drivers/Board/USBKEY/Dataflash.h @@ -36,6 +36,12 @@ * dispatch header located in LUFA/Drivers/Board/Dataflash.h. */ +/** \ingroup Group_Dataflash + * @defgroup Group_Dataflash_USBKEY USBKEY + * + * @{ + */ + #ifndef __DATAFLASH_USBKEY_H__ #define __DATAFLASH_USBKEY_H__ @@ -114,3 +120,5 @@ } #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/USBKEY/HWB.h b/LUFA/Drivers/Board/USBKEY/HWB.h index 750368b19a..bfbaa4940c 100644 --- a/LUFA/Drivers/Board/USBKEY/HWB.h +++ b/LUFA/Drivers/Board/USBKEY/HWB.h @@ -35,7 +35,13 @@ * \note This file should not be included directly. It is automatically included as needed by the HWB driver * dispatch header located in LUFA/Drivers/Board/HWB.h. */ - + +/** \ingroup Group_HWB + * @defgroup Group_HWB_USBKEY USBKEY + * + * @{ + */ + #ifndef __HWB_USBKEY_H__ #define __HWB_USBKEY_H__ @@ -77,3 +83,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/USBKEY/Joystick.h b/LUFA/Drivers/Board/USBKEY/Joystick.h index 6c2d72aee5..332dd56a30 100644 --- a/LUFA/Drivers/Board/USBKEY/Joystick.h +++ b/LUFA/Drivers/Board/USBKEY/Joystick.h @@ -35,7 +35,13 @@ * \note This file should not be included directly. It is automatically included as needed by the joystick driver * dispatch header located in LUFA/Drivers/Board/Joystick.h. */ - + +/** \ingroup Group_Joystick + * @defgroup Group_Joystick_USBKEY USBKEY + * + * @{ + */ + #ifndef __JOYSTICK_USBKEY_H__ #define __JOYSTICK_USBKEY_H__ @@ -102,3 +108,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Board/USBKEY/LEDs.h b/LUFA/Drivers/Board/USBKEY/LEDs.h index 07a2b7501a..68df3172f4 100644 --- a/LUFA/Drivers/Board/USBKEY/LEDs.h +++ b/LUFA/Drivers/Board/USBKEY/LEDs.h @@ -36,6 +36,12 @@ * dispatch header located in LUFA/Drivers/Board/LEDs.h. */ +/** \ingroup Group_LEDs + * @defgroup Group_LEDs_USBKEY USBKEY + * + * @{ + */ + #ifndef __LEDS_USBKEY_H__ #define __LEDS_USBKEY_H__ @@ -115,3 +121,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/Misc/TerminalCodes.h b/LUFA/Drivers/Misc/TerminalCodes.h index d6e58708a8..1206ade267 100644 --- a/LUFA/Drivers/Misc/TerminalCodes.h +++ b/LUFA/Drivers/Misc/TerminalCodes.h @@ -43,6 +43,14 @@ * \endcode */ +/** \ingroup Group_MiscDrivers + * @defgroup Group_Terminal ANSI Terminal Escape Codes - LUFA/Drivers/Misc/TerminalCodes.h + * + * Escape code macros for ANSI compliant text terminals. + * + * @{ + */ + #ifndef __TERMINALCODES_H__ #define __TERMINALCODES_H__ @@ -174,3 +182,5 @@ #define ESC_ERASE_LINE ANSI_ESCAPE_SEQUENCE("K") #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/Class/ConfigDescriptor.h b/LUFA/Drivers/USB/Class/ConfigDescriptor.h index bd92b51f3a..d5fcbb0bb0 100644 --- a/LUFA/Drivers/USB/Class/ConfigDescriptor.h +++ b/LUFA/Drivers/USB/Class/ConfigDescriptor.h @@ -35,6 +35,14 @@ * and other descriptor data can be extracted and used as needed. */ +/** \ingroup Group_Descriptors + * @defgroup Group_ConfigDescriptorParser Configuration Descriptor Parser + * + * Functions, macros, variables, enums and types related to the parsing of Configuration Descriptors. + * + * @{ + */ + #ifndef __CONFIGDESCRIPTOR_H__ #define __CONFIGDESCRIPTOR_H__ @@ -109,7 +117,7 @@ * for certain descriptors matching unique criteria. * * Comparator routines are passed in a single pointer named CurrentDescriptor, and should return a value - * of a member of the DSEARCH_Return_ErrorCodes_t enum. + * of a member of the DSearch_Return_ErrorCodes_t enum. */ #define DESCRIPTOR_COMPARATOR(name) uint8_t DCOMP_##name (void* const CurrentDescriptor) @@ -124,7 +132,7 @@ * \param DPos Pointer to the current position in the configuration descriptor * \param DSearch Name of the comparator search function to use on the configuration descriptor * - * \return Value of one of the members of the DSEARCH_Comp_Return_ErrorCodes_t enum + * \return Value of one of the members of the DSearch_Comp_Return_ErrorCodes_t enum * * Usage Example: * \code @@ -151,7 +159,7 @@ USB_Host_GetNextDescriptorComp_P(DSize, DPos, DCOMP_##DSearch) /* Enums: */ /** Enum for return values of a descriptor comparator made with DESCRIPTOR_COMPARATOR. */ - enum DSEARCH_Return_ErrorCodes_t + enum DSearch_Return_ErrorCodes_t { Descriptor_Search_Found = 0, /**< Current descriptor matches comparator criteria. */ Descriptor_Search_Fail = 1, /**< No further descriptor could possibly match criteria, fail the search. */ @@ -159,7 +167,7 @@ }; /** Enum for return values of USB_Host_GetNextDescriptorComp() */ - enum DSEARCH_Comp_Return_ErrorCodes_t + enum DSearch_Comp_Return_ErrorCodes_t { Descriptor_Search_Comp_Found = 0, /**< Configuration descriptor now points to descriptor which matches * search criteria of the given comparator function. */ @@ -259,5 +267,7 @@ #if defined(__cplusplus) } #endif - + #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/Class/HIDParser.h b/LUFA/Drivers/USB/Class/HIDParser.h index 47a678b9bc..ad242fe565 100644 --- a/LUFA/Drivers/USB/Class/HIDParser.h +++ b/LUFA/Drivers/USB/Class/HIDParser.h @@ -44,6 +44,14 @@ * HID_INCLUDE_CONSTANT_DATA_ITEMS tokens in the user project makefile, passing them to the compiler via the -D * switch. */ + +/** \ingroup Group_USB + * @defgroup Group_HIDParser HID Report Parser + * + * Functions, macros, variables, enums and types related to the parsing of HID class device report descriptors. + * + * @{ + */ #ifndef __HIDPARSER_H__ #define __HIDPARSER_H__ @@ -250,3 +258,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/Class/HIDReportData.h b/LUFA/Drivers/USB/Class/HIDReportData.h index b1468a31a6..eee38be04d 100644 --- a/LUFA/Drivers/USB/Class/HIDReportData.h +++ b/LUFA/Drivers/USB/Class/HIDReportData.h @@ -34,6 +34,14 @@ * flag's meaning when applied to an IN, OUT or FEATURE item. */ +/** \ingroup Group_HIDParser + * @defgroup Group_HIDIOFConst Input/Output/Feature Masks + * + * Masks indicating the type of Input, Output of Feature HID report item. + * + * @{ + */ + #ifndef __HIDREPORTDATA_H__ #define __HIDREPORTDATA_H__ @@ -126,5 +134,7 @@ #define TAG_LOCAL_USAGEMIN 0x10 #define TAG_LOCAL_USAGEMAX 0x20 #endif + +/** @} */ #endif diff --git a/LUFA/Drivers/USB/HighLevel/Events.h b/LUFA/Drivers/USB/HighLevel/Events.h index c9882cfc06..480e824a78 100644 --- a/LUFA/Drivers/USB/HighLevel/Events.h +++ b/LUFA/Drivers/USB/HighLevel/Events.h @@ -39,6 +39,14 @@ * * Each event must only have one associated event handler, but can be raised by multiple sources. */ + +/** \ingroup Group_USB + * @defgroup Group_Events USB Events + * + * Functions, macros, variables, enums and types related to the management of events from the USB kernel. + * + * @{ + */ #ifndef __USBEVENTS_H__ #define __USBEVENTS_H__ @@ -436,5 +444,7 @@ #if defined(__cplusplus) } #endif - + #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h index d628363219..a1a051824b 100644 --- a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h +++ b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h @@ -44,6 +44,14 @@ * named counterparts, thus they can be correlated easily with the official USB specification. */ +/** \ingroup Group_USB + * @defgroup Group_Descriptors USB Descriptors + * + * Functions, macros, variables, enums and types related to standard USB descriptors. + * + * @{ + */ + #ifndef __USBDESCRIPTORS_H__ #define __USBDESCRIPTORS_H__ @@ -472,12 +480,6 @@ int16_t bString[]; #endif } USB_Descriptor_String_t; - - typedef struct - { - uint16_t Size; - void* Address; - } USB_Descriptor_Details_t; /* Function Prototypes: */ /** Function to retrieve a given descriptor's size and memory location from the given descriptor type value, @@ -519,5 +521,7 @@ #if defined(__cplusplus) } #endif - + #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/HighLevel/StdRequestType.h b/LUFA/Drivers/USB/HighLevel/StdRequestType.h index 423de6d9c9..bf9ef8aeea 100644 --- a/LUFA/Drivers/USB/HighLevel/StdRequestType.h +++ b/LUFA/Drivers/USB/HighLevel/StdRequestType.h @@ -34,6 +34,14 @@ * direction, request recipient, etc.) can be extracted via masking. */ +/** \ingroup Group_USB + * @defgroup Group_StdRequest Standard USB Requests + * + * Functions, macros, variables, enums and types related to standard USB requests to USB devices. + * + * @{ + */ + #ifndef __STDREQTYPE_H__ #define __STDREQTYPE_H__ @@ -181,11 +189,13 @@ * device mode. */ }; -/* Private Interface - For use in library only: */ - #if !defined(__DOXYGEN__) - /* Macros: */ - #define FEATURE_SELFPOWERED_ENABLED (1 << 0) - #define FEATURE_REMOTE_WAKEUP_ENABLED (1 << 1) - #endif - + /* Private Interface - For use in library only: */ + #if !defined(__DOXYGEN__) + /* Macros: */ + #define FEATURE_SELFPOWERED_ENABLED (1 << 0) + #define FEATURE_REMOTE_WAKEUP_ENABLED (1 << 1) + #endif + #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/HighLevel/StreamCallbacks.h b/LUFA/Drivers/USB/HighLevel/StreamCallbacks.h index 5c2dad6379..300a3f217e 100644 --- a/LUFA/Drivers/USB/HighLevel/StreamCallbacks.h +++ b/LUFA/Drivers/USB/HighLevel/StreamCallbacks.h @@ -35,6 +35,14 @@ * stream read/write process. */ +/** \ingroup Group_USB + * @defgroup Group_StreamCallbacks Endpoint and Pipe Stream Callbacks + * + * Functions, macros, variables, enums and types related to endpoint and pipe stream callback functions. + * + * @{ + */ + #ifndef __STREAMCALLBACK_H__ #define __STREAMCALLBACK_H__ @@ -85,3 +93,5 @@ }; #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/HighLevel/USBInterrupt.h b/LUFA/Drivers/USB/HighLevel/USBInterrupt.h index d54de39205..65e0b5fb17 100644 --- a/LUFA/Drivers/USB/HighLevel/USBInterrupt.h +++ b/LUFA/Drivers/USB/HighLevel/USBInterrupt.h @@ -34,6 +34,14 @@ * events as VBUS interrupts (on supported USB AVR models), device connections and disconnections, etc. */ +/** \ingroup Group_USB + * @defgroup Group_USBInterrupt Endpoint and Pipe Interrupts + * + * Functions, macros, variables, enums and types related to endpoint and pipe interrupts. + * + * @{ + */ + #ifndef __USBINTERRUPT_H__ #define __USBINTERRUPT_H__ @@ -220,5 +228,7 @@ #if defined(__cplusplus) } #endif - + #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/HighLevel/USBTask.c b/LUFA/Drivers/USB/HighLevel/USBTask.c index e62ac687fc..80731ac194 100644 --- a/LUFA/Drivers/USB/HighLevel/USBTask.c +++ b/LUFA/Drivers/USB/HighLevel/USBTask.c @@ -64,7 +64,7 @@ static void USB_DeviceTask(void) Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - if (Endpoint_IsSetupReceived()) + if (Endpoint_IsSETUPReceived()) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { diff --git a/LUFA/Drivers/USB/HighLevel/USBTask.h b/LUFA/Drivers/USB/HighLevel/USBTask.h index e0ca8ede82..bcf117ddb4 100644 --- a/LUFA/Drivers/USB/HighLevel/USBTask.h +++ b/LUFA/Drivers/USB/HighLevel/USBTask.h @@ -73,6 +73,8 @@ * needs to be determined, VBUS should be routed to an external pin, and the auto-detect behaviour turned off by * passing the NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection * and disconnection events may be manually fired by RAISE_EVENT(), and the USB_IsConnected global changed manually. + * + * \ingroup Group_USBManagement */ extern volatile bool USB_IsConnected; @@ -81,6 +83,8 @@ * * \note This variable should be treated as read-only in the user application, and never manually * changed in value. + * + * \ingroup Group_USBManagement */ extern volatile bool USB_IsInitialized; @@ -94,6 +98,8 @@ * * \note This variable should be treated as read-only in the user application, and never manually * changed in value. + * + * \ingroup Group_Device */ extern volatile bool USB_IsSuspended; #endif @@ -107,6 +113,8 @@ * by the library. * * \note This global is only present if the user application can be a USB host. + * + * \ingroup Group_Host */ extern volatile uint8_t USB_HostState; #endif @@ -173,6 +181,8 @@ * event and disabled again on the firing of the USB_DeviceUnattached event. * * \see Events.h for more information on the USB events. + * + * \ingroup Group_USBManagement */ TASK(USB_USBTask); diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.c b/LUFA/Drivers/USB/LowLevel/DevChapter9.c index 765627b151..19d72983b6 100644 --- a/LUFA/Drivers/USB/LowLevel/DevChapter9.c +++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.c @@ -105,10 +105,10 @@ void USB_Device_ProcessControlPacket(void) if (!(RequestHandled)) RAISE_EVENT(USB_UnhandledControlPacket, bRequest, bmRequestType); - if (Endpoint_IsSetupReceived()) + if (Endpoint_IsSETUPReceived()) { Endpoint_StallTransaction(); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); } } @@ -116,13 +116,13 @@ static void USB_Device_SetAddress(void) { uint8_t wValue_LSB = Endpoint_Read_Byte(); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); - while (!(Endpoint_IsSetupINReady())); + while (!(Endpoint_IsINReady())); - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); - while (!(Endpoint_IsSetupINReady())); + while (!(Endpoint_IsINReady())); UDADDR = ((1 << ADDEN) | (wValue_LSB & 0x7F)); @@ -152,11 +152,11 @@ static void USB_Device_SetConfiguration(void) return; } - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); USB_ConfigurationNumber = wValue_LSB; - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); if (!(AlreadyConfigured) && USB_ConfigurationNumber) RAISE_EVENT(USB_DeviceEnumerationComplete); @@ -166,14 +166,14 @@ static void USB_Device_SetConfiguration(void) void USB_Device_GetConfiguration(void) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); Endpoint_Write_Byte(USB_ConfigurationNumber); - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); } static void USB_Device_GetDescriptor(void) @@ -190,18 +190,18 @@ static void USB_Device_GetDescriptor(void) if ((DescriptorSize = USB_GetDescriptor(wValue, wIndex, &DescriptorPointer)) == NO_DESCRIPTOR) return; - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); if (wLength > DescriptorSize) wLength = DescriptorSize; while (wLength) { - while (!(Endpoint_IsSetupINReady())) + while (!(Endpoint_IsINReady())) { - if (Endpoint_IsSetupOUTReceived()) + if (Endpoint_IsOUTReceived()) { - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); return; } } @@ -220,17 +220,17 @@ static void USB_Device_GetDescriptor(void) } SendZLP = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize); - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); } if (SendZLP) { - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); } static void USB_Device_GetStatus(const uint8_t bmRequestType) @@ -264,13 +264,14 @@ static void USB_Device_GetStatus(const uint8_t bmRequestType) } Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); + Endpoint_Write_Word_LE(CurrentStatus); - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); } #if !defined(FEATURELESS_CONTROL_ONLY_DEVICE) @@ -305,8 +306,8 @@ static void USB_Device_ClearSetFeature(const uint8_t bRequest, const uint8_t bmR } Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); - Endpoint_ClearSetupReceived(); - Endpoint_ClearSetupIN(); + Endpoint_ClearControlSETUP(); + Endpoint_ClearControlIN(); } } diff --git a/LUFA/Drivers/USB/LowLevel/DevChapter9.h b/LUFA/Drivers/USB/LowLevel/DevChapter9.h index 2b425e7e62..6571659c1f 100644 --- a/LUFA/Drivers/USB/LowLevel/DevChapter9.h +++ b/LUFA/Drivers/USB/LowLevel/DevChapter9.h @@ -66,6 +66,8 @@ * * \note This variable should be treated as read-only in the user application, and never manually * changed in value. + * + * \ingroup Group_Device */ extern uint8_t USB_ConfigurationNumber; @@ -74,12 +76,16 @@ * * \note This variable should be treated as read-only in the user application, and never manually * changed in value. + * + * \ingroup Group_Device */ extern bool USB_RemoteWakeupEnabled; /** Indicates if the device is currently being powered by its own power supply, rather than being * powered by the host's USB supply. This flag should remain cleared if the device does not * support self powered mode, as indicated in the device descriptors. + * + * \ingroup Group_Device */ extern bool USB_CurrentlySelfPowered; diff --git a/LUFA/Drivers/USB/LowLevel/Device.h b/LUFA/Drivers/USB/LowLevel/Device.h index c6e5f7f5a6..8a2ee00c33 100644 --- a/LUFA/Drivers/USB/LowLevel/Device.h +++ b/LUFA/Drivers/USB/LowLevel/Device.h @@ -33,6 +33,14 @@ * USB Device mode related macros and enums. This module contains macros and enums which are used when * the USB controller is initialized in device mode. */ + +/** \ingroup Group_USB + * @defgroup Group_Device Device Management + * + * Functions, macros, variables, enums and types related to the management of a USB device when in Device mode. + * + * @{ + */ #ifndef __USBDEVICE_H__ #define __USBDEVICE_H__ @@ -64,42 +72,52 @@ */ #define USB_DEVICE_OPT_FULLSPEED (0 << 0) - /** Sends a Remote Wakeup request to the host. This signals to the host that the device should - * be taken out of suspended mode, and communications should resume. - * - * Typically, this is implemented so that HID devices (mice, keyboards, etc.) can wake up the - * host computer when the host has suspended all USB devices to enter a low power state. - * - * \note This macro should only be used if the device has indicated to the host that it - * supports the Remote Wakeup feature in the device descriptors, and should only be - * issued if the host is currently allowing remote wakeup events from the device (i.e., - * the USB_RemoteWakeupEnabled flag is set, see DevChapter9.h documentation). - * - * \see StdDescriptors.h for more information on the RMWAKEUP feature and device descriptors. - */ - #define USB_Device_SendRemoteWakeup() MACROS{ UDCON |= (1 << RMWKUP); }MACROE + /* Psuedo-Function Macros: */ + #if defined(__DOXYGEN__) + /** Sends a Remote Wakeup request to the host. This signals to the host that the device should + * be taken out of suspended mode, and communications should resume. + * + * Typically, this is implemented so that HID devices (mice, keyboards, etc.) can wake up the + * host computer when the host has suspended all USB devices to enter a low power state. + * + * \note This macro should only be used if the device has indicated to the host that it + * supports the Remote Wakeup feature in the device descriptors, and should only be + * issued if the host is currently allowing remote wakeup events from the device (i.e., + * the USB_RemoteWakeupEnabled flag is set, see DevChapter9.h documentation). + * + * \see StdDescriptors.h for more information on the RMWAKEUP feature and device descriptors. + */ + static inline void USB_Device_SendRemoteWakeup(void); + + /** Indicates if a Remote Wakeup request is being sent to the host. This returns true if a + * remote wakeup is currently being sent, false otherwise. + * + * This can be used in conjunction with the USB_Device_IsUSBSuspended() macro to determine if + * a sent RMWAKEUP request was accepted or rejected by the host. + * + * \note This macro should only be used if the device has indicated to the host that it + * supports the Remote Wakeup feature in the device descriptors. + * + * \see StdDescriptors.h for more information on the RMWAKEUP feature and device descriptors. + * + * \return Boolean true if no Remote Wakeup request is currently being sent, false otherwise + */ + static inline bool USB_Device_IsRemoteWakeupSent(void); + + /** Indicates if the device is currently suspended by the host. While suspended, the device is + * to enter a low power state until resumed by the host. While suspended no USB traffic to or + * from the device can occur (except for Remote Wakeup requests). + * + * \return Boolean true if the USB communications have been suspended by the host, false otherwise. + */ + static inline bool USB_Device_IsUSBSuspended(void); + #else + #define USB_Device_SendRemoteWakeup() MACROS{ UDCON |= (1 << RMWKUP); }MACROE - /** Indicates if a Remote Wakeup request is being sent to the host. This returns true if a - * remote wakeup is currently being sent, false otherwise. - * - * This can be used in conjunction with the USB_Device_IsUSBSuspended() macro to determine if - * a sent RMWAKEUP request was accepted or rejected by the host. - * - * \note This macro should only be used if the device has indicated to the host that it - * supports the Remote Wakeup feature in the device descriptors. - * - * \see StdDescriptors.h for more information on the RMWAKEUP feature and device descriptors. - */ - #define USB_Device_IsRemoteWakeupSent() ((UDCON & (1 << RMWKUP)) ? false : true) + #define USB_Device_IsRemoteWakeupSent() ((UDCON & (1 << RMWKUP)) ? false : true) - /** Indicates if the device is currently suspended by the host. While suspended, the device is - * to enter a low power state until resumed by the host. While suspended no USB traffic to or - * from the device can occur (except for Remote Wakeup requests). - * - * This macro returns true if the USB communications have been suspended by the host, false - * otherwise. - */ - #define USB_Device_IsUSBSuspended() ((UDINT & (1 << SUSPI)) ? true : false) + #define USB_Device_IsUSBSuspended() ((UDINT & (1 << SUSPI)) ? true : false) + #endif /* Enums: */ /** Enum for the ErrorCode parameter of the USB_DeviceError event. @@ -122,5 +140,7 @@ #define USB_Device_SetLowSpeed() MACROS{ UDCON |= (1 << LSM); }MACROE #define USB_Device_SetHighSpeed() MACROS{ UDCON &= ~(1 << LSM); }MACROE #endif - + #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.c b/LUFA/Drivers/USB/LowLevel/Endpoint.c index aa18358c8e..b88547177c 100644 --- a/LUFA/Drivers/USB/LowLevel/Endpoint.c +++ b/LUFA/Drivers/USB/LowLevel/Endpoint.c @@ -88,8 +88,19 @@ uint8_t Endpoint_WaitUntilReady(void) USB_INT_Clear(USB_INT_SOFI); - while (!(Endpoint_ReadWriteAllowed())) + for (;;) { + if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) + { + if (Endpoint_IsINReady()) + return ENDPOINT_READYWAIT_NoError; + } + else + { + if (Endpoint_IsOUTReceived()) + return ENDPOINT_READYWAIT_NoError; + } + if (!(USB_IsConnected)) return ENDPOINT_READYWAIT_DeviceDisconnected; else if (Endpoint_IsStalled()) @@ -103,8 +114,6 @@ uint8_t Endpoint_WaitUntilReady(void) return ENDPOINT_READYWAIT_Timeout; } } - - return ENDPOINT_READYWAIT_NoError; } uint8_t Endpoint_Discard_Stream(uint16_t Length @@ -120,9 +129,9 @@ uint8_t Endpoint_Discard_Stream(uint16_t Length while (Length--) { - if (!(Endpoint_ReadWriteAllowed())) + if (!(Endpoint_IsReadWriteAllowed())) { - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) @@ -132,8 +141,10 @@ uint8_t Endpoint_Discard_Stream(uint16_t Length if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; } - - Endpoint_Discard_Byte(); + else + { + Endpoint_Discard_Byte(); + } } return ENDPOINT_RWSTREAM_ERROR_NoError; @@ -153,9 +164,9 @@ uint8_t Endpoint_Write_Stream_LE(const void* Buffer, uint16_t Length while (Length--) { - if (!(Endpoint_ReadWriteAllowed())) + if (!(Endpoint_IsReadWriteAllowed())) { - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) @@ -165,8 +176,10 @@ uint8_t Endpoint_Write_Stream_LE(const void* Buffer, uint16_t Length if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; } - - Endpoint_Write_Byte(*(DataStream++)); + else + { + Endpoint_Write_Byte(*(DataStream++)); + } } return ENDPOINT_RWSTREAM_ERROR_NoError; @@ -186,9 +199,9 @@ uint8_t Endpoint_Write_Stream_BE(const void* Buffer, uint16_t Length while (Length--) { - if (!(Endpoint_ReadWriteAllowed())) + if (!(Endpoint_IsReadWriteAllowed())) { - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) @@ -198,8 +211,10 @@ uint8_t Endpoint_Write_Stream_BE(const void* Buffer, uint16_t Length if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; } - - Endpoint_Write_Byte(*(DataStream--)); + else + { + Endpoint_Write_Byte(*(DataStream--)); + } } return ENDPOINT_RWSTREAM_ERROR_NoError; @@ -219,9 +234,9 @@ uint8_t Endpoint_Read_Stream_LE(void* Buffer, uint16_t Length while (Length--) { - if (!(Endpoint_ReadWriteAllowed())) + if (!(Endpoint_IsReadWriteAllowed())) { - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) @@ -231,8 +246,10 @@ uint8_t Endpoint_Read_Stream_LE(void* Buffer, uint16_t Length if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; } - - *(DataStream++) = Endpoint_Read_Byte(); + else + { + *(DataStream++) = Endpoint_Read_Byte(); + } } return ENDPOINT_RWSTREAM_ERROR_NoError; @@ -252,9 +269,9 @@ uint8_t Endpoint_Read_Stream_BE(void* Buffer, uint16_t Length while (Length--) { - if (!(Endpoint_ReadWriteAllowed())) + if (!(Endpoint_IsReadWriteAllowed())) { - Endpoint_ClearCurrentBank(); + Endpoint_ClearOUT(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) @@ -264,8 +281,10 @@ uint8_t Endpoint_Read_Stream_BE(void* Buffer, uint16_t Length if ((ErrorCode = Endpoint_WaitUntilReady())) return ErrorCode; } - - *(DataStream--) = Endpoint_Read_Byte(); + else + { + *(DataStream--) = Endpoint_Read_Byte(); + } } return ENDPOINT_RWSTREAM_ERROR_NoError; @@ -276,9 +295,9 @@ uint8_t Endpoint_Write_Control_Stream_LE(const void* Buffer, uint16_t Length) uint8_t* DataStream = (uint8_t*)Buffer; bool SendZLP = true; - while (Length && !(Endpoint_IsSetupOUTReceived())) + while (Length && !(Endpoint_IsOUTReceived())) { - while (!(Endpoint_IsSetupINReady())); + while (!(Endpoint_IsINReady())); while (Length && (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize)) { @@ -288,19 +307,19 @@ uint8_t Endpoint_Write_Control_Stream_LE(const void* Buffer, uint16_t Length) } SendZLP = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize); - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); } - if (Endpoint_IsSetupOUTReceived()) + if (Endpoint_IsOUTReceived()) return ENDPOINT_RWCSTREAM_ERROR_HostAborted; if (SendZLP) { - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } - while (!(Endpoint_IsSetupOUTReceived())); + while (!(Endpoint_IsOUTReceived())); return ENDPOINT_RWCSTREAM_ERROR_NoError; } @@ -310,9 +329,9 @@ uint8_t Endpoint_Write_Control_Stream_BE(const void* Buffer, uint16_t Length) uint8_t* DataStream = (uint8_t*)(Buffer + Length - 1); bool SendZLP = true; - while (Length && !(Endpoint_IsSetupOUTReceived())) + while (Length && !(Endpoint_IsOUTReceived())) { - while (!(Endpoint_IsSetupINReady())); + while (!(Endpoint_IsINReady())); while (Length && (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize)) { @@ -322,19 +341,19 @@ uint8_t Endpoint_Write_Control_Stream_BE(const void* Buffer, uint16_t Length) } SendZLP = (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize); - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); } - if (Endpoint_IsSetupOUTReceived()) + if (Endpoint_IsOUTReceived()) return ENDPOINT_RWCSTREAM_ERROR_HostAborted; if (SendZLP) { - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } - while (!(Endpoint_IsSetupOUTReceived())); + while (!(Endpoint_IsOUTReceived())); return ENDPOINT_RWCSTREAM_ERROR_NoError; } @@ -345,7 +364,7 @@ uint8_t Endpoint_Read_Control_Stream_LE(void* Buffer, uint16_t Length) while (Length) { - while (!(Endpoint_IsSetupOUTReceived())); + while (!(Endpoint_IsOUTReceived())); while (Length && Endpoint_BytesInEndpoint()) { @@ -354,10 +373,10 @@ uint8_t Endpoint_Read_Control_Stream_LE(void* Buffer, uint16_t Length) Length--; } - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); } - while (!(Endpoint_IsSetupINReady())); + while (!(Endpoint_IsINReady())); return ENDPOINT_RWCSTREAM_ERROR_NoError; } @@ -368,7 +387,7 @@ uint8_t Endpoint_Read_Control_Stream_BE(void* Buffer, uint16_t Length) while (Length) { - while (!(Endpoint_IsSetupOUTReceived())); + while (!(Endpoint_IsOUTReceived())); while (Length && Endpoint_BytesInEndpoint()) { @@ -377,10 +396,10 @@ uint8_t Endpoint_Read_Control_Stream_BE(void* Buffer, uint16_t Length) Length--; } - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); } - while (!(Endpoint_IsSetupINReady())); + while (!(Endpoint_IsINReady())); return ENDPOINT_RWCSTREAM_ERROR_NoError; } diff --git a/LUFA/Drivers/USB/LowLevel/Endpoint.h b/LUFA/Drivers/USB/LowLevel/Endpoint.h index c0eab3584e..2223f0ca4a 100644 --- a/LUFA/Drivers/USB/LowLevel/Endpoint.h +++ b/LUFA/Drivers/USB/LowLevel/Endpoint.h @@ -34,7 +34,25 @@ * module contains the endpoint management macros, as well as endpoint interrupt and data * send/recieve functions for various data types. */ + +/** \ingroup Group_USB + * @defgroup Group_EndpointManagement Endpoint Management + * + * Functions, macros, variables, enums and types related to the setup and management of endpoints while in USB Device mode. + * + * @{ + */ + +/** @defgroup Group_EndpointRW Endpoint Data Reading and Writing + * + * Functions, macros, variables, enums and types related to data reading and writing from and to endpoints. + */ +/** @defgroup Group_EndpointPacketManagement Endpoint Packet Management + * + * Functions, macros, variables, enums and types related to packet management of endpoints. + */ + #ifndef __ENDPOINT_H__ #define __ENDPOINT_H__ @@ -85,10 +103,10 @@ */ #define ENDPOINT_CONTROLEP 0 - /** Default size of the default control endpoint's bank, until altered by the Endpoint0Size value - * in the device descriptor. Not available if the FIXED_CONTROL_ENDPOINT_SIZE token is defined. - */ #if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__)) + /** Default size of the default control endpoint's bank, until altered by the Endpoint0Size value + * in the device descriptor. Not available if the FIXED_CONTROL_ENDPOINT_SIZE token is defined. + */ #define ENDPOINT_CONTROLEP_DEFAULT_SIZE 8 #endif @@ -165,125 +183,271 @@ */ #define ENDPOINT_INT_OUT UEIENX, (1 << RXOUTE), UEINTX, (1 << RXOUTI) - #if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER) || defined(__DOXYGEN__) - /** Indicates the number of bytes currently stored in the current endpoint's selected bank. */ - #define Endpoint_BytesInEndpoint() UEBCX + /* Psuedo-Function Macros: */ + #if defined(__DOXYGEN__) + /** Indicates the number of bytes currently stored in the current endpoint's selected bank. + * + * \note The return width of this function may differ, depending on the maximum endpoint bank size + * of the selected AVR model. + * + * \ingroup Group_EndpointRW + * + * \return Total number of bytes in the currently selected Endpoint's FIFO buffer + */ + static inline uint16_t Endpoint_BytesInEndpoint(void); + + /** Get the endpoint address of the currently selected endpoint. This is typically used to save + * the currently selected endpoint number so that it can be restored after another endpoint has + * been manipulated. + * + * \return Index of the currently selected endpoint + */ + static inline uint8_t Endpoint_GetCurrentEndpoint(void); + + /** Selects the given endpoint number. If the address from the device descriptors is used, the + * value should be masked with the ENDPOINT_EPNUM_MASK constant to extract only the endpoint + * number (and discarding the endpoint direction bit). + * + * Any endpoint operations which do not require the endpoint number to be indicated will operate on + * the currently selected endpoint. + * + * \param EndpointNumber Endpoint number to select + */ + static inline void Endpoint_SelectEndpoint(uint8_t EndpointNumber); + + /** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's + * In and Out pointers to the bank's contents. + * + * \param EndpointNumber Endpoint number whose FIFO buffers are to be reset + */ + static inline void Endpoint_ResetFIFO(uint8_t EndpointNumber); + + /** Enables the currently selected endpoint so that data can be sent and received through it to + * and from a host. + * + * \note Endpoints must first be configured properly rather than just being enabled via the + * Endpoint_ConfigureEndpoint() macro, which calls Endpoint_EnableEndpoint() automatically. + */ + static inline void Endpoint_EnableEndpoint(void); + + /** Disables the currently selected endpoint so that data cannot be sent and received through it + * to and from a host. + */ + static inline void Endpoint_DisableEndpoint(void); + + /** Determines if the currently selected endpoint is enabled, but not necessarily configured. + * + * \return Boolean True if the currently selected endpoint is enabled, false otherwise + */ + static inline bool Endpoint_IsEnabled(void); + + /** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint + * bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an IN + * direction). This function will return false if an error has occurred in the endpoint, if the endpoint + * is an OUT direction and no packet (or an empty packet) has been received, or if the endpoint is an IN + * direction and the endpoint bank is full. + * + * \ingroup Group_EndpointPacketManagement + * + * \return Boolean true if the currently selected endpoint may be read from or written to, depending on its direction + */ + static inline bool Endpoint_IsReadWriteAllowed(void); + + /** Determines if the currently selected endpoint is configured. + * + * \return Boolean true if the currently selected endpoint has been configured, false otherwise + */ + static inline bool Endpoint_IsConfigured(void); + + /** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their + * interrupt duration has elapsed. Which endpoints have interrupted can be determined by + * masking the return value against (1 << {Endpoint Number}). + * + * \return Mask whose bits indicate which endpoints have interrupted + */ + static inline uint8_t Endpoint_GetEndpointInterrupts(void); + + /** Clears the endpoint interrupt flag. This clears the specified endpoint number's interrupt + * mask in the endpoint interrupt flag register. + * + * \param EndpointNumber Index of the endpoint whose interrupt flag should be cleared + */ + static inline void Endpoint_ClearEndpointInterrupt(uint8_t EndpointNumber); + + /** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type + * endpoints). + * + * \param EndpointNumber Index of the endpoint whose interrupt flag should be tested + * + * \return Boolean true if the specified endpoint has interrupted, false otherwise + */ + static inline bool Endpoint_HasEndpointInterrupted(uint8_t EndpointNumber); + + /** Determines if the selected IN endpoint is ready for a new packet. + * + * \ingroup Group_EndpointPacketManagement + * + * \return Boolean true if the current endpoint is ready for an IN packet, false otherwise. + */ + static inline bool Endpoint_IsINReady(void); + + /** Determines if the selected OUT endpoint has received new packet. + * + * \ingroup Group_EndpointPacketManagement + * + * \return Boolean true if current endpoint is has received an OUT packet, false otherwise. + */ + static inline bool Endpoint_IsOUTReceived(void); + + /** Determines if the current CONTROL type endpoint has received a SETUP packet. + * + * \ingroup Group_EndpointPacketManagement + * + * \return Boolean true if the selected endpoint has received a SETUP packet, false otherwise. + */ + static inline bool Endpoint_IsSETUPReceived(void); + + /** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the + * endpoint for the next packet. + * + * \ingroup Group_EndpointPacketManagement + * + * \note This is not applicable for non CONTROL type endpoints. + */ + static inline void Endpoint_ClearControlSETUP(void); + + /** Sends an IN packet to the host on the currently selected CONTROL type endpoint, freeing up the + * endpoint for the next packet. + * + * \ingroup Group_EndpointPacketManagement + * + * \note For non CONTROL type endpoints, use Endpoint_ClearIN() instead. + */ + static inline void Endpoint_ClearControlIN(void); + + /** Acknowledges an OUT packet to the host on the currently selected CONTROL type endpoint, freeing + * up the endpoint for the next packet. + * + * \ingroup Group_EndpointPacketManagement + * + * \note For non CONTROL type endpoints, use Endpoint_ClearOUT() instead. + */ + static inline void Endpoint_ClearControlOUT(void); + + /** Sends an IN packet to the host on the currently selected non CONTROL type endpoint, freeing + * up the endpoint for the next packet and switching to the alternative endpoint bank if double banked. + * + * \ingroup Group_EndpointPacketManagement + * + * \note For CONTROL type endpoints, use Endpoint_ClearControlIN() instead. + */ + static inline void Endpoint_ClearIN(void); + + /** Acknowledges an OUT packet to the host on the currently selected non CONTROL type endpoint, freeing + * up the endpoint for the next packet and switching to the alternative endpoint bank if double banked. + * + * \ingroup Group_EndpointPacketManagement + * + * \note For CONTROL type endpoints, use Endpoint_ClearControlOUT() instead. + */ + static inline void Endpoint_ClearOUT(void); + + /** Stalls the current endpoint, indicating to the host that a logical problem occurred with the + * indicated endpoint and that the current transfer sequence should be aborted. This provides a + * way for devices to indicate invalid commands to the host so that the current transfer can be + * aborted and the host can begin its own recovery sequence. + * + * The currently selected endpoint remains stalled until either the Endpoint_ClearStall() macro + * is called, or the host issues a CLEAR FEATURE request to the device for the currently selected + * endpoint. + * + * \ingroup Group_EndpointPacketManagement + */ + static inline void Endpoint_StallTransaction(void); + + /** Clears the STALL condition on the currently selected endpoint. + * + * \ingroup Group_EndpointPacketManagement + */ + static inline void Endpoint_ClearStall(void); + + /** Determines if the currently selected endpoint is stalled, false otherwise. + * + * \ingroup Group_EndpointPacketManagement + * + * \return Boolean true if the currently selected endpoint is stalled, false otherwise + */ + static inline bool Endpoint_IsStalled(void); + + /** Resets the data toggle of the currently selected endpoint. */ + static inline void Endpoint_ResetDataToggle(void); + + /** Determines the currently selected endpoint's direction. + * + * \return The currently selected endpoint's direction, as a ENDPOINT_DIR_* mask. + */ + static inline uint8_t Endpoint_GetEndpointDirection(void); #else - #define Endpoint_BytesInEndpoint() UEBCLX + #if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER) || defined(__DOXYGEN__) + #define Endpoint_BytesInEndpoint() UEBCX + #else + #define Endpoint_BytesInEndpoint() UEBCLX + #endif + + #define Endpoint_GetCurrentEndpoint() (UENUM & ENDPOINT_EPNUM_MASK) + + #define Endpoint_SelectEndpoint(epnum) MACROS{ UENUM = epnum; }MACROE + + #define Endpoint_ResetFIFO(epnum) MACROS{ UERST = (1 << epnum); UERST = 0; }MACROE + + #define Endpoint_EnableEndpoint() MACROS{ UECONX |= (1 << EPEN); }MACROE + + #define Endpoint_DisableEndpoint() MACROS{ UECONX &= ~(1 << EPEN); }MACROE + + #define Endpoint_IsEnabled() ((UECONX & (1 << EPEN)) ? true : false) + + #define Endpoint_IsReadWriteAllowed() ((UEINTX & (1 << RWAL)) ? true : false) + + #define Endpoint_IsConfigured() ((UESTA0X & (1 << CFGOK)) ? true : false) + + #define Endpoint_GetEndpointInterrupts() UEINT + + #define Endpoint_ClearEndpointInterrupt(n) MACROS{ UEINT &= ~(1 << n); }MACROE + + #define Endpoint_HasEndpointInterrupted(n) ((UEINT & (1 << n)) ? true : false) + + #define Endpoint_IsINReady() ((UEINTX & (1 << TXINI)) ? true : false) + + #define Endpoint_IsOUTReceived() ((UEINTX & (1 << RXOUTI)) ? true : false) + + #define Endpoint_IsSETUPReceived() ((UEINTX & (1 << RXSTPI)) ? true : false) + + #define Endpoint_ClearControlSETUP() MACROS{ UEINTX &= ~(1 << RXSTPI); }MACROE + + #define Endpoint_ClearControlIN() MACROS{ UEINTX &= ~(1 << TXINI); }MACROE + + #define Endpoint_ClearControlOUT() MACROS{ UEINTX &= ~(1 << RXOUTI); }MACROE + + #define Endpoint_ClearIN() MACROS{ UEINTX &= ~(1 << TXINI); UEINTX &= ~(1 << FIFOCON); }MACROE + + #define Endpoint_ClearOUT() MACROS{ UEINTX &= ~(1 << RXOUTI); UEINTX &= ~(1 << FIFOCON); }MACROE + + #define Endpoint_StallTransaction() MACROS{ UECONX |= (1 << STALLRQ); }MACROE + + #define Endpoint_ClearStall() MACROS{ UECONX |= (1 << STALLRQC); }MACROE + + #define Endpoint_IsStalled() ((UECONX & (1 << STALLRQ)) ? true : false) + + #define Endpoint_ResetDataToggle() MACROS{ UECONX |= (1 << RSTDT); }MACROE + + #define Endpoint_GetEndpointDirection() (UECFG0X & ENDPOINT_DIR_IN) #endif - - /** Returns the endpoint address of the currently selected endpoint. This is typically used to save - * the currently selected endpoint number so that it can be restored after another endpoint has - * been manipulated. - */ - #define Endpoint_GetCurrentEndpoint() (UENUM & ENDPOINT_EPNUM_MASK) - - /** Selects the given endpoint number. If the address from the device descriptors is used, the - * value should be masked with the ENDPOINT_EPNUM_MASK constant to extract only the endpoint - * number (and discarding the endpoint direction bit). - * - * Any endpoint operations which do not require the endpoint number to be indicated will operate on - * the currently selected endpoint. - */ - #define Endpoint_SelectEndpoint(epnum) MACROS{ UENUM = epnum; }MACROE - - /** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's - * In and Out pointers to the bank's contents. - */ - #define Endpoint_ResetFIFO(epnum) MACROS{ UERST = (1 << epnum); UERST = 0; }MACROE - - /** Enables the currently selected endpoint so that data can be sent and received through it to - * and from a host. - * - * \note Endpoints must first be configured properly rather than just being enabled via the - * Endpoint_ConfigureEndpoint() macro, which calls Endpoint_EnableEndpoint() automatically. - */ - #define Endpoint_EnableEndpoint() MACROS{ UECONX |= (1 << EPEN); }MACROE - - /** Disables the currently selected endpoint so that data cannot be sent and received through it - * to and from a host. - */ - #define Endpoint_DisableEndpoint() MACROS{ UECONX &= ~(1 << EPEN); }MACROE - - /** Returns true if the currently selected endpoint is enabled, false otherwise. */ - #define Endpoint_IsEnabled() ((UECONX & (1 << EPEN)) ? true : false) - - /** Returns true if the currently selected endpoint may be read from (if data is waiting in the endpoint - * bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an - * IN direction). This function will return false if an error has occurred in the endpoint, or if - * the endpoint is an OUT direction and no packet has been received, or if the endpoint is an IN - * direction and the endpoint bank is full. - */ - #define Endpoint_ReadWriteAllowed() ((UEINTX & (1 << RWAL)) ? true : false) - - /** Returns true if the currently selected endpoint is configured, false otherwise. */ - #define Endpoint_IsConfigured() ((UESTA0X & (1 << CFGOK)) ? true : false) - - /** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their - * interrupt duration has elapsed. Which endpoints have interrupted can be determined by - * masking the return value against (1 << {Endpoint Number}). - */ - #define Endpoint_GetEndpointInterrupts() UEINT - - /** Clears the endpoint interrupt flag. This clears the specified endpoint number's interrupt - * mask in the endpoint interrupt flag register. - */ - #define Endpoint_ClearEndpointInterrupt(n) MACROS{ UEINT &= ~(1 << n); }MACROE - - /** Returns true if the specified endpoint number has interrupted (valid only for INTERRUPT type - * endpoints), false otherwise. - */ - #define Endpoint_HasEndpointInterrupted(n) ((UEINT & (1 << n)) ? true : false) - - /** Clears the currently selected endpoint bank, and switches to the alternate bank if the currently - * selected endpoint is dual-banked. When cleared, this either frees the bank up for the next packet - * from the host (if the endpoint is of the OUT direction) or sends the packet contents to the host - * (if the endpoint is of the IN direction). - */ - #define Endpoint_ClearCurrentBank() MACROS{ UEINTX &= ~(1 << FIFOCON); }MACROE - - /** Returns true if the current CONTROL type endpoint is ready for an IN packet, false otherwise. */ - #define Endpoint_IsSetupINReady() ((UEINTX & (1 << TXINI)) ? true : false) - - /** Returns true if the current CONTROL type endpoint is ready for an OUT packet, false otherwise. */ - #define Endpoint_IsSetupOUTReceived() ((UEINTX & (1 << RXOUTI)) ? true : false) - - /** Returns true if the current CONTROL type endpoint is ready for a SETUP packet, false otherwise. */ - #define Endpoint_IsSetupReceived() ((UEINTX & (1 << RXSTPI)) ? true : false) - - /** Clears a received SETUP packet on the currently selected CONTROL type endpoint. */ - #define Endpoint_ClearSetupReceived() MACROS{ UEINTX &= ~(1 << RXSTPI); }MACROE - - /** Sends an IN packet to the host on the currently selected CONTROL type endpoint. */ - #define Endpoint_ClearSetupIN() MACROS{ UEINTX &= ~(1 << TXINI); }MACROE - - /** Acknowledges an OUT packet to the host on the currently selected CONTROL type endpoint, freeing - * up the endpoint for the next packet. - */ - #define Endpoint_ClearSetupOUT() MACROS{ UEINTX &= ~(1 << RXOUTI); }MACROE - - /** Stalls the current endpoint, indicating to the host that a logical problem occurred with the - * indicated endpoint and that the current transfer sequence should be aborted. This provides a - * way for devices to indicate invalid commands to the host so that the current transfer can be - * aborted and the host can begin its own recovery sequence. - * - * The currently selected endpoint remains stalled until either the Endpoint_ClearStall() macro - * is called, or the host issues a CLEAR FEATURE request to the device for the currently selected - * endpoint. - */ - #define Endpoint_StallTransaction() MACROS{ UECONX |= (1 << STALLRQ); }MACROE - - /** Clears the stall on the currently selected endpoint. */ - #define Endpoint_ClearStall() MACROS{ UECONX |= (1 << STALLRQC); }MACROE - - /** Returns true if the currently selected endpoint is stalled, false otherwise. */ - #define Endpoint_IsStalled() ((UECONX & (1 << STALLRQ)) ? true : false) - - /** Resets the data toggle of the currently selected endpoint. */ - #define Endpoint_ResetDataToggle() MACROS{ UECONX |= (1 << RSTDT); }MACROE /* Enums: */ - /** Enum for the possible error return codes of the Endpoint_WaitUntilReady function */ + /** Enum for the possible error return codes of the Endpoint_WaitUntilReady function. + * + * \ingroup Group_EndpointRW + */ enum Endpoint_WaitUntilReady_ErrorCodes_t { ENDPOINT_READYWAIT_NoError = 0, /**< Endpoint is ready for next packet, no error. */ @@ -299,7 +463,10 @@ */ }; - /** Enum for the possible error return codes of the Endpoint_*_Stream_* functions. */ + /** Enum for the possible error return codes of the Endpoint_*_Stream_* functions. + * + * \ingroup Group_EndpointRW + */ enum Endpoint_Stream_RW_ErrorCodes_t { ENDPOINT_RWSTREAM_ERROR_NoError = 0, /**< Command completed successfully, no error. */ @@ -318,7 +485,10 @@ */ }; - /** Enum for the possible error return codes of the Endpoint_*_Control_Stream_* functions. */ + /** Enum for the possible error return codes of the Endpoint_*_Control_Stream_* functions.. + * + * \ingroup Group_EndpointRW + */ enum Endpoint_ControlStream_RW_ErrorCodes_t { ENDPOINT_RWCSTREAM_ERROR_NoError = 0, /**< Command completed successfully, no error. */ @@ -326,21 +496,34 @@ }; /* Inline Functions: */ - /** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints. */ + /** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints. + * + * \ingroup Group_EndpointRW + * + * \return Next byte in the currently selected endpoint's FIFO buffer + */ static inline uint8_t Endpoint_Read_Byte(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Endpoint_Read_Byte(void) { return UEDATX; } - /** Writes one byte from the currently selected endpoint's bank, for IN direction endpoints. */ + /** Writes one byte from the currently selected endpoint's bank, for IN direction endpoints. + * + * \ingroup Group_EndpointRW + * + * \param Byte Next byte to write into the the currently selected endpoint's FIFO buffer + */ static inline void Endpoint_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_Byte(const uint8_t Byte) { UEDATX = Byte; } - /** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints. */ + /** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints. + * + * \ingroup Group_EndpointRW + */ static inline void Endpoint_Discard_Byte(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_Discard_Byte(void) { @@ -351,6 +534,10 @@ /** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT * direction endpoints. + * + * \ingroup Group_EndpointRW + * + * \return Next word in the currently selected endpoint's FIFO buffer */ static inline uint16_t Endpoint_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_Read_Word_LE(void) @@ -365,6 +552,10 @@ /** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT * direction endpoints. + * + * \ingroup Group_EndpointRW + * + * \return Next word in the currently selected endpoint's FIFO buffer */ static inline uint16_t Endpoint_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Endpoint_Read_Word_BE(void) @@ -379,6 +570,10 @@ /** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN * direction endpoints. + * + * \ingroup Group_EndpointRW + * + * \param Word Next word to write to the currently selected endpoint's FIFO buffer */ static inline void Endpoint_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_Word_LE(const uint16_t Word) @@ -389,6 +584,10 @@ /** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN * direction endpoints. + * + * \ingroup Group_EndpointRW + * + * \param Word Next word to write to the currently selected endpoint's FIFO buffer */ static inline void Endpoint_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_Word_BE(const uint16_t Word) @@ -397,7 +596,10 @@ UEDATX = (Word & 0xFF); } - /** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints. */ + /** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints. + * + * \ingroup Group_EndpointRW + */ static inline void Endpoint_Discard_Word(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_Discard_Word(void) { @@ -409,6 +611,10 @@ /** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT * direction endpoints. + * + * \ingroup Group_EndpointRW + * + * \return Next double word in the currently selected endpoint's FIFO buffer */ static inline uint32_t Endpoint_Read_DWord_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint32_t Endpoint_Read_DWord_LE(void) @@ -429,6 +635,10 @@ /** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT * direction endpoints. + * + * \ingroup Group_EndpointRW + * + * \return Next double word in the currently selected endpoint's FIFO buffer */ static inline uint32_t Endpoint_Read_DWord_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint32_t Endpoint_Read_DWord_BE(void) @@ -449,6 +659,10 @@ /** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN * direction endpoints. + * + * \ingroup Group_EndpointRW + * + * \param DWord Next double word to write to the currently selected endpoint's FIFO buffer */ static inline void Endpoint_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_DWord_LE(const uint32_t DWord) @@ -461,6 +675,10 @@ /** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN * direction endpoints. + * + * \ingroup Group_EndpointRW + * + * \param DWord Next double word to write to the currently selected endpoint's FIFO buffer */ static inline void Endpoint_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE; static inline void Endpoint_Write_DWord_BE(const uint32_t DWord) @@ -471,7 +689,10 @@ UEDATX = (DWord & 0xFF); } - /** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints. */ + /** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints. + * + * \ingroup Group_EndpointRW + */ static inline void Endpoint_Discard_DWord(void) ATTR_ALWAYS_INLINE; static inline void Endpoint_Discard_DWord(void) { @@ -539,6 +760,8 @@ * * \note This routine should not be called on CONTROL type endpoints. * + * \ingroup Group_EndpointRW + * * \return A value from the Endpoint_WaitUntilReady_ErrorCodes_t enum. */ uint8_t Endpoint_WaitUntilReady(void); @@ -546,7 +769,7 @@ /** Reads and discards the given number of bytes from the endpoint from the given buffer, * discarding fully read packets from the host as needed. The last packet is not automatically * discarded once the remaining bytes has been read; the user is responsible for manually - * discarding the last packet from the host via the Endpoint_ClearCurrentBank() macro. Between + * discarding the last packet from the host via the Endpoint_ClearOUT() macro. Between * each USB packet, the given stream callback function is executed repeatedly until the next * packet is ready, allowing for early aborts of stream transfers. * @@ -556,6 +779,8 @@ * * \note This routine should not be used on CONTROL type endpoints. * + * \ingroup Group_EndpointRW + * * \param Length Number of bytes to send via the currently selected endpoint. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback * @@ -570,7 +795,7 @@ /** Writes the given number of bytes to the endpoint from the given buffer in little endian, * sending full packets to the host as needed. The last packet filled is not automatically sent; * the user is responsible for manually sending the last written packet to the host via the - * Endpoint_ClearCurrentBank() macro. Between each USB packet, the given stream callback function + * Endpoint_ClearIN() macro. Between each USB packet, the given stream callback function * is executed repeatedly until the endpoint is ready to accept the next packet, allowing for early * aborts of stream transfers. * @@ -580,6 +805,8 @@ * * \note This routine should not be used on CONTROL type endpoints. * + * \ingroup Group_EndpointRW + * * \param Buffer Pointer to the source data buffer to read from. * \param Length Number of bytes to read for the currently selected endpoint into the buffer. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback @@ -595,7 +822,7 @@ /** Writes the given number of bytes to the endpoint from the given buffer in big endian, * sending full packets to the host as needed. The last packet filled is not automatically sent; * the user is responsible for manually sending the last written packet to the host via the - * Endpoint_ClearCurrentBank() macro. Between each USB packet, the given stream callback function + * Endpoint_ClearIN() macro. Between each USB packet, the given stream callback function * is executed repeatedly until the endpoint is ready to accept the next packet, allowing for early * aborts of stream transfers. * @@ -605,6 +832,8 @@ * * \note This routine should not be used on CONTROL type endpoints. * + * \ingroup Group_EndpointRW + * * \param Buffer Pointer to the source data buffer to read from. * \param Length Number of bytes to read for the currently selected endpoint into the buffer. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback @@ -620,7 +849,7 @@ /** Reads the given number of bytes from the endpoint from the given buffer in little endian, * discarding fully read packets from the host as needed. The last packet is not automatically * discarded once the remaining bytes has been read; the user is responsible for manually - * discarding the last packet from the host via the Endpoint_ClearCurrentBank() macro. Between + * discarding the last packet from the host via the Endpoint_ClearOUT() macro. Between * each USB packet, the given stream callback function is executed repeatedly until the endpoint * is ready to accept the next packet, allowing for early aborts of stream transfers. * @@ -630,6 +859,8 @@ * * \note This routine should not be used on CONTROL type endpoints. * + * \ingroup Group_EndpointRW + * * \param Buffer Pointer to the destination data buffer to write to. * \param Length Number of bytes to send via the currently selected endpoint. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback @@ -645,7 +876,7 @@ /** Reads the given number of bytes from the endpoint from the given buffer in big endian, * discarding fully read packets from the host as needed. The last packet is not automatically * discarded once the remaining bytes has been read; the user is responsible for manually - * discarding the last packet from the host via the Endpoint_ClearCurrentBank() macro. Between + * discarding the last packet from the host via the Endpoint_ClearOUT() macro. Between * each USB packet, the given stream callback function is executed repeatedly until the endpoint * is ready to accept the next packet, allowing for early aborts of stream transfers. * @@ -655,6 +886,8 @@ * * \note This routine should not be used on CONTROL type endpoints. * + * \ingroup Group_EndpointRW + * * \param Buffer Pointer to the destination data buffer to write to. * \param Length Number of bytes to send via the currently selected endpoint. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback @@ -670,13 +903,15 @@ /** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian, * sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared * in both failure and success states; the user is responsible for manually clearing the setup OUT to - * finalize the transfer via the Endpoint_ClearSetupOUT() macro. + * finalize the transfer via the Endpoint_ClearControlOUT() macro. * * \note This routine should only be used on CONTROL type endpoints. * * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained * together; i.e. the entire stream data must be read or written at the one time. * + * \ingroup Group_EndpointRW + * * \param Buffer Pointer to the source data buffer to read from. * \param Length Number of bytes to read for the currently selected endpoint into the buffer. * @@ -687,13 +922,15 @@ /** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian, * sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared * in both failure and success states; the user is responsible for manually clearing the setup OUT to - * finalize the transfer via the Endpoint_ClearSetupOUT() macro. + * finalize the transfer via the Endpoint_ClearControlOUT() macro. * * \note This routine should only be used on CONTROL type endpoints. * * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained * together; i.e. the entire stream data must be read or written at the one time. * + * \ingroup Group_EndpointRW + * * \param Buffer Pointer to the source data buffer to read from. * \param Length Number of bytes to read for the currently selected endpoint into the buffer. * @@ -704,13 +941,15 @@ /** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian, * discarding fully read packets from the host as needed. The device IN acknowledgement is not * automatically sent after success or failure states; the user is responsible for manually sending the - * setup IN to finalize the transfer via the Endpoint_ClearSetupIN() macro. + * setup IN to finalize the transfer via the Endpoint_ClearControlIN() macro. * * \note This routine should only be used on CONTROL type endpoints. * * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained * together; i.e. the entire stream data must be read or written at the one time. * + * \ingroup Group_EndpointRW + * * \param Buffer Pointer to the destination data buffer to write to. * \param Length Number of bytes to send via the currently selected endpoint. * @@ -721,80 +960,21 @@ /** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian, * discarding fully read packets from the host as needed. The device IN acknowledgement is not * automatically sent after success or failure states; the user is responsible for manually sending the - * setup IN to finalize the transfer via the Endpoint_ClearSetupIN() macro. + * setup IN to finalize the transfer via the Endpoint_ClearControlIN() macro. * * \note This routine should only be used on CONTROL type endpoints. * * \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained * together; i.e. the entire stream data must be read or written at the one time. * + * \ingroup Group_EndpointRW + * * \param Buffer Pointer to the destination data buffer to write to. * \param Length Number of bytes to send via the currently selected endpoint. * * \return A value from the Endpoint_ControlStream_RW_ErrorCodes_t enum. */ - uint8_t Endpoint_Read_Control_Stream_BE(void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); - - /* Function Aliases: */ - /** Alias for Endpoint_Discard_Byte(). - */ - #define Endpoint_Ignore_Byte() Endpoint_Discard_Byte() - - /** Alias for Endpoint_Discard_Word(). - */ - #define Endpoint_Ignore_Word() Endpoint_Discard_Word() - - /** Alias for Endpoint_Discard_DWord(). - */ - #define Endpoint_Ignore_DWord() Endpoint_Discard_DWord() - - /** Alias for Endpoint_Read_Word_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #define Endpoint_Read_Word() Endpoint_Read_Word_LE() - - /** Alias for Endpoint_Write_Word_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #define Endpoint_Write_Word(Word) Endpoint_Write_Word_LE(Word) - - /** Alias for Endpoint_Read_DWord_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #define Endpoint_Read_DWord() Endpoint_Read_DWord_LE() - - /** Alias for Endpoint_Write_DWord_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #define Endpoint_Write_DWord(DWord) Endpoint_Write_DWord_LE(DWord) - - /** Alias for Endpoint_Read_Stream_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #if !defined(NO_STREAM_CALLBACKS) - #define Endpoint_Read_Stream(Buffer, Length, Callback) Endpoint_Read_Stream_LE(Buffer, Length, Callback) - #else - #define Endpoint_Read_Stream(Buffer, Length) Endpoint_Read_Stream_LE(Buffer, Length) - #endif - - /** Alias for Endpoint_Write_Stream_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #if !defined(NO_STREAM_CALLBACKS) - #define Endpoint_Write_Stream(Buffer, Length, Callback) Endpoint_Write_Stream_LE(Buffer, Length, Callback) - #else - #define Endpoint_Write_Stream(Buffer, Length) Endpoint_Write_Stream_LE(Buffer, Length) - #endif - - /** Alias for Endpoint_Read_Control_Stream_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #define Endpoint_Read_Control_Stream(Data, Length) Endpoint_Read_Control_Stream_LE(Data, Length) - - /** Alias for Endpoint_Write_Control_Stream_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #define Endpoint_Write_Control_Stream(Data, Length) Endpoint_Write_Control_Stream_LE(Data, Length) + uint8_t Endpoint_Read_Control_Stream_BE(void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); /* Private Interface - For use in library only: */ #if !defined(__DOXYGEN__) @@ -868,3 +1048,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/LowLevel/Host.c b/LUFA/Drivers/USB/LowLevel/Host.c index 52f19a5fd7..fe02f7cd15 100644 --- a/LUFA/Drivers/USB/LowLevel/Host.c +++ b/LUFA/Drivers/USB/LowLevel/Host.c @@ -87,7 +87,7 @@ void USB_Host_ResetDevice(void) USB_INT_Disable(USB_INT_DDISCI); USB_Host_ResetBus(); - while (!(USB_Host_IsResetBusDone())); + while (!(USB_Host_IsBusResetComplete())); USB_INT_Clear(USB_INT_HSOFI); USB_Host_ResumeBus(); diff --git a/LUFA/Drivers/USB/LowLevel/Host.h b/LUFA/Drivers/USB/LowLevel/Host.h index 18eebfec1d..1ff2d7ab2d 100644 --- a/LUFA/Drivers/USB/LowLevel/Host.h +++ b/LUFA/Drivers/USB/LowLevel/Host.h @@ -34,6 +34,14 @@ * the USB controller is initialized in host mode. */ +/** \ingroup Group_USB + * @defgroup Group_Host Host Management + * + * Functions, macros, variables, enums and types related to the management of a USB host when in Host mode. + * + * @{ + */ + #ifndef __USBHOST_H__ #define __USBHOST_H__ @@ -81,64 +89,94 @@ */ #define HOST_DEVICE_SETTLE_DELAY_MS 1500 #endif - - /** Resets the USB bus, including the endpoints in any attached device and pipes on the AVR host. - * USB bus resets leave the default control pipe configured (if already configured). - * - * If the USB bus has been suspended prior to issuing a bus reset, the attached device will be - * woken up automatically and the bus resumed after the reset has been correctly issued. - */ - #define USB_Host_ResetBus() MACROS{ UHCON |= (1 << RESET); }MACROE - - /** Determines if a previously issued bus reset (via the USB_Host_ResetBus() macro) has - * completed. This macro returns true if no bus reset is currently being sent, false - * otherwise. - */ - #define USB_Host_IsResetBusDone() ((UHCON & (1 << RESET)) ? false : true) - - /** Resumes USB communications with an attached and enumerated device, by resuming the transmission - * of the 1MS Start Of Frame messages to the device. When resumed, USB communications between the - * host and attached device may occur. - */ - #define USB_Host_ResumeBus() MACROS{ UHCON |= (1 << SOFEN); }MACROE - - /** Suspends the USB bus, preventing any communications from occurring between the host and attached - * device until the bus has been resumed. This stops the transmission of the 1MS Start Of Frame - * messages to the device. - */ - #define USB_Host_SuspendBus() MACROS{ UHCON &= ~(1 << SOFEN); }MACROE - - /** Returns true if the USB bus has been suspended via the use of the USB_Host_SuspendBus() macro, - * false otherwise. While suspended, no USB communications can occur until the bus is resumed, - * except for the Remote Wakeup event from the device if supported. - */ - #define USB_Host_IsBusSuspended() ((UHCON & (1 << SOFEN)) ? false : true) - /** Returns true if the attached device is currently enumerated in Full Speed mode (12Mb/s), or - * false if the attached device is enumerated in Low Speed mode (1.5Mb/s). - */ - #define USB_Host_IsDeviceFullSpeed() ((USBSTA & (1 << SPEED)) ? true : false) + /* Psuedo-Function Macros: */ + #if defined(__DOXYGEN__) + /** Resets the USB bus, including the endpoints in any attached device and pipes on the AVR host. + * USB bus resets leave the default control pipe configured (if already configured). + * + * If the USB bus has been suspended prior to issuing a bus reset, the attached device will be + * woken up automatically and the bus resumed after the reset has been correctly issued. + */ + static inline void USB_Host_ResetBus(void); - /** Returns true if the attached device is currently issuing a Remote Wakeup request, requesting - * that the host resume the USB bus and wake up the device, false otherwise. - */ - #define USB_Host_IsRemoteWakeupSent() ((UHINT & (1 << RXRSMI)) ? true : false) + /** Determines if a previously issued bus reset (via the USB_Host_ResetBus() macro) has + * completed. + * + * \return Boolean true if no bus reset is currently being sent, false otherwise. + */ + static inline void USB_Host_IsBusResetComplete(void); - /** Clears the flag indicating that a Remote Wakeup request has been issued by an attached - * device. - */ - #define USB_Host_ClearRemoteWakeupSent() MACROS{ UHINT &= ~(1 << RXRSMI); }MACROE + /** Resumes USB communications with an attached and enumerated device, by resuming the transmission + * of the 1MS Start Of Frame messages to the device. When resumed, USB communications between the + * host and attached device may occur. + */ + static inline void USB_Host_ResumeBus(void); - /** Accepts a Remote Wakeup request from an attached device. This must be issued in response to - * a device's Remote Wakeup request within 2ms for the request to be accepted and the bus to - * be resumed. - */ - #define USB_Host_ResumeFromWakeupRequest() MACROS{ UHCON |= (1 << RESUME); }MACROE + /** Suspends the USB bus, preventing any communications from occurring between the host and attached + * device until the bus has been resumed. This stops the transmission of the 1MS Start Of Frame + * messages to the device. + */ + static inline void USB_Host_SuspendBus(void); + + /** Determines if the USB bus has been suspended via the use of the USB_Host_SuspendBus() macro, + * false otherwise. While suspended, no USB communications can occur until the bus is resumed, + * except for the Remote Wakeup event from the device if supported. + * + * \return Boolean true if the bus is currently suspended, false otherwise + */ + static inline bool USB_Host_IsBusSuspended(void); + + /** Determines if the attached device is currently enumerated in Full Speed mode (12Mb/s), or + * false if the attached device is enumerated in Low Speed mode (1.5Mb/s). + * + * \return Boolean true if the attached device is enumerated in Full Speed mode, false otherwise + */ + static inline bool USB_Host_IsDeviceFullSpeed(void); + + /** Determines if the attached device is currently issuing a Remote Wakeup request, requesting + * that the host resume the USB bus and wake up the device, false otherwise. + * + * \return Boolean true if the attached device has sent a Remote Wakeup request, false otherwise + */ + static inline bool USB_Host_IsRemoteWakeupSent(void); + + /** Clears the flag indicating that a Remote Wakeup request has been issued by an attached device. */ + static inline void USB_Host_ClearRemoteWakeupSent(void); + + /** Accepts a Remote Wakeup request from an attached device. This must be issued in response to + * a device's Remote Wakeup request within 2ms for the request to be accepted and the bus to + * be resumed. + */ + static inline void USB_Host_ResumeFromWakeupRequest(void); + + /** Determines if a resume from Remote Wakeup request is currently being sent to an attached + * device. + * + * \return Boolean true if no resume request is currently being sent, false otherwise + */ + static inline bool USB_Host_IsResumeFromWakeupRequestSent(void); + #else + #define USB_Host_ResetBus() MACROS{ UHCON |= (1 << RESET); }MACROE + + #define USB_Host_IsBusResetComplete() ((UHCON & (1 << RESET)) ? false : true) + + #define USB_Host_ResumeBus() MACROS{ UHCON |= (1 << SOFEN); }MACROE + + #define USB_Host_SuspendBus() MACROS{ UHCON &= ~(1 << SOFEN); }MACROE + + #define USB_Host_IsBusSuspended() ((UHCON & (1 << SOFEN)) ? false : true) - /** Returns true if no resume from Remote Wakeup request is currently being sent to an attached - * device, false otherwise. - */ - #define USB_Host_IsResumeFromWakeupRequestSent() ((UHCON & (1 << RESUME)) ? false : true) + #define USB_Host_IsDeviceFullSpeed() ((USBSTA & (1 << SPEED)) ? true : false) + + #define USB_Host_IsRemoteWakeupSent() ((UHINT & (1 << RXRSMI)) ? true : false) + + #define USB_Host_ClearRemoteWakeupSent() MACROS{ UHINT &= ~(1 << RXRSMI); }MACROE + + #define USB_Host_ResumeFromWakeupRequest() MACROS{ UHCON |= (1 << RESUME); }MACROE + + #define USB_Host_IsResumeFromWakeupRequestSent() ((UHCON & (1 << RESUME)) ? false : true) + #endif /* Enums: */ /** Enum for the various states of the USB Host state machine. Only some states are @@ -241,5 +279,7 @@ #if defined(__cplusplus) } #endif - + #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/LowLevel/HostChapter9.c b/LUFA/Drivers/USB/LowLevel/HostChapter9.c index 5367c984cb..c89910e630 100644 --- a/LUFA/Drivers/USB/LowLevel/HostChapter9.c +++ b/LUFA/Drivers/USB/LowLevel/HostChapter9.c @@ -52,19 +52,17 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) Pipe_SetToken(PIPE_TOKEN_SETUP); Pipe_ClearErrorFlags(); - Pipe_ClearSetupSent(); Pipe_Unfreeze(); for (uint8_t HeaderByte = 0; HeaderByte < sizeof(USB_Host_Request_Header_t); HeaderByte++) Pipe_Write_Byte(*(HeaderStream++)); - Pipe_ClearSetupOUT(); + Pipe_ClearControlSETUP(); if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_SetupSent))) goto End_Of_Control_Send; - Pipe_ClearSetupSent(); Pipe_Freeze(); if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) @@ -93,7 +91,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) } Pipe_Freeze(); - Pipe_ClearSetupIN(); + Pipe_ClearControlIN(); } } @@ -103,7 +101,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady))) goto End_Of_Control_Send; - Pipe_ClearSetupOUT(); + Pipe_ClearControlOUT(); if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady))) goto End_Of_Control_Send; @@ -126,7 +124,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) DataLen--; } - Pipe_ClearSetupOUT(); + Pipe_ClearControlOUT(); } if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_OutReady))) @@ -141,7 +139,7 @@ uint8_t USB_Host_SendControlRequest(void* BufferPtr) if ((ReturnStatus = USB_Host_Wait_For_Setup_IOS(USB_HOST_WAITFOR_InReceived))) goto End_Of_Control_Send; - Pipe_ClearSetupIN(); + Pipe_ClearControlIN(); } End_Of_Control_Send: @@ -159,9 +157,9 @@ static uint8_t USB_Host_Wait_For_Setup_IOS(const uint8_t WaitType) { uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS; - while (!(((WaitType == USB_HOST_WAITFOR_SetupSent) && Pipe_IsSetupSent()) || - ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsSetupINReceived()) || - ((WaitType == USB_HOST_WAITFOR_OutReady) && Pipe_IsSetupOUTReady()))) + while (!(((WaitType == USB_HOST_WAITFOR_SetupSent) && Pipe_IsSETUPSent()) || + ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) || + ((WaitType == USB_HOST_WAITFOR_OutReady) && Pipe_IsOUTReady()))) { uint8_t ErrorCode; diff --git a/LUFA/Drivers/USB/LowLevel/HostChapter9.h b/LUFA/Drivers/USB/LowLevel/HostChapter9.h index 7ced889b33..8e7695b34e 100644 --- a/LUFA/Drivers/USB/LowLevel/HostChapter9.h +++ b/LUFA/Drivers/USB/LowLevel/HostChapter9.h @@ -58,6 +58,8 @@ * * \see StdRequestType.h for information on the request type and data. * \see The USB 2.0 specification for more information on standard control requests. + * + * \ingroup Group_PipeControlReq */ typedef struct { @@ -71,6 +73,8 @@ /* Enums: */ /** Enum for the USB_Host_SendControlRequest() return code, indicating the reason for the error * if the transfer of the request is unsuccessful. + * + * \ingroup Group_PipeControlReq */ enum USB_Host_SendControlErrorCodes_t { @@ -89,6 +93,8 @@ /** Global for the request to send via the USB_Host_SendControlRequest() function. This * global should be filled with the correct control request data before sending the request to * the attached device while in host mode. + * + * \ingroup Group_PipeControlReq */ extern USB_Host_Request_Header_t USB_HostRequest; @@ -97,6 +103,8 @@ * and transfers the data stored in the buffer to the device, or from the device to the buffer * as requested. The transfer is made on the currently selected pipe. * + * \ingroup Group_PipeControlReq + * * \param BufferPtr Pointer to the start of the data buffer if the request has a data stage, or * NULL if the request transfers no data to or from the device. * diff --git a/LUFA/Drivers/USB/LowLevel/LowLevel.h b/LUFA/Drivers/USB/LowLevel/LowLevel.h index 07be4396d2..a6f506f3b0 100644 --- a/LUFA/Drivers/USB/LowLevel/LowLevel.h +++ b/LUFA/Drivers/USB/LowLevel/LowLevel.h @@ -34,6 +34,14 @@ * USB interface in either device or (if supported) host mode. */ +/** \ingroup Group_USB + * @defgroup Group_USBManagement USB Interface Management + * + * Functions, macros, variables, enums and types related to the setup and management of the USB interface. + * + * @{ + */ + #ifndef __USBLOWLEVEL_H__ #define __USBLOWLEVEL_H__ @@ -70,7 +78,6 @@ /* Preprocessor Checks and Defines: */ #if !defined(F_CLOCK) #error F_CLOCK is not defined. You must device F_CLOCK to the frequency of the unprescaled input clock in your project makefile. - #define F_CLOCK 0 #endif #if (F_CLOCK == 8000000) @@ -376,3 +383,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/LowLevel/OTG.h b/LUFA/Drivers/USB/LowLevel/OTG.h index 88a9554039..caef82cb6b 100644 --- a/LUFA/Drivers/USB/LowLevel/OTG.h +++ b/LUFA/Drivers/USB/LowLevel/OTG.h @@ -35,6 +35,14 @@ * * \note These macros are only for AVRs which support the OTG protocol, and do not exist for device-only AVRs. */ + +/** \ingroup Group_USB + * @defgroup Group_OTGManagement USB On The Go (OTG) Management + * + * Functions, macros, variables, enums and types related to the setup and management of dual role devices. + * + * @{ + */ #ifndef __USBOTG_H__ #define __USBOTG_H__ @@ -47,46 +55,6 @@ /* Public Interface - May be used in end-application: */ /* Macros: */ - /** Initiate a Host Negotiation Protocol request. This indicates to the other connected device - * that the device wishes to change device/host roles. - */ - #define USB_OTG_DEV_Request_HNP() MACROS{ OTGCON |= (1 << HNPREQ); }MACROE - - /** Cancel a Host Negotiation Protocol request. This stops a pending HNP request to the other - * connected device. - */ - #define USB_OTG_DEV_Cancel_HNP_Request() MACROS{ OTGCON &= ~(1 << HNPREQ); }MACROE - - /** Returns boolean false if not currently sending a HNP to the other connected device, or true - * if a HNP is currently being issued. - */ - #define USB_OTG_DEV_IsSendingHNP() ((OTGCON & (1 << HNPREQ)) ? true : false) - - /** Accepts a HNP from a connected device, indicating that both devices should exchange - * device/host roles. - */ - #define USB_OTG_HOST_Accept_HNP() USB_OTG_DEV_Request_HNP() - - /** Rejects a HNP from a connected device, indicating that both devices should remain in their - * current device/host roles. - */ - #define USB_OTG_HOST_Reject_HNP() USB_OTG_DEV_Cancel_HNP_Request() - - /** Returns boolean false if the connected device is not currently sending a HNP request, or true - * if a HNP is currently being issued by the connected device. - */ - #define USB_OTG_HOST_IsHNPReceived() ((OTGCON & (1 << HNPREQ)) ? true : false) - - /** Initiates a Session Request Protocol request. Most OTG devices turn off VBUS when the USB - * interface is not in use, to conserve power. Sending a SRP to a USB OTG device running in - * host mode indicates that VBUS should be applied and a session started. - * - * There are two different methods of sending a SRP - either pulses on the VBUS line, or by - * pulsing the Data + line via the internal pull-up resistor. The SRP mode is given as the - * "type" parameter, and can be either USB_OTG_SRP_VBUS or USB_OTG_STP_DATA. - */ - #define USB_OTG_DEV_Initiate_SRP(type) MACROS{ OTGCON = ((OTGCON & ~(1 << SRPSEL)) | (type | (1 << SRPREQ))); }MACROE - /** Mask for the VBUS pulsing method of SRP, supported by some OTG devices. * * \see USB_OTG_DEV_Initiate_SRP() @@ -99,4 +67,67 @@ */ #define USB_OTG_STP_DATA 0 + /* Psuedo-Function Macros: */ + #if defined(__DOXYGEN__) + /** Initiate a Host Negotiation Protocol request. This indicates to the other connected device + * that the device wishes to change device/host roles. + */ + static inline void USB_OTG_DEV_Request_HNP(void); + + /** Cancel a Host Negotiation Protocol request. This stops a pending HNP request to the other + * connected device. + */ + static inline void USB_OTG_DEV_Cancel_HNP_Request(void); + + /** Determines if the device is currently sending a HNP to an attached host. + * + * \return Boolean true if currently sending a HNP to the other connected device, false otherwise + */ + static inline bool USB_OTG_DEV_IsSendingHNP(void); + + /** Accepts a HNP from a connected device, indicating that both devices should exchange + * device/host roles. + */ + static inline void USB_OTG_HOST_Accept_HNP(void); + + /** Rejects a HNP from a connected device, indicating that both devices should remain in their + * current device/host roles. + */ + static inline void USB_OTG_HOST_Reject_HNP(void); + + /** Indicates if the connected device is not currently sending a HNP request. + * + * \return Boolean true if a HNP is currently being issued by the connected device, false otherwise. + */ + static inline bool USB_OTG_HOST_IsHNPReceived(void); + + /** Initiates a Session Request Protocol request. Most OTG devices turn off VBUS when the USB + * interface is not in use, to conserve power. Sending a SRP to a USB OTG device running in + * host mode indicates that VBUS should be applied and a session started. + * + * There are two different methods of sending a SRP - either pulses on the VBUS line, or by + * pulsing the Data + line via the internal pull-up resistor. + * + * \param SRPTypeMask Mask indicating the type of SRP to use, either USB_OTG_SRP_VBUS or USB_OTG_STP_DATA. + */ + static inline void USB_OTG_DEV_Initiate_SRP(uint8_t SRPTypeMask); + #else + + #define USB_OTG_DEV_Request_HNP() MACROS{ OTGCON |= (1 << HNPREQ); }MACROE + + #define USB_OTG_DEV_Cancel_HNP_Request() MACROS{ OTGCON &= ~(1 << HNPREQ); }MACROE + + #define USB_OTG_DEV_IsSendingHNP() ((OTGCON & (1 << HNPREQ)) ? true : false) + + #define USB_OTG_HOST_Accept_HNP() MACROS{ OTGCON |= (1 << HNPREQ); }MACROE + + #define USB_OTG_HOST_Reject_HNP() MACROS{ OTGCON &= ~(1 << HNPREQ); }MACROE + + #define USB_OTG_HOST_IsHNPReceived() ((OTGCON & (1 << HNPREQ)) ? true : false) + + #define USB_OTG_DEV_Initiate_SRP(type) MACROS{ OTGCON = ((OTGCON & ~(1 << SRPSEL)) | (type | (1 << SRPREQ))); }MACROE + #endif + #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.c b/LUFA/Drivers/USB/LowLevel/Pipe.c index 1218d2f247..5850fcf7c1 100644 --- a/LUFA/Drivers/USB/LowLevel/Pipe.c +++ b/LUFA/Drivers/USB/LowLevel/Pipe.c @@ -74,8 +74,19 @@ uint8_t Pipe_WaitUntilReady(void) USB_INT_Clear(USB_INT_HSOFI); - while (!(Pipe_ReadWriteAllowed())) + for (;;) { + if (Pipe_GetPipeToken() == PIPE_TOKEN_IN) + { + if (Pipe_IsINReceived()) + return PIPE_READYWAIT_NoError; + } + else + { + if (Pipe_IsOUTReady()) + return PIPE_READYWAIT_NoError; + } + if (Pipe_IsStalled()) return PIPE_READYWAIT_PipeStalled; else if (!(USB_IsConnected)) @@ -89,8 +100,6 @@ uint8_t Pipe_WaitUntilReady(void) return PIPE_READYWAIT_Timeout; } } - - return PIPE_READYWAIT_NoError; } uint8_t Pipe_Write_Stream_LE(const void* Data, uint16_t Length @@ -107,9 +116,9 @@ uint8_t Pipe_Write_Stream_LE(const void* Data, uint16_t Length while (Length--) { - if (!(Pipe_ReadWriteAllowed())) + if (!(Pipe_IsReadWriteAllowed())) { - Pipe_ClearCurrentBank(); + Pipe_ClearOUT(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) @@ -119,8 +128,10 @@ uint8_t Pipe_Write_Stream_LE(const void* Data, uint16_t Length if ((ErrorCode = Pipe_WaitUntilReady())) return ErrorCode; } - - Pipe_Write_Byte(*(DataStream++)); + else + { + Pipe_Write_Byte(*(DataStream++)); + } } return PIPE_RWSTREAM_ERROR_NoError; @@ -140,9 +151,9 @@ uint8_t Pipe_Write_Stream_BE(const void* Data, uint16_t Length while (Length--) { - if (!(Pipe_ReadWriteAllowed())) + if (!(Pipe_IsReadWriteAllowed())) { - Pipe_ClearCurrentBank(); + Pipe_ClearOUT(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) @@ -152,8 +163,10 @@ uint8_t Pipe_Write_Stream_BE(const void* Data, uint16_t Length if ((ErrorCode = Pipe_WaitUntilReady())) return ErrorCode; } - - Pipe_Write_Byte(*(DataStream--)); + else + { + Pipe_Write_Byte(*(DataStream--)); + } } return PIPE_RWSTREAM_ERROR_NoError; @@ -172,9 +185,9 @@ uint8_t Pipe_Discard_Stream(uint16_t Length while (Length--) { - if (!(Pipe_ReadWriteAllowed())) + if (!(Pipe_IsReadWriteAllowed())) { - Pipe_ClearCurrentBank(); + Pipe_ClearIN(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) @@ -184,8 +197,10 @@ uint8_t Pipe_Discard_Stream(uint16_t Length if ((ErrorCode = Pipe_WaitUntilReady())) return ErrorCode; } - - Pipe_Discard_Byte(); + else + { + Pipe_Discard_Byte(); + } } return PIPE_RWSTREAM_ERROR_NoError; @@ -205,9 +220,9 @@ uint8_t Pipe_Read_Stream_LE(void* Buffer, uint16_t Length while (Length--) { - if (!(Pipe_ReadWriteAllowed())) + if (!(Pipe_IsReadWriteAllowed())) { - Pipe_ClearCurrentBank(); + Pipe_ClearIN(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) @@ -217,8 +232,10 @@ uint8_t Pipe_Read_Stream_LE(void* Buffer, uint16_t Length if ((ErrorCode = Pipe_WaitUntilReady())) return ErrorCode; } - - *(DataStream++) = Pipe_Read_Byte(); + else + { + *(DataStream++) = Pipe_Read_Byte(); + } } return PIPE_RWSTREAM_ERROR_NoError; @@ -238,9 +255,9 @@ uint8_t Pipe_Read_Stream_BE(void* Buffer, uint16_t Length while (Length--) { - if (!(Pipe_ReadWriteAllowed())) + if (!(Pipe_IsReadWriteAllowed())) { - Pipe_ClearCurrentBank(); + Pipe_ClearIN(); #if !defined(NO_STREAM_CALLBACKS) if ((Callback != NULL) && (Callback() == STREAMCALLBACK_Abort)) @@ -250,8 +267,10 @@ uint8_t Pipe_Read_Stream_BE(void* Buffer, uint16_t Length if ((ErrorCode = Pipe_WaitUntilReady())) return ErrorCode; } - - *(DataStream--) = Pipe_Read_Byte(); + else + { + *(DataStream--) = Pipe_Read_Byte(); + } } return PIPE_RWSTREAM_ERROR_NoError; diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.h b/LUFA/Drivers/USB/LowLevel/Pipe.h index 46a10e493c..253ce2a93a 100644 --- a/LUFA/Drivers/USB/LowLevel/Pipe.h +++ b/LUFA/Drivers/USB/LowLevel/Pipe.h @@ -35,6 +35,29 @@ * send/recieve functions for various data types. */ +/** \ingroup Group_USB + * @defgroup Group_PipeManagement Pipe Management + * + * Functions, macros, variables, enums and types related to the setup and management of pipes while in USB Device mode. + * + * @{ + */ + +/** @defgroup Group_PipeRW Pipe Data Reading and Writing + * + * Functions, macros, variables, enums and types related to data reading and writing from and to pipes. + */ + +/** @defgroup Group_PipePacketManagement Pipe Packet Management + * + * Functions, macros, variables, enums and types related to packet management of pipes. + */ + +/** @defgroup Group_PipeControlReq Pipe Control Request Management + * + * Functions, macros, variables, enums and types related to control request management of pipes. + */ + #ifndef __PIPE_H__ #define __PIPE_H__ @@ -221,158 +244,339 @@ */ #define PIPE_INT_STALL UPIENX, (1 << RXSTALLE), UPINTX, (1 << RXSTALLI) - /** Indicates the number of bytes currently stored in the current pipe's selected bank. */ - #define Pipe_BytesInPipe() UPBCX + /* Psuedo-Function Macros: */ + #if defined(__DOXYGEN__) + /** Indicates the number of bytes currently stored in the current pipes's selected bank. + * + * \note The return width of this function may differ, depending on the maximum pipe bank size + * of the selected AVR model. + * + * \ingroup Group_PipeRW + * + * \return Total number of bytes in the currently selected Pipe's FIFO buffer + */ + static inline uint16_t Pipe_BytesInPipe(void); + + /** Returns the pipe address of the currently selected pipe. This is typically used to save the + * currently selected pipe number so that it can be restored after another pipe has been manipulated. + * + * \return Index of the currently selected pipe + */ + static inline uint8_t Pipe_GetCurrentPipe(void); - /** Resets the desired pipe, including the pipe banks and flags. */ - #define Pipe_ResetPipe(pipenum) MACROS{ UPRST = (1 << pipenum); UPRST = 0; }MACROE + /** Selects the given pipe number. Any pipe operations which do not require the pipe number to be + * indicated will operate on the currently selected pipe. + * + * \param PipeNumber Index of the pipe to select + */ + static inline void Pipe_SelectPipe(uint8_t PipeNumber); + + /** Resets the desired pipe, including the pipe banks and flags. + * + * \param PipeNumber Index of the pipe to reset + */ + static inline void Pipe_ResetPipe(uint8_t PipeNumber); + + /** Enables the currently selected pipe so that data can be sent and received through it to and from + * an attached device. + * + * \note Pipes must first be configured properly rather than just being enabled via the + * Pipe_ConfigurePipe() macro, which calls Pipe_EnablePipe() automatically. + */ + static inline void Pipe_EnablePipe(void); - /** Selects the given pipe number. Any pipe operations which do not require the pipe number to be - * indicated will operate on the currently selected pipe. - */ - #define Pipe_SelectPipe(pipenum) MACROS{ UPNUM = pipenum; }MACROE + /** Disables the currently selected pipe so that data cannot be sent and received through it to and + * from an attached device. + */ + static inline void Pipe_DisablePipe(void); - /** Returns the pipe address of the currently selected pipe. This is typically used to save the - * currently selected pipe number so that it can be restored after another pipe has been manipulated. - */ - #define Pipe_GetCurrentPipe() (UPNUM & PIPE_PIPENUM_MASK) + /** Determines if the currently selected pipe is enabled, but not necessarily configured. + * + * \return Boolean True if the currently selected pipe is enabled, false otherwise + */ + static inline bool Pipe_IsEnabled(void); + + /** Gets the current pipe token, indicating the pipe's data direction and type. + * + * \return The current pipe token, as a PIPE_TOKEN_* mask + */ + static inline uint8_t Pipe_GetCurrentToken(void); + + /** Sets the token for the currently selected pipe to one of the tokens specified by the PIPE_TOKEN_* + * masks. This can be used on CONTROL type pipes, to allow for bidirectional transfer of data during + * control requests, or on regular pipes to allow for half-duplex bidirectional data transfer to devices + * which have two endpoints of opposite direction sharing the same endpoint address within the device. + * + * \param Token New pipe token to set the selected pipe to, as a PIPE_TOKEN_* mask + */ + static inline void Pipe_SetPipeToken(uint8_t Token); + + /** Configures the currently selected pipe to allow for an unlimited number of IN requests. */ + static inline void Pipe_SetInfiniteINRequests(void); + + /** Configures the currently selected pipe to only allow the specified number of IN requests to be + * accepted by the pipe before it is automatically frozen. + * + * \param TotalINRequests Total number of IN requests that the pipe may receive before freezing + */ + static inline void Pipe_SetFiniteINRequests(uint8_t TotalINRequests); - /** Enables the currently selected pipe so that data can be sent and received through it to and from - * an attached device. - * - * \note Pipes must first be configured properly rather than just being enabled via the - * Pipe_ConfigurePipe() macro, which calls Pipe_EnablePipe() automatically. - */ - #define Pipe_EnablePipe() MACROS{ UPCONX |= (1 << PEN); }MACROE + /** Determines if the currently selected pipe is configured. + * + * \return Boolean true if the selected pipe is configured, false otherwise + */ + static inline bool Pipe_IsConfigured(void); + + /** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds. + * + * \param Milliseconds Number of milliseconds between each pipe poll + */ + static inline void Pipe_SetInterruptPeriod(uint8_t Milliseconds); + + /** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should + * be serviced. + * + * \return Mask whose bits indicate which pipes have interrupted + */ + static inline uint8_t Pipe_GetPipeInterrupts(void); + + /** Clears the interrupt flag for the specified pipe number. + * + * \param PipeNumber Index of the pipe whose interrupt flag is to be cleared + */ + static inline void Pipe_ClearPipeInterrupt(uint8_t PipeNumber); + + /** Determines if the specified pipe number has interrupted (valid only for INTERRUPT type + * pipes). + * + * \param PipeNumber Index of the pipe whose interrupt flag should be tested + * + * \return Boolean true if the specified pipe has interrupted, false otherwise + */ + static inline bool Pipe_HasPipeInterrupted(uint8_t PipeNumber); + + /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */ + static inline void Pipe_Unfreeze(void); + + /** Freezes the selected pipe, preventing it from communicating with an attached device. */ + static inline void Pipe_Freeze(void); - /** Disables the currently selected pipe so that data cannot be sent and received through it to and - * from an attached device. - */ - #define Pipe_DisablePipe() MACROS{ UPCONX &= ~(1 << PEN); }MACROE + /** Clears the master pipe error flag. */ + static inline void Pipe_ClearError(void); + + /** Determines if the master pipe error flag is set for the currently selected pipe, indicating that + * some sort of hardware error has occurred on the pipe. + * + * \see Pipe_GetErrorFlags() macro for information on retrieving the exact error flag. + * + * \return Boolean true if an error has ocurred on the selected pipe, false otherwise + */ + static inline bool Pipe_IsError(void); + + /** Clears all the currently selected pipe's hardware error flags, but does not clear the master error + * flag for the pipe. + */ + static inline void Pipe_ClearErrorFlags(void); + + /** Gets a mask of the hardware error flags which have occurred on the currently selected pipe. This + * value can then be masked against the PIPE_ERRORFLAG_* masks to determine what error has occurred. + * + * \return Mask comprising of PIPE_ERRORFLAG_* bits indicating what error has ocurred on the selected pipe + */ + static inline uint8_t Pipe_GetErrorFlags(void); + + /** Determines if the currently selected pipe may be read from (if data is waiting in the pipe + * bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT + * direction). This function will return false if an error has occurred in the pipe, or if the pipe + * is an IN direction and no packet (or an empty packet) has been received, or if the pipe is an OUT + * direction and the pipe bank is full. + * + * \ingroup Group_PipePacketManagement + * + * \return Boolean true if the currently selected pipe may be read from or written to, depending on its direction + */ + static inline bool Pipe_IsReadWriteAllowed(void); + + /** Determines if an IN request has been received on the currently selected pipe. + * + * \ingroup Group_PipePacketManagement + * + * \return Boolean true if the current pipe has received an IN packet, false otherwise. + */ + static inline bool Pipe_IsINReceived(void); + + /** Determines if the currently selected pipe is ready to send an OUT request. + * + * \ingroup Group_PipePacketManagement + * + * \return Boolean true if the current pipe is ready for an OUT packet, false otherwise. + */ + static inline bool Pipe_IsOUTReady(void); - /** Returns true if the currently selected pipe is enabled, false otherwise. */ - #define Pipe_IsEnabled() ((UPCONX & (1 << PEN)) ? true : false) + /** Determines if no SETUP request is currently being sent to the attached device on the selected + * CONTROL type pipe. + * + * \ingroup Group_PipePacketManagement + * + * \return Boolean true if the current pipe is ready for a SETUP packet, false otherwise. + */ + static inline bool Pipe_IsSETUPSent(void); + + /** Acknowledges the reception of a setup IN request from the attached device on the currently selected + * CONTROL type pipe, freeing the bank ready for the next packet. + * + * \ingroup Group_PipePacketManagement + * + * \note For non CONTROL type pipes, use Pipe_ClearIN() instead. + */ + static inline void Pipe_ClearControlIN(void); - /** Sets the token for the currently selected endpoint to one of the tokens specified by the PIPE_TOKEN_* - * masks. This should only be used on CONTROL type endpoints, to allow for bidirectional transfer of - * data during control requests. - */ - #define Pipe_SetToken(token) MACROS{ UPCFG0X = ((UPCFG0X & ~PIPE_TOKEN_MASK) | token); }MACROE - - /** Configures the currently selected pipe to allow for an unlimited number of IN requests. */ - #define Pipe_SetInfiniteINRequests() MACROS{ UPCONX |= (1 << INMODE); }MACROE + /** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing + * the bank ready for the next packet. + * + * \ingroup Group_PipePacketManagement + * + * \note For non CONTROL type pipes, use Pipe_ClearOUT() instead. + */ + static inline void Pipe_ClearControlOUT(void); - /** Configures the currently selected pipe to only allow the specified number of IN requests to be - * accepted by the pipe before it is automatically frozen. - */ - #define Pipe_SetFiniteINRequests(n) MACROS{ UPCONX &= ~(1 << INMODE); UPINRQX = n; }MACROE + /** Sends the currently selected CONTROL type pipe's contents to the device as a SETUP packet. + * + * \ingroup Group_PipePacketManagement + * + * \note This is not applicable for non CONTROL type pipes. + */ + static inline void Pipe_ClearControlSETUP(void); - /** Returns true if the currently selected pipe is configured, false otherwise. */ - #define Pipe_IsConfigured() ((UPSTAX & (1 << CFGOK)) ? true : false) + /** Acknowledges the reception of a setup IN request from the attached device on the currently selected + * pipe, freeing the bank ready for the next packet. + * + * \ingroup Group_PipePacketManagement + * + * \note For CONTROL type pipes, use Pipe_ClearControlIN() instead. + */ + static inline void Pipe_ClearIN(void); - /** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds. */ - #define Pipe_SetInterruptPeriod(ms) MACROS{ UPCFG2X = ms; }MACROE + /** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing + * the bank ready for the next packet. + * + * \ingroup Group_PipePacketManagement + * + * \note For CONTROL type pipes, use Pipe_ClearControlOUT() instead. + */ + static inline void Pipe_ClearOUT(void); - /** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should - * be serviced. - */ - #define Pipe_GetPipeInterrupts() UPINT + /** Determines if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on + * the currently selected pipe. This occurs when the host sends a packet to the device, but the device + * is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been + * received, it must be cleared using Pipe_ClearNAKReceived() before the previous (or any other) packet + * can be re-sent. + * + * \ingroup Group_PipePacketManagement + * + * \return Boolean true if an NAK has been received on the current pipe, false otherwise + */ + static inline bool Pipe_IsNAKReceived(void); - /** Clears the interrupt flag for the specified pipe number. */ - #define Pipe_ClearPipeInterrupt(n) MACROS{ UPINT &= ~(1 << n); }MACROE + /** Clears the NAK condition on the currently selected pipe. + * + * \ingroup Group_PipePacketManagement + * + * \see Pipe_IsNAKReceived() for more details. + */ + static inline void Pipe_ClearNAKReceived(void); + + /** Determines if the currently selected pipe has had the STALL condition set by the attached device. + * + * \ingroup Group_PipePacketManagement + * + * \return Boolean true if the current pipe has been stalled by the attached device, false otherwise + */ + static inline bool Pipe_IsStalled(void); + + /** Clears the STALL condition detection flag on the currently selected pipe, but does not clear the + * STALL condition itself (this must be done via a ClearFeature control request to the device). + * + * \ingroup Group_PipePacketManagement + */ + static inline void Pipe_ClearStall(void); + #else + #define Pipe_BytesInPipe() UPBCX - /** Returns true if the specified pipe's interrupt period has elapsed, false otherwise. */ - #define Pipe_HasPipeInterrupted(n) ((UPINT & (1 << n)) ? true : false) - - /** Clears the pipe bank, and switches to the alternate bank if the currently selected pipe is - * dual-banked. When cleared, this either frees the bank up for the next packet from the host - * (if the endpoint is of the OUT direction) or sends the packet contents to the host (if the - * pipe is of the IN direction). - */ - #define Pipe_ClearCurrentBank() MACROS{ UPINTX &= ~(1 << FIFOCON); }MACROE + #define Pipe_GetCurrentPipe() (UPNUM & PIPE_PIPENUM_MASK) - /** Unfreezes the pipe, allowing it to communicate with an attached device. */ - #define Pipe_Unfreeze() MACROS{ UPCONX &= ~(1 << PFREEZE); }MACROE + #define Pipe_SelectPipe(pipenum) MACROS{ UPNUM = pipenum; }MACROE + + #define Pipe_ResetPipe(pipenum) MACROS{ UPRST = (1 << pipenum); UPRST = 0; }MACROE - /** Freezes the pipe, preventing it from communicating with an attached device. */ - #define Pipe_Freeze() MACROS{ UPCONX |= (1 << PFREEZE); }MACROE + #define Pipe_EnablePipe() MACROS{ UPCONX |= (1 << PEN); }MACROE - /** Clears the master pipe error flag. */ - #define Pipe_ClearError() MACROS{ UPINTX &= ~(1 << PERRI); }MACROE + #define Pipe_DisablePipe() MACROS{ UPCONX &= ~(1 << PEN); }MACROE - /** Returns true if the master pipe error flag is set for the currently selected pipe, indicating that - * some sort of hardware error has occurred on the pipe. - * - * \see Pipe_GetErrorFlags() macro for information on retrieving the exact error flag. - */ - #define Pipe_IsError() ((UPINTX & (1 << PERRI)) ? true : false) - - /** Clears all the currently selected pipe's hardware error flags, but does not clear the master error - * flag for the pipe. */ - #define Pipe_ClearErrorFlags() MACROS{ UPERRX = 0; }MACROE + #define Pipe_IsEnabled() ((UPCONX & (1 << PEN)) ? true : false) - /** Returns a mask of the hardware error flags which have occurred on the currently selected pipe. This - * value can then be masked against the PIPE_ERRORFLAG_* masks to determine what error has occurred. - */ - #define Pipe_GetErrorFlags() UPERRX + #define Pipe_GetPipeToken() (UPCFG0X & PIPE_TOKEN_MASK) - /** Returns true if the currently selected pipe may be read from (if data is waiting in the pipe - * bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT - * direction). This function will return false if an error has occurred in the pipe, or if the pipe - * is an IN direction and no packet has been received, or if the pipe is an OUT direction and the - * pipe bank is full. - */ - #define Pipe_ReadWriteAllowed() ((UPINTX & (1 << RWAL)) ? true : false) + #define Pipe_SetToken(token) MACROS{ UPCFG0X = ((UPCFG0X & ~PIPE_TOKEN_MASK) | token); }MACROE + + #define Pipe_SetInfiniteINRequests() MACROS{ UPCONX |= (1 << INMODE); }MACROE - /** Clears the flag indicating that a SETUP request has been sent to the attached device from the - * currently selected CONTROL type pipe. - */ - #define Pipe_ClearSetupSent() MACROS{ UPINTX &= ~(1 << TXSTPI); }MACROE + #define Pipe_SetFiniteINRequests(n) MACROS{ UPCONX &= ~(1 << INMODE); UPINRQX = n; }MACROE - /** Returns true if no SETUP request is currently being sent to the attached device, false otherwise. */ - #define Pipe_IsSetupSent() ((UPINTX & (1 << TXSTPI)) ? true : false) + #define Pipe_IsConfigured() ((UPSTAX & (1 << CFGOK)) ? true : false) - /** Returns true if the currently selected pipe has been stalled by the attached device, false otherwise. */ - #define Pipe_IsStalled() ((UPINTX & (1 << RXSTALLI)) ? true : false) + #define Pipe_SetInterruptPeriod(ms) MACROS{ UPCFG2X = ms; }MACROE - /** Clears the stall condition on the currently selected pipe. */ - #define Pipe_ClearStall() MACROS{ UPINTX &= ~(1 << RXSTALLI); }MACROE + #define Pipe_GetPipeInterrupts() UPINT - /** Returns true if an IN request has been received on the currently selected CONTROL type pipe, false - * otherwise. - */ - #define Pipe_IsSetupINReceived() ((UPINTX & (1 << RXINI)) ? true : false) + #define Pipe_ClearPipeInterrupt(n) MACROS{ UPINT &= ~(1 << n); }MACROE - /** Returns true if the currently selected CONTROL type pipe is ready to send an OUT request, false - * otherwise. - */ - #define Pipe_IsSetupOUTReady() ((UPINTX & (1 << TXOUTI)) ? true : false) + #define Pipe_HasPipeInterrupted(n) ((UPINT & (1 << n)) ? true : false) - /** Acknowledges the reception of a setup IN request from the attached device on the currently selected - * CONTROL type endpoint, allowing for the transmission of a setup OUT packet, or the reception of - * another setup IN packet. - */ - #define Pipe_ClearSetupIN() MACROS{ UPINTX &= ~(1 << RXINI); UPINTX &= ~(1 << FIFOCON); }MACROE + #define Pipe_Unfreeze() MACROS{ UPCONX &= ~(1 << PFREEZE); }MACROE - /** Sends the currently selected CONTROL type pipe's contents to the device as a setup OUT packet. */ - #define Pipe_ClearSetupOUT() MACROS{ UPINTX &= ~(1 << TXOUTI); UPINTX &= ~(1 << FIFOCON); }MACROE - - /** Returns true if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on - * the currently selected pipe. This occurs when the host sends a packet to the device, but the device - * is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been - * received, it must be cleared using Pipe_ClearNAKReceived() before the previous (or any other) packet - * can be re-sent. - */ - #define Pipe_IsNAKReceived() ((UPINTX & (1 << NAKEDI)) ? true : false) + #define Pipe_Freeze() MACROS{ UPCONX |= (1 << PFREEZE); }MACROE - /** Clears the NAK condition on the currently selected pipe. - * - * \see Pipe_IsNAKReceived() for more details. - */ - #define Pipe_ClearNAKReceived() MACROS{ UPINTX &= ~(1 << NAKEDI); }MACROE + #define Pipe_ClearError() MACROS{ UPINTX &= ~(1 << PERRI); }MACROE + + #define Pipe_IsError() ((UPINTX & (1 << PERRI)) ? true : false) + + #define Pipe_ClearErrorFlags() MACROS{ UPERRX = 0; }MACROE + + #define Pipe_GetErrorFlags() UPERRX + + #define Pipe_IsReadWriteAllowed() ((UPINTX & (1 << RWAL)) ? true : false) + + #define Pipe_IsINReceived() ((UPINTX & (1 << RXINI)) ? true : false) + + #define Pipe_IsOUTReady() ((UPINTX & (1 << TXOUTI)) ? true : false) + + #define Pipe_IsSETUPSent() ((UPINTX & (1 << TXSTPI)) ? true : false) + + #define Pipe_ClearIN() MACROS{ UPINTX &= ~(1 << RXINI); UPINTX &= ~(1 << FIFOCON); }MACROE + + #define Pipe_ClearControlIN() MACROS{ UPINTX &= ~(1 << RXINI); UPINTX &= ~(1 << FIFOCON); }MACROE + + #define Pipe_ClearOUT() MACROS{ UPINTX &= ~(1 << TXOUTI); UPINTX &= ~(1 << FIFOCON); }MACROE + + #define Pipe_ClearControlOUT() MACROS{ UPINTX &= ~(1 << TXOUTI); UPINTX &= ~(1 << FIFOCON); }MACROE + + #define Pipe_ClearControlSETUP() MACROS{ UPINTX &= ~(1 << TXSTPI); UPINTX &= ~(1 << FIFOCON); }MACROE + + #define Pipe_IsNAKReceived() ((UPINTX & (1 << NAKEDI)) ? true : false) + + #define Pipe_ClearNAKReceived() MACROS{ UPINTX &= ~(1 << NAKEDI); }MACROE + + #define Pipe_IsStalled() ((UPINTX & (1 << RXSTALLI)) ? true : false) + + #define Pipe_ClearStall() MACROS{ UPINTX &= ~(1 << RXSTALLI); }MACROE + #endif /* Enums: */ - /** Enum for the possible error return codes of the Pipe_WaitUntilReady function */ + /** Enum for the possible error return codes of the Pipe_WaitUntilReady function + * + * \ingroup Group_PipeRW + */ enum Pipe_WaitUntilReady_ErrorCodes_t { PIPE_READYWAIT_NoError = 0, /**< Pipe ready for next packet, no error */ @@ -384,7 +588,10 @@ */ }; - /** Enum for the possible error return codes of the Pipe_*_Stream_* functions. */ + /** Enum for the possible error return codes of the Pipe_*_Stream_* functions. + * + * \ingroup Group_PipeRW + */ enum Pipe_Stream_RW_ErrorCodes_t { PIPE_RWSTREAM_ERROR_NoError = 0, /**< Command completed successfully, no error. */ @@ -402,21 +609,34 @@ }; /* Inline Functions: */ - /** Reads one byte from the currently selected pipe's bank, for OUT direction pipes. */ + /** Reads one byte from the currently selected pipe's bank, for OUT direction pipes. + * + * \ingroup Group_PipeRW + * + * \return Next byte in the currently selected pipe's FIFO buffer + */ static inline uint8_t Pipe_Read_Byte(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint8_t Pipe_Read_Byte(void) { return UPDATX; } - /** Writes one byte from the currently selected pipe's bank, for IN direction pipes. */ + /** Writes one byte from the currently selected pipe's bank, for IN direction pipes. + * + * \ingroup Group_PipeRW + * + * \param Byte Next byte to write into the the currently selected pipe's FIFO buffer + */ static inline void Pipe_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE; static inline void Pipe_Write_Byte(const uint8_t Byte) { UPDATX = Byte; } - /** Discards one byte from the currently selected pipe's bank, for OUT direction pipes. */ + /** Discards one byte from the currently selected pipe's bank, for OUT direction pipes. + * + * \ingroup Group_PipeRW + */ static inline void Pipe_Discard_Byte(void) ATTR_ALWAYS_INLINE; static inline void Pipe_Discard_Byte(void) { @@ -427,6 +647,10 @@ /** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT * direction pipes. + * + * \ingroup Group_PipeRW + * + * \return Next word in the currently selected pipe's FIFO buffer */ static inline uint16_t Pipe_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Pipe_Read_Word_LE(void) @@ -441,6 +665,10 @@ /** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT * direction pipes. + * + * \ingroup Group_PipeRW + * + * \return Next word in the currently selected pipe's FIFO buffer */ static inline uint16_t Pipe_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint16_t Pipe_Read_Word_BE(void) @@ -455,6 +683,10 @@ /** Writes two bytes to the currently selected pipe's bank in little endian format, for IN * direction pipes. + * + * \ingroup Group_PipeRW + * + * \param Word Next word to write to the currently selected pipe's FIFO buffer */ static inline void Pipe_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE; static inline void Pipe_Write_Word_LE(const uint16_t Word) @@ -465,6 +697,10 @@ /** Writes two bytes to the currently selected pipe's bank in big endian format, for IN * direction pipes. + * + * \ingroup Group_PipeRW + * + * \param Word Next word to write to the currently selected pipe's FIFO buffer */ static inline void Pipe_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE; static inline void Pipe_Write_Word_BE(const uint16_t Word) @@ -473,9 +709,12 @@ UPDATX = (Word & 0xFF); } - /** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes. */ - static inline void Pipe_Ignore_Word(void) ATTR_ALWAYS_INLINE; - static inline void Pipe_Ignore_Word(void) + /** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes. + * + * \ingroup Group_PipeRW + */ + static inline void Pipe_Discard_Word(void) ATTR_ALWAYS_INLINE; + static inline void Pipe_Discard_Word(void) { uint8_t Dummy; @@ -485,6 +724,10 @@ /** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT * direction pipes. + * + * \ingroup Group_PipeRW + * + * \return Next double word in the currently selected pipe's FIFO buffer */ static inline uint32_t Pipe_Read_DWord_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint32_t Pipe_Read_DWord_LE(void) @@ -505,6 +748,10 @@ /** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT * direction pipes. + * + * \ingroup Group_PipeRW + * + * \return Next double word in the currently selected pipe's FIFO buffer */ static inline uint32_t Pipe_Read_DWord_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; static inline uint32_t Pipe_Read_DWord_BE(void) @@ -525,6 +772,10 @@ /** Writes four bytes to the currently selected pipe's bank in little endian format, for IN * direction pipes. + * + * \ingroup Group_PipeRW + * + * \param DWord Next double word to write to the currently selected pipe's FIFO buffer */ static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE; static inline void Pipe_Write_DWord_LE(const uint32_t DWord) @@ -535,6 +786,10 @@ /** Writes four bytes to the currently selected pipe's bank in big endian format, for IN * direction pipes. + * + * \ingroup Group_PipeRW + * + * \param DWord Next double word to write to the currently selected pipe's FIFO buffer */ static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE; static inline void Pipe_Write_DWord_BE(const uint32_t DWord) @@ -543,7 +798,10 @@ Pipe_Write_Word_BE(DWord); } - /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes. */ + /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes. + * + * \ingroup Group_PipeRW + */ static inline void Pipe_Ignore_DWord(void) ATTR_ALWAYS_INLINE; static inline void Pipe_Ignore_DWord(void) { @@ -595,6 +853,8 @@ * * \note This routine should not be called on CONTROL type pipes. * + * \ingroup Group_PipeRW + * * \return A value from the Pipe_WaitUntilReady_ErrorCodes_t enum. */ uint8_t Pipe_WaitUntilReady(void); @@ -602,13 +862,15 @@ /** Writes the given number of bytes to the pipe from the given buffer in little endian, * sending full packets to the device as needed. The last packet filled is not automatically sent; * the user is responsible for manually sending the last written packet to the host via the - * Pipe_ClearCurrentBank() macro. Between each USB packet, the given stream callback function is + * Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is * executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. * * The callback routine should be created using the STREAM_CALLBACK() macro. If the token * NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled * and this function has the Callback parameter omitted. * + * \ingroup Group_PipeRW + * * \param Buffer Pointer to the source data buffer to read from. * \param Length Number of bytes to read for the currently selected pipe into the buffer. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback @@ -624,13 +886,15 @@ /** Writes the given number of bytes to the pipe from the given buffer in big endian, * sending full packets to the device as needed. The last packet filled is not automatically sent; * the user is responsible for manually sending the last written packet to the host via the - * Pipe_ClearCurrentBank() macro. Between each USB packet, the given stream callback function is + * Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is * executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. * * The callback routine should be created using the STREAM_CALLBACK() macro. If the token * NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled * and this function has the Callback parameter omitted. * + * \ingroup Group_PipeRW + * * \param Buffer Pointer to the source data buffer to read from. * \param Length Number of bytes to read for the currently selected pipe into the buffer. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback @@ -645,7 +909,7 @@ /** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host * as needed. The last packet is not automatically discarded once the remaining bytes has been read; the - * user is responsible for manually discarding the last packet from the host via the Pipe_ClearCurrentBank() macro. + * user is responsible for manually discarding the last packet from the device via the Pipe_ClearIN() macro. * Between each USB packet, the given stream callback function is executed repeatedly until the next packet is ready, * allowing for early aborts of stream transfers. * @@ -653,6 +917,8 @@ * NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled * and this function has the Callback parameter omitted. * + * \ingroup Group_PipeRW + * * \param Length Number of bytes to send via the currently selected pipe. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback * @@ -667,13 +933,15 @@ /** Reads the given number of bytes from the pipe into the given buffer in little endian, * sending full packets to the device as needed. The last packet filled is not automatically sent; * the user is responsible for manually sending the last written packet to the host via the - * Pipe_ClearCurrentBank() macro. Between each USB packet, the given stream callback function is + * Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is * executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. * * The callback routine should be created using the STREAM_CALLBACK() macro. If the token * NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled * and this function has the Callback parameter omitted. * + * \ingroup Group_PipeRW + * * \param Buffer Pointer to the source data buffer to write to. * \param Length Number of bytes to read for the currently selected pipe to read from. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback @@ -689,13 +957,15 @@ /** Reads the given number of bytes from the pipe into the given buffer in big endian, * sending full packets to the device as needed. The last packet filled is not automatically sent; * the user is responsible for manually sending the last written packet to the host via the - * Pipe_ClearCurrentBank() macro. Between each USB packet, the given stream callback function is + * Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is * executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. * * The callback routine should be created using the STREAM_CALLBACK() macro. If the token * NO_STREAM_CALLBACKS is passed via the -D option to the compiler, stream callbacks are disabled * and this function has the Callback parameter omitted. * + * \ingroup Group_PipeRW + * * \param Buffer Pointer to the source data buffer to write to. * \param Length Number of bytes to read for the currently selected pipe to read from. * \param Callback Name of a callback routine to call between successive USB packet transfers, NULL if no callback @@ -706,58 +976,7 @@ #if !defined(NO_STREAM_CALLBACKS) || defined(__DOXYGEN__) , uint8_t (* const Callback)(void) #endif - ) ATTR_NON_NULL_PTR_ARG(1); - - /* Function Aliases: */ - /** Alias for Pipe_Discard_Byte(). - */ - #define Pipe_Ignore_Byte() Pipe_Discard_Byte() - - /** Alias for Pipe_Discard_Word(). - */ - #define Pipe_Ignore_Word() Pipe_Discard_Word() - - /** Alias for Pipe_Discard_DWord(). - */ - #define Pipe_Ignore_DWord() Pipe_Discard_DWord() - - /** Alias for Pipe_Read_Word_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #define Pipe_Read_Word() Pipe_Read_Word_LE() - - /** Alias for Pipe_Write_Word_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #define Pipe_Write_Word(Word) Pipe_Write_Word_LE(Word) - - /** Alias for Pipe_Read_DWord_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #define Pipe_Read_DWord() Pipe_Read_DWord_LE() - - /** Alias for Pipe_Write_DWord_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #define Pipe_Write_DWord(DWord) Pipe_Write_DWord_LE(DWord) - - /** Alias for Pipe_Read_Stream_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #if !defined(NO_STREAM_CALLBACKS) - #define Pipe_Read_Stream(Buffer, Length, Callback) Pipe_Read_Stream_LE(Buffer, Length, Callback) - #else - #define Pipe_Read_Stream(Buffer, Length) Pipe_Read_Stream_LE(Buffer, Length) - #endif - - /** Alias for Pipe_Write_Stream_LE(). By default USB transfers use little endian format, thus - * the command with no endianness specified indicates little endian mode. - */ - #if !defined(NO_STREAM_CALLBACKS) - #define Pipe_Write_Stream(Buffer, Length, Callback) Pipe_Read_Stream_LE(Buffer, Length, Callback) - #else - #define Pipe_Write_Stream(Buffer, Length) Pipe_Read_Stream_LE(Buffer, Length) - #endif + ) ATTR_NON_NULL_PTR_ARG(1); /* Private Interface - For use in library only: */ #if !defined(__DOXYGEN__) @@ -794,5 +1013,7 @@ #if defined(__cplusplus) } #endif - + #endif + +/** @} */ diff --git a/LUFA/Drivers/USB/USB.h b/LUFA/Drivers/USB/USB.h index 499c59be23..75fff2fcdb 100644 --- a/LUFA/Drivers/USB/USB.h +++ b/LUFA/Drivers/USB/USB.h @@ -38,6 +38,11 @@ * the USB library unless desired by the library user. */ +/** @defgroup Group_USB USB - LUFA/Drivers/USB/USB.h + * + * Functions, macros, variables, enums and types related to the management of USB communications. + */ + #ifndef __USB_H__ #define __USB_H__ @@ -79,5 +84,8 @@ #include "LowLevel/OTG.h" #endif + #include "Class/ConfigDescriptor.h" + #include "Class/HIDParser.h" + #endif diff --git a/LUFA/Groups.txt b/LUFA/Groups.txt new file mode 100644 index 0000000000..352d92e7f1 --- /dev/null +++ b/LUFA/Groups.txt @@ -0,0 +1,20 @@ +/** \file + * + * This file contains special DoxyGen information for the generation of the main page and other special + * documentation pages. It is not a project source file. + */ + +/** @defgroup Group_BoardDrivers Board Drivers + * + * Functions, macros, variables, enums and types related to the control of physical board hardware. + */ + +/** @defgroup Group_SubsystemDrivers Subsystem Drivers + * + * Functions, macros, variables, enums and types related to the control of AVR subsystems. + */ + +/** @defgroup Group_MiscDrivers Miscellaneous Drivers + * + * Miscellaneous driver Functions, macros, variables, enums and types. + */ \ No newline at end of file diff --git a/LUFA/MemoryAllocator/DynAlloc.h b/LUFA/MemoryAllocator/DynAlloc.h index dba1864cd5..d53b8bb30c 100644 --- a/LUFA/MemoryAllocator/DynAlloc.h +++ b/LUFA/MemoryAllocator/DynAlloc.h @@ -51,6 +51,13 @@ * memory) to be freed. BLOCK_SIZE gives the number of bytes in each memory block. */ +/** @defgroup Group_MemoryAllocator Dynamic Block Memory Allocator - LUFA/MemoryAllocator/DynAlloc.h + * + * Dynamic auto-degragmenting memory block allocator functions. See DynAlloc.h description for more details. + * + * @{ + */ + #ifndef __DYN_ALLOC__ #define __DYN_ALLOC__ @@ -180,3 +187,5 @@ #endif #endif + +/** @} */ diff --git a/LUFA/MigrationInformation.txt b/LUFA/MigrationInformation.txt index 49fa25dea8..e8e3065faa 100644 --- a/LUFA/MigrationInformation.txt +++ b/LUFA/MigrationInformation.txt @@ -12,12 +12,48 @@ * * \section Sec_MigrationXXXXXX Migrating from 090401 to XXXXXX * + * All + * - The ButtLoadTag.h header has been removed, as it was never used for its intended purpose. Projects should either remove all + * BUTTLOADTAG elements, or download and extract ButtLoadTag.h header from the ButtLoad project. + * + * Library Demos + * - Most demos, bootloaders and applications have had significant changes from previous versions. Applications built off of any + * library demos should update to the latest versions. + * + * Device Mode + * - The Endpoint_ClearCurrentBank() macro has been removed, and is now replaced with the Endpoint_ClearIN(), Endpoint_ClearOUT(), + * Endpoint_ClearControlIN(), Endpoint_ClearControlOUT() and other related macros. See Endpoint.h documentation for more details + * on the new endpoint management macros. + * - The Endpoint_ReadWriteAllowed() macro has been renamed to Endpoint_IsReadWriteAllowed() to be more consistent with the rest of + * the API naming scheme. + * - The Endpoint_IsSetupINReady() and Endpoint_IsOutReceived() macros have been renamed to Endpoint_IsINReady() and + * Endpoint_IsOUTReceived() respectively. + * - The Endpoint_IsSetupReceived() macro has been renamed to Endpoint_IsSETUPReceived(). + * - The Endpoint_ClearSetupReceived() macro has been renamed to Endpoint_ClearControlSETUP(). + * - All endpoint read/write/discard aliases which did not have an explicity endianness specifier (such as Endpoint_Read_Word()) have + * been removed for clarity. Existing projects should use the "_LE" suffix on such calls to use the explicit Little Endian versions. + * * Host Mode * - The USB_Host_SendControlRequest() function no longer automatically selects the Control pipe (pipe 0) to allow it to be used on * other control type pipes. Care should be taken to ensure that the Control pipe is always selected before the function is called * in existing projects where the Control pipe is to be operated on. * - The USB Host management task now saves and restores the currently selected pipe before and after the task runs. Projects no longer * need to manage this manually when calling the USB management task. + * - The Pipe_ClearCurrentBank() macro has been removed, and is now replaced with the Pipe_ClearIN(), Pipe_ClearOUT(), + * Pipe_ClearControlIN(), Pipe_ClearControlOUT() and other related macros. See Pipe.h documentation for more details on the new pipe + * management macros. + * - The Pipe_ReadWriteAllowed() macro has been renamed to Pipe_IsReadWriteAllowed() to be more consistent with the rest of the API + * naming scheme. + * - The Pipe_IsSetupINReceived() and Pipe_IsOutReady() macros have been renamed to Pipe_IsINReceived() and Pipe_IsOUTReady() + * respectively. + * - The new Pipe_ClearControlSETUP() macro should be used to send CONTROL transactions, rather than the previous Pipe_ClearSetupOUT() macro. + * - The Pipe_IsSetupSent() macro has been renamed to Pipe_IsSETUPSent(). + * - The Pipe_ClearSetupSent() macro is no longer applicable and should be removed. + * - All pipe read/write/discard aliases which did not have an explicity endianness specifier (such as Pipe_Read_Word()) have + * been removed for clarity. Existing projects should use the "_LE" suffix on such calls to use the explicit Little Endian versions. + * - The Host_IsResetBusDone() macro has been renamed to Host_IsBusResetComplete(). + * - The Pipe_Ignore_Word() function has been renamed to Pipe_Discard_Word() to remain consistent with the rest of the pipe API. + * * * \section Sec_Migration090401 Migrating from 090209 to 090401 * diff --git a/LUFA/Scheduler/Scheduler.h b/LUFA/Scheduler/Scheduler.h index 414b0b2918..979156e7cb 100644 --- a/LUFA/Scheduler/Scheduler.h +++ b/LUFA/Scheduler/Scheduler.h @@ -65,6 +65,13 @@ * \endcode */ +/** @defgroup Group_Scheduler Simple Task Scheduler - LUFA/Scheduler/Scheduler.h + * + * Simple round-robbin task scheduler. See Scheduler.h description for more details. + * + * @{ + */ + #ifndef __SCHEDULER_H__ #define __SCHEDULER_H__ @@ -261,3 +268,5 @@ #endif #endif + +/** @} */ diff --git a/Projects/Magstripe/Magstripe.c b/Projects/Magstripe/Magstripe.c index 93681170a4..9132a80de9 100644 --- a/Projects/Magstripe/Magstripe.c +++ b/Projects/Magstripe/Magstripe.c @@ -37,12 +37,6 @@ #include "Magstripe.h" -/* Project Tags, for reading out using the ButtLoad project */ -BUTTLOADTAG(ProjName, "Magstripe Reader"); -BUTTLOADTAG(BuildTime, __TIME__); -BUTTLOADTAG(BuildDate, __DATE__); -BUTTLOADTAG(LUFAVersion, "LUFA V" LUFA_VERSION_STRING); - /* Scheduler Task List */ TASK_LIST { @@ -184,30 +178,30 @@ EVENT_HANDLER(USB_UnhandledControlPacket) if (wLength > sizeof(KeyboardReportData)) wLength = sizeof(KeyboardReportData); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the report data to the control endpoint */ Endpoint_Write_Control_Stream_LE(&KeyboardReportData, wLength); /* Finalize the stream transfer to send the last packet or clear the host abort */ - Endpoint_ClearSetupOUT(); + Endpoint_ClearControlOUT(); } break; case REQ_GetProtocol: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the current protocol flag to the host */ Endpoint_Write_Byte(UsingReportProtocol); /* Send the flag to the host */ - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); } break; @@ -217,14 +211,14 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Read in the wValue parameter containing the new protocol mode */ uint16_t wValue = Endpoint_Read_Word_LE(); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Set or clear the flag depending on what the host indicates that the current Protocol should be */ UsingReportProtocol = (wValue != 0x0000); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; @@ -234,31 +228,31 @@ EVENT_HANDLER(USB_UnhandledControlPacket) /* Read in the wValue parameter containing the idle period */ uint16_t wValue = Endpoint_Read_Word_LE(); - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Get idle period in MSB */ IdleCount = (wValue >> 8); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupINReady())); - Endpoint_ClearSetupIN(); + while (!(Endpoint_IsINReady())); + Endpoint_ClearControlIN(); } break; case REQ_GetIdle: if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { - Endpoint_ClearSetupReceived(); + Endpoint_ClearControlSETUP(); /* Write the current idle duration to the host */ Endpoint_Write_Byte(IdleCount); /* Send the flag to the host */ - Endpoint_ClearSetupIN(); + Endpoint_ClearControlIN(); /* Acknowledge status stage */ - while (!(Endpoint_IsSetupOUTReceived())); - Endpoint_ClearSetupOUT(); + while (!(Endpoint_IsOUTReceived())); + Endpoint_ClearControlOUT(); } break; @@ -410,7 +404,7 @@ TASK(USB_Keyboard_Report) Endpoint_SelectEndpoint(KEYBOARD_EPNUM); /* Check if Keyboard Endpoint Ready for Read/Write */ - if (Endpoint_ReadWriteAllowed()) + if (Endpoint_IsReadWriteAllowed()) { /* Only fetch the next key to send once the period between key presses has elapsed */ if (!(KeyDelayRemaining)) @@ -436,7 +430,7 @@ TASK(USB_Keyboard_Report) Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(USB_KeyboardReport_Data_t)); /* Finalize the stream transfer to send the last packet */ - Endpoint_ClearCurrentBank(); + Endpoint_ClearIN(); /* Reset the key delay period counter */ KeyDelayRemaining = 2; diff --git a/Projects/Magstripe/Magstripe.h b/Projects/Magstripe/Magstripe.h index fbf68e51ca..0393c36032 100644 --- a/Projects/Magstripe/Magstripe.h +++ b/Projects/Magstripe/Magstripe.h @@ -50,7 +50,6 @@ #include "CircularBitBuffer.h" #include // Library Version Information - #include // PROGMEM tags readable by the ButtLoad project #include // USB Functionality #include // Simple scheduler for task management