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.
This commit is contained in:
		
							parent
							
								
									34164a5550
								
							
						
					
					
						commit
						0bf5064aec
					
				
					 9 changed files with 82 additions and 37 deletions
				
			
		| 
						 | 
				
			
			@ -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 <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
 | 
			
		||||
 *
 | 
			
		||||
 *  \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.
 | 
			
		||||
 *
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
 | 
			
		||||
 *
 | 
			
		||||
 *  \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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue