163 lines
6.3 KiB
C
163 lines
6.3 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.
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
/*
|
|
Title: USBConfigurationDescriptor implementation
|
|
|
|
About: Purpose
|
|
Implementation of the USBConfigurationDescriptor class.
|
|
*/
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Headers
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "USBConfigurationDescriptor.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Exported functions
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// Returns the total length of a configuration, i.e. including the
|
|
/// descriptors following it.
|
|
/// \param configuration Pointer to a USBConfigurationDescriptor instance.
|
|
/// \return Total length (in bytes) of the configuration.
|
|
//-----------------------------------------------------------------------------
|
|
unsigned int USBConfigurationDescriptor_GetTotalLength(
|
|
const USBConfigurationDescriptor *configuration)
|
|
{
|
|
return configuration->wTotalLength;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// Returns the number of interfaces in a configuration.
|
|
/// \param configuration Pointer to a USBConfigurationDescriptor instance.
|
|
/// \return Number of interfaces in configuration.
|
|
//-----------------------------------------------------------------------------
|
|
unsigned char USBConfigurationDescriptor_GetNumInterfaces(
|
|
const USBConfigurationDescriptor *configuration)
|
|
{
|
|
return configuration->bNumInterfaces;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// Indicates if the device is self-powered when in a given configuration.
|
|
/// \param configuration Pointer to a USBConfigurationDescriptor instance.
|
|
/// \return 1 if the device is self-powered when in the given configuration;
|
|
/// otherwise 0.
|
|
//-----------------------------------------------------------------------------
|
|
unsigned char USBConfigurationDescriptor_IsSelfPowered(
|
|
const USBConfigurationDescriptor *configuration)
|
|
{
|
|
if ((configuration->bmAttributes & (1 << 6)) != 0) {
|
|
|
|
return 1;
|
|
}
|
|
else {
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
/// Parses the given Configuration descriptor (followed by relevant
|
|
/// interface, endpoint and class-specific descriptors) into three arrays.
|
|
/// *Each array must have its size equal or greater to the number of
|
|
/// descriptors it stores plus one*. A null-value is inserted after the last
|
|
/// descriptor of each type to indicate the array end.
|
|
///
|
|
/// Note that if the pointer to an array is null (0), nothing is stored in
|
|
/// it.
|
|
/// \param configuration Pointer to the start of the whole Configuration
|
|
/// descriptor.
|
|
/// \param interfaces Pointer to the Interface descriptor array.
|
|
/// \param endpoints Pointer to the Endpoint descriptor array.
|
|
/// \param others Pointer to the class-specific descriptor array.
|
|
//-----------------------------------------------------------------------------
|
|
void USBConfigurationDescriptor_Parse(
|
|
const USBConfigurationDescriptor *configuration,
|
|
USBInterfaceDescriptor **interfaces,
|
|
USBEndpointDescriptor **endpoints,
|
|
USBGenericDescriptor **others)
|
|
{
|
|
// Get size of configuration to parse
|
|
int size = USBConfigurationDescriptor_GetTotalLength(configuration);
|
|
size -= sizeof(USBConfigurationDescriptor);
|
|
|
|
// Start parsing descriptors
|
|
USBGenericDescriptor *descriptor = (USBGenericDescriptor *) configuration;
|
|
while (size > 0) {
|
|
|
|
// Get next descriptor
|
|
descriptor = USBGenericDescriptor_GetNextDescriptor(descriptor);
|
|
size -= USBGenericDescriptor_GetLength(descriptor);
|
|
|
|
// Store descriptor in correponding array
|
|
if (USBGenericDescriptor_GetType(descriptor)
|
|
== USBGenericDescriptor_INTERFACE) {
|
|
|
|
if (interfaces) {
|
|
|
|
*interfaces = (USBInterfaceDescriptor *) descriptor;
|
|
interfaces++;
|
|
}
|
|
}
|
|
else if (USBGenericDescriptor_GetType(descriptor)
|
|
== USBGenericDescriptor_ENDPOINT) {
|
|
|
|
if (endpoints) {
|
|
|
|
*endpoints = (USBEndpointDescriptor *) descriptor;
|
|
endpoints++;
|
|
}
|
|
}
|
|
else if (others) {
|
|
|
|
*others = descriptor;
|
|
others++;
|
|
}
|
|
}
|
|
|
|
// Null-terminate arrays
|
|
if (interfaces) {
|
|
|
|
*interfaces = 0;
|
|
}
|
|
if (endpoints) {
|
|
|
|
*endpoints = 0;
|
|
}
|
|
if (others) {
|
|
|
|
*others = 0;
|
|
}
|
|
}
|
|
|