Commit 0bf5064a authored by Dean Camera's avatar Dean Camera
Browse files

Pipe_BoundEndpointNumber() has been renamed to Pipe_GetBoundEndpointAddress(),...

Pipe_BoundEndpointNumber() has been renamed to Pipe_GetBoundEndpointAddress(), and now returns the correct endpoint direction as part of the endpoint address.

Add Audio_GetSetEndpointProperty() function to the Host mode Audio class driver.
parent 34164a55
...@@ -29,16 +29,16 @@ ...@@ -29,16 +29,16 @@
*/ */
/** \file /** \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 * 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. * including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories.
*/ */
/** \ingroup Group_USBClassDrivers /** \ingroup Group_USBClassDrivers
* \defgroup Group_USBClassAudio Audio Class Driver * \defgroup Group_USBClassAudio Audio 1.0 Class Driver
* *
* \section Sec_Dependencies Module Source Dependencies * \section Sec_Dependencies Module Source Dependencies
* The following files must be built with any user project that uses this module: * The following files must be built with any user project that uses this module:
...@@ -46,12 +46,12 @@ ...@@ -46,12 +46,12 @@
* - LUFA/Drivers/USB/Class/Host/Audio.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> * - LUFA/Drivers/USB/Class/Host/Audio.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
* *
* \section Sec_ModDescription Module Description * \section Sec_ModDescription Module Description
* Audio Class Driver module. This module contains an internal implementation of the USB Audio 1.0 Class, for both * 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 class * 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. * 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 * 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.
* *
* @{ * @{
*/ */
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
*/ */
/** \ingroup Group_USBClassAudio /** \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 * \section Sec_Dependencies Module Source Dependencies
* The following files must be built with any user project that uses this module: * The following files must be built with any user project that uses this module:
......
...@@ -194,7 +194,7 @@ static uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor) ...@@ -194,7 +194,7 @@ static uint8_t DComp_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor)
return DESCRIPTOR_SEARCH_NotFound; 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) bool EnableStreaming)
{ {
if (!(AudioInterfaceInfo->State.IsActive)) if (!(AudioInterfaceInfo->State.IsActive))
...@@ -204,5 +204,37 @@ uint8_t AUDIO_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInt ...@@ -204,5 +204,37 @@ uint8_t AUDIO_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInt
EnableStreaming ? AudioInterfaceInfo->State.EnabledStreamingAltIndex : 0); 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 #endif
...@@ -29,23 +29,23 @@ ...@@ -29,23 +29,23 @@
*/ */
/** \file /** \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 * \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. * dispatch header located in LUFA/Drivers/USB.h.
*/ */
/** \ingroup Group_USBClassAudio /** \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 * \section Sec_Dependencies Module Source Dependencies
* The following files must be built with any user project that uses this module: * The following files must be built with any user project that uses this module:
* - LUFA/Drivers/USB/Class/Host/Audio.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> * - LUFA/Drivers/USB/Class/Host/Audio.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
* *
* \section Sec_ModDescription Module Description * \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 @@ ...@@ -138,9 +138,30 @@
* *
* \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. * \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); 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: */ /* Inline Functions: */
/** General management task for a given Audio host class interface, required for the correct operation of /** 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 * the interface. This should be called frequently in the main program loop, before the master USB management task
......
...@@ -137,13 +137,7 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress) ...@@ -137,13 +137,7 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
if (!(Pipe_IsConfigured())) if (!(Pipe_IsConfigured()))
continue; continue;
uint8_t PipeToken = Pipe_GetPipeToken(); if (Pipe_GetBoundEndpointAddress() == EndpointAddress)
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)))
return true; return true;
} }
......
...@@ -321,15 +321,16 @@ ...@@ -321,15 +321,16 @@
return ((UPSTAX & (1 << CFGOK)) ? true : false); 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. * 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_GetBoundEndpointAddress(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
static inline uint8_t Pipe_BoundEndpointNumber(void) 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. /** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds.
......
...@@ -86,13 +86,7 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress) ...@@ -86,13 +86,7 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
if (!(Pipe_IsConfigured())) if (!(Pipe_IsConfigured()))
continue; continue;
uint8_t PipeToken = Pipe_GetPipeToken(); if (Pipe_GetBoundEndpointAddress() == EndpointAddress)
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)))
return true; return true;
} }
......
...@@ -332,15 +332,16 @@ ...@@ -332,15 +332,16 @@
return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].cfgok; 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. * 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_GetBoundEndpointAddress(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
static inline uint8_t Pipe_BoundEndpointNumber(void) 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. /** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds.
......
...@@ -31,6 +31,8 @@ ...@@ -31,6 +31,8 @@
* - Altered the definition of the USB_Audio_Descriptor_Format_t descriptor so that the user is now responsible for supplying * - 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 * the supported audio sampling rates, to allow for multiple audio interfaces with different numbers of supported rates and/or
* continuous sample rates * 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: * - Library Applications:
* - Modified the Low Level and Class Driver AudioInput and AudioOutput demos to support multiple sample rates * - Modified the Low Level and Class Driver AudioInput and AudioOutput demos to support multiple sample rates
* *
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment