diff --git a/LUFA/Drivers/USB/Class/Audio.h b/LUFA/Drivers/USB/Class/Audio.h index ad0150f653..5d02b4d4a6 100644 --- a/LUFA/Drivers/USB/Class/Audio.h +++ b/LUFA/Drivers/USB/Class/Audio.h @@ -29,16 +29,16 @@ */ /** \file - * \brief Master include file for the library USB Audio Class driver. + * \brief Master include file for the library USB Audio 1.0 Class driver. * - * Master include file for the library USB Audio Class driver, for both host and device modes, where available. + * Master include file for the library USB Audio 1.0 Class driver, for both host and device modes, where available. * * This file should be included in all user projects making use of this optional class driver, instead of * including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories. */ /** \ingroup Group_USBClassDrivers - * \defgroup Group_USBClassAudio Audio Class Driver + * \defgroup Group_USBClassAudio Audio 1.0 Class Driver * * \section Sec_Dependencies Module Source Dependencies * The following files must be built with any user project that uses this module: @@ -46,12 +46,12 @@ * - LUFA/Drivers/USB/Class/Host/Audio.c (Makefile source module name: LUFA_SRC_USBCLASS) * * \section Sec_ModDescription Module Description - * Audio Class Driver module. This module contains an internal implementation of the USB Audio 1.0 Class, for both - * Device and Host USB modes. User applications can use this class driver instead of implementing the Audio class + * Audio 1.0 Class Driver module. This module contains an internal implementation of the USB Audio 1.0 Class, for both + * Device and Host USB modes. User applications can use this class driver instead of implementing the Audio 1.0 class * manually via the low-level LUFA APIs. * * This module is designed to simplify the user code by exposing only the required interface needed to interface with - * Hosts or Devices using the USB Audio Class. + * Hosts or Devices using the USB Audio 1.0 Class. * * @{ */ diff --git a/LUFA/Drivers/USB/Class/Device/Audio.h b/LUFA/Drivers/USB/Class/Device/Audio.h index 4026f9092d..486df72d13 100644 --- a/LUFA/Drivers/USB/Class/Device/Audio.h +++ b/LUFA/Drivers/USB/Class/Device/Audio.h @@ -38,7 +38,7 @@ */ /** \ingroup Group_USBClassAudio - * \defgroup Group_USBClassAudioDevice Audio Class Device Mode Driver + * \defgroup Group_USBClassAudioDevice Audio 1.0 Class Device Mode Driver * * \section Sec_Dependencies Module Source Dependencies * The following files must be built with any user project that uses this module: diff --git a/LUFA/Drivers/USB/Class/Host/Audio.c b/LUFA/Drivers/USB/Class/Host/Audio.c index 7397ef9864..0da1eb6646 100644 --- a/LUFA/Drivers/USB/Class/Host/Audio.c +++ b/LUFA/Drivers/USB/Class/Host/Audio.c @@ -194,7 +194,7 @@ static uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor) return DESCRIPTOR_SEARCH_NotFound; } -uint8_t AUDIO_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +uint8_t Audio_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, bool EnableStreaming) { if (!(AudioInterfaceInfo->State.IsActive)) @@ -204,5 +204,37 @@ uint8_t AUDIO_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInt EnableStreaming ? AudioInterfaceInfo->State.EnabledStreamingAltIndex : 0); } +uint8_t Audio_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, + const uint8_t DataPipeIndex, + const uint8_t EndpointProperty, + const uint8_t EndpointControl, + uint16_t const DataLength, + uint8_t* Data) +{ + uint8_t RequestType; + uint8_t EndpointAddress; + + if (EndpointProperty & 0x80) + RequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE); + else + RequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE); + + Pipe_SelectPipe(DataPipeIndex); + EndpointAddress = Pipe_GetBoundEndpointAddress(); + + USB_ControlRequest = (USB_Request_Header_t) + { + .bmRequestType = RequestType, + .bRequest = EndpointProperty, + .wValue = ((uint16_t)EndpointControl << 8), + .wIndex = EndpointAddress, + .wLength = DataLength, + }; + + Pipe_SelectPipe(PIPE_CONTROLPIPE); + + return USB_Host_SendControlRequest(Data); +} + #endif diff --git a/LUFA/Drivers/USB/Class/Host/Audio.h b/LUFA/Drivers/USB/Class/Host/Audio.h index 0ceaf885bf..7e9a48d895 100644 --- a/LUFA/Drivers/USB/Class/Host/Audio.h +++ b/LUFA/Drivers/USB/Class/Host/Audio.h @@ -29,23 +29,23 @@ */ /** \file - * \brief Host mode driver for the library USB Audio Class driver. + * \brief Host mode driver for the library USB Audio 1.0 Class driver. * - * Host mode driver for the library USB Audio Class driver. + * Host mode driver for the library USB Audio 1.0 Class driver. * * \note This file should not be included directly. It is automatically included as needed by the USB module driver * dispatch header located in LUFA/Drivers/USB.h. */ /** \ingroup Group_USBClassAudio - * \defgroup Group_USBClassAudioHost Audio Class Host Mode Driver + * \defgroup Group_USBClassAudioHost Audio 1.0 Class Host Mode Driver * * \section Sec_Dependencies Module Source Dependencies * The following files must be built with any user project that uses this module: * - LUFA/Drivers/USB/Class/Host/Audio.c (Makefile source module name: LUFA_SRC_USBCLASS) * * \section Sec_ModDescription Module Description - * Host Mode USB Class driver framework interface, for the Audio USB Class driver. + * Host Mode USB Class driver framework interface, for the Audio 1.0 USB Class driver. * * @{ */ @@ -138,9 +138,30 @@ * * \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. */ - uint8_t AUDIO_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, + uint8_t Audio_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, bool EnableStreaming); + /** Gets or sets the specified property of a streaming audio class endpoint that is bound to a pipe in the given + * class instance. + * + * \param[in,out] AudioInterfaceInfo Pointer to a structure containing an Audio Class host configuration and state. + * \param[in] DataPipeIndex Index of the data pipe whose bound endpoint is to be altered. + * \param[in] EndpointProperty Property of the endpoint to get or set, a value from \ref Audio_ClassRequests_t. + * \param[in] EndpointControl Parameter of the endpoint to get or set, a value from \ref Audio_EndpointControls_t. + * \param[in,out] DataLength For SET operations, the length of the parameter data to set. For GET operations, the maximum + * length of the retrieved data. + * \param[in,out] Data Pointer to a location where the parameter data is stored for SET operations, or where + * the retrieved data is to be stored for GET operations. + * + * \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. + */ + uint8_t Audio_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, + const uint8_t DataPipeIndex, + const uint8_t EndpointProperty, + const uint8_t EndpointControl, + uint16_t* const DataLength, + uint8_t* Data); + /* Inline Functions: */ /** General management task for a given Audio host class interface, required for the correct operation of * the interface. This should be called frequently in the main program loop, before the master USB management task diff --git a/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c b/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c index 48445293e8..e93b256c68 100644 --- a/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c +++ b/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c @@ -137,13 +137,7 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress) if (!(Pipe_IsConfigured())) continue; - uint8_t PipeToken = Pipe_GetPipeToken(); - bool PipeTokenCorrect = true; - - if (PipeToken != PIPE_TOKEN_SETUP) - PipeTokenCorrect = (PipeToken == ((EndpointAddress & PIPE_EPDIR_MASK) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT)); - - if (PipeTokenCorrect && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK))) + if (Pipe_GetBoundEndpointAddress() == EndpointAddress) return true; } diff --git a/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h b/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h index c6bdcfb4a9..4d49da4f42 100644 --- a/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h +++ b/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h @@ -321,15 +321,16 @@ return ((UPSTAX & (1 << CFGOK)) ? true : false); } - /** Retrieves the endpoint number of the endpoint within the attached device that the currently selected + /** Retrieves the endpoint address of the endpoint within the attached device that the currently selected * pipe is bound to. * - * \return Endpoint number the currently selected pipe is bound to. + * \return Endpoint address the currently selected pipe is bound to. */ - static inline uint8_t Pipe_BoundEndpointNumber(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint8_t Pipe_BoundEndpointNumber(void) + static inline uint8_t Pipe_GetBoundEndpointAddress(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint8_t Pipe_GetBoundEndpointAddress(void) { - return ((UPCFG0X >> PEPNUM0) & PIPE_EPNUM_MASK); + return (((UPCFG0X >> PEPNUM0) & PIPE_EPNUM_MASK) | + ((Pipe_GetPipeToken() == PIPE_TOKEN_IN) ? ENDPOINT_DESCRIPTOR_DIR_IN : 0)); } /** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds. diff --git a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c index 92589a8706..4e67f9691f 100644 --- a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c +++ b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c @@ -86,13 +86,7 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress) if (!(Pipe_IsConfigured())) continue; - uint8_t PipeToken = Pipe_GetPipeToken(); - bool PipeTokenCorrect = true; - - if (PipeToken != PIPE_TOKEN_SETUP) - PipeTokenCorrect = (PipeToken == ((EndpointAddress & PIPE_EPDIR_MASK) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT)); - - if (PipeTokenCorrect && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK))) + if (Pipe_GetBoundEndpointAddress() == EndpointAddress) return true; } diff --git a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h index c10518548d..459423c125 100644 --- a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h +++ b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h @@ -332,15 +332,16 @@ return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].cfgok; } - /** Retrieves the endpoint number of the endpoint within the attached device that the currently selected + /** Retrieves the endpoint address of the endpoint within the attached device that the currently selected * pipe is bound to. * - * \return Endpoint number the currently selected pipe is bound to. + * \return Endpoint address the currently selected pipe is bound to. */ - static inline uint8_t Pipe_BoundEndpointNumber(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; - static inline uint8_t Pipe_BoundEndpointNumber(void) + static inline uint8_t Pipe_GetBoundEndpointAddress(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline uint8_t Pipe_GetBoundEndpointAddress(void) { - return (&AVR32_USBB.UPCFG0)[USB_SelectedPipe].pepnum; + return ((&AVR32_USBB.UPCFG0)[USB_SelectedPipe].pepnum | + ((Pipe_GetPipeToken() == PIPE_TOKEN_IN) ? ENDPOINT_DESCRIPTOR_DIR_IN : 0)); } /** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds. diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 23bd5ec1e4..c7401ea72a 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -31,6 +31,8 @@ * - Altered the definition of the USB_Audio_Descriptor_Format_t descriptor so that the user is now responsible for supplying * the supported audio sampling rates, to allow for multiple audio interfaces with different numbers of supported rates and/or * continuous sample rates + * - Pipe_BoundEndpointNumber() has been renamed to Pipe_GetBoundEndpointAddress(), and now returns the correct endpoint direction + * as part of the endpoint address * - Library Applications: * - Modified the Low Level and Class Driver AudioInput and AudioOutput demos to support multiple sample rates *