This repository has been archived on 2022-02-18. You can view files and clone it, but cannot push or open issues or pull requests.
osmo-sdr/firmware/src/fast_source_descr.c

1678 lines
62 KiB
C

/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2008, Atmel Corporation
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
*
* Atmel's name may not be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ----------------------------------------------------------------------------
*/
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "fast_source_descr.h"
#include <board.h>
#include <usb/common/core/USBGenericDescriptor.h>
#include <usb/common/core/USBDeviceDescriptor.h>
#include <usb/common/core/USBConfigurationDescriptor.h>
#include <usb/common/core/USBInterfaceDescriptor.h>
#include <usb/common/core/USBEndpointDescriptor.h>
#include <usb/common/core/USBStringDescriptor.h>
#include <usb/common/audio/AUDGenericDescriptor.h>
#include <usb/common/audio/AUDDeviceDescriptor.h>
#include <usb/common/audio/AUDControlInterfaceDescriptor.h>
#include <usb/common/audio/AUDStreamingInterfaceDescriptor.h>
#include <usb/common/audio/AUDEndpointDescriptor.h>
#include <usb/common/audio/AUDDataEndpointDescriptor.h>
#include <usb/common/audio/AUDFormatTypeOneDescriptor.h>
#include <usb/common/audio/AUDHeaderDescriptor.h>
#include <usb/common/audio/AUDFeatureUnitDescriptor.h>
#include <usb/common/audio/AUDInputTerminalDescriptor.h>
#include <usb/common/audio/AUDOutputTerminalDescriptor.h>
#include <usb/device/dfu/dfu.h>
// #define AUDIOSOURCE 1
#undef AUDIOSOURCE
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "Audio Loop Record Device Codes"
///
/// This page lists the %device IDs and release number of the USB Audio Loop Record
/// %device.
///
/// !Codes
/// - AUDDLoopRecDriverDescriptors_VENDORID
/// - AUDDLoopRecDriverDescriptors_PRODUCTID
/// - AUDDLoopRecDriverDescriptors_RELEASE
/// Device vendor ID.
#define AUDDLoopRecDriverDescriptors_VENDORID 0x16C0
/// Device product ID.
#define AUDDLoopRecDriverDescriptors_PRODUCTID 0x0763
/// Device release number in BCD format.
#define AUDDLoopRecDriverDescriptors_RELEASE 0x0100
//------------------------------------------------------------------------------
#ifdef AUDIOSOURCE
//------------------------------------------------------------------------------
// Internal types
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Audio control header descriptor with one slave interface.
//------------------------------------------------------------------------------
#ifdef __ICCARM__ // IAR
#pragma pack(1) // IAR
#define __attribute__(...) // IAR
#endif // IAR
//------------------------------------------------------------------------------
/// Header descriptor with 1 interface.
//------------------------------------------------------------------------------
typedef struct {
/// Header descriptor.
AUDHeaderDescriptor header;
/// Id of the first grouped interface - Speaker.
unsigned char bInterface0;
/// Id of the second grouped interface - Speakerphone.
unsigned char bInterface1;
} __attribute__ ((packed)) AUDHeaderDescriptor2; // GCC
//------------------------------------------------------------------------------
/// Feature unit descriptor with 3 channel controls (master, right, left).
//------------------------------------------------------------------------------
typedef struct {
/// Feature unit descriptor.
AUDFeatureUnitDescriptor feature;
/// Available controls for each channel.
unsigned char bmaControls[3];
/// Index of a string descriptor for the feature unit.
unsigned char iFeature;
} __attribute__ ((packed)) AUDFeatureUnitDescriptor3; // GCC
//------------------------------------------------------------------------------
/// List of descriptors for detailling the audio control interface of a
/// device using a USB Audio Loop Recorder driver.
//------------------------------------------------------------------------------
typedef struct {
/// Header descriptor (with one slave interface).
AUDHeaderDescriptor2 header;
/// Input terminal descriptor.
AUDInputTerminalDescriptor inputLoopRec;
/// Output terminal descriptor.
AUDOutputTerminalDescriptor outputLoopRec;
/// Feature unit descriptor - LoopRec.
AUDFeatureUnitDescriptor3 featureLoopRec;
/// Input terminal descriptor.
AUDInputTerminalDescriptor inputRec;
/// Output terminal descriptor.
AUDOutputTerminalDescriptor outputRec;
/// Feature unit descriptor - LoopRecphone.
AUDFeatureUnitDescriptor3 featureRec;
} __attribute__ ((packed)) AUDDLoopRecDriverAudioControlDescriptors; // GCC
//------------------------------------------------------------------------------
/// Format type I descriptor with one discrete sampling frequency.
//------------------------------------------------------------------------------
typedef struct {
/// Format type I descriptor.
AUDFormatTypeOneDescriptor formatType;
/// Sampling frequency in Hz.
unsigned char tSamFreq[3];
} __attribute__ ((packed)) AUDFormatTypeOneDescriptor1; // GCC
//------------------------------------------------------------------------------
/// Holds a list of descriptors returned as part of the configuration of
/// a USB Audio Loop Record device.
//------------------------------------------------------------------------------
typedef struct {
/// Standard configuration.
USBConfigurationDescriptor configuration;
/// Audio control interface.
USBInterfaceDescriptor control;
/// Descriptors for the audio control interface.
AUDDLoopRecDriverAudioControlDescriptors controlDescriptors;
//- AUDIO OUT
/// Streaming out interface descriptor (with no endpoint, required).
USBInterfaceDescriptor streamingOutNoIsochronous;
/// Streaming out interface descriptor.
USBInterfaceDescriptor streamingOut;
/// Audio class descriptor for the streaming out interface.
AUDStreamingInterfaceDescriptor streamingOutClass;
/// Stream format descriptor.
AUDFormatTypeOneDescriptor1 streamingOutFormatType;
/// Streaming out endpoint descriptor.
AUDEndpointDescriptor streamingOutEndpoint;
/// Audio class descriptor for the streaming out endpoint.
AUDDataEndpointDescriptor streamingOutDataEndpoint;
//- AUDIO IN
/// Streaming in interface descriptor (with no endpoint, required).
USBInterfaceDescriptor streamingInNoIsochronous;
/// Streaming in interface descriptor.
USBInterfaceDescriptor streamingIn;
/// Audio class descriptor for the streaming in interface.
AUDStreamingInterfaceDescriptor streamingInClass;
/// Stream format descriptor.
AUDFormatTypeOneDescriptor1 streamingInFormatType;
/// Streaming in endpoint descriptor.
AUDEndpointDescriptor streamingInEndpoint;
/// Audio class descriptor for the streaming in endpoint.
AUDDataEndpointDescriptor streamingInDataEndpoint;
// DFU Runtime
DFURT_IF_DESCRIPTOR_STRUCT
} __attribute__ ((packed)) AUDDLoopRecDriverConfigurationDescriptors; // GCC
#ifdef __ICCARM__ // IAR
#pragma pack() // IAR
#endif // IAR
//------------------------------------------------------------------------------
// Exported variables
//------------------------------------------------------------------------------
/// Device descriptor for a USB Audio Loop Record driver.
const USBDeviceDescriptor deviceDescriptor = {
sizeof(USBDeviceDescriptor),
USBGenericDescriptor_DEVICE,
USBDeviceDescriptor_USB2_00,
AUDDeviceDescriptor_CLASS,
AUDDeviceDescriptor_SUBCLASS,
AUDDeviceDescriptor_PROTOCOL,
CHIP_USB_ENDPOINTS_MAXPACKETSIZE(0),
AUDDLoopRecDriverDescriptors_VENDORID,
AUDDLoopRecDriverDescriptors_PRODUCTID,
AUDDLoopRecDriverDescriptors_RELEASE,
1, // Manufacturer string descriptor index
2, // Product string descriptor index
3, // Index of serial number string descriptor
1 // One possible configuration
};
#if defined(CHIP_USB_UDPHS) || defined(CHIP_USB_OTGHS)
/// USB device qualifier descriptor.
const USBDeviceQualifierDescriptor qualifierDescriptor = {
sizeof(USBDeviceQualifierDescriptor),
USBGenericDescriptor_DEVICEQUALIFIER,
USBDeviceDescriptor_USB2_00,
AUDDeviceDescriptor_CLASS,
AUDDeviceDescriptor_SUBCLASS,
AUDDeviceDescriptor_PROTOCOL,
CHIP_USB_ENDPOINTS_MAXPACKETSIZE(0),
1, // Device has one possible configuration
0 // Reserved
};
/// HS Configuration descriptors for a USB Audio Loop Record driver.
const AUDDLoopRecDriverConfigurationDescriptors hsConfigurationDescriptors = {
// Configuration descriptor
{
sizeof(USBConfigurationDescriptor),
USBGenericDescriptor_CONFIGURATION,
sizeof(AUDDLoopRecDriverConfigurationDescriptors),
3+DFURT_NUM_IF, // This configuration has 3 interfaces
1, // This is configuration #1
0, // No string descriptor
BOARD_USB_BMATTRIBUTES,
USBConfigurationDescriptor_POWER(100)
},
// Audio control interface standard descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_CONTROL,
0, // This is alternate setting #0
0, // This interface uses no endpoint
AUDControlInterfaceDescriptor_CLASS,
AUDControlInterfaceDescriptor_SUBCLASS,
AUDControlInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio control interface descriptors
{
// Header descriptor
{
{
sizeof(AUDHeaderDescriptor2),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_HEADER,
AUDHeaderDescriptor_AUD1_00,
sizeof(AUDDLoopRecDriverAudioControlDescriptors),
2 // Two streaming interface
},
AUDDLoopRecDriverDescriptors_STREAMING,
AUDDLoopRecDriverDescriptors_STREAMINGIN
},
// Input terminal descriptor ( speaker )
{
sizeof(AUDInputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
AUDInputTerminalDescriptor_USBSTREAMING,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL,
AUDDLoopRecDriver_NUMCHANNELS,
#if AUDDLoopRecDriver_NUMCHANNELS > 1
AUDInputTerminalDescriptor_LEFTFRONT
| AUDInputTerminalDescriptor_RIGHTFRONT,
#else
0, // Mono sets no position bits.
#endif
0, // No string descriptor for channels
0 // No string descriptor for input terminal
},
// Output terminal descriptor ( speaker )
{
sizeof(AUDOutputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_OUTPUTTERMINAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL,
AUDOutputTerminalDescriptor_SPEAKER,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_FEATUREUNIT,
0 // No string descriptor
},
// Feature unit descriptor ( speaker )
{
{
sizeof(AUDFeatureUnitDescriptor3),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
1, // 1 byte per channel for controls
},
{
AUDFeatureUnitDescriptor_MUTE, // Master channel controls
0, // Right channel controls
0 // Left channel controls
},
0 // No string descriptor
},
// Input terminal descriptor ( speakerphone )
{
sizeof(AUDInputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
AUDInputTerminalDescriptor_SPEAKERPHONE,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
AUDDLoopRecDriver_NUMCHANNELS,
#if AUDDLoopRecDriver_NUMCHANNELS > 1
AUDInputTerminalDescriptor_LEFTFRONT
| AUDInputTerminalDescriptor_RIGHTFRONT,
#else
0, // Mono sets no position bits.
#endif
0, // No string descriptor for channels
0 // No string descriptor for input terminal
},
// Output terminal descriptor ( speakerphone )
{
sizeof(AUDOutputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_OUTPUTTERMINAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
AUDOutputTerminalDescriptor_USBTREAMING,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
AUDDLoopRecDriverDescriptors_FEATUREUNIT_REC,
0 // No string descriptor
},
// Feature unit descriptor ( speakerphone )
{
{
sizeof(AUDFeatureUnitDescriptor3),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_FEATUREUNIT_REC,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
1
},
{
AUDFeatureUnitDescriptor_MUTE, // Mic controls
0,
0
},
0 // No string descriptor
}
},
// - AUIDO OUT
// Audio streaming interface with 0 endpoints
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMING,
0, // This is alternate setting #0
0, // This interface uses no endpoints
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming interface with data endpoint
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMING,
1, // This is alternate setting #1
1, // This interface uses 1 endpoint
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming class-specific descriptor
{
sizeof(AUDStreamingInterfaceDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_GENERAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
0, // No internal delay because of data path
AUDFormatTypeOneDescriptor_PCM
},
// Format type I descriptor
{
{
sizeof(AUDFormatTypeOneDescriptor1),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_FORMATTYPE,
AUDFormatTypeOneDescriptor_FORMATTYPEONE,
AUDDLoopRecDriver_NUMCHANNELS,
AUDDLoopRecDriver_BYTESPERSAMPLE,
AUDDLoopRecDriver_BYTESPERSAMPLE*8,
1 // One discrete frequency supported
},
{
AUDDLoopRecDriver_SAMPLERATE & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 8) & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 16) & 0xFF
}
},
// Audio streaming endpoint standard descriptor
{
sizeof(AUDEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_OUT,
AUDDLoopRecDriverDescriptors_DATAOUT),
USBEndpointDescriptor_ISOCHRONOUS,
AUDDLoopRecDriver_BYTESPERFRAME,
AUDDLoopRecDriverDescriptors_HS_INTERVAL, // Polling interval = 1 ms
0, // This is not a synchronization endpoint
0 // No associated synchronization endpoint
},
// Audio streaming endpoint class-specific descriptor
{
sizeof(AUDDataEndpointDescriptor),
AUDGenericDescriptor_ENDPOINT,
AUDDataEndpointDescriptor_SUBTYPE,
0, // No attributes
0, // Endpoint is not synchronized
0 // Endpoint is not synchronized
},
//- AUDIO IN
// Audio streaming interface with 0 endpoints
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMINGIN,
0, // This is alternate setting #0
0, // This interface uses no endpoints
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming interface with data endpoint
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMINGIN,
1, // This is alternate setting #1
1, // This interface uses 1 endpoint
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming class-specific descriptor
{
sizeof(AUDStreamingInterfaceDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_GENERAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
0, // No internal delay because of data path
AUDFormatTypeOneDescriptor_PCM
},
// Format type I descriptor
{
{
sizeof(AUDFormatTypeOneDescriptor1),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_FORMATTYPE,
AUDFormatTypeOneDescriptor_FORMATTYPEONE,
AUDDLoopRecDriver_NUMCHANNELS,
AUDDLoopRecDriver_BYTESPERSAMPLE,
AUDDLoopRecDriver_BYTESPERSAMPLE*8,
1 // One discrete frequency supported
},
{
AUDDLoopRecDriver_SAMPLERATE & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 8) & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 16) & 0xFF
}
},
// Audio streaming endpoint standard descriptor
{
sizeof(AUDEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_IN,
AUDDLoopRecDriverDescriptors_DATAIN),
USBEndpointDescriptor_ISOCHRONOUS,
AUDDLoopRecDriver_BYTESPERFRAME,
AUDDLoopRecDriverDescriptors_HS_INTERVAL, // Polling interval = 1 ms
0, // This is not a synchronization endpoint
0 // No associated synchronization endpoint
},
// Audio streaming endpoint class-specific descriptor
{
sizeof(AUDDataEndpointDescriptor),
AUDGenericDescriptor_ENDPOINT,
AUDDataEndpointDescriptor_SUBTYPE,
0, // No attributes
0, // Endpoint is not synchronized
0 // Endpoint is not synchronized
},
DFURT_IF_DESCRIPTOR(3, 0),
};
/// HS Other Speed Configuration descriptors for a USB Audio Loop Record driver.
const AUDDLoopRecDriverConfigurationDescriptors
fsOtherSpeedConfigurationDescriptors = {
// Configuration descriptor
{
sizeof(USBConfigurationDescriptor),
USBGenericDescriptor_OTHERSPEEDCONFIGURATION,
sizeof(AUDDLoopRecDriverConfigurationDescriptors),
3+DFURT_NUM_IF, // This configuration has 3 interfaces
1, // This is configuration #1
0, // No string descriptor
BOARD_USB_BMATTRIBUTES,
USBConfigurationDescriptor_POWER(100)
},
// Audio control interface standard descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_CONTROL,
0, // This is alternate setting #0
0, // This interface uses no endpoint
AUDControlInterfaceDescriptor_CLASS,
AUDControlInterfaceDescriptor_SUBCLASS,
AUDControlInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio control interface descriptors
{
// Header descriptor
{
{
sizeof(AUDHeaderDescriptor2),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_HEADER,
AUDHeaderDescriptor_AUD1_00,
sizeof(AUDDLoopRecDriverAudioControlDescriptors),
2 // Two streaming interface
},
AUDDLoopRecDriverDescriptors_STREAMING,
AUDDLoopRecDriverDescriptors_STREAMINGIN
},
// Input terminal descriptor ( speaker )
{
sizeof(AUDInputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
AUDInputTerminalDescriptor_USBSTREAMING,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL,
AUDDLoopRecDriver_NUMCHANNELS,
#if AUDDLoopRecDriver_NUMCHANNELS > 1
AUDInputTerminalDescriptor_LEFTFRONT
| AUDInputTerminalDescriptor_RIGHTFRONT,
#else
0, // Mono sets no position bits.
#endif
0, // No string descriptor for channels
0 // No string descriptor for input terminal
},
// Output terminal descriptor ( speaker )
{
sizeof(AUDOutputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_OUTPUTTERMINAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL,
AUDOutputTerminalDescriptor_SPEAKER,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_FEATUREUNIT,
0 // No string descriptor
},
// Feature unit descriptor ( speaker )
{
{
sizeof(AUDFeatureUnitDescriptor3),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
1, // 1 byte per channel for controls
},
{
AUDFeatureUnitDescriptor_MUTE, // Master channel controls
0, // Right channel controls
0 // Left channel controls
},
0 // No string descriptor
},
// Input terminal descriptor ( speakerphone )
{
sizeof(AUDInputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
AUDInputTerminalDescriptor_SPEAKERPHONE,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
AUDDLoopRecDriver_NUMCHANNELS,
#if AUDDLoopRecDriver_NUMCHANNELS > 1
AUDInputTerminalDescriptor_LEFTFRONT
| AUDInputTerminalDescriptor_RIGHTFRONT,
#else
0, // Mono sets no position bits.
#endif
0, // No string descriptor for channels
0 // No string descriptor for input terminal
},
// Output terminal descriptor ( speakerphone )
{
sizeof(AUDOutputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_OUTPUTTERMINAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
AUDOutputTerminalDescriptor_USBTREAMING,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
AUDDLoopRecDriverDescriptors_FEATUREUNIT_REC,
0 // No string descriptor
},
// Feature unit descriptor ( speakerphone )
{
{
sizeof(AUDFeatureUnitDescriptor3),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_FEATUREUNIT_REC,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
1
},
{
AUDFeatureUnitDescriptor_MUTE, // Mic controls
0,
0
},
0 // No string descriptor
}
},
// - AUIDO OUT
// Audio streaming interface with 0 endpoints
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMING,
0, // This is alternate setting #0
0, // This interface uses no endpoints
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming interface with data endpoint
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMING,
1, // This is alternate setting #1
1, // This interface uses 1 endpoint
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming class-specific descriptor
{
sizeof(AUDStreamingInterfaceDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_GENERAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
0, // No internal delay because of data path
AUDFormatTypeOneDescriptor_PCM
},
// Format type I descriptor
{
{
sizeof(AUDFormatTypeOneDescriptor1),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_FORMATTYPE,
AUDFormatTypeOneDescriptor_FORMATTYPEONE,
AUDDLoopRecDriver_NUMCHANNELS,
AUDDLoopRecDriver_BYTESPERSAMPLE,
AUDDLoopRecDriver_BYTESPERSAMPLE*8,
1 // One discrete frequency supported
},
{
AUDDLoopRecDriver_SAMPLERATE & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 8) & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 16) & 0xFF
}
},
// Audio streaming endpoint standard descriptor
{
sizeof(AUDEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_OUT,
AUDDLoopRecDriverDescriptors_DATAOUT),
USBEndpointDescriptor_ISOCHRONOUS,
AUDDLoopRecDriver_BYTESPERFRAME,
AUDDLoopRecDriverDescriptors_HS_INTERVAL, // Polling interval = 1 ms
0, // This is not a synchronization endpoint
0 // No associated synchronization endpoint
},
// Audio streaming endpoint class-specific descriptor
{
sizeof(AUDDataEndpointDescriptor),
AUDGenericDescriptor_ENDPOINT,
AUDDataEndpointDescriptor_SUBTYPE,
0, // No attributes
0, // Endpoint is not synchronized
0 // Endpoint is not synchronized
},
//- AUDIO IN
// Audio streaming interface with 0 endpoints
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMINGIN,
0, // This is alternate setting #0
0, // This interface uses no endpoints
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming interface with data endpoint
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMINGIN,
1, // This is alternate setting #1
1, // This interface uses 1 endpoint
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming class-specific descriptor
{
sizeof(AUDStreamingInterfaceDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_GENERAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
0, // No internal delay because of data path
AUDFormatTypeOneDescriptor_PCM
},
// Format type I descriptor
{
{
sizeof(AUDFormatTypeOneDescriptor1),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_FORMATTYPE,
AUDFormatTypeOneDescriptor_FORMATTYPEONE,
AUDDLoopRecDriver_NUMCHANNELS,
AUDDLoopRecDriver_BYTESPERSAMPLE,
AUDDLoopRecDriver_BYTESPERSAMPLE*8,
1 // One discrete frequency supported
},
{
AUDDLoopRecDriver_SAMPLERATE & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 8) & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 16) & 0xFF
}
},
// Audio streaming endpoint standard descriptor
{
sizeof(AUDEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_IN,
AUDDLoopRecDriverDescriptors_DATAIN),
USBEndpointDescriptor_ISOCHRONOUS,
AUDDLoopRecDriver_BYTESPERFRAME,
AUDDLoopRecDriverDescriptors_HS_INTERVAL, // Polling interval = 1 ms
0, // This is not a synchronization endpoint
0 // No associated synchronization endpoint
},
// Audio streaming endpoint class-specific descriptor
{
sizeof(AUDDataEndpointDescriptor),
AUDGenericDescriptor_ENDPOINT,
AUDDataEndpointDescriptor_SUBTYPE,
0, // No attributes
0, // Endpoint is not synchronized
0 // Endpoint is not synchronized
},
DFURT_IF_DESCRIPTOR(3, 0),
};
/// HS Other Speed Configuration descriptors.
const AUDDLoopRecDriverConfigurationDescriptors
hsOtherSpeedConfigurationDescriptors = {
// Configuration descriptor
{
sizeof(USBConfigurationDescriptor),
USBGenericDescriptor_OTHERSPEEDCONFIGURATION,
sizeof(AUDDLoopRecDriverConfigurationDescriptors),
3+DFURT_NUM_IF, // This configuration has 3 interfaces
1, // This is configuration #1
0, // No string descriptor
BOARD_USB_BMATTRIBUTES,
USBConfigurationDescriptor_POWER(100)
},
// Audio control interface standard descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_CONTROL,
0, // This is alternate setting #0
0, // This interface uses no endpoint
AUDControlInterfaceDescriptor_CLASS,
AUDControlInterfaceDescriptor_SUBCLASS,
AUDControlInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio control interface descriptors
{
// Header descriptor
{
{
sizeof(AUDHeaderDescriptor2),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_HEADER,
AUDHeaderDescriptor_AUD1_00,
sizeof(AUDDLoopRecDriverAudioControlDescriptors),
2 // Two streaming interface
},
AUDDLoopRecDriverDescriptors_STREAMING,
AUDDLoopRecDriverDescriptors_STREAMINGIN
},
// Input terminal descriptor ( speaker )
{
sizeof(AUDInputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
AUDInputTerminalDescriptor_USBSTREAMING,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL,
AUDDLoopRecDriver_NUMCHANNELS,
#if AUDDLoopRecDriver_NUMCHANNELS > 1
AUDInputTerminalDescriptor_LEFTFRONT
| AUDInputTerminalDescriptor_RIGHTFRONT,
#else
0, // Mono sets no position bits.
#endif
0, // No string descriptor for channels
0 // No string descriptor for input terminal
},
// Output terminal descriptor ( speaker )
{
sizeof(AUDOutputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_OUTPUTTERMINAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL,
AUDOutputTerminalDescriptor_SPEAKER,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_FEATUREUNIT,
0 // No string descriptor
},
// Feature unit descriptor ( speaker )
{
{
sizeof(AUDFeatureUnitDescriptor3),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
1, // 1 byte per channel for controls
},
{
AUDFeatureUnitDescriptor_MUTE, // Master channel controls
0, // Right channel controls
0 // Left channel controls
},
0 // No string descriptor
},
// Input terminal descriptor ( speakerphone )
{
sizeof(AUDInputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
AUDInputTerminalDescriptor_SPEAKERPHONE,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
AUDDLoopRecDriver_NUMCHANNELS,
#if AUDDLoopRecDriver_NUMCHANNELS > 1
AUDInputTerminalDescriptor_LEFTFRONT
| AUDInputTerminalDescriptor_RIGHTFRONT,
#else
0, // Mono sets no position bits.
#endif
0, // No string descriptor for channels
0 // No string descriptor for input terminal
},
// Output terminal descriptor ( speakerphone )
{
sizeof(AUDOutputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_OUTPUTTERMINAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
AUDOutputTerminalDescriptor_USBTREAMING,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
AUDDLoopRecDriverDescriptors_FEATUREUNIT_REC,
0 // No string descriptor
},
// Feature unit descriptor ( speakerphone )
{
{
sizeof(AUDFeatureUnitDescriptor3),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_FEATUREUNIT_REC,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
1
},
{
AUDFeatureUnitDescriptor_MUTE, // Mic controls
0,
0
},
0 // No string descriptor
}
},
// - AUIDO OUT
// Audio streaming interface with 0 endpoints
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMING,
0, // This is alternate setting #0
0, // This interface uses no endpoints
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming interface with data endpoint
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMING,
1, // This is alternate setting #1
1, // This interface uses 1 endpoint
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming class-specific descriptor
{
sizeof(AUDStreamingInterfaceDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_GENERAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
0, // No internal delay because of data path
AUDFormatTypeOneDescriptor_PCM
},
// Format type I descriptor
{
{
sizeof(AUDFormatTypeOneDescriptor1),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_FORMATTYPE,
AUDFormatTypeOneDescriptor_FORMATTYPEONE,
AUDDLoopRecDriver_NUMCHANNELS,
AUDDLoopRecDriver_BYTESPERSAMPLE,
AUDDLoopRecDriver_BYTESPERSAMPLE*8,
1 // One discrete frequency supported
},
{
AUDDLoopRecDriver_SAMPLERATE & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 8) & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 16) & 0xFF
}
},
// Audio streaming endpoint standard descriptor
{
sizeof(AUDEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_OUT,
AUDDLoopRecDriverDescriptors_DATAOUT),
USBEndpointDescriptor_ISOCHRONOUS,
AUDDLoopRecDriver_BYTESPERFRAME,
AUDDLoopRecDriverDescriptors_FS_INTERVAL, // Polling interval = 1 ms
0, // This is not a synchronization endpoint
0 // No associated synchronization endpoint
},
// Audio streaming endpoint class-specific descriptor
{
sizeof(AUDDataEndpointDescriptor),
AUDGenericDescriptor_ENDPOINT,
AUDDataEndpointDescriptor_SUBTYPE,
0, // No attributes
0, // Endpoint is not synchronized
0 // Endpoint is not synchronized
},
//- AUDIO IN
// Audio streaming interface with 0 endpoints
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMINGIN,
0, // This is alternate setting #0
0, // This interface uses no endpoints
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming interface with data endpoint
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMINGIN,
1, // This is alternate setting #1
1, // This interface uses 1 endpoint
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming class-specific descriptor
{
sizeof(AUDStreamingInterfaceDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_GENERAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
0, // No internal delay because of data path
AUDFormatTypeOneDescriptor_PCM
},
// Format type I descriptor
{
{
sizeof(AUDFormatTypeOneDescriptor1),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_FORMATTYPE,
AUDFormatTypeOneDescriptor_FORMATTYPEONE,
AUDDLoopRecDriver_NUMCHANNELS,
AUDDLoopRecDriver_BYTESPERSAMPLE,
AUDDLoopRecDriver_BYTESPERSAMPLE*8,
1 // One discrete frequency supported
},
{
AUDDLoopRecDriver_SAMPLERATE & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 8) & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 16) & 0xFF
}
},
// Audio streaming endpoint standard descriptor
{
sizeof(AUDEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_IN,
AUDDLoopRecDriverDescriptors_DATAIN),
USBEndpointDescriptor_ISOCHRONOUS,
AUDDLoopRecDriver_BYTESPERFRAME,
AUDDLoopRecDriverDescriptors_FS_INTERVAL, // Polling interval = 1 ms
0, // This is not a synchronization endpoint
0 // No associated synchronization endpoint
},
// Audio streaming endpoint class-specific descriptor
{
sizeof(AUDDataEndpointDescriptor),
AUDGenericDescriptor_ENDPOINT,
AUDDataEndpointDescriptor_SUBTYPE,
0, // No attributes
0, // Endpoint is not synchronized
0 // Endpoint is not synchronized
},
DFURT_IF_DESCRIPTOR(3, 0),
};
#endif // defined(CHIP_USB_UDPHS) || defined(CHIP_USB_OTGHS)
/// FS Configuration descriptors for a USB Audio Loop Record driver.
const AUDDLoopRecDriverConfigurationDescriptors fsConfigurationDescriptors = {
// Configuration descriptor
{
sizeof(USBConfigurationDescriptor),
USBGenericDescriptor_CONFIGURATION,
sizeof(AUDDLoopRecDriverConfigurationDescriptors),
3+DFURT_NUM_IF, // This configuration has 3 interfaces
1, // This is configuration #1
0, // No string descriptor
BOARD_USB_BMATTRIBUTES,
USBConfigurationDescriptor_POWER(100)
},
// Audio control interface standard descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_CONTROL,
0, // This is alternate setting #0
0, // This interface uses no endpoint
AUDControlInterfaceDescriptor_CLASS,
AUDControlInterfaceDescriptor_SUBCLASS,
AUDControlInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio control interface descriptors
{
// Header descriptor
{
{
sizeof(AUDHeaderDescriptor2),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_HEADER,
AUDHeaderDescriptor_AUD1_00,
sizeof(AUDDLoopRecDriverAudioControlDescriptors),
2 // Two streaming interface
},
AUDDLoopRecDriverDescriptors_STREAMING,
AUDDLoopRecDriverDescriptors_STREAMINGIN
},
// Input terminal descriptor ( speaker )
{
sizeof(AUDInputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
AUDInputTerminalDescriptor_USBSTREAMING,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL,
AUDDLoopRecDriver_NUMCHANNELS,
#if AUDDLoopRecDriver_NUMCHANNELS > 1
AUDInputTerminalDescriptor_LEFTFRONT
| AUDInputTerminalDescriptor_RIGHTFRONT,
#else
0, // Mono sets no position bits.
#endif
0, // No string descriptor for channels
0 // No string descriptor for input terminal
},
// Output terminal descriptor ( speaker )
{
sizeof(AUDOutputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_OUTPUTTERMINAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL,
AUDOutputTerminalDescriptor_SPEAKER,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_FEATUREUNIT,
0 // No string descriptor
},
// Feature unit descriptor ( speaker )
{
{
sizeof(AUDFeatureUnitDescriptor3),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
1, // 1 byte per channel for controls
},
{
AUDFeatureUnitDescriptor_MUTE, // Master channel controls
0, // Right channel controls
0 // Left channel controls
},
0 // No string descriptor
},
// Input terminal descriptor ( speakerphone )
{
sizeof(AUDInputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_INPUTTERMINAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
AUDInputTerminalDescriptor_SPEAKERPHONE,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
AUDDLoopRecDriver_NUMCHANNELS,
#if AUDDLoopRecDriver_NUMCHANNELS > 1
AUDInputTerminalDescriptor_LEFTFRONT
| AUDInputTerminalDescriptor_RIGHTFRONT,
#else
0, // Mono sets no position bits.
#endif
0, // No string descriptor for channels
0 // No string descriptor for input terminal
},
// Output terminal descriptor ( speakerphone )
{
sizeof(AUDOutputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_OUTPUTTERMINAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
AUDOutputTerminalDescriptor_USBTREAMING,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
AUDDLoopRecDriverDescriptors_FEATUREUNIT_REC,
0 // No string descriptor
},
// Feature unit descriptor ( speakerphone )
{
{
sizeof(AUDFeatureUnitDescriptor3),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_FEATUREUNIT,
AUDDLoopRecDriverDescriptors_FEATUREUNIT_REC,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL_REC,
1
},
{
AUDFeatureUnitDescriptor_MUTE, // Mic controls
0,
0
},
0 // No string descriptor
}
},
// - AUIDO OUT
// Audio streaming interface with 0 endpoints
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMING,
0, // This is alternate setting #0
0, // This interface uses no endpoints
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming interface with data endpoint
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMING,
1, // This is alternate setting #1
1, // This interface uses 1 endpoint
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming class-specific descriptor
{
sizeof(AUDStreamingInterfaceDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_GENERAL,
AUDDLoopRecDriverDescriptors_INPUTTERMINAL,
0, // No internal delay because of data path
AUDFormatTypeOneDescriptor_PCM
},
// Format type I descriptor
{
{
sizeof(AUDFormatTypeOneDescriptor1),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_FORMATTYPE,
AUDFormatTypeOneDescriptor_FORMATTYPEONE,
AUDDLoopRecDriver_NUMCHANNELS,
AUDDLoopRecDriver_BYTESPERSAMPLE,
AUDDLoopRecDriver_BYTESPERSAMPLE*8,
1 // One discrete frequency supported
},
{
AUDDLoopRecDriver_SAMPLERATE & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 8) & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 16) & 0xFF
}
},
// Audio streaming endpoint standard descriptor
{
sizeof(AUDEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_OUT,
AUDDLoopRecDriverDescriptors_DATAOUT),
USBEndpointDescriptor_ISOCHRONOUS,
AUDDLoopRecDriver_BYTESPERFRAME,
AUDDLoopRecDriverDescriptors_FS_INTERVAL, // Polling interval = 1 ms
0, // This is not a synchronization endpoint
0 // No associated synchronization endpoint
},
// Audio streaming endpoint class-specific descriptor
{
sizeof(AUDDataEndpointDescriptor),
AUDGenericDescriptor_ENDPOINT,
AUDDataEndpointDescriptor_SUBTYPE,
0, // No attributes
0, // Endpoint is not synchronized
0 // Endpoint is not synchronized
},
//- AUDIO IN
// Audio streaming interface with 0 endpoints
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMINGIN,
0, // This is alternate setting #0
0, // This interface uses no endpoints
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming interface with data endpoint
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDDLoopRecDriverDescriptors_STREAMINGIN,
1, // This is alternate setting #1
1, // This interface uses 1 endpoint
AUDStreamingInterfaceDescriptor_CLASS,
AUDStreamingInterfaceDescriptor_SUBCLASS,
AUDStreamingInterfaceDescriptor_PROTOCOL,
0 // No string descriptor
},
// Audio streaming class-specific descriptor
{
sizeof(AUDStreamingInterfaceDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_GENERAL,
AUDDLoopRecDriverDescriptors_OUTPUTTERMINAL_REC,
0, // No internal delay because of data path
AUDFormatTypeOneDescriptor_PCM
},
// Format type I descriptor
{
{
sizeof(AUDFormatTypeOneDescriptor1),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_FORMATTYPE,
AUDFormatTypeOneDescriptor_FORMATTYPEONE,
AUDDLoopRecDriver_NUMCHANNELS,
AUDDLoopRecDriver_BYTESPERSAMPLE,
AUDDLoopRecDriver_BYTESPERSAMPLE*8,
1 // One discrete frequency supported
},
{
AUDDLoopRecDriver_SAMPLERATE & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 8) & 0xFF,
(AUDDLoopRecDriver_SAMPLERATE >> 16) & 0xFF
}
},
// Audio streaming endpoint standard descriptor
{
sizeof(AUDEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_IN,
AUDDLoopRecDriverDescriptors_DATAIN),
USBEndpointDescriptor_ISOCHRONOUS,
AUDDLoopRecDriver_BYTESPERFRAME,
AUDDLoopRecDriverDescriptors_FS_INTERVAL, // Polling interval = 1 ms
0, // This is not a synchronization endpoint
0 // No associated synchronization endpoint
},
// Audio streaming endpoint class-specific descriptor
{
sizeof(AUDDataEndpointDescriptor),
AUDGenericDescriptor_ENDPOINT,
AUDDataEndpointDescriptor_SUBTYPE,
0, // No attributes
0, // Endpoint is not synchronized
0 // Endpoint is not synchronized
},
DFURT_IF_DESCRIPTOR(3, 0),
};
/// String descriptor with the supported languages.
const unsigned char languageIdDescriptor[] = {
USBStringDescriptor_LENGTH(1),
USBGenericDescriptor_STRING,
USBStringDescriptor_ENGLISH_US
};
/// Manufacturer name.
const unsigned char manufacturerDescriptor[] = {
USBStringDescriptor_LENGTH(8),
USBGenericDescriptor_STRING,
USBStringDescriptor_UNICODE('s'),
USBStringDescriptor_UNICODE('y'),
USBStringDescriptor_UNICODE('s'),
USBStringDescriptor_UNICODE('m'),
USBStringDescriptor_UNICODE('o'),
USBStringDescriptor_UNICODE('c'),
USBStringDescriptor_UNICODE('o'),
USBStringDescriptor_UNICODE('m'),
};
/// Product name.
const unsigned char productDescriptor[] = {
USBStringDescriptor_LENGTH(7),
USBGenericDescriptor_STRING,
USBStringDescriptor_UNICODE('O'),
USBStringDescriptor_UNICODE('s'),
USBStringDescriptor_UNICODE('m'),
USBStringDescriptor_UNICODE('o'),
USBStringDescriptor_UNICODE('S'),
USBStringDescriptor_UNICODE('D'),
USBStringDescriptor_UNICODE('R'),
};
/// Product serial number.
const unsigned char serialNumberDescriptor[] = {
USBStringDescriptor_LENGTH(4),
USBGenericDescriptor_STRING,
USBStringDescriptor_UNICODE('0'),
USBStringDescriptor_UNICODE('1'),
USBStringDescriptor_UNICODE('2'),
USBStringDescriptor_UNICODE('3')
};
/// Array of pointers to the four string descriptors.
const unsigned char *stringDescriptors[] = {
languageIdDescriptor,
manufacturerDescriptor,
productDescriptor,
serialNumberDescriptor,
};
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
/// List of descriptors required by an USB Audio Loop Recorder device driver.
const USBDDriverDescriptors auddFastSourceDriverDescriptors = {
&deviceDescriptor,
(const USBConfigurationDescriptor *) &fsConfigurationDescriptors,
#if defined (CHIP_USB_UDPHS) || defined(CHIP_USB_OTGHS)
&qualifierDescriptor,
(const USBConfigurationDescriptor *) &fsOtherSpeedConfigurationDescriptors,
&deviceDescriptor,
(const USBConfigurationDescriptor *) &hsConfigurationDescriptors,
&qualifierDescriptor,
(const USBConfigurationDescriptor *) &hsOtherSpeedConfigurationDescriptors,
#else
0, 0, 0, 0, 0, 0,
#endif
stringDescriptors,
4 // Number of string descriptors
};
#else
typedef struct {
/// Size of the descriptor in bytes.
unsigned char bLength;
/// Descriptor type (USBGenericDescriptor_ENDPOINT).
unsigned char bDescriptorType;
/// Address and direction of the endpoint.
unsigned char bEndpointAddress;
/// Endpoint type and additional characteristics (for isochronous endpoints).
unsigned char bmAttributes;
/// Maximum packet size (in bytes) of the endpoint.
unsigned short wMaxPacketSize;
/// Polling rate of the endpoint.
unsigned char bInterval;
} __attribute__ ((packed)) BulkEndpointDescriptor; // GCC
typedef struct {
/// Standard configuration.
USBConfigurationDescriptor configuration;
/// Audio stream interface.
USBInterfaceDescriptor stream;
/// Streaming out endpoint descriptor.
BulkEndpointDescriptor bulkInEndpoint;
} __attribute__ ((packed)) BulkDriverConfigurationDescriptors; // GCC
const USBDeviceDescriptor deviceDescriptor = {
sizeof(USBDeviceDescriptor),
USBGenericDescriptor_DEVICE,
USBDeviceDescriptor_USB2_00,
0, // class - all defined at interface level
0, // subclass
0, // protocol
CHIP_USB_ENDPOINTS_MAXPACKETSIZE(0),
AUDDLoopRecDriverDescriptors_VENDORID,
AUDDLoopRecDriverDescriptors_PRODUCTID,
AUDDLoopRecDriverDescriptors_RELEASE,
1, // Manufacturer string descriptor index
2, // Product string descriptor index
3, // Index of serial number string descriptor
1 // One possible configuration
};
/// configuration descriptors for bulk
const BulkDriverConfigurationDescriptors configurationDescriptors = {
// Configuration descriptor
{
sizeof(USBConfigurationDescriptor),
USBGenericDescriptor_CONFIGURATION,
sizeof(BulkDriverConfigurationDescriptors),
1, // This configuration has 1 interfaces
1, // This is configuration #1
0, // No string descriptor
BOARD_USB_BMATTRIBUTES,
USBConfigurationDescriptor_POWER(100)
},
// Bulk interface standard descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
0, // interface number
0, // This is alternate setting #0
1, // This interface uses one endpoint
254, // class
0, // subclass
0, // protocol
0 // No string descriptor
},
{
sizeof(BulkEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_IN,
AUDDLoopRecDriverDescriptors_DATAIN),
USBEndpointDescriptor_BULK,
0x200, // packet size
0 // Polling interval = 0 ms
},
};
/// configuration descriptors for bulk
const BulkDriverConfigurationDescriptors otherConfigurationDescriptors = {
// Configuration descriptor
{
sizeof(USBConfigurationDescriptor),
USBGenericDescriptor_OTHERSPEEDCONFIGURATION,
sizeof(BulkDriverConfigurationDescriptors),
1, // This configuration has 1 interface
1, // This is configuration #1
0, // No string descriptor
BOARD_USB_BMATTRIBUTES,
USBConfigurationDescriptor_POWER(100)
},
// Bulk interface standard descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
0, // interface number
0, // This is alternate setting #0
1, // This interface uses one endpoint
254, // class
0, // subclass
0, // protocol
0 // No string descriptor
},
{
sizeof(BulkEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_IN,
AUDDLoopRecDriverDescriptors_DATAIN),
USBEndpointDescriptor_BULK,
0x200, // packet size
0 // Polling interval = 0 ms
},
};
/// String descriptor with the supported languages.
const unsigned char languageIdDescriptor[] = {
USBStringDescriptor_LENGTH(1),
USBGenericDescriptor_STRING,
USBStringDescriptor_ENGLISH_US
};
/// USB device qualifier descriptor.
const USBDeviceQualifierDescriptor qualifierDescriptor = {
sizeof(USBDeviceQualifierDescriptor),
USBGenericDescriptor_DEVICEQUALIFIER,
USBDeviceDescriptor_USB2_00,
0, // class
0, // subclass
0, // protocol
CHIP_USB_ENDPOINTS_MAXPACKETSIZE(0),
1, // Device has one possible configuration
0 // Reserved
};
/// Manufacturer name.
const unsigned char manufacturerDescriptor[] = {
USBStringDescriptor_LENGTH(8),
USBGenericDescriptor_STRING,
USBStringDescriptor_UNICODE('s'),
USBStringDescriptor_UNICODE('y'),
USBStringDescriptor_UNICODE('s'),
USBStringDescriptor_UNICODE('m'),
USBStringDescriptor_UNICODE('o'),
USBStringDescriptor_UNICODE('c'),
USBStringDescriptor_UNICODE('o'),
USBStringDescriptor_UNICODE('m'),
};
/// Product name.
const unsigned char productDescriptor[] = {
USBStringDescriptor_LENGTH(7),
USBGenericDescriptor_STRING,
USBStringDescriptor_UNICODE('O'),
USBStringDescriptor_UNICODE('s'),
USBStringDescriptor_UNICODE('m'),
USBStringDescriptor_UNICODE('o'),
USBStringDescriptor_UNICODE('S'),
USBStringDescriptor_UNICODE('D'),
USBStringDescriptor_UNICODE('R'),
};
/// Product serial number.
const unsigned char serialNumberDescriptor[] = {
USBStringDescriptor_LENGTH(3),
USBGenericDescriptor_STRING,
USBStringDescriptor_UNICODE('6'),
USBStringDescriptor_UNICODE('6'),
USBStringDescriptor_UNICODE('6')
};
/// Array of pointers to the four string descriptors.
const unsigned char *stringDescriptors[] = {
languageIdDescriptor,
manufacturerDescriptor,
productDescriptor,
serialNumberDescriptor,
};
const USBDDriverDescriptors auddFastSourceDriverDescriptors = {
&deviceDescriptor,
(const USBConfigurationDescriptor *) &configurationDescriptors,
#if defined (CHIP_USB_UDPHS) || defined(CHIP_USB_OTGHS)
&qualifierDescriptor,
(const USBConfigurationDescriptor *) &otherConfigurationDescriptors,
&deviceDescriptor,
(const USBConfigurationDescriptor *) &configurationDescriptors,
&qualifierDescriptor,
(const USBConfigurationDescriptor *) &otherConfigurationDescriptors,
#else
0, 0, 0, 0, 0, 0,
#endif
stringDescriptors,
4 // Number of string descriptors
};
#endif