📄 compositeddriverdescriptors.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 "COMPOSITEDDriver.h"
#include "COMPOSITEDDriverDescriptors.h"
#include <board.h>
//- USB Generic
#include <usb/common/core/USBGenericDescriptor.h>
#include <usb/common/core/USBConfigurationDescriptor.h>
#include <usb/common/core/USBInterfaceAssociationDescriptor.h>
#include <usb/common/core/USBEndpointDescriptor.h>
#include <usb/common/core/USBStringDescriptor.h>
#include <usb/common/core/USBGenericRequest.h>
//- CDC
#if defined(usb_CDCAUDIO) || defined(usb_CDCHID) || defined(usb_CDCCDC) || defined(usb_CDCMSD)
#include <usb/common/cdc/CDCGenericDescriptor.h>
#include <usb/common/cdc/CDCDeviceDescriptor.h>
#include <usb/common/cdc/CDCCommunicationInterfaceDescriptor.h>
#include <usb/common/cdc/CDCDataInterfaceDescriptor.h>
#include <usb/common/cdc/CDCHeaderDescriptor.h>
#include <usb/common/cdc/CDCCallManagementDescriptor.h>
#include <usb/common/cdc/CDCAbstractControlManagementDescriptor.h>
#include <usb/common/cdc/CDCUnionDescriptor.h>
#include "CDCDFunctionDriverDescriptors.h"
#endif // (CDC defined)
//- HID
#if defined(usb_CDCHID) || defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
#include <usb/device/hid-keyboard/HIDDKeyboardInputReport.h>
#include <usb/device/hid-keyboard/HIDDKeyboardOutputReport.h>
#include <usb/common/hid/HIDGenericDescriptor.h>
#include <usb/common/hid/HIDDeviceDescriptor.h>
#include <usb/common/hid/HIDInterfaceDescriptor.h>
#include <usb/common/hid/HIDDescriptor.h>
#include <usb/common/hid/HIDReport.h>
#include <usb/common/hid/HIDGenericDesktop.h>
#include <usb/common/hid/HIDLeds.h>
#include <usb/common/hid/HIDKeypad.h>
#include "HIDDFunctionDriverDescriptors.h"
#endif // (HID defined)
//- AUDIO
#if defined(usb_CDCAUDIO) || defined(usb_HIDAUDIO)
#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 "AUDDFunctionDriverDescriptors.h"
#endif // (AUDIO defined)
//- MSD
#if defined(usb_CDCMSD) || defined(usb_HIDMSD)
#include <usb/common/massstorage/MSDeviceDescriptor.h>
#include <usb/common/massstorage/MSInterfaceDescriptor.h>
#include "MSDDFunctionDriverDescriptors.h"
#endif // (MSD defined)
//-----------------------------------------------------------------------------
// Definitions
//-----------------------------------------------------------------------------
/// Device product ID.
#if defined(usb_CDCHID)
#define COMPOSITEDDriverDescriptors_PRODUCTID 0x6130
#elif defined(usb_CDCAUDIO)
#define COMPOSITEDDriverDescriptors_PRODUCTID 0x6131
#elif defined(usb_CDCMSD)
#define COMPOSITEDDriverDescriptors_PRODUCTID 0x6132
#elif defined(usb_CDCCDC)
#define COMPOSITEDDriverDescriptors_PRODUCTID 0x6133
#elif defined(usb_HIDAUDIO)
#define COMPOSITEDDriverDescriptors_PRODUCTID 0x6134
#elif defined(usb_HIDMSD)
#define COMPOSITEDDriverDescriptors_PRODUCTID 0x6135
#else
#error COMPOSITE Device Classes not defined!
#endif
/// Device vendor ID (Atmel).
#define COMPOSITEDDriverDescriptors_VENDORID 0x03EB
/// Device release number.
#define COMPOSITEDDriverDescriptors_RELEASE 0x0003
//-----------------------------------------------------------------------------
// Macros
//-----------------------------------------------------------------------------
/// Returns the minimum between two values.
#define MIN(a, b) ((a < b) ? a : b)
//-----------------------------------------------------------------------------
// Internal structures
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
/// Audio control header descriptor with one slave interface.
//-----------------------------------------------------------------------------
#ifdef __ICCARM__ // IAR
#pragma pack(1) // IAR
#define __attribute__(...) // IAR
#endif // IAR
//- AUDIO
#if defined(usb_CDCAUDIO) || defined(usb_HIDAUDIO)
typedef struct {
/// Header descriptor.
AUDHeaderDescriptor header;
/// Id of the first grouped interface.
unsigned char bInterface0;
} __attribute__ ((packed)) AUDHeaderDescriptor1; // 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 speaker driver.
//-----------------------------------------------------------------------------
typedef struct {
/// Header descriptor (with one slave interface).
AUDHeaderDescriptor1 header;
/// Input terminal descriptor.
AUDInputTerminalDescriptor input;
/// Output terminal descriptor.
AUDOutputTerminalDescriptor output;
/// Feature unit descriptor.
AUDFeatureUnitDescriptor3 feature;
} __attribute__ ((packed)) AUDDSpeakerDriverAudioControlDescriptors; // 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
#endif // (AUDIO defined)
//-----------------------------------------------------------------------------
/// Configuration descriptor list for a device implementing a composite driver.
//-----------------------------------------------------------------------------
typedef struct {
/// Standard configuration descriptor.
USBConfigurationDescriptor configuration;
#if defined(usb_CDCAUDIO) || defined(usb_CDCHID) || defined(usb_CDCCDC) || defined(usb_CDCMSD)
/// --- CDC 0
/// IAD 0
USBInterfaceAssociationDescriptor cdcIAD0;
/// Communication interface descriptor
USBInterfaceDescriptor cdcCommunication0;
/// CDC header functional descriptor.
CDCHeaderDescriptor cdcHeader0;
/// CDC call management functional descriptor.
CDCCallManagementDescriptor cdcCallManagement0;
/// CDC abstract control management functional descriptor.
CDCAbstractControlManagementDescriptor cdcAbstractControlManagement0;
/// CDC union functional descriptor (with one slave interface).
CDCUnionDescriptor cdcUnion0;
/// Notification endpoint descriptor.
USBEndpointDescriptor cdcNotification0;
/// Data interface descriptor.
USBInterfaceDescriptor cdcData0;
/// Data OUT endpoint descriptor.
USBEndpointDescriptor cdcDataOut0;
/// Data IN endpoint descriptor.
USBEndpointDescriptor cdcDataIn0;
#endif // (CDC defined)
#if defined(usb_CDCHID) || defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
/// --- HID
USBInterfaceDescriptor hidInterface;
HIDDescriptor hid;
USBEndpointDescriptor hidInterruptIn;
USBEndpointDescriptor hidInterruptOut;
#endif // (HID defined)
#if defined(usb_CDCAUDIO) || defined(usb_HIDAUDIO)
/// --- AUDIO
/// IAD 1
USBInterfaceAssociationDescriptor audIAD;
/// Audio control interface.
USBInterfaceDescriptor audInterface;
/// Descriptors for the audio control interface.
AUDDSpeakerDriverAudioControlDescriptors audControl;
/// -- AUDIO out
/// Streaming out interface descriptor (with no endpoint, required).
USBInterfaceDescriptor audStreamingOutNoIsochronous;
/// Streaming out interface descriptor.
USBInterfaceDescriptor audStreamingOut;
/// Audio class descriptor for the streaming out interface.
AUDStreamingInterfaceDescriptor audStreamingOutClass;
/// Stream format descriptor.
AUDFormatTypeOneDescriptor1 audStreamingOutFormatType;
/// Streaming out endpoint descriptor.
AUDEndpointDescriptor audStreamingOutEndpoint;
/// Audio class descriptor for the streaming out endpoint.
AUDDataEndpointDescriptor audStreamingOutDataEndpoint;
#endif // (AUDIO defined)
#if defined(usb_CDCCDC)
/// --- CDC 1
/// IAD 1
USBInterfaceAssociationDescriptor cdcIAD1;
/// Communication interface descriptor
USBInterfaceDescriptor cdcCommunication1;
/// CDC header functional descriptor.
CDCHeaderDescriptor cdcHeader1;
/// CDC call management functional descriptor.
CDCCallManagementDescriptor cdcCallManagement1;
/// CDC abstract control management functional descriptor.
CDCAbstractControlManagementDescriptor cdcAbstractControlManagement1;
/// CDC union functional descriptor (with one slave interface).
CDCUnionDescriptor cdcUnion1;
/// Notification endpoint descriptor.
USBEndpointDescriptor cdcNotification1;
/// Data interface descriptor.
USBInterfaceDescriptor cdcData1;
/// Data OUT endpoint descriptor.
USBEndpointDescriptor cdcDataOut1;
/// Data IN endpoint descriptor.
USBEndpointDescriptor cdcDataIn1;
#endif // (Another CDC defined)
#if defined(usb_CDCMSD) || defined(usb_HIDMSD)
/// --- MSD
/// Mass storage interface descriptor.
USBInterfaceDescriptor msdInterface;
/// Bulk-out endpoint descriptor.
USBEndpointDescriptor msdBulkOut;
/// Bulk-in endpoint descriptor.
USBEndpointDescriptor msdBulkIn;
#endif // (MSD defined)
} __attribute__ ((packed)) CompositeDriverConfigurationDescriptors;
#ifdef __ICCARM__ // IAR
#pragma pack() // IAR
#endif // IAR
//------------------------------------------------------------------------------
// Exported variables
//------------------------------------------------------------------------------
/// Standard USB device descriptor for the composite device driver
const USBDeviceDescriptor deviceDescriptor = {
sizeof(USBDeviceDescriptor),
USBGenericDescriptor_DEVICE,
USBDeviceDescriptor_USB2_00,
#if defined(usb_HIDMSD)
0x00,
0x00,
0x00,
#else
0xEF,// MI
0x02,//
0x01,//
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -