import usb-device-composide-cdchid-project

This commit is contained in:
Harald Welte 2011-07-31 10:22:41 +02:00
parent 63d587cf2e
commit af8603411c
50 changed files with 7028 additions and 0 deletions

View File

@ -0,0 +1,104 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definition of a class for manipulating CDC abstract control management
descriptors.
!!!Usage
Should be included in a list of USB configuration descriptors.
*/
#ifndef CDCABSTRACTCONTROLMANAGEMENTDESCRIPTOR_H
#define CDCABSTRACTCONTROLMANAGEMENTDESCRIPTOR_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "CDC ACM Capabilities"
/// This page lists the capabilities of the CDC ACM.
///
/// !Capabilities
/// - CDCAbstractControlManagementDescriptor_COMMFEATURE
/// - CDCAbstractControlManagementDescriptor_LINE
/// - CDCAbstractControlManagementDescriptor_SENDBREAK
/// - CDCAbstractControlManagementDescriptor_NETWORKCONNECTION
/// Device supports the request combination of SetCommFeature, ClearCommFeature
/// and GetCommFeature.
#define CDCAbstractControlManagementDescriptor_COMMFEATURE (1 << 0)
/// Device supports the request combination of SetLineCoding, GetLineCoding and
/// SetControlLineState.
#define CDCAbstractControlManagementDescriptor_LINE (1 << 1)
/// Device supports the SendBreak request.
#define CDCAbstractControlManagementDescriptor_SENDBREAK (1 << 2)
/// Device supports the NetworkConnection notification.
#define CDCAbstractControlManagementDescriptor_NETWORKCONNECTION (1 << 3)
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
#ifdef __ICCARM__ // IAR
#pragma pack(1) // IAR
#define __attribute__(...) // IAR
#endif // IAR
//------------------------------------------------------------------------------
/// Describes the command supported by the communication interface class
/// with the Abstract Control Model subclass code.
//------------------------------------------------------------------------------
typedef struct {
/// Size of this descriptor in bytes.
unsigned char bFunctionLength;
/// Descriptor type (CDCDescriptors_INTERFACE).
unsigned char bDescriptorType;
/// Descriptor subtype (CDCDescriptors_ABSTRACTCONTROLMANAGEMENT).
unsigned char bDescriptorSubtype;
/// Configuration capabilities.
/// \sa "CDC ACM Capabilities".
unsigned char bmCapabilities;
} __attribute__ ((packed)) CDCAbstractControlManagementDescriptor; // GCC
#ifdef __ICCARM__ // IAR
#pragma pack() // IAR
#endif // IAR
#endif //#ifndef CDCABSTRACTCONTROLMANAGEMENTDESCRIPTOR_H

View File

@ -0,0 +1,97 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definition of a class for managing CDC call management descriptors.
!!!Usage
Should be included in a list of configuration descriptors for a USB
device.
*/
#ifndef CDCCALLMANAGEMENTDESCRIPTOR_H
#define CDCCALLMANAGEMENTDESCRIPTOR_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "CDC CallManagement Capabilities"
/// This page lists CDC CallManagement Capabilities.
///
/// !Capabilities
/// - CDCCallManagementDescriptor_SELFCALLMANAGEMENT
/// - CDCCallManagementDescriptor_DATACALLMANAGEMENT
/// Device handles call management itself.
#define CDCCallManagementDescriptor_SELFCALLMANAGEMENT (1 << 0)
/// Device can exchange call management information over a Data class interface.
#define CDCCallManagementDescriptor_DATACALLMANAGEMENT (1 << 1)
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
#ifdef __ICCARM__ // IAR
#pragma pack(1) // IAR
#define __attribute__(...) // IAR
#endif // IAR
//------------------------------------------------------------------------------
/// Describes the processing of calls for the communication class interface.
//------------------------------------------------------------------------------
typedef struct {
/// Size of this descriptor in bytes.
unsigned char bFunctionLength;
/// Descriptor type (CDCDescriptors_INTERFACE).
unsigned char bDescriptorType;
/// Descriptor sub-type (CDCDescriptors_CALLMANAGEMENT).
unsigned char bDescriptorSubtype;
/// Configuration capabilities ("CDC CallManagement Capabilities").
unsigned char bmCapabilities;
/// Interface number of the data class interface used for call management
/// (optional).
unsigned char bDataInterface;
} __attribute__ ((packed)) CDCCallManagementDescriptor; // GCC
#ifdef __ICCARM__ // IAR
#pragma pack() // IAR
#endif // IAR
#endif //#ifndef CDCCALLMANAGEMENTDESCRIPTOR_H

View File

@ -0,0 +1,65 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definition of several constants used when declaring a CDC communication
class interface descriptor.
*/
#ifndef CDCCOMMUNICATIONINTERFACEDESCRIPTOR_H
#define CDCCOMMUNICATIONINTERFACEDESCRIPTOR_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "CDC Communication Interface Values"
/// This page lists the values for CDC Communication Interface Descriptor.
///
/// !Values
/// - CDCCommunicationInterfaceDescriptor_CLASS
/// - CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL
/// - CDCCommunicationInterfaceDescriptor_NOPROTOCOL
/// Interface class code for a CDC communication class interface.
#define CDCCommunicationInterfaceDescriptor_CLASS 0x02
/// Interface subclass code for an Abstract Control Model interface descriptor.
#define CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL 0x02
/// Interface protocol code when a CDC communication interface does not
/// implemenent any particular protocol.
#define CDCCommunicationInterfaceDescriptor_NOPROTOCOL 0x00
//------------------------------------------------------------------------------
#endif //#ifndef CDCCOMMUNICATIONINTERFACEDESCRIPTOR_H

View File

@ -0,0 +1,65 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definitions of constants used when declaring a CDC data class interface
descriptor.
*/
#ifndef CDCDATAINTERFACEDESCRIPTOR_H
#define CDCDATAINTERFACEDESCRIPTOR_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "CDC Data Interface Values"
/// This page lists the values for CDC Data Interface Descriptor.
///
/// !Values
/// - CDCDataInterfaceDescriptor_CLASS
/// - CDCDataInterfaceDescriptor_SUBCLASS
/// - CDCDataInterfaceDescriptor_NOPROTOCOL
/// Interface class code for a data class interface.
#define CDCDataInterfaceDescriptor_CLASS 0x0A
/// Interface subclass code for a data class interface.
#define CDCDataInterfaceDescriptor_SUBCLASS 0x00
/// Protocol code for a data class interface which does not implement any
/// particular protocol.
#define CDCDataInterfaceDescriptor_NOPROTOCOL 0x00
//------------------------------------------------------------------------------
#endif //#ifndef CDCDATAINTERFACEDESCRIPTOR_H

View File

@ -0,0 +1,64 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definition of several constants used when declaring USB CDC device
descriptors.
*/
#ifndef CDCDEVICEDESCRIPTOR_H
#define CDCDEVICEDESCRIPTOR_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "CDC Device Descriptor Values"
/// This page lists the values for CDC Device Descriptor.
///
/// !Values
/// - CDCDeviceDescriptor_CLASS
/// - CDCDeviceDescriptor_SUBCLASS
/// - CDCDeviceDescriptor_PROTOCOL
/// Device class code when using the CDC class.
#define CDCDeviceDescriptor_CLASS 0x02
/// Device subclass code when using the CDC class.
#define CDCDeviceDescriptor_SUBCLASS 0x00
/// Device protocol code when using the CDC class.
#define CDCDeviceDescriptor_PROTOCOL 0x00
//------------------------------------------------------------------------------
#endif //#ifndef CDCDEVICEDESCRIPTOR_H

View File

@ -0,0 +1,91 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definition of several constants for declaring CDC descriptors.
*/
#ifndef CDCGENERICDESCRIPTOR_H
#define CDCGENERICDESCRIPTOR_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "CDC Specification Release Numbers"
/// This page list the CDC Spec. Release Numbers.
///
/// !Numbers
/// - CDCGenericDescriptor_CDC1_10
/// Identify CDC specification version 1.10.
#define CDCGenericDescriptor_CDC1_10 0x0110
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "CDC Descriptro Types"
/// This page lists CDC descriptor types.
///
/// !Types
/// - CDCGenericDescriptor_INTERFACE
/// - CDCGenericDescriptor_ENDPOINT
///Indicates that a CDC descriptor applies to an interface.
#define CDCGenericDescriptor_INTERFACE 0x24
/// Indicates that a CDC descriptor applies to an endpoint.
#define CDCGenericDescriptor_ENDPOINT 0x25
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "CDC Descriptor Subtypes"
/// This page lists CDC descriptor sub types
///
/// !Types
/// - CDCGenericDescriptor_HEADER
/// - CDCGenericDescriptor_CALLMANAGEMENT
/// - CDCGenericDescriptor_ABSTRACTCONTROLMANAGEMENT
/// - CDCGenericDescriptor_UNION
/// Header functional descriptor subtype.
#define CDCGenericDescriptor_HEADER 0x00
/// Call management functional descriptor subtype.
#define CDCGenericDescriptor_CALLMANAGEMENT 0x01
/// Abstract control management descriptor subtype.
#define CDCGenericDescriptor_ABSTRACTCONTROLMANAGEMENT 0x02
/// Union descriptor subtype.
#define CDCGenericDescriptor_UNION 0x06
//------------------------------------------------------------------------------
#endif //#ifndef CDCGENERICDESCRIPTOR_H

View File

@ -0,0 +1,63 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Various definitions used for characterizing USB CDC requests.
*/
#ifndef CDCGENERICREQUEST_H
#define CDCGENERICREQUEST_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "CDC Request Codes"
/// This page lists USB CDC Request Codes.
///
/// !Codes
/// - CDCGenericRequest_SETLINECODING
/// - CDCGenericRequest_GETLINECODING
/// - CDCGenericRequest_SETCONTROLLINESTATE
/// SetLineCoding request code.
#define CDCGenericRequest_SETLINECODING 0x20
/// GetLineCoding request code.
#define CDCGenericRequest_GETLINECODING 0x21
/// SetControlLineState request code.
#define CDCGenericRequest_SETCONTROLLINESTATE 0x22
//------------------------------------------------------------------------------
#endif //#ifndef CDCGENERICREQUEST_H

View File

@ -0,0 +1,77 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definition of the CDCHeaderDescriptor class.
!!!Usage
Should be included in a USB configuration descriptor.
*/
#ifndef CDCHEADERDESCRIPTOR_H
#define CDCHEADERDESCRIPTOR_H
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
#ifdef __ICCARM__ // IAR
#pragma pack(1) // IAR
#define __attribute__(...) // IAR
#endif // IAR
//------------------------------------------------------------------------------
/// Marks the beginning of the concatenated set of functional descriptors
/// for the interface.
//------------------------------------------------------------------------------
typedef struct {
/// Size of this descriptor in bytes.
unsigned char bFunctionLength;
/// Descriptor type (CDCDescriptors_INTERFACE).
unsigned char bDescriptorType;
/// Descriptor sub-type (CDCDescriptors_HEADER).
unsigned char bDescriptorSubtype;
/// USB CDC specification release number.
unsigned short bcdCDC;
} __attribute__ ((packed)) CDCHeaderDescriptor; // GCC
#ifdef __ICCARM__ // IAR
#pragma pack() // IAR
#endif // IAR
#endif //#ifndef CDCHEADERDESCRIPTOR_H

View File

@ -0,0 +1,78 @@
/* ----------------------------------------------------------------------------
* 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: CDCLineCoding
About: Purpose
Implementation of the CDCLineCoding class.
*/
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "CDCLineCoding.h"
#include <utility/assert.h>
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Initializes the bitrate, number of stop bits, parity checking and
/// number of data bits of a CDCLineCoding object.
/// \param lineCoding Pointer to a CDCLineCoding instance.
/// \param bitrate Bitrate of the virtual COM connection.
/// \param stopbits Number of stop bits ("CDC LineCoding StopBits").
/// \param parity Parity check type ("CDC LineCoding ParityChecking").
/// \param databits Number of data bits.
//------------------------------------------------------------------------------
void CDCLineCoding_Initialize(CDCLineCoding *lineCoding,
unsigned int bitrate,
unsigned char stopbits,
unsigned char parity,
unsigned char databits)
{
ASSERT(stopbits <= CDCLineCoding_TWOSTOPBITS,
"CDCLineCoding_Initialize: Invalid stopbits value (%d)\n\r",
stopbits);
ASSERT(parity <= CDCLineCoding_SPACEPARITY,
"CDCLineCoding_Initialize: Invalid parity value (%d)\n\r",
parity);
ASSERT(((databits >= 5) && (databits <= 8)) || (databits == 16),
"CDCLineCoding_Initialize: Invalid databits value (%d)\n\r",
databits);
lineCoding->dwDTERate = bitrate;
lineCoding->bCharFormat = stopbits;
lineCoding->bParityType = parity;
lineCoding->bDataBits = databits;
}

View File

@ -0,0 +1,136 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Line coding structure used for by the CDC GetLineCoding and SetLineCoding
requests.
!!!Usage
-# Initialize a CDCLineCoding instance using CDCLineCoding_Initialize.
-# Send a CDCLineCoding object to the host in response to a GetLineCoding
request.
-# Receive a CDCLineCoding object from the host after a SetLineCoding
request.
*/
#ifndef CDCLINECODING_H
#define CDCLINECODING_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "CDC LineCoding StopBits"
/// This page lists Stop Bits for CDC Line Coding.
///
/// !Stop bits
/// - CDCLineCoding_ONESTOPBIT
/// - CDCLineCoding_ONE5STOPBIT
/// - CDCLineCoding_TWOSTOPBITS
/// The transmission protocol uses one stop bit.
#define CDCLineCoding_ONESTOPBIT 0
/// The transmission protocol uses 1.5 stop bit.
#define CDCLineCoding_ONE5STOPBIT 1
/// The transmissin protocol uses two stop bits.
#define CDCLineCoding_TWOSTOPBITS 2
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "CDC LineCoding ParityCheckings"
/// This page lists Parity checkings for CDC Line Coding.
///
/// !Parity checking
/// - CDCLineCoding_NOPARITY
/// - CDCLineCoding_ODDPARITY
/// - CDCLineCoding_EVENPARITY
/// - CDCLineCoding_MARKPARITY
/// - CDCLineCoding_SPACEPARITY
/// No parity checking.
#define CDCLineCoding_NOPARITY 0
/// Odd parity checking.
#define CDCLineCoding_ODDPARITY 1
/// Even parity checking.
#define CDCLineCoding_EVENPARITY 2
/// Mark parity checking.
#define CDCLineCoding_MARKPARITY 3
/// Space parity checking.
#define CDCLineCoding_SPACEPARITY 4
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
#ifdef __ICCARM__ // IAR
#pragma pack(1) // IAR
#define __attribute__(...) // IAR
#endif // IAR
//------------------------------------------------------------------------------
/// Format of the data returned when a GetLineCoding request is received.
//------------------------------------------------------------------------------
typedef struct {
/// Data terminal rate in bits per second.
unsigned int dwDTERate;
/// Number of stop bits.
/// \sa "CDC LineCoding StopBits".
char bCharFormat;
/// Type of parity checking used.
/// \sa "CDC LineCoding ParityCheckings".
char bParityType;
/// Number of data bits (5, 6, 7, 8 or 16).
char bDataBits;
} __attribute__ ((packed)) CDCLineCoding; // GCC
#ifdef __ICCARM__ // IAR
#pragma pack() // IAR
#endif // IAR
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
extern void CDCLineCoding_Initialize(CDCLineCoding *lineCoding,
unsigned int bitrate,
unsigned char stopbits,
unsigned char parity,
unsigned char databits);
#endif //#ifndef CDCLINECODING_H

View File

@ -0,0 +1,84 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
CDCSetControlLineStateRequest.c
!!!Purpose
Implementation of the CDCSetControlLineStateRequest class.
*/
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "CDCSetControlLineStateRequest.h"
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Notifies if the given request indicates that the DTE signal is present.
/// \param request Pointer to a USBGenericRequest instance.
/// \return 1 if the DTE signal is present, otherwise 0.
//------------------------------------------------------------------------------
unsigned char CDCSetControlLineStateRequest_IsDtePresent(
const USBGenericRequest *request)
{
if ((USBGenericRequest_GetValue(request) & 0x0001) != 0) {
return 1;
}
else {
return 0;
}
}
//------------------------------------------------------------------------------
/// Notifies if the given request indicates that the device carrier should
/// be activated.
/// \param request Pointer to a USBGenericRequest instance.
/// \return 1 is the device should activate its carrier, 0 otherwise.
//------------------------------------------------------------------------------
unsigned char CDCSetControlLineStateRequest_ActivateCarrier(
const USBGenericRequest *request)
{
if ((USBGenericRequest_GetValue(request) & 0x0002) != 0) {
return 1;
}
else {
return 0;
}
}

View File

@ -0,0 +1,59 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definition of a class for manipulating SetControlLineState requests.
*/
#ifndef CDCSETCONTROLLINESTATE_H
#define CDCSETCONTROLLINESTATE_H
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include <usb/common/core/USBGenericRequest.h>
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
extern unsigned char CDCSetControlLineStateRequest_IsDtePresent(
const USBGenericRequest *request);
extern unsigned char CDCSetControlLineStateRequest_ActivateCarrier(
const USBGenericRequest *request);
#endif //#ifndef CDCSETCONTROLLINESTATE_H

View File

@ -0,0 +1,79 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definition of a class for manipulating CDC union descriptors.
!!!Usage
Should be included in the list of USB descriptor used for a device
configuration.
*/
#ifndef CDCUNIONDESCRIPTOR_H
#define CDCUNIONDESCRIPTOR_H
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
#ifdef __ICCARM__ // IAR
#pragma pack(1) // IAR
#define __attribute__(...) // IAR
#endif // IAR
//------------------------------------------------------------------------------
/// Describes the relationship between a group of interfaces that can
/// be considered to form a functional unit.
//------------------------------------------------------------------------------
typedef struct {
/// Size of the descriptor in bytes.
unsigned char bFunctionLength;
/// Descriptor type (CDCDescriptors_INTERFACE).
unsigned char bDescriptorType;
/// Descriptor subtype (CDCDescriptors_UNION).
unsigned char bDescriptorSubtype;
/// Number of the master interface for this union.
unsigned char bMasterInterface;
/// Number of the first slave interface for this union.
unsigned char bSlaveInterface0;
} __attribute__ ((packed)) CDCUnionDescriptor; // GCC
#ifdef __ICCARM__ // IAR
#pragma pack() // IAR
#endif // IAR
#endif //#ifndef CDCUNIONDESCRIPTOR_H

View File

@ -0,0 +1,86 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \page USBInterfaceAssociateDescriptor
* !!!Purpose
*
* Class for manipulating USB IAD descriptors.
*
* !!!Usage
*
* -# Test
*/
#ifndef USBDIADDESCRIPTOR_H
#define USBDIADDESCRIPTOR_H
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
#ifdef __ICCARM__ // IAR
#pragma pack(1) // IAR
#define __attribute__(...) // IAR
#endif // IAR
/*
Type: USBDeviceDescriptor
USB standard device descriptor structure.
Variables:
bLength - Size of this descriptor in bytes.
bDescriptorType - Descriptor type (<USBGenericDescriptor_IAD>).
bFirstInterface - Interface number of the first interface that is
associated with this function.
bInterfaceCount - Number of contiguous interfaces that are
associated with this function.
bFunctionClass - Class code (assigned by USB-IF).
bFunctionSubClass - Subclass code (assigned by USB-IF).
bFunctionProtocol - Protocol code (assigned by USB-IF)
iFunction - Index of string descriptor describing this function.
*/
typedef struct {
unsigned char bLength;
unsigned char bDescriptorType;
unsigned char bFirstInterface;
unsigned char bInterfaceCount;
unsigned char bFunctionClass;
unsigned char bFunctionSubClass;
unsigned char bFunctionProtocol;
unsigned char iFunction;
} __attribute__ ((packed)) USBInterfaceAssociationDescriptor; // GCC
#ifdef __ICCARM__ // IAR
#pragma pack() // IAR
#endif // IAR
#endif //#ifndef USBDIADDESCRIPTOR_H

View File

@ -0,0 +1,93 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Methods and definitions for manipulating a HID descriptor.
*/
#ifndef HIDDESCRIPTOR_H
#define HIDDESCRIPTOR_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Release Numbers"
/// ...
///
/// !Numbers
/// - HIDDescriptor_HID1_11
/// Identifies version 1.11 of the HID specification.
#define HIDDescriptor_HID1_11 0x0111
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
#ifdef __ICCARM__ // IAR
#pragma pack(1) // IAR
#define __attribute__(...) // IAR
#endif // IAR
//------------------------------------------------------------------------------
/// Identifies the length of type of subordinate descriptors of a HID
/// device. This particular type only supports one subordinate descriptor.
//------------------------------------------------------------------------------
typedef struct {
/// Size of descriptor in bytes.
unsigned char bLength;
/// Descriptor type (HIDGenericDescriptor_HID).
unsigned char bDescriptorType;
/// HID class specification release number in BCD format.
unsigned short bcdHID;
/// Country code of the device if it is localized.
unsigned char bCountryCode;
/// Number of subordinate descriptors.
unsigned char bNumDescriptors;
/// Type of the first subordinate descriptor.
unsigned char bDescriptorType0;
/// Size in bytes of the first subordinate descriptor.
unsigned short wDescriptorLength0;
} __attribute__ ((packed)) HIDDescriptor; // GCC
#ifdef __ICCARM__ // IAR
#pragma pack() // IAR
#endif // IAR
#endif //#ifndef HIDDESCRIPTOR_H

View File

@ -0,0 +1,68 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definitions used for declaring the device descriptor of a HID device.
!!!Usage
Use this constants when defining an instance of USBDeviceDescriptor for
an HID device.
*/
#ifndef HIDDEVICEDESCRIPTOR_H
#define HIDDEVICEDESCRIPTOR_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Device Descriptor Codes"
/// This page lists HID device class, subclass and protocol codes.
///
/// !Codes
/// - HIDDeviceDescriptor_CLASS
/// - HIDDeviceDescriptor_SUBCLASS
/// - HIDDeviceDescriptor_PROTOCOL
/// Class code for a HID device.
#define HIDDeviceDescriptor_CLASS 0
/// Subclass code for a HID device.
#define HIDDeviceDescriptor_SUBCLASS 0
/// Protocol code for a HID device.
#define HIDDeviceDescriptor_PROTOCOL 0
//------------------------------------------------------------------------------
#endif //#ifndef HIDDEVICEDESCRIPTOR_H

View File

@ -0,0 +1,63 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definitions for using HID-specific descriptors.
*/
#ifndef HIDGENERICDESCRIPTOR_H
#define HIDGENERICDESCRIPTOR_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Descriptors Types"
/// ...
///
/// !Types
/// - HIDGenericDescriptor_HID
/// - HIDGenericDescriptor_REPORT
/// - HIDGenericDescriptor_PHYSICAL
/// HID descriptor type.
#define HIDGenericDescriptor_HID 0x21
/// Report descriptor type.
#define HIDGenericDescriptor_REPORT 0x22
/// Physical descriptor type.
#define HIDGenericDescriptor_PHYSICAL 0x23
//------------------------------------------------------------------------------
#endif //#ifndef HIDGENERICDESCRIPTOR_H

View File

@ -0,0 +1,98 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Constants for using the HID generic desktop usage page.
!!!Usage
Use these constants when declaring a Report descriptor which references
the generic desktop page.
*/
#ifndef HIDGENERICDESKTOP_H
#define HIDGENERICDESKTOP_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID GenericDesktop Page ID"
/// ...
///
/// !ID
/// - HIDGenericDesktop_PAGEID
/// ID for the HID generic desktop usage page.
#define HIDGenericDesktop_PAGEID 0x01
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID GenericDesktop Usages"
/// ...
///
/// !Usages
/// - HIDGenericDesktop_POINTER
/// - HIDGenericDesktop_MOUSE
/// - HIDGenericDesktop_JOYSTICK
/// - HIDGenericDesktop_GAMEPAD
/// - HIDGenericDesktop_KEYBOARD
/// - HIDGenericDesktop_KEYPAD
/// - HIDGenericDesktop_MULTIAXIS
/// - HIDGenericDesktop_X
/// - HIDGenericDesktop_Y
/// Pointer usage ID.
#define HIDGenericDesktop_POINTER 0x01
/// Mouse usage ID.
#define HIDGenericDesktop_MOUSE 0x02
/// Joystick usage ID.
#define HIDGenericDesktop_JOYSTICK 0x04
/// Gamepad usage ID.
#define HIDGenericDesktop_GAMEPAD 0x05
/// Keyboard usage ID.
#define HIDGenericDesktop_KEYBOARD 0x06
/// Keypad usage ID.
#define HIDGenericDesktop_KEYPAD 0x07
/// Multi-axis controller usage ID.
#define HIDGenericDesktop_MULTIAXIS 0x08
/// Axis Usage X direction ID.
#define HIDGenericDesktop_X 0x30
/// Axis Usage Y direction ID.
#define HIDGenericDesktop_Y 0x31
//------------------------------------------------------------------------------
#endif //#ifndef HIDGENERICDESKTOP_H

View File

@ -0,0 +1,75 @@
/* ----------------------------------------------------------------------------
* 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: HIDGenericRequest
About: Purpose
Definition of constants for using HID-specific requests.
About: Usage
When constructing or receiving an HID SETUP request, use the request
codes provided by this header file.
*/
#ifndef HIDGENERICREQUEST_H
#define HIDGENERICREQUEST_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Request Codes"
/// ...
///
/// !Codes
/// - HIDGenericRequest_GETREPORT
/// - HIDGenericRequest_GETIDLE
/// - HIDGenericRequest_GETPROTOCOL
/// - HIDGenericRequest_SETREPORT
/// - HIDGenericRequest_SETIDLE
/// - HIDGenericRequest_SETPROTOCOL
/// GetReport request code.
#define HIDGenericRequest_GETREPORT 0x01
/// GetIdle request code.
#define HIDGenericRequest_GETIDLE 0x02
/// GetProtocol request code.
#define HIDGenericRequest_GETPROTOCOL 0x03
/// SetReport request code.
#define HIDGenericRequest_SETREPORT 0x09
/// SetIdle request code.
#define HIDGenericRequest_SETIDLE 0x0A
/// SetProtocol request code.
#define HIDGenericRequest_SETPROTOCOL 0x0B
//------------------------------------------------------------------------------
#endif //#ifndef HIDGENERICREQUEST_H

View File

@ -0,0 +1,56 @@
/* ----------------------------------------------------------------------------
* 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: HIDIdleRequest implementation
About: Purpose
Implementation of the HIDIdleRequest methods.
*/
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "HIDIdleRequest.h"
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Retrieves the Idle rate (in milliseconds) indicated by a SET_IDLE
/// request.
/// \param request Pointer to a USBGenericRequest instance.
/// \return New idle rate for the report.
//------------------------------------------------------------------------------
unsigned char HIDIdleRequest_GetIdleRate(const USBGenericRequest *request)
{
return ((USBGenericRequest_GetValue(request) >> 8) & 0xFF);
}

View File

@ -0,0 +1,68 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Methods and constants for manipulating HID-specific GET_IDLE and SET_IDLE
requests.
!!!Usage
-# Retrieve the idle rate indicated by a GET_IDLE or SET_IDLE request
with HIDIdleRequest_GetIdleRate.
*/
#ifndef HIDIDLEREQUEST_H
#define HIDIDLEREQUEST_H
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include <usb/common/core/USBGenericRequest.h>
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
/// Infinite idle rate.
#define HIDIdleRequest_INFINITE 0
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
extern unsigned char HIDIdleRequest_GetIdleRate(
const USBGenericRequest *request);
#endif //#ifndef HIDIDLEREQUEST_H

View File

@ -0,0 +1,77 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Constants used when declaring an HID interface.
!!!Usage
Use the constants defined here when declaring a USBInterfaceDescriptor
instance for a HID interface.
*/
#ifndef HIDINTERFACEDESCRIPTOR_H
#define HIDINTERFACEDESCRIPTOR_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Interface Descriptor Codes"
/// This page lists HID Interface class, subclass and protocol codes.
///
/// !Codes
/// - HIDInterfaceDescriptor_CLASS
/// - HIDInterfaceDescriptor_SUBCLASS_NONE
/// - HIDInterfaceDescriptor_SUBCLASS_BOOT
/// - HIDInterfaceDescriptor_PROTOCOL_NONE
/// - HIDInterfaceDescriptor_PROTOCOL_KEYBOARD
/// - HIDInterfaceDescriptor_PROTOCOL_MOUSE
/// HID interface class code.
#define HIDInterfaceDescriptor_CLASS 0x03
/// Indicates the interface does not implement a particular subclass.
#define HIDInterfaceDescriptor_SUBCLASS_NONE 0x00
/// Indicates the interface is compliant with the boot specification.
#define HIDInterfaceDescriptor_SUBCLASS_BOOT 0x01
/// Indicates the interface does not implement a particular protocol.
#define HIDInterfaceDescriptor_PROTOCOL_NONE 0x00
/// Indicates the interface supports the boot specification as a keyboard.
#define HIDInterfaceDescriptor_PROTOCOL_KEYBOARD 0x01
/// Indicates the interface supports the boot specification as a mouse.
#define HIDInterfaceDescriptor_PROTOCOL_MOUSE 0x02
//------------------------------------------------------------------------------
#endif //#ifndef HIDINTERFACEDESCRIPTOR_H

View File

@ -0,0 +1,56 @@
/* ----------------------------------------------------------------------------
* 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: HIDKeypad implementation
About: Purpose
Implementation of HID keypad usage page methods.
*/
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "HIDKeypad.h"
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Indicates if the given key code is associated with a modified key.
/// \param key Key code.
/// \return 1 if the key code represents a modifier key; otherwise 0.
//------------------------------------------------------------------------------
unsigned char HIDKeypad_IsModifierKey(unsigned char key)
{
return ((key >= HIDKeypad_LEFTCONTROL) && (key <= HIDKeypad_RIGHTGUI));
}

View File

@ -0,0 +1,276 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definitions of constants and methods for the HID keypad usage page.
!!!Usage
-# Use the constants declared in this file when instanciating a
Report descriptor instance.
-# When implementing the functionality of an HID keyboard, use the
key codes defined here to indicate keys that are being pressed and
released.
*/
#ifndef HIDKEYPAD_H
#define HIDKEYPAD_H
//------------------------------------------------------------------------------
// Constants
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Keypad Page ID"
/// This page lists HID Keypad page ID.
///
/// !ID
/// - HIDKeypad_PAGEID
/// Identifier for the HID keypad usage page
#define HIDKeypad_PAGEID 0x07
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Alphabetic Keys"
/// ...
///
/// !Keys
/// - HIDKeypad_A
/// - HIDKeypad_B
/// - HIDKeypad_C
/// - HIDKeypad_D
/// - HIDKeypad_E
/// - HIDKeypad_F
/// - HIDKeypad_G
/// - HIDKeypad_H
/// - HIDKeypad_I
/// - HIDKeypad_J
/// - HIDKeypad_K
/// - HIDKeypad_L
/// - HIDKeypad_M
/// - HIDKeypad_N
/// - HIDKeypad_O
/// - HIDKeypad_P
/// - HIDKeypad_Q
/// - HIDKeypad_R
/// - HIDKeypad_S
/// - HIDKeypad_T
/// - HIDKeypad_U
/// - HIDKeypad_V
/// - HIDKeypad_W
/// - HIDKeypad_X
/// - HIDKeypad_Y
/// - HIDKeypad_Z
/// Key code for 'a' and 'A'.
#define HIDKeypad_A 4
/// Key code for 'b' and 'B'.
#define HIDKeypad_B 5
/// Key code for 'c' and 'C'.
#define HIDKeypad_C 6
/// Key code for 'd' and 'D'.
#define HIDKeypad_D 7
/// Key code for 'e' and 'E'.
#define HIDKeypad_E 8
/// Key code for 'f' and 'F'.
#define HIDKeypad_F 9
/// Key code for 'g' and 'G'.
#define HIDKeypad_G 10
/// Key code for 'h' and 'H'.
#define HIDKeypad_H 11
/// Key code for 'i' and 'I'.
#define HIDKeypad_I 12
/// Key code for 'j' and 'J'.
#define HIDKeypad_J 13
/// Key code for 'k' and 'K'.
#define HIDKeypad_K 14
/// Key code for 'l' and 'L'.
#define HIDKeypad_L 15
/// Key code for 'm' and 'M'.
#define HIDKeypad_M 16
/// Key code for 'n' and 'N'.
#define HIDKeypad_N 17
/// Key code for 'o' and 'O'.
#define HIDKeypad_O 18
/// Key code for 'p' and 'P'.
#define HIDKeypad_P 19
/// Key code for 'q' and 'Q'.
#define HIDKeypad_Q 20
/// Key code for 'r' and 'R'.
#define HIDKeypad_R 21
/// Key code for 's' and 'S'.
#define HIDKeypad_S 22
/// Key code for 't' and 'T'.
#define HIDKeypad_T 23
/// Key code for 'u' and 'U'.
#define HIDKeypad_U 24
/// Key code for 'v' and 'V'.
#define HIDKeypad_V 25
/// Key code for 'w' and 'W'.
#define HIDKeypad_W 26
/// Key code for 'x' and 'X'.
#define HIDKeypad_X 27
/// Key code for 'y' and 'Y'.
#define HIDKeypad_Y 28
/// Key code for 'z' and 'Z'.
#define HIDKeypad_Z 29
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Numeric Keys"
/// ...
///
/// !Keys
/// - HIDKeypad_1
/// - HIDKeypad_2
/// - HIDKeypad_3
/// - HIDKeypad_4
/// - HIDKeypad_5
/// - HIDKeypad_6
/// - HIDKeypad_7
/// - HIDKeypad_8
/// - HIDKeypad_9
/// - HIDKeypad_0
/// Key code for '1' and '!'.
#define HIDKeypad_1 30
/// Key code for '2' and '@'.
#define HIDKeypad_2 31
/// Key code for '3' and '#'.
#define HIDKeypad_3 32
/// Key code for '4' and '$'.
#define HIDKeypad_4 33
/// Key code for '5' and '%'.
#define HIDKeypad_5 34
/// Key code for '6' and '^'.
#define HIDKeypad_6 35
/// Key code for '7' and '&'.
#define HIDKeypad_7 36
/// Key code for '8' and '*'.
#define HIDKeypad_8 37
/// Key code for '9' and '('.
#define HIDKeypad_9 38
/// Key code for '0' and ')'.
#define HIDKeypad_0 39
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Special Keys"
/// ...
///
/// !Keys
/// - HIDKeypad_ENTER
/// - HIDKeypad_ESCAPE
/// - HIDKeypad_BACKSPACE
/// - HIDKeypad_TAB
/// - HIDKeypad_SPACEBAR
/// - HIDKeypad_PRINTSCREEN
/// - HIDKeypad_SCROLLLOCK
/// - HIDKeypad_NUMLOCK
/// Enter key code.
#define HIDKeypad_ENTER 40
/// Escape key code.
#define HIDKeypad_ESCAPE 41
/// Backspace key code.
#define HIDKeypad_BACKSPACE 42
/// Tab key code.
#define HIDKeypad_TAB 43
/// Spacebar key code.
#define HIDKeypad_SPACEBAR 44
/// Printscreen key code.
#define HIDKeypad_PRINTSCREEN 70
/// Scroll lock key code.
#define HIDKeypad_SCROLLLOCK 71
/// Num lock key code.
#define HIDKeypad_NUMLOCK 83
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Modified Keys"
/// ...
///
/// !Keys
/// - HIDKeypad_LEFTCONTROL
/// - HIDKeypad_LEFTSHIFT
/// - HIDKeypad_LEFTALT
/// - HIDKeypad_LEFTGUI
/// - HIDKeypad_RIGHTCONTROL
/// - HIDKeypad_RIGHTSHIFT
/// - HIDKeypad_RIGHTALT
/// - HIDKeypad_RIGHTGUI
/// Key code for the left 'Control' key.
#define HIDKeypad_LEFTCONTROL 224
/// Key code for the left 'Shift' key.
#define HIDKeypad_LEFTSHIFT 225
/// Key code for the left 'Alt' key.
#define HIDKeypad_LEFTALT 226
/// Key code for the left 'GUI' (e.g. Windows) key.
#define HIDKeypad_LEFTGUI 227
/// Key code for the right 'Control' key.
#define HIDKeypad_RIGHTCONTROL 228
/// Key code for the right 'Shift' key.
#define HIDKeypad_RIGHTSHIFT 229
/// Key code for the right 'Alt' key.
#define HIDKeypad_RIGHTALT 230
/// Key code for the right 'GUI' key.
#define HIDKeypad_RIGHTGUI 231
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Error Codes"
/// ...
///
/// !Codes
/// - HIDKeypad_ERRORROLLOVER
/// - HIDKeypad_POSTFAIL
/// - HIDKeypad_ERRORUNDEFINED
/// Indicates that too many keys have been pressed at the same time.
#define HIDKeypad_ERRORROLLOVER 1
/// ?
#define HIDKeypad_POSTFAIL 2
/// Indicates an undefined error.
#define HIDKeypad_ERRORUNDEFINED 3
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
extern unsigned char HIDKeypad_IsModifierKey(unsigned char key);
#endif //#ifndef HIDKEYPAD_H

View File

@ -0,0 +1,79 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definition for the HID LEDs usage page.
!!!Usage
Uses the constants defined in this header file when declaring a Report
descriptor which references the LEDs usage page.
*/
#ifndef HIDLEDS_H
#define HIDLEDS_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID LEDs Page ID"
/// This page lists the page ID of the HID LEDs usage page.
///
/// !ID
/// - HIDLeds_PAGEID
/// ID of the HID LEDs usage page.
#define HIDLeds_PAGEID 0x08
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID LEDs Usages"
/// This page lists the Usages of the HID LEDs.
///
/// !Usages
/// - HIDLeds_NUMLOCK
/// - HIDLeds_CAPSLOCK
/// - HIDLeds_SCROLLLOCK
/// Num lock LED usage.
#define HIDLeds_NUMLOCK 0x01
/// Caps lock LED usage.
#define HIDLeds_CAPSLOCK 0x02
/// Scroll lock LED usage.
#define HIDLeds_SCROLLLOCK 0x03
//------------------------------------------------------------------------------
#endif //#ifndef HIDLEDS_H

View File

@ -0,0 +1,231 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definitions used when declaring an HID report descriptor.
!!!Usage
Use the definitions provided here when declaring a report descriptor,
which shall be an unsigned char array.
*/
#ifndef HIDREPORT_H
#define HIDREPORT_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Main Item Tags"
/// This page lists the Main Item Tags defined for HID %device.
/// ( HID Spec. 6.2.2 )
///
/// !Tags
/// - HIDReport_INPUT
/// - HIDReport_OUPUT
/// - HIDReport_FEATURE
/// - HIDReport_COLLECTION
/// - HIDReport_ENDCOLLECTION
/// Input item.
#define HIDReport_INPUT 0x80
/// Output item.
#define HIDReport_OUTPUT 0x90
/// Feature item.
#define HIDReport_FEATURE 0xB0
/// Collection item.
#define HIDReport_COLLECTION 0xA0
/// End of collection item.
#define HIDReport_ENDCOLLECTION 0xC0
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Items for Data Fields"
/// This page lists defintions for HID Input, Output and Feature items that
/// are used to create the data fields within a report.
/// ( HID Spec. 6.2.2.5 )
///
/// !Items
/// - HIDReport_CONSTANT
/// - HIDReport_VARIABLE
/// - HIDReport_RELATIVE
/// - HIDReport_WRAP
/// - HIDReport_NONLINEAR
/// - HIDReport_NOPREFERRED
/// - HIDReport_NULLSTATE
/// - HIDReport_VOLATILE
/// - HIDReport_BUFFEREDBYTES
/// The report value is constant (vs. variable).
#define HIDReport_CONSTANT (1 << 0)
/// Data reported is a variable (vs. array).
#define HIDReport_VARIABLE (1 << 1)
/// Data is relative (vs. absolute).
#define HIDReport_RELATIVE (1 << 2)
/// Value rolls over when it reach a maximum/minimum.
#define HIDReport_WRAP (1 << 3)
/// Indicates that the data reported has been processed and is no longuer
/// linear with the original measurements.
#define HIDReport_NONLINEAR (1 << 4)
/// Device has no preferred state to which it automatically returns.
#define HIDReport_NOPREFERRED (1 << 5)
/// Device has a null state, in which it does not report meaningful
/// information.
#define HIDReport_NULLSTATE (1 << 6)
/// Indicates data can change without the host intervention.
#define HIDReport_VOLATILE (1 << 7)
/// Indicates the device produces a fixed-length stream of bytes.
#define HIDReport_BUFFEREDBYTES (1 << 8)
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Collection Items"
/// This page lists definitions for HID Collection Items.
/// ( HID Spec. 6.2.2.6 )
///
/// !Items
/// - HIDReport_COLLECTION_PHYSICAL
/// - HIDReport_COLLECTION_APPLICATION
/// - HIDReport_COLLECTION_LOGICAL
/// - HIDReport_COLLECTION_REPORT
/// - HIDReport_COLLECTION_NAMEDARRAY
/// - HIDReport_COLLECTION_USAGESWITCH
/// - HIDReport_COLLECTION_USAGEMODIFIER
/// Physical collection.
#define HIDReport_COLLECTION_PHYSICAL 0x00
/// Application collection.
#define HIDReport_COLLECTION_APPLICATION 0x01
/// Logical collection.
#define HIDReport_COLLECTION_LOGICAL 0x02
/// Report collection.
#define HIDReport_COLLECTION_REPORT 0x03
/// Named array collection.
#define HIDReport_COLLECTION_NAMEDARRAY 0x04
/// Usage switch collection.
#define HIDReport_COLLECTION_USAGESWITCH 0x05
/// Usage modifier collection
#define HIDReport_COLLECTION_USAGEMODIFIER 0x06
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Global Items"
/// This page lists HID Global Items.
/// ( HID Spec. 6.2.2.7 )
///
/// !Items
/// - HIDReport_GLOBAL_USAGEPAGE
/// - HIDReport_GLOBAL_LOGICALMINIMUM
/// - HIDReport_GLOBAL_LOGICALMAXIMUM
/// - HIDReport_GLOBAL_PHYSICALMINIMUM
/// - HIDReport_GLOBAL_PHYSICALMAXIMUM
/// - HIDReport_GLOBAL_UNITEXPONENT
/// - HIDReport_GLOBAL_UNIT
/// - HIDReport_GLOBAL_REPORTSIZE
/// - HIDReport_GLOBAL_REPORTID
/// - HIDReport_GLOBAL_REPORTCOUNT
/// - HIDReport_GLOBAL_PUSH
/// - HIDReport_GLOBAL_POP
/// Current usage page.
#define HIDReport_GLOBAL_USAGEPAGE 0x04
/// Minimum value that a variable or array item will report.
#define HIDReport_GLOBAL_LOGICALMINIMUM 0x14
/// Maximum value that a variable or array item will report.
#define HIDReport_GLOBAL_LOGICALMAXIMUM 0x24
/// Minimum value for the physical extent of a variable item.
#define HIDReport_GLOBAL_PHYSICALMINIMUM 0x34
/// Maximum value for the physical extent of a variable item.
#define HIDReport_GLOBAL_PHYSICALMAXIMUM 0x44
/// Value of the unit exponent in base 10.
#define HIDReport_GLOBAL_UNITEXPONENT 0x54
/// Unit values.
#define HIDReport_GLOBAL_UNIT 0x64
/// Size of the report fields in bits.
#define HIDReport_GLOBAL_REPORTSIZE 0x74
/// Specifies the report ID.
#define HIDReport_GLOBAL_REPORTID 0x84
/// Number of data fields for an item.
#define HIDReport_GLOBAL_REPORTCOUNT 0x94
/// Places a copy of the global item state table on the stack.
#define HIDReport_GLOBAL_PUSH 0xA4
/// Replaces the item state table with the top structure from the stack.
#define HIDReport_GLOBAL_POP 0xB4
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Local Items"
/// This page lists definitions for HID Local Items.
///
/// !Items
/// - HIDReport_LOCAL_USAGE
/// - HIDReport_LOCAL_USAGEMINIMUM
/// - HIDReport_LOCAL_USAGEMAXIMUM
/// - HIDReport_LOCAL_DESIGNATORINDEX
/// - HIDReport_LOCAL_DESIGNATORMINIMUM
/// - HIDReport_LOCAL_DESIGNATORMAXIMUM
/// - HIDReport_LOCAL_STRINGINDEX
/// - HIDReport_LOCAL_STRINGMINIMUM
/// - HIDReport_LOCAL_STRINGMAXIMUM
/// - HIDReport_LOCAL_DELIMITER
/// Suggested usage for an item or collection.
#define HIDReport_LOCAL_USAGE 0x08
/// Defines the starting usage associated with an array or bitmap.
#define HIDReport_LOCAL_USAGEMINIMUM 0x18
/// Defines the ending usage associated with an array or bitmap.
#define HIDReport_LOCAL_USAGEMAXIMUM 0x28
/// Determines the body part used for a control.
#define HIDReport_LOCAL_DESIGNATORINDEX 0x38
/// Defines the index of the starting designator associated with an array or
/// bitmap.
#define HIDReport_LOCAL_DESIGNATORMINIMUM 0x48
/// Defines the index of the ending designator associated with an array or
/// bitmap.
#define HIDReport_LOCAL_DESIGNATORMAXIMUM 0x58
/// String index for a string descriptor.
#define HIDReport_LOCAL_STRINGINDEX 0x78
/// Specifies the first string index when assigning a group of sequential
/// strings to controls in an array or bitmap.
#define HIDReport_LOCAL_STRINGMINIMUM 0x88
/// Specifies the last string index when assigning a group of sequential
/// strings to controls in an array or bitmap.
#define HIDReport_LOCAL_STRINGMAXIMUM 0x98
/// Defines the beginning or end of a set of local items.
#define HIDReport_LOCAL_DELIMITER 0xA8
//------------------------------------------------------------------------------
#endif //#ifndef HIDREPORT_H

View File

@ -0,0 +1,68 @@
/* ----------------------------------------------------------------------------
* 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: HIDReportRequest implementation
About: Purpose
Implementation of the HIDReportRequest methods.
*/
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "HIDReportRequest.h"
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Indicates the type of report targetted by a SET_REPORT or GET_REPORT
/// request.
/// \param request Pointer to a USBGenericRequest instance.
/// \return Requested report type (see "HID Report Types").
//------------------------------------------------------------------------------
unsigned char HIDReportRequest_GetReportType(const USBGenericRequest *request)
{
return ((USBGenericRequest_GetValue(request) >> 8) & 0xFF);
}
//------------------------------------------------------------------------------
/// Indicates the ID of the report targetted by a SET_REPORT or GET_REPORT
/// request. This value should be 0 if report IDs are not used.
/// \param request Pointer to a USBGenericRequest instance.
/// \return Requested report ID.
//------------------------------------------------------------------------------
unsigned char HIDReportRequest_GetReportId(const USBGenericRequest *request)
{
return (USBGenericRequest_GetValue(request) & 0xFF);
}

View File

@ -0,0 +1,86 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit
!!!Purpose
Definition of a class for manipulating HID-specific GET_REPORT and
SET_REPORT requests.
!!!Usage
-# Receive a GET_REPORT or SET_REPORT request from the host.
-# Retrieve the report type using HIDReportRequest_GetReportType.
-# Retrieve the report ID using HIDReportRequest_GetReportId.
*/
#ifndef HIDREPORTREQUEST_H
#define HIDREPORTREQUEST_H
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include <usb/common/core/USBGenericRequest.h>
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Report Types"
/// This page lists the types for USB HID Reports.
///
/// !Types
/// - HIDReportRequest_INPUT
/// - HIDReportRequest_OUTPUT
/// - HIDReportRequest_FEATURE
/// Input report.
#define HIDReportRequest_INPUT 1
/// Output report.
#define HIDReportRequest_OUTPUT 2
/// Feature report.
#define HIDReportRequest_FEATURE 3
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
extern unsigned char HIDReportRequest_GetReportType(
const USBGenericRequest *request);
extern unsigned char HIDReportRequest_GetReportId(
const USBGenericRequest *request);
#endif //#ifndef HIDREPORTREQUEST_H

View File

@ -0,0 +1,346 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
#if defined(usb_CDCAUDIO) || defined(usb_CDCHID) || defined(usb_CDCCDC) || defined(usb_CDCMSD)
//-----------------------------------------------------------------------------
// Headers
//-----------------------------------------------------------------------------
// GENERAL
#include <utility/trace.h>
#include <utility/assert.h>
// USB
#include <usb/device/core/USBD.h>
// CDC
#include <usb/common/cdc/CDCLineCoding.h>
#include <usb/common/cdc/CDCGenericRequest.h>
#include <usb/common/cdc/CDCSetControlLineStateRequest.h>
#include "CDCDFunctionDriver.h"
#include "CDCDFunctionDriverDescriptors.h"
//-----------------------------------------------------------------------------
// Defines
//-----------------------------------------------------------------------------
/// Number of serial ports supported
#if defined(usb_CDCCDC)
#define CDCD_PORT_NUM 2
#else
#define CDCD_PORT_NUM 1
#endif
//-----------------------------------------------------------------------------
// Types
//-----------------------------------------------------------------------------
/// CDC Serial port struct
typedef struct {
CDCLineCoding lineCoding;
unsigned char isCarrierActivated;
unsigned char epDataIn;
unsigned char epDataOut;
unsigned short serialState;
} CDCDSerialPort;
//-----------------------------------------------------------------------------
// Internal variables
//-----------------------------------------------------------------------------
/// CDCDSerialPort instance
static CDCDSerialPort cdcdSerial[CDCD_PORT_NUM];
//-----------------------------------------------------------------------------
// Internal functions
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
/// Callback function which should be invoked after the data of a
/// SetLineCoding request has been retrieved. Sends a zero-length packet
/// to the host for acknowledging the request.
//-----------------------------------------------------------------------------
static void CDCD_SetLineCodingCallback()
{
USBD_Write(0, 0, 0, 0, 0);
}
//-----------------------------------------------------------------------------
/// Return the port index that host send this request for.
//-----------------------------------------------------------------------------
static char CDCD_GetSerialPort(const USBGenericRequest *request)
{
if (request->wIndex == CDCD_Descriptors_INTERFACENUM0 + 1) return 0;
#if CDCD_PORT_NUM > 1
else if (request->wIndex == CDCD_Descriptors_INTERFACENUM1 + 1) return 1;
#endif
return 0xFF;
}
//-----------------------------------------------------------------------------
/// Receives new line coding information from the USB host.
/// \param request Pointer to a USBGenericRequest instance.
//-----------------------------------------------------------------------------
static void CDCD_SetLineCoding(const USBGenericRequest *request)
{
unsigned char serial;
serial = CDCD_GetSerialPort(request);
TRACE_INFO_WP("sLineCoding_%d ", serial);
USBD_Read(0,
(void *) &(cdcdSerial[serial].lineCoding),
sizeof(CDCLineCoding),
(TransferCallback) CDCD_SetLineCodingCallback,
0);
}
//-----------------------------------------------------------------------------
/// Sends the current line coding information to the host through Control
/// endpoint 0.
/// \param request Pointer to a USBGenericRequest instance.
//-----------------------------------------------------------------------------
static void CDCD_GetLineCoding(const USBGenericRequest *request)
{
unsigned char serial;
serial = CDCD_GetSerialPort(request);
TRACE_INFO_WP("gLineCoding_%d ", serial);
USBD_Write(0,
(void *) &(cdcdSerial[serial].lineCoding),
sizeof(CDCLineCoding),
0,
0);
}
//-----------------------------------------------------------------------------
/// Changes the state of the serial driver according to the information
/// sent by the host via a SetControlLineState request, and acknowledges
/// the request with a zero-length packet.
/// \param request Pointer to a USBGenericRequest instance.
/// \param activateCarrier The active carrier state to set.
/// \param isDTEPresent The DTE status.
//-----------------------------------------------------------------------------
static void CDCD_SetControlLineState(const USBGenericRequest *request,
unsigned char activateCarrier,
unsigned char isDTEPresent)
{
unsigned char serial;
serial = CDCD_GetSerialPort(request);
TRACE_INFO_WP(
"sControlLineState_%d(%d, %d) ",
serial,
activateCarrier,
isDTEPresent);
cdcdSerial[serial].isCarrierActivated = activateCarrier;
USBD_Write(0, 0, 0, 0, 0);
}
//-----------------------------------------------------------------------------
// Exported functions
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
/// Initializes the USB device CDC serial function driver.
//-----------------------------------------------------------------------------
void CDCDFunctionDriver_Initialize()
{
unsigned char serial;
TRACE_INFO("CDCDFunctionDriver_Initialize\n\r");
for (serial = 0; serial < CDCD_PORT_NUM; serial ++) {
CDCDSerialPort * pSerial = &cdcdSerial[serial];
// Initialize Abstract Control Model attributes
CDCLineCoding_Initialize(&(pSerial->lineCoding),
115200,
CDCLineCoding_ONESTOPBIT,
CDCLineCoding_NOPARITY,
8);
pSerial->isCarrierActivated = 0;
pSerial->serialState = 0;
}
}
//-----------------------------------------------------------------------------
/// Handles CDC/ACM-specific USB requests sent by the host
/// \param request Pointer to a USBGenericRequest instance.
/// \return 0 if the request is Unsupported, 1 if the request handled.
//-----------------------------------------------------------------------------
unsigned char CDCDFunctionDriver_RequestHandler(
const USBGenericRequest *request)
{
switch (USBGenericRequest_GetRequest(request)) {
case CDCGenericRequest_SETLINECODING:
CDCD_SetLineCoding(request);
break;
case CDCGenericRequest_GETLINECODING:
CDCD_GetLineCoding(request);
break;
case CDCGenericRequest_SETCONTROLLINESTATE:
CDCD_SetControlLineState(request,
CDCSetControlLineStateRequest_ActivateCarrier(request),
CDCSetControlLineStateRequest_IsDtePresent(request));
break;
// Unsupported request
default:
return 0;
}
return 1;
}
//-----------------------------------------------------------------------------
/// Receives data from the host through the virtual COM port created by
/// the CDC function serial driver. This function behaves like <USBD_Read>.
/// \param Port Port index to receive.
/// \param Pointer to the data buffer to send.
/// \param Size of the data buffer in bytes.
/// \param callback Optional callback function to invoke when the transfer
/// finishes.
/// \param argument Optional argument to the callback function.
/// \return <USBD_STATUS_SUCCESS> if the read operation started normally;
/// otherwise, the corresponding error code.
//-----------------------------------------------------------------------------
unsigned char CDCDSerialDriver_Read(unsigned char port,
void *data,
unsigned int size,
TransferCallback callback,
void *argument)
{
unsigned char ep = CDCD_Descriptors_DATAOUT0;
#if CDCD_PORT_NUM > 1
ep = (port == 0) ?
CDCD_Descriptors_DATAOUT0 : CDCD_Descriptors_DATAOUT1;
#endif
return USBD_Read(ep,
data,
size,
callback,
argument);
}
//-----------------------------------------------------------------------------
/// Sends a data buffer through the virtual COM port created by the CDC
/// function serial driver. This function behaves exactly like <USBD_Write>.
/// \param port Port index to receive.
/// \param data - Pointer to the data buffer to send.
/// \param size - Size of the data buffer in bytes.
/// \param callback - Optional callback function to invoke when the transfer
/// finishes.
/// \param argument - Optional argument to the callback function.
/// \return <USBD_STATUS_SUCCESS> if the write operation started normally;
/// otherwise, the corresponding error code.
//-----------------------------------------------------------------------------
unsigned char CDCDSerialDriver_Write(unsigned char port,
void *data,
unsigned int size,
TransferCallback callback,
void *argument)
{
unsigned char ep = CDCD_Descriptors_DATAIN0;
#if CDCD_PORT_NUM > 1
ep = (port == 0) ?
CDCD_Descriptors_DATAIN0 : CDCD_Descriptors_DATAIN1;
#endif
return USBD_Write(ep,
data,
size,
callback,
argument);
}
//------------------------------------------------------------------------------
/// Returns the current status of the RS-232 line.
/// \param port The port number that checked.
//------------------------------------------------------------------------------
unsigned short CDCDSerialDriver_GetSerialState(unsigned char port)
{
return cdcdSerial[port].serialState;
}
//------------------------------------------------------------------------------
/// Sets the current serial state of the device to the given value.
/// \param port The port number that the port state should be changed.
/// \param serialState New device state.
//------------------------------------------------------------------------------
void CDCDSerialDriver_SetSerialState(unsigned char port,
unsigned short serialState)
{
CDCDSerialPort * pPort;
unsigned char ep = 0;
ASSERT((serialState & 0xFF80) == 0,
"CDCDSerialDriver_SetSerialState: Bits D7-D15 are reserved!\n\r");
// If new state is different from previous one, send a notification to the
// host
pPort = &cdcdSerial[port];
if (pPort->serialState != serialState) {
#if CDCD_PORT_NUM > 1
ep = (port == 0) ?
CDCD_Descriptors_NOTIFICATION0 : CDCD_Descriptors_NOTIFICATION1;
#endif
pPort->serialState = serialState;
USBD_Write(ep,
&(pPort->serialState),
2,
0,
0);
// Reset one-time flags
pPort->serialState &= ~(CDCD_STATE_OVERRUN
| CDCD_STATE_PARITY
| CDCD_STATE_FRAMING
| CDCD_STATE_RINGSIGNAL
| CDCD_STATE_BREAK);
}
}
#endif // (CDC defined)

View File

@ -0,0 +1,99 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
#ifndef CDCDFUNCTIONDRIVER_H
#define CDCDFUNCTIONDRIVER_H
//-----------------------------------------------------------------------------
// Headers
//-----------------------------------------------------------------------------
#include <usb/device/core/USBD.h>
//-----------------------------------------------------------------------------
// Definitions
//-----------------------------------------------------------------------------
/// Indicates the receiver carrier signal is present.
#define CDCD_STATE_RXDRIVER (1 << 0)
/// Indicates the transmission carrier signal is present.
#define CDCD_STATE_TXCARRIER (1 << 1)
/// Indicates a break has been detected.
#define CDCD_STATE_BREAK (1 << 2)
/// Indicates a ring signal has been detected.
#define CDCD_STATE_RINGSIGNAL (1 << 3)
/// Indicates a framing error has occured.
#define CDCD_STATE_FRAMING (1 << 4)
/// Indicates a parity error has occured.
#define CDCD_STATE_PARITY (1 << 5)
/// Indicates a data overrun error has occured.
#define CDCD_STATE_OVERRUN (1 << 6)
//-----------------------------------------------------------------------------
// Structs
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Callbacks
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Exported functions
//-----------------------------------------------------------------------------
//- Function API for composite device
extern void CDCDFunctionDriver_Initialize();
extern unsigned char CDCDFunctionDriver_RequestHandler(
const USBGenericRequest * request);
//- CDC Serial Port API
extern unsigned char CDCDSerialDriver_Write(
unsigned char port,
void *data,
unsigned int size,
TransferCallback callback,
void *argument);
extern unsigned char CDCDSerialDriver_Read(
unsigned char port,
void *data,
unsigned int size,
TransferCallback callback,
void *argument);
extern unsigned short CDCDSerialDriver_GetSerialState(unsigned char port);
extern void CDCDSerialDriver_SetSerialState(
unsigned char port,
unsigned short serialState);
#endif // #define CDCDFUNCTIONDRIVER_H

View File

@ -0,0 +1,58 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
#ifndef CDCDFUNCTIONDRIVERDESCRIPTORS_H
#define CDCDFUNCTIONDRIVERDESCRIPTORS_H
//-----------------------------------------------------------------------------
// Headers
//-----------------------------------------------------------------------------
#include <board.h>
#include <usb/device/core/USBDDriverDescriptors.h>
//-----------------------------------------------------------------------------
// Definitions
//-----------------------------------------------------------------------------
/// EPs used in CDC/ACM Function.
#if defined(usb_CDCAUDIO) || defined(usb_CDCHID) || defined(usb_CDCCDC) || defined(usb_CDCMSD)
#define CDCD_Descriptors_INTERFACENUM0 0
#define CDCD_Descriptors_NOTIFICATION0 3
#define CDCD_Descriptors_DATAIN0 2
#define CDCD_Descriptors_DATAOUT0 1
#endif
#if defined(usb_CDCCDC)
#define CDCD_Descriptors_INTERFACENUM1 2
#define CDCD_Descriptors_NOTIFICATION1 6
#define CDCD_Descriptors_DATAIN1 5
#define CDCD_Descriptors_DATAOUT1 4
#endif
#endif // #define CDCFUNCTIONDRIVERDESCRIPTORS_H

View File

@ -0,0 +1,276 @@
/* ----------------------------------------------------------------------------
* 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
//-----------------------------------------------------------------------------
// GENERAL
#include <utility/trace.h>
#include <utility/assert.h>
#include <utility/led.h>
// USB
#include <usb/device/core/USBD.h>
#include <usb/device/core/USBDDriver.h>
//- HID
#if defined(usb_CDCHID) || defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
#include <usb/device/hid-keyboard/HIDDKeyboardDriver.h>
#include <usb/device/hid-keyboard/HIDDKeyboardDriverDescriptors.h>
#include <usb/device/hid-keyboard/HIDDKeyboardCallbacks.h>
#include <usb/device/hid-keyboard/HIDDKeyboardInputReport.h>
#include <usb/device/hid-keyboard/HIDDKeyboardOutputReport.h>
#include <usb/common/hid/HIDGenericDescriptor.h>
#include <usb/common/hid/HIDDescriptor.h>
#include <usb/common/hid/HIDGenericRequest.h>
#include <usb/common/hid/HIDReportRequest.h>
#include <usb/common/hid/HIDIdleRequest.h>
#include <usb/common/hid/HIDKeypad.h>
#endif // (HID defined)
//- MSD
#if defined(usb_CDCMSD) || defined(usb_HIDMSD)
#endif
//- COMPOSITE
#include "COMPOSITEDDriver.h"
#include "COMPOSITEDDriverDescriptors.h"
//-----------------------------------------------------------------------------
// Defines
//-----------------------------------------------------------------------------
/// Interface setting spaces (4 byte aligned)
#define NUM_INTERFACES ((COMPOSITEDDriverDescriptors_NUMINTERFACE+3)&0xFC)
//-----------------------------------------------------------------------------
// Types
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Internal variables
//-----------------------------------------------------------------------------
/// USBDDriver instance
static USBDDriver usbdDriver;
/// Array for storing the current setting of each interface
static unsigned char compositedDriverInterfaces[NUM_INTERFACES];
//-----------------------------------------------------------------------------
// Internal functions
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Optional RequestReceived() callback re-implementation
//-----------------------------------------------------------------------------
#if !defined(NOAUTOCALLBACK)
void USBDCallbacks_RequestReceived(const USBGenericRequest *request)
{
COMPOSITEDDriver_RequestHandler(request);
}
#endif
//-----------------------------------------------------------------------------
/// Invoked whenever the active setting of an interface is changed by the
/// host. Changes the status of the third LED accordingly.
/// \param interface Interface number.
/// \param setting Newly active setting.
//-----------------------------------------------------------------------------
void USBDDriverCallbacks_InterfaceSettingChanged(unsigned char interface,
unsigned char setting)
{
// AUDIO
#if defined(usb_CDCAUDIO) || defined(usb_HIDAUDIO)
AUDDFunctionCallbacks_InterfaceSettingChanged(interface, setting);
#endif
}
//-----------------------------------------------------------------------------
// ConfigurationChanged() callback re-implementation
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
/// Invoked whenever the configuration value of a device is changed by the host
/// \param cfgnum Configuration number.
//-----------------------------------------------------------------------------
void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum)
{
// HID
#if defined(usb_CDCHID) || defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
HIDDFunctionCallbacks_ConfigurationChanged(cfgnum);
#endif
}
//-----------------------------------------------------------------------------
// Exported functions
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
/// Initializes the USB device composite device driver.
//-----------------------------------------------------------------------------
void COMPOSITEDDriver_Initialize()
{
// CDC
#if defined(usb_CDCAUDIO) || defined(usb_CDCHID) || defined(usb_CDCCDC) || defined(usb_CDCMSD)
CDCDFunctionDriver_Initialize();
#endif
// AUDIO
#if defined(usb_CDCAUDIO) || defined(usb_HIDAUDIO)
AUDDFunctionDriver_Initialize();
#endif
// HID
#if defined(usb_CDCHID) || defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
HIDDFunctionDriver_Initialize(&usbdDriver);
#endif
// MSD
#if defined(usb_CDCMSD) || defined(usb_HIDMSD)
// Function driver initialize is put to main() for additional LUN list
#endif
// Initialize the standard USB driver
USBDDriver_Initialize(&usbdDriver,
&compositedDriverDescriptors,
compositedDriverInterfaces);
// Initialize the USB driver
USBD_Init();
}
//-----------------------------------------------------------------------------
/// Handles composite-specific USB requests sent by the host, and forwards
/// standard ones to the USB device driver.
/// \param request Pointer to a USBGenericRequest instance.
//-----------------------------------------------------------------------------
void COMPOSITEDDriver_RequestHandler(const USBGenericRequest *request)
{
// Check if this is a class request
if (USBGenericRequest_GetType(request) == USBGenericRequest_CLASS) {
unsigned char rc = 0;
// AUDIO class request
#if defined(usb_CDCAUDIO) || defined(usb_HIDAUDIO)
if (rc == 0) {
rc = AUDDFunctionDriver_RequestHandler(request);
}
#endif
// CDC class request
#if defined(usb_CDCAUDIO) || defined(usb_CDCHID) || defined(usb_CDCMSD) || defined(usb_CDCCDC)
if (rc == 0) {
rc = CDCDFunctionDriver_RequestHandler(request);
}
#endif
// MSD class request
#if defined(usb_CDCMSD) || defined(usb_HIDMSD)
if (rc == 0) {
rc = MSDDFunctionDriver_RequestHandler(request);
}
#endif
// HID class request
#if defined(usb_CDCHID) || defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
if (rc == 0) {
rc = HIDDFunctionDriver_RequestHandler(request);
}
#endif
if (!rc) {
TRACE_WARNING(
"COMPOSITEDDriver_RequestHandler: Unsupported request (%d)\n\r",
USBGenericRequest_GetRequest(request));
USBD_Stall(0);
}
}
// Check if this is a standard request
else if (USBGenericRequest_GetType(request) == USBGenericRequest_STANDARD) {
unsigned char rc = 0;
#if defined(usb_CDCHID) || defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
rc = HIDDFunctionDriver_RequestHandler(request);
#endif
#if defined(usb_CDCMSD) || defined(usb_HIDMSD)
if (rc == 0) {
rc = MSDDFunctionDriver_RequestHandler(request);
}
#endif
// Forward request to the standard handler
if (rc == 0) {
USBDDriver_RequestHandler(&(usbdDriver), request);
}
}
// Unsupported request type
else {
TRACE_WARNING(
"COMPOSITEDDriver_RequestHandler: Unsupported request type (%d)\n\r",
USBGenericRequest_GetType(request));
USBD_Stall(0);
}
}
//-----------------------------------------------------------------------------
/// Starts a remote wake-up sequence if the host has explicitely enabled it
/// by sending the appropriate SET_FEATURE request.
//-----------------------------------------------------------------------------
void COMPOSITEDDriver_RemoteWakeUp(void)
{
// Remote wake-up has been enabled
if (USBDDriver_IsRemoteWakeUpEnabled(&usbdDriver)) {
USBD_RemoteWakeUp();
}
// Remote wake-up NOT enabled
else {
TRACE_WARNING("COMPOSITEDDriver_RemoteWakeUp: not enabled\n\r");
}
}

View File

@ -0,0 +1,91 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
//-----------------------------------------------------------------------------
/// \unit
///
/// !Purpose
///
/// Definitions and methods for USB composite device implement.
///
/// !Usage
///
/// -# Initialize USB function specified driver ( for MSD currently )
/// - MSDDFunctionDriver_Initialize
///
/// -# Initialize USB composite driver and USB driver
/// - COMPOSITEDDriver_Initialize
///
/// -# Handle and dispach USB requests
/// - COMPOSITEDDriver_RequestHandler
///
/// -# Try starting a remote wake-up sequence
/// - COMPOSITEDDriver_RemoteWakeUp
//-----------------------------------------------------------------------------
#ifndef COMPOSITEDDRIVER_H
#define COMPOSITEDDRIVER_H
//-----------------------------------------------------------------------------
// Headers
//-----------------------------------------------------------------------------
#include <usb/common/core/USBGenericRequest.h>
#include <usb/device/core/USBD.h>
#if defined(usb_CDCAUDIO) || defined(usb_CDCHID) || defined(usb_CDCCDC) || defined(usb_CDCMSD)
#include "CDCDFunctionDriver.h"
#endif
#if defined(usb_CDCAUDIO) || defined(usb_HIDAUDIO)
#include "AUDDFunctionDriver.h"
#endif
#if defined(usb_CDCHID) || defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
#include "HIDDFunctionDriver.h"
#endif
#if defined(usb_CDCMSD) || defined(usb_HIDMSD)
#include "MSDDFunctionDriver.h"
#endif
//-----------------------------------------------------------------------------
// Exported functions
//-----------------------------------------------------------------------------
// -COMPOSITE
extern void COMPOSITEDDriver_Initialize();
extern void COMPOSITEDDriver_RequestHandler(const USBGenericRequest *request);
extern void COMPOSITEDDriver_RemoteWakeUp(void);
#endif //#ifndef COMPOSITEDDRIVER_H

View File

@ -0,0 +1,954 @@
/* ----------------------------------------------------------------------------
* 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
BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0),
COMPOSITEDDriverDescriptors_VENDORID,
COMPOSITEDDriverDescriptors_PRODUCTID,
COMPOSITEDDriverDescriptors_RELEASE,
0, // No string descriptor for manufacturer
1, // Index of product string descriptor is #1
0, // No string descriptor for serial number
1 // Device has 1 possible configuration
};
#if defined(BOARD_USB_UDPHS)
/// USB device qualifier descriptor.
const USBDeviceQualifierDescriptor qualifierDescriptor = {
sizeof(USBDeviceQualifierDescriptor),
USBGenericDescriptor_DEVICEQUALIFIER,
USBDeviceDescriptor_USB2_00,
#if defined(usb_HIDMSD)
0x00,
0x00,
0x00,
#else
0xEF,// MI
0x02,//
0x01,//
#endif
BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0),
1, // Device has one possible configuration
0 // Reserved
};
#endif
/// USB configuration descriptors for the composite device driver
const CompositeDriverConfigurationDescriptors configurationDescriptors = {
// Standard configuration descriptor
{
sizeof(USBConfigurationDescriptor),
USBGenericDescriptor_CONFIGURATION,
sizeof(CompositeDriverConfigurationDescriptors),
COMPOSITEDDriverDescriptors_NUMINTERFACE,
1, // This is configuration #1
0, // No string descriptor for this configuration
BOARD_USB_BMATTRIBUTES,
USBConfigurationDescriptor_POWER(100)
},
#if defined(usb_CDCAUDIO) || defined(usb_CDCHID) || defined(usb_CDCCDC) || defined(usb_CDCMSD)
// CDC
// IAD for CDC/ACM port
{
sizeof(USBInterfaceAssociationDescriptor),
USBGenericDescriptor_INTERFACEASSOCIATION,
CDCD_Descriptors_INTERFACENUM0,
2,
CDCCommunicationInterfaceDescriptor_CLASS,
CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL,
CDCCommunicationInterfaceDescriptor_NOPROTOCOL,
0 // No string descriptor for this interface
},
// Communication class interface standard descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
CDCD_Descriptors_INTERFACENUM0, // This is interface #0
0, // This is alternate setting #0 for this interface
1, // This interface uses 1 endpoint
CDCCommunicationInterfaceDescriptor_CLASS,
CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL,
CDCCommunicationInterfaceDescriptor_NOPROTOCOL,
0 // No string descriptor for this interface
},
// Class-specific header functional descriptor
{
sizeof(CDCHeaderDescriptor),
CDCGenericDescriptor_INTERFACE,
CDCGenericDescriptor_HEADER,
CDCGenericDescriptor_CDC1_10
},
// Class-specific call management functional descriptor
{
sizeof(CDCCallManagementDescriptor),
CDCGenericDescriptor_INTERFACE,
CDCGenericDescriptor_CALLMANAGEMENT,
CDCCallManagementDescriptor_SELFCALLMANAGEMENT,
CDCD_Descriptors_INTERFACENUM0 + 1 // No associated data interface
},
// Class-specific abstract control management functional descriptor
{
sizeof(CDCAbstractControlManagementDescriptor),
CDCGenericDescriptor_INTERFACE,
CDCGenericDescriptor_ABSTRACTCONTROLMANAGEMENT,
CDCAbstractControlManagementDescriptor_LINE
},
// Class-specific union functional descriptor with one slave interface
{
sizeof(CDCUnionDescriptor),
CDCGenericDescriptor_INTERFACE,
CDCGenericDescriptor_UNION,
CDCD_Descriptors_INTERFACENUM0, // Number of master interface is #0
CDCD_Descriptors_INTERFACENUM0 + 1 // First slave interface is #1
},
// Notification endpoint standard descriptor
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
CDCD_Descriptors_NOTIFICATION0),
USBEndpointDescriptor_INTERRUPT,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCD_Descriptors_NOTIFICATION0),
USBEndpointDescriptor_MAXINTERRUPTSIZE_FS),
10 // Endpoint is polled every 10ms
},
// Data class interface standard descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
CDCD_Descriptors_INTERFACENUM0 + 1, // This is interface #1
0, // This is alternate setting #0 for this interface
2, // This interface uses 2 endpoints
CDCDataInterfaceDescriptor_CLASS,
CDCDataInterfaceDescriptor_SUBCLASS,
CDCDataInterfaceDescriptor_NOPROTOCOL,
0 // No string descriptor for this interface
},
// Bulk-OUT endpoint standard descriptor
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT,
CDCD_Descriptors_DATAOUT0),
USBEndpointDescriptor_BULK,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCD_Descriptors_DATAOUT0),
USBEndpointDescriptor_MAXBULKSIZE_FS),
0 // Must be 0 for full-speed bulk endpoints
},
// Bulk-IN endpoint descriptor
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
CDCD_Descriptors_DATAIN0),
USBEndpointDescriptor_BULK,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCD_Descriptors_DATAIN0),
USBEndpointDescriptor_MAXBULKSIZE_FS),
0 // Must be 0 for full-speed bulk endpoints
},
#endif // (CDC defined)
#if defined(usb_CDCHID) || defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
// Interface descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
HIDD_Descriptors_INTERFACENUM,
0, // This is alternate setting #0
2, // Two endpoints used
HIDInterfaceDescriptor_CLASS,
HIDInterfaceDescriptor_SUBCLASS_NONE,
HIDInterfaceDescriptor_PROTOCOL_NONE,
0 // No associated string descriptor
},
// HID descriptor
{
sizeof(HIDDescriptor),
HIDGenericDescriptor_HID,
HIDDescriptor_HID1_11,
0, // Device is not localized, no country code
1, // One HID-specific descriptor (apart from this one)
HIDGenericDescriptor_REPORT,
HIDD_Descriptors_REPORTSIZE
},
// Interrupt IN endpoint descriptor
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_IN,
HIDD_Descriptors_INTERRUPTIN),
USBEndpointDescriptor_INTERRUPT,
sizeof(HIDDKeyboardInputReport),
HIDD_Descriptors_INTERRUPTIN_POLLING
},
// Interrupt OUT endpoint descriptor
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_OUT,
HIDD_Descriptors_INTERRUPTOUT),
USBEndpointDescriptor_INTERRUPT,
sizeof(HIDDKeyboardOutputReport),
HIDD_Descriptors_INTERRUPTIN_POLLING
},
#endif // (HID defined)
#if defined(usb_CDCAUDIO) || defined(usb_HIDAUDIO)
// AUDIO
// IAD for AUDIO function
{
sizeof(USBInterfaceAssociationDescriptor),
USBGenericDescriptor_INTERFACEASSOCIATION,
AUDD_Descriptors_INTERFACE,
2,
AUDControlInterfaceDescriptor_CLASS,
AUDControlInterfaceDescriptor_SUBCLASS,
AUDControlInterfaceDescriptor_PROTOCOL,
0 // No string descriptor for this interface
},
// Audio control interface standard descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDD_Descriptors_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(AUDHeaderDescriptor1),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_HEADER,
AUDHeaderDescriptor_AUD1_00,
sizeof(AUDDSpeakerDriverAudioControlDescriptors),
1 // One streaming interface
},
AUDD_Descriptors_STREAMING
},
// Input terminal descriptor
{
sizeof(AUDInputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_INPUTTERMINAL,
AUDD_Descriptors_INPUTTERMINAL,
AUDInputTerminalDescriptor_USBSTREAMING,
AUDD_Descriptors_OUTPUTTERMINAL,
AUDD_NUMCHANNELS,
AUDInputTerminalDescriptor_LEFTFRONT
| AUDInputTerminalDescriptor_RIGHTFRONT,
0, // No string descriptor for channels
0 // No string descriptor for input terminal
},
// Output terminal descriptor
{
sizeof(AUDOutputTerminalDescriptor),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_OUTPUTTERMINAL,
AUDD_Descriptors_OUTPUTTERMINAL,
AUDOutputTerminalDescriptor_SPEAKER,
AUDD_Descriptors_INPUTTERMINAL,
AUDD_Descriptors_FEATUREUNIT,
0 // No string descriptor
},
// Feature unit descriptor
{
{
sizeof(AUDFeatureUnitDescriptor3),
AUDGenericDescriptor_INTERFACE,
AUDGenericDescriptor_FEATUREUNIT,
AUDD_Descriptors_FEATUREUNIT,
AUDD_Descriptors_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
}
},
// Audio streaming interface with 0 endpoints
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
AUDD_Descriptors_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,
AUDD_Descriptors_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,
AUDD_Descriptors_INPUTTERMINAL,
0, // No internal delay because of data path
AUDFormatTypeOneDescriptor_PCM
},
// Format type I descriptor
{
{
sizeof(AUDFormatTypeOneDescriptor1),
AUDGenericDescriptor_INTERFACE,
AUDStreamingInterfaceDescriptor_FORMATTYPE,
AUDFormatTypeOneDescriptor_FORMATTYPEONE,
AUDD_NUMCHANNELS,
AUDD_BYTESPERSAMPLE,
AUDD_BYTESPERSAMPLE*8,
1 // One discrete frequency supported
},
{
AUDD_SAMPLERATE & 0xFF,
(AUDD_SAMPLERATE >> 8) & 0xFF,
(AUDD_SAMPLERATE >> 16) & 0xFF
}
},
// Audio streaming endpoint standard descriptor
{
sizeof(AUDEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_OUT,
AUDD_Descriptors_DATAOUT),
USBEndpointDescriptor_ISOCHRONOUS,
BOARD_USB_ENDPOINTS_MAXPACKETSIZE(AUDD_Descriptors_DATAOUT),
1, // Polling interval = 2^(x-1) milliseconds (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
},
#endif // (AUDIO defined)
#if defined(usb_CDCCDC)
// CDC 1
// IAD for CDC/ACM port 1
{
sizeof(USBInterfaceAssociationDescriptor),
USBGenericDescriptor_INTERFACEASSOCIATION,
CDCD_Descriptors_INTERFACENUM1,
2,
CDCCommunicationInterfaceDescriptor_CLASS,
CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL,
CDCCommunicationInterfaceDescriptor_NOPROTOCOL,
0 // No string descriptor for this interface
},
// Communication class interface standard descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
CDCD_Descriptors_INTERFACENUM1, // This is interface #2
0, // This is alternate setting #0 for this interface
1, // This interface uses 1 endpoint
CDCCommunicationInterfaceDescriptor_CLASS,
CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL,
CDCCommunicationInterfaceDescriptor_NOPROTOCOL,
0 // No string descriptor for this interface
},
// Class-specific header functional descriptor
{
sizeof(CDCHeaderDescriptor),
CDCGenericDescriptor_INTERFACE,
CDCGenericDescriptor_HEADER,
CDCGenericDescriptor_CDC1_10
},
// Class-specific call management functional descriptor
{
sizeof(CDCCallManagementDescriptor),
CDCGenericDescriptor_INTERFACE,
CDCGenericDescriptor_CALLMANAGEMENT,
CDCCallManagementDescriptor_SELFCALLMANAGEMENT,
CDCD_Descriptors_INTERFACENUM1 + 1 // No associated data interface
},
// Class-specific abstract control management functional descriptor
{
sizeof(CDCAbstractControlManagementDescriptor),
CDCGenericDescriptor_INTERFACE,
CDCGenericDescriptor_ABSTRACTCONTROLMANAGEMENT,
CDCAbstractControlManagementDescriptor_LINE
},
// Class-specific union functional descriptor with one slave interface
{
sizeof(CDCUnionDescriptor),
CDCGenericDescriptor_INTERFACE,
CDCGenericDescriptor_UNION,
CDCD_Descriptors_INTERFACENUM1, // Number of master interface is #2
CDCD_Descriptors_INTERFACENUM1+1 // First slave interface is #3
},
// Notification endpoint standard descriptor
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
CDCD_Descriptors_NOTIFICATION1),
USBEndpointDescriptor_INTERRUPT,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCD_Descriptors_NOTIFICATION1),
USBEndpointDescriptor_MAXINTERRUPTSIZE_FS),
10 // Endpoint is polled every 10ms
},
// Data class interface standard descriptor
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
CDCD_Descriptors_INTERFACENUM1 + 1, // This is interface #3
0, // This is alternate setting #0 for this interface
2, // This interface uses 2 endpoints
CDCDataInterfaceDescriptor_CLASS,
CDCDataInterfaceDescriptor_SUBCLASS,
CDCDataInterfaceDescriptor_NOPROTOCOL,
0 // No string descriptor for this interface
},
// Bulk-OUT endpoint standard descriptor
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT,
CDCD_Descriptors_DATAOUT1),
USBEndpointDescriptor_BULK,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCD_Descriptors_DATAOUT1),
USBEndpointDescriptor_MAXBULKSIZE_FS),
0 // Must be 0 for full-speed bulk endpoints
},
// Bulk-IN endpoint descriptor
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
CDCD_Descriptors_DATAIN1),
USBEndpointDescriptor_BULK,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CDCD_Descriptors_DATAIN1),
USBEndpointDescriptor_MAXBULKSIZE_FS),
0 // Must be 0 for full-speed bulk endpoints
},
#endif // (2 CDCs defined)
#if defined(usb_CDCMSD) || defined(usb_HIDMSD)
// Mass Storage interface descriptor.
{
sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE,
MSDD_Descriptors_INTERFACENUM,
0, // This is alternate setting #0.
2, // Interface uses two endpoints.
MSInterfaceDescriptor_CLASS,
MSInterfaceDescriptor_SCSI,
MSInterfaceDescriptor_BULKONLY,
0 // No string descriptor for interface.
},
// Bulk-OUT endpoint descriptor
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_OUT,
MSDD_Descriptors_BULKOUT),
USBEndpointDescriptor_BULK,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(MSDD_Descriptors_BULKOUT),
USBEndpointDescriptor_MAXBULKSIZE_FS),
0 // No string descriptor for endpoint.
},
// Bulk-IN endpoint descriptor
{
sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_IN,
MSDD_Descriptors_BULKIN),
USBEndpointDescriptor_BULK,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(MSDD_Descriptors_BULKIN),
USBEndpointDescriptor_MAXBULKSIZE_FS),
0 // No string descriptor for endpoint.
},
#endif // (MSD defined)
};
/// 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(5),
USBGenericDescriptor_STRING,
USBStringDescriptor_UNICODE('A'),
USBStringDescriptor_UNICODE('t'),
USBStringDescriptor_UNICODE('m'),
USBStringDescriptor_UNICODE('e'),
USBStringDescriptor_UNICODE('l')
};
/// Product name.
const unsigned char productDescriptor[] = {
USBStringDescriptor_LENGTH(14),
USBGenericDescriptor_STRING,
USBStringDescriptor_UNICODE('C'),
USBStringDescriptor_UNICODE('o'),
USBStringDescriptor_UNICODE('m'),
USBStringDescriptor_UNICODE('p'),
USBStringDescriptor_UNICODE('o'),
USBStringDescriptor_UNICODE('s'),
USBStringDescriptor_UNICODE('i'),
USBStringDescriptor_UNICODE('t'),
USBStringDescriptor_UNICODE('e'),
USBStringDescriptor_UNICODE(' '),
USBStringDescriptor_UNICODE('D'),
USBStringDescriptor_UNICODE('e'),
USBStringDescriptor_UNICODE('m'),
USBStringDescriptor_UNICODE('o')
};
/// 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 variables
//------------------------------------------------------------------------------
/// List of descriptors required by an USB audio speaker device driver.
const USBDDriverDescriptors compositedDriverDescriptors = {
&deviceDescriptor,
(const USBConfigurationDescriptor *) &configurationDescriptors,
#ifdef BOARD_USB_UDPHS
&qualifierDescriptor,
(const USBConfigurationDescriptor *) &configurationDescriptors,
&deviceDescriptor,
(const USBConfigurationDescriptor *) &configurationDescriptors,
&qualifierDescriptor,
(const USBConfigurationDescriptor *) &configurationDescriptors,
#else
0, 0, 0, 0, 0, 0,
#endif
stringDescriptors,
4 // Number of string descriptors
};
#if defined(usb_CDCHID) || defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
/// Report descriptor used by the driver.
const unsigned char hiddReportDescriptor[] = {
HIDReport_GLOBAL_USAGEPAGE + 1, HIDGenericDesktop_PAGEID,
HIDReport_LOCAL_USAGE + 1, HIDGenericDesktop_KEYBOARD,
HIDReport_COLLECTION + 1, HIDReport_COLLECTION_APPLICATION,
// Input report: modifier keys
HIDReport_GLOBAL_REPORTSIZE + 1, 1,
HIDReport_GLOBAL_REPORTCOUNT + 1, 8,
HIDReport_GLOBAL_USAGEPAGE + 1, HIDKeypad_PAGEID,
HIDReport_LOCAL_USAGEMINIMUM + 1,
HIDD_Descriptors_FIRSTMODIFIERKEY,
HIDReport_LOCAL_USAGEMAXIMUM + 1,
HIDD_Descriptors_LASTMODIFIERKEY,
HIDReport_GLOBAL_LOGICALMINIMUM + 1, 0,
HIDReport_GLOBAL_LOGICALMAXIMUM + 1, 1,
HIDReport_INPUT + 1, HIDReport_VARIABLE,
// Input report: standard keys
HIDReport_GLOBAL_REPORTCOUNT + 1, 3,
HIDReport_GLOBAL_REPORTSIZE + 1, 8,
HIDReport_GLOBAL_LOGICALMINIMUM + 1,
HIDD_Descriptors_FIRSTSTANDARDKEY,
HIDReport_GLOBAL_LOGICALMAXIMUM + 1,
HIDD_Descriptors_LASTSTANDARDKEY,
HIDReport_GLOBAL_USAGEPAGE + 1, HIDKeypad_PAGEID,
HIDReport_LOCAL_USAGEMINIMUM + 1,
HIDD_Descriptors_FIRSTSTANDARDKEY,
HIDReport_LOCAL_USAGEMAXIMUM + 1,
HIDD_Descriptors_LASTSTANDARDKEY,
HIDReport_INPUT + 1, 0 /* Data array */,
// Output report: LEDs
HIDReport_GLOBAL_REPORTCOUNT + 1, 3,
HIDReport_GLOBAL_REPORTSIZE + 1, 1,
HIDReport_GLOBAL_USAGEPAGE + 1, HIDLeds_PAGEID,
HIDReport_GLOBAL_LOGICALMINIMUM + 1, 0,
HIDReport_GLOBAL_LOGICALMAXIMUM + 1, 1,
HIDReport_LOCAL_USAGEMINIMUM + 1, HIDLeds_NUMLOCK,
HIDReport_LOCAL_USAGEMAXIMUM + 1, HIDLeds_SCROLLLOCK,
HIDReport_OUTPUT + 1, HIDReport_VARIABLE,
// Output report: padding
HIDReport_GLOBAL_REPORTCOUNT + 1, 1,
HIDReport_GLOBAL_REPORTSIZE + 1, 5,
HIDReport_OUTPUT + 1, HIDReport_CONSTANT,
HIDReport_ENDCOLLECTION
};
#endif // (HID defined)

View File

@ -0,0 +1,61 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
#ifndef COMPOSITEDDRIVERDESCRIPTORS_H
#define COMPOSITEDDRIVERDESCRIPTORS_H
//-----------------------------------------------------------------------------
// Headers
//-----------------------------------------------------------------------------
#include <board.h>
#include <usb/device/core/USBDDriverDescriptors.h>
//-----------------------------------------------------------------------------
// Definitions
//-----------------------------------------------------------------------------
/// Number of interfaces of the device
#if defined(usb_CDCAUDIO) || defined(usb_CDCCDC)
#define COMPOSITEDDriverDescriptors_NUMINTERFACE 4
#elif defined(usb_CDCHID) || defined(usb_CDCMSD) || defined(usb_HIDAUDIO)
#define COMPOSITEDDriverDescriptors_NUMINTERFACE 3
#elif defined(usb_HIDMSD)
#define COMPOSITEDDriverDescriptors_NUMINTERFACE 2
#else
#error USB Composite class not defined.
#endif
//-----------------------------------------------------------------------------
// Exported variables
//-----------------------------------------------------------------------------
extern const USBDDriverDescriptors compositedDriverDescriptors;
#endif //#ifndef COMPOSITEDDRIVERDESCRIPTORS_H

View File

@ -0,0 +1,466 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
#if defined(usb_CDCHID) || defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
//-----------------------------------------------------------------------------
// Headers
//-----------------------------------------------------------------------------
// GENERAL
#include <utility/trace.h>
#include <utility/assert.h>
// USB
#include <usb/device/core/USBD.h>
#include <usb/common/core/USBGetDescriptorRequest.h>
#include <usb/device/core/USBDDriver.h>
// HID
#include <usb/device/hid-keyboard/HIDDKeyboardDriver.h>
#include <usb/device/hid-keyboard/HIDDKeyboardDriverDescriptors.h>
#include <usb/device/hid-keyboard/HIDDKeyboardCallbacks.h>
#include <usb/device/hid-keyboard/HIDDKeyboardInputReport.h>
#include <usb/device/hid-keyboard/HIDDKeyboardOutputReport.h>
#include <usb/common/hid/HIDGenericDescriptor.h>
#include <usb/common/hid/HIDDescriptor.h>
#include <usb/common/hid/HIDGenericRequest.h>
#include <usb/common/hid/HIDReportRequest.h>
#include <usb/common/hid/HIDIdleRequest.h>
#include <usb/common/hid/HIDKeypad.h>
#include "HIDDFunctionDriver.h"
#include "HIDDFunctionDriverDescriptors.h"
//-----------------------------------------------------------------------------
// Internal types
//-----------------------------------------------------------------------------
/// Driver structure for an HID device implementing keyboard functionalities.
typedef struct {
/// Pointer to USB device driver instance
USBDDriver * pUsbdDriver;
/// Idle rate (in milliseconds) of the input report
unsigned char inputReportIdleRate;
/// Input report instance.
HIDDKeyboardInputReport inputReport;
/// Output report instance.
HIDDKeyboardOutputReport outputReport;
} HIDDKeyboardDriver;
//-----------------------------------------------------------------------------
// Internal variables
//-----------------------------------------------------------------------------
/// Static instance of the HID keyboard device driver.
static HIDDKeyboardDriver hiddKeyboardDriver;
//-----------------------------------------------------------------------------
// Internal functions
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
/// Returns the descriptor requested by the host.
/// \param type Descriptor type.
/// \param length Maximum number of bytes to send.
/// \return 1 if the request has been handled by this function, otherwise 0.
//-----------------------------------------------------------------------------
static unsigned char HIDD_GetDescriptor(unsigned char type,
unsigned char length)
{
const USBConfigurationDescriptor *pConfiguration;
HIDDescriptor *hidDescriptor;
switch (type) {
case HIDGenericDescriptor_REPORT:
TRACE_INFO_WP("Report ");
// Adjust length and send report descriptor
if (length > HIDD_Descriptors_REPORTSIZE) {
length = HIDD_Descriptors_REPORTSIZE;
}
USBD_Write(0, &hiddReportDescriptor, length, 0, 0);
break;
case HIDGenericDescriptor_HID:
TRACE_INFO_WP("HID ");
// Configuration descriptor is different depending on speed
if (USBD_IsHighSpeed()) {
pConfiguration = hiddKeyboardDriver
.pUsbdDriver->pDescriptors->pHsConfiguration;
}
else {
pConfiguration = hiddKeyboardDriver
.pUsbdDriver->pDescriptors->pFsConfiguration;
}
// Parse the device configuration to get the HID descriptor
USBConfigurationDescriptor_Parse(pConfiguration,
0,
0,
(USBGenericDescriptor **) &hidDescriptor);
// Adjust length and send HID descriptor
if (length > sizeof(HIDDescriptor)) {
length = sizeof(HIDDescriptor);
}
USBD_Write(0, hidDescriptor, length, 0, 0);
break;
default:
return 0;
}
return 1;
}
//-----------------------------------------------------------------------------
/// Sends the current Idle rate of the input report to the host.
//-----------------------------------------------------------------------------
static void HIDD_GetIdle()
{
TRACE_INFO_WP("gIdle ");
USBD_Write(0, &(hiddKeyboardDriver.inputReportIdleRate), 1, 0, 0);
}
//-----------------------------------------------------------------------------
/// Retrieves the new idle rate of the input report from the USB host.
/// \param idleRate New input report idle rate.
//-----------------------------------------------------------------------------
static void HIDD_SetIdle(unsigned char idleRate)
{
TRACE_INFO_WP("sIdle(%d) ", idleRate);
hiddKeyboardDriver.inputReportIdleRate = idleRate;
USBD_Write(0, 0, 0, 0, 0);
}
//-----------------------------------------------------------------------------
/// Sends the requested report to the host.
/// \param type Report type.
/// \param length Maximum number of bytes to send.
//-----------------------------------------------------------------------------
static void HIDD_GetReport(unsigned char type,
unsigned short length)
{
TRACE_INFO_WP("gReport ");
// Check report type
switch (type) {
case HIDReportRequest_INPUT:
TRACE_INFO_WP("In ");
// Adjust size and send report
if (length > sizeof(HIDDKeyboardInputReport)) {
length = sizeof(HIDDKeyboardInputReport);
}
USBD_Write(0, // Endpoint #0
&(hiddKeyboardDriver.inputReport),
length,
0, // No callback
0);
break;
case HIDReportRequest_OUTPUT:
TRACE_INFO_WP("Out ");
// Adjust size and send report
if (length > sizeof(HIDDKeyboardOutputReport)) {
length = sizeof(HIDDKeyboardOutputReport);
}
USBD_Write(0, // Endpoint #0
&(hiddKeyboardDriver.outputReport),
length,
0, // No callback
0);
break;
default:
USBD_Stall(0);
}
}
//-----------------------------------------------------------------------------
/// Callback invoked when an output report has been received from the host.
/// Forward the new status of the LEDs to the user program via the
//-----------------------------------------------------------------------------
static void HIDD_ReportReceived()
{
TRACE_INFO_WP("oReport ");
// Trigger callback
HIDDKeyboardCallbacks_LedsChanged(
HIDDKeyboardOutputReport_GetNumLockStatus(
&(hiddKeyboardDriver.outputReport)),
HIDDKeyboardOutputReport_GetCapsLockStatus(
&(hiddKeyboardDriver.outputReport)),
HIDDKeyboardOutputReport_GetScrollLockStatus(
&(hiddKeyboardDriver.outputReport)));
// Restart transfer
USBD_Read(HIDD_Descriptors_INTERRUPTOUT,
&(hiddKeyboardDriver.outputReport),
sizeof(HIDDKeyboardOutputReport),
(TransferCallback) HIDD_ReportReceived,
0); // No argument for callback function
}
//-----------------------------------------------------------------------------
/// Retrieves the new value of a report from the host and saves it.
/// \param type Report type.
/// \param length Report length.
//-----------------------------------------------------------------------------
static void HIDD_SetReport(unsigned char type,
unsigned short length)
{
TRACE_INFO_WP("sReport ");
// Check report type
switch (type) {
case HIDReportRequest_INPUT:
// SET_REPORT requests on input reports are ignored
USBD_Stall(0);
break;
case HIDReportRequest_OUTPUT:
// Check report length
if (length != sizeof(HIDDKeyboardOutputReport)) {
USBD_Stall(0);
}
else {
USBD_Read(0, // Endpoint #0
&(hiddKeyboardDriver.outputReport),
length,
(TransferCallback) HIDD_ReportReceived,
0); // No argument to the callback function
}
break;
default:
USBD_Stall(0);
}
}
//-----------------------------------------------------------------------------
// Exported functions
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
/// Initializes an USB HID keyboard function driver.
/// \param pUsbdDriver Pointer to the USB driver instance.
//-----------------------------------------------------------------------------
void HIDDFunctionDriver_Initialize(USBDDriver * pUsbdDriver)
{
hiddKeyboardDriver.inputReportIdleRate = 0;
HIDDKeyboardInputReport_Initialize(&(hiddKeyboardDriver.inputReport));
HIDDKeyboardOutputReport_Initialize(&(hiddKeyboardDriver.outputReport));
hiddKeyboardDriver.pUsbdDriver = pUsbdDriver;
}
//-----------------------------------------------------------------------------
/// Handles HID-specific SETUP request sent by the host.
/// \param request Pointer to a USBGenericRequest instance.
/// \return 0 if the request is Unsupported, 1 if the request handled.
//-----------------------------------------------------------------------------
unsigned char HIDDFunctionDriver_RequestHandler(
const USBGenericRequest *request)
{
TRACE_INFO_WP("NewReq ");
// Check if this is a standard request
if (USBGenericRequest_GetType(request) == USBGenericRequest_STANDARD) {
// This is a standard request
switch (USBGenericRequest_GetRequest(request)) {
case USBGenericRequest_GETDESCRIPTOR:
// Check if this is a HID descriptor, otherwise forward it to
// the standard driver
if (!HIDD_GetDescriptor(
USBGetDescriptorRequest_GetDescriptorType(request),
USBGenericRequest_GetLength(request))) {
USBDDriver_RequestHandler(hiddKeyboardDriver.pUsbdDriver,
request);
}
break;
default:
return 0;
}
}
// Check if this is a class request
else if (USBGenericRequest_GetType(request) == USBGenericRequest_CLASS) {
// This is a class-specific request
switch (USBGenericRequest_GetRequest(request)) {
case HIDGenericRequest_GETIDLE:
HIDD_GetIdle();
break;
case HIDGenericRequest_SETIDLE:
HIDD_SetIdle(HIDIdleRequest_GetIdleRate(request));
break;
case HIDGenericRequest_GETREPORT:
HIDD_GetReport(
HIDReportRequest_GetReportType(request),
USBGenericRequest_GetLength(request));
break;
case HIDGenericRequest_SETREPORT:
HIDD_SetReport(
HIDReportRequest_GetReportType(request),
USBGenericRequest_GetLength(request));
break;
default:
return 0;
}
}
return 1;
}
//-----------------------------------------------------------------------------
/// Invoked whenever the configuration of the device is changed by the host.
/// \param cfgnum Newly configuration number.
//-----------------------------------------------------------------------------
void HIDDFunctionCallbacks_ConfigurationChanged(unsigned char cfgnum)
{
if (cfgnum > 0) {
// Start receiving output reports
USBD_Read(HIDD_Descriptors_INTERRUPTOUT,
&(hiddKeyboardDriver.outputReport),
sizeof(HIDDKeyboardOutputReport),
(TransferCallback) HIDD_ReportReceived,
0); // No argument for callback function
}
}
//-----------------------------------------------------------------------------
/// Reports a change in which keys are currently pressed or release to the
/// host.
/// \param pressedKeys Pointer to an array of key codes indicating keys that
/// have been pressed since the last call to
/// <HIDDKeyboardDriver_ChangeKeys>.
/// \param pressedKeysSize Number of key codes in the pressedKeys array.
/// \param releasedKeys Pointer to an array of key codes indicates keys that
/// have been released since the last call to
/// <HIDDKeyboardDriver_ChangeKeys>.
/// \param releasedKeysSize Number of key codes in the releasedKeys array.
/// \return <USBD_STATUS_SUCCESS> if the report has been sent to the host;
/// otherwise an error code.
//-----------------------------------------------------------------------------
unsigned char HIDDKeyboardDriver_ChangeKeys(unsigned char *pressedKeys,
unsigned char pressedKeysSize,
unsigned char *releasedKeys,
unsigned char releasedKeysSize)
{
// Press keys
while (pressedKeysSize > 0) {
// Check if this is a standard or modifier key
if (HIDKeypad_IsModifierKey(*pressedKeys)) {
// Set the corresponding bit in the input report
HIDDKeyboardInputReport_PressModifierKey(
&(hiddKeyboardDriver.inputReport),
*pressedKeys);
}
else {
HIDDKeyboardInputReport_PressStandardKey(
&(hiddKeyboardDriver.inputReport),
*pressedKeys);
}
pressedKeysSize--;
pressedKeys++;
}
// Release keys
while (releasedKeysSize > 0) {
// Check if this is a standard or modifier key
if (HIDKeypad_IsModifierKey(*releasedKeys)) {
// Set the corresponding bit in the input report
HIDDKeyboardInputReport_ReleaseModifierKey(
&(hiddKeyboardDriver.inputReport),
*releasedKeys);
}
else {
HIDDKeyboardInputReport_ReleaseStandardKey(
&(hiddKeyboardDriver.inputReport),
*releasedKeys);
}
releasedKeysSize--;
releasedKeys++;
}
// Send input report through the interrupt IN endpoint
return USBD_Write(HIDD_Descriptors_INTERRUPTIN,
&(hiddKeyboardDriver.inputReport),
sizeof(HIDDKeyboardInputReport),
0,
0);
}
//-----------------------------------------------------------------------------
/// Starts a remote wake-up sequence if the host has explicitely enabled it
/// by sending the appropriate SET_FEATURE request.
//-----------------------------------------------------------------------------
void HIDDKeyboardDriver_RemoteWakeUp(void)
{
// Remote wake-up has been enabled
if (USBDDriver_IsRemoteWakeUpEnabled(hiddKeyboardDriver.pUsbdDriver)) {
USBD_RemoteWakeUp();
}
}
#endif

View File

@ -0,0 +1,61 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
#ifndef HIDDFUNCTIONDRIVER_H
#define HIDDFUNCTIONDRIVER_H
//-----------------------------------------------------------------------------
// Headers
//-----------------------------------------------------------------------------
#include <usb/device/core/USBDDriver.h>
#include <usb/common/core/USBGenericRequest.h>
//-----------------------------------------------------------------------------
// Exported functions
//-----------------------------------------------------------------------------
//- Function API for composite device
extern void HIDDFunctionDriver_Initialize(USBDDriver * pUsbdDriver);
extern unsigned char HIDDFunctionDriver_RequestHandler(
const USBGenericRequest *request);
extern void HIDDFunctionCallbacks_ConfigurationChanged(unsigned char cfgnum);
//- HID Keyboard API
extern unsigned char HIDDKeyboardDriver_ChangeKeys(
unsigned char *pressedKeys,
unsigned char pressedKeysSize,
unsigned char *releasedKeys,
unsigned char releasedKeysSize);
extern void HIDDKeyboardDriver_RemoteWakeUp(void);
#endif // #define HIDDFUNCTIONDRIVER_H

View File

@ -0,0 +1,84 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
#ifndef HIDDFUNCTIONDRIVERDESCRIPTORS_H
#define HIDDFUNCTIONDRIVERDESCRIPTORS_H
//-----------------------------------------------------------------------------
// Headers
//-----------------------------------------------------------------------------
#include <usb/device/core/USBDDriverDescriptors.h>
#include <usb/common/hid/HIDKeypad.h>
//-----------------------------------------------------------------------------
// Definitions
//-----------------------------------------------------------------------------
//- Interface & Endpoints
/// Interface Number.
/// Interrupt IN endpoint number.
/// Interrupt OUT endpoint number.
/// Interrupt IN endpoint polling rate (in milliseconds).
/// Interrupt OUT endpoint polling rate (in milliseconds).
#if defined(usb_CDCHID)
#define HIDD_Descriptors_INTERFACENUM 2
#define HIDD_Descriptors_INTERRUPTIN 4
#define HIDD_Descriptors_INTERRUPTOUT 5
#elif defined(usb_HIDAUDIO) || defined(usb_HIDMSD)
#define HIDD_Descriptors_INTERFACENUM 0
#define HIDD_Descriptors_INTERRUPTIN 1
#define HIDD_Descriptors_INTERRUPTOUT 2
#endif
#define HIDD_Descriptors_INTERRUPTIN_POLLING 10
#define HIDD_Descriptors_INTERRUPTOUT_POLLING 10
//- Keypad keys
/// Key code of the first accepted modifier key.
#define HIDD_Descriptors_FIRSTMODIFIERKEY HIDKeypad_LEFTCONTROL
/// Key code of the last accepted modifier key.
#define HIDD_Descriptors_LASTMODIFIERKEY HIDKeypad_RIGHTGUI
/// Key code of the first accepted standard key.
#define HIDD_Descriptors_FIRSTSTANDARDKEY 0
/// Key code of the last accepted standard key.
#define HIDD_Descriptors_LASTSTANDARDKEY HIDKeypad_NUMLOCK
//- Report descriptor
/// Size of the report descriptor in bytes.
#define HIDD_Descriptors_REPORTSIZE 61
//-----------------------------------------------------------------------------
// Exported variables
//-----------------------------------------------------------------------------
/// Report descriptor used by the driver.
extern const unsigned char hiddReportDescriptor[];
#endif // #define HIDDFUNCTIONDRIVERDESCRIPTORS_H

View File

@ -0,0 +1,57 @@
; $Id: 6119.inf,v 1.1.2.1 2006/12/05 08:33:25 danielru Exp $
[Version] ; Version section
Signature="$Chicago$" ; All Windows versions
Class=Ports ; This is a serial port driver
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} ; Associated GUID
Provider=%ATMEL% ; Driver is provided by ATMEL
DriverVer=09/12/2006,1.1.1.5 ; Driver version 1.1.1.5 published on 23 February 2007
[DestinationDirs] ; DestinationDirs section
DefaultDestDir=12 ; Default install directory is \drivers or \IOSubSys
[Manufacturer] ; Manufacturer section
%ATMEL%=AtmelMfg ; Only one manufacturer (ATMEL), models section is named
; AtmelMfg
[AtmelMfg] ; Models section corresponding to ATMEL
%USBtoSerialConverter%=USBtoSer.Install,USB\VID_03EB&PID_6130&MI_00 ; Identifies a device with ATMEL Vendor ID (03EBh) and
; Product ID equal to 6130h. Corresponding Install section
; is named USBtoSer.Install ( CDCHID )
%USBtoSerialConverter%=USBtoSer.Install,USB\VID_03EB&PID_6131&MI_00 ; Identifies a device with ATMEL Vendor ID (03EBh) and
; Product ID equal to 6131h. Corresponding Install section
; is named USBtoSer.Install ( CDCAUDIO )
%USBtoSerialConverter%=USBtoSer.Install,USB\VID_03EB&PID_6132&MI_00 ; Identifies a device with ATMEL Vendor ID (03EBh) and
; Product ID equal to 6132h. Corresponding Install section
; is named USBtoSer.Install ( CDCMSD )
%USBtoSerialConverter%=USBtoSer.Install,USB\VID_03EB&PID_6133&MI_00 ; Identifies a device with ATMEL Vendor ID (03EBh) and
; Product ID equal to 6133h. Corresponding Install section
; is named USBtoSer.Install ( CDCCDC )
%USBtoSerialConverter%=USBtoSer.Install,USB\VID_03EB&PID_6133&MI_02 ; Identifies a device with ATMEL Vendor ID (03EBh) and
; Product ID equal to 6133h. Corresponding Install section
; is named USBtoSer.Install ( CDCCDC )
[USBtoSer.Install] ; Install section
include=mdmcpq.inf
CopyFiles=FakeModemCopyFileSection
AddReg=USBtoSer.AddReg ; Registry keys to add are listed in USBtoSer.AddReg
[USBtoSer.AddReg] ; AddReg section
HKR,,DevLoader,,*ntkern ;
HKR,,NTMPDriver,,usbser.sys
HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"
[USBtoSer.Install.Services] ; Services section
AddService=usbser,0x00000002,USBtoSer.AddService ; Assign usbser as the PnP driver for the device
[USBtoSer.AddService] ; Service install section
DisplayName=%USBSer% ; Name of the serial driver
ServiceType=1 ; Service kernel driver
StartType=3 ; Driver is started by the PnP manager
ErrorControl=1 ; Warn about errors
ServiceBinary=%12%\usbser.sys ; Driver filename
[Strings] ; Strings section
ATMEL="ATMEL Corp." ; String value for the ATMEL symbol
USBtoSerialConverter="AT91 USB to Serial Converter" ; String value for the USBtoSerialConverter symbol
USBSer="USB Composite Serial Driver" ; String value for the USBSer symbol

View File

@ -0,0 +1,57 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit HIDDKeyboardCallbacks
!!!Purpose
Definitions of callbacks used by the HID keyboard device driver to
notify the application of events.
!!!Usage
-# Re-implement any number of these callbacks anywhere in the program;
they will be called automatically by the driver when the related
event occurs.
*/
#ifndef HIDDKEYBOARDCALLBACKS_H
#define HIDDKEYBOARDCALLBACKS_H
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
extern void HIDDKeyboardCallbacks_LedsChanged(unsigned char numLockStatus,
unsigned char capsLockStatus,
unsigned char scrollLockStatus);
#endif //#ifndef HIDDKEYBOARDCALLBACKS_H

View File

@ -0,0 +1,75 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit HIDDKeyboardDriver
!!!Purpose
Definition of methods for using a HID keyboard device driver.
!!!Usage
-# Re-implement the USBDCallbacks_RequestReceived callback to forward
requests to HIDDKeyboardDriver_RequestHandler. This is done
automatically unless the NOAUTOCALLBACK symbol is defined during
compilation.
-# Initialize the driver using HIDDKeyboardDriver_Initialize. The
USB driver is automatically initialized by this method.
-# Call the HIDDKeyboardDriver_ChangeKeys method when one or more
keys are pressed/released.
*/
#ifndef HIDDKEYBOARDDRIVER_H
#define HIDDKEYBOARDDRIVER_H
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include <usb/common/core/USBGenericRequest.h>
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
extern void HIDDKeyboardDriver_Initialize();
extern void HIDDKeyboardDriver_RequestHandler(const USBGenericRequest *request);
extern unsigned char HIDDKeyboardDriver_ChangeKeys(
unsigned char *pressedKeys,
unsigned char pressedKeysSize,
unsigned char *releasedKeys,
unsigned char releasedKeysSize);
extern void HIDDKeyboardDriver_RemoteWakeUp(void);
#endif //#ifndef HIDDKEYBOARDDRIVER_H

View File

@ -0,0 +1,114 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit HIDDKeyboardDriverDescriptors
!!!Purpose
Definitions of the descriptors required by the HID device keyboard
driver.
!!!Usage
-# Use the hiddKeyboardDriverDescriptors variable to initialize a
USBDDriver instance.
-# Send hiddReportDescriptor to the host when a GET_DESCRIPTOR request
for the report descriptor is received.
*/
#ifndef HIDDKEYBOARDDRIVERDESCRIPTORS_H
#define HIDDKEYBOARDDRIVERDESCRIPTORS_H
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include <usb/device/core/USBDDriverDescriptors.h>
#include <usb/common/hid/HIDKeypad.h>
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Endpoints"
/// This page lists endpoint addresses and polling settings.
///
/// !Endpoints
/// - HIDDKeyboardDriverDescriptors_INTERRUPTIN
/// - HIDDKeyboardDriverDescriptors_INTERRUPTOUT
///
/// !Polling Rates
/// - HIDDKeyboardDriverDescriptors_INTERRUPTIN_POLLING
/// - HIDDKeyboardDriverDescriptors_INTERRUPTOUT_POLLING
/// Interrupt IN endpoint number.
#define HIDDKeyboardDriverDescriptors_INTERRUPTIN 1
/// Interrupt IN endpoint polling rate (in milliseconds).
#define HIDDKeyboardDriverDescriptors_INTERRUPTIN_POLLING 10
/// Interrupt OUT endpoint number.
#define HIDDKeyboardDriverDescriptors_INTERRUPTOUT 2
/// Interrupt OUT endpoint polling rate (in milliseconds).
#define HIDDKeyboardDriverDescriptors_INTERRUPTOUT_POLLING 10
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// \page "HID Keypad keys"
/// This page lists definition for HID keypad keys.
///
/// !Keys
/// - HIDDKeyboardDriverDescriptors_FIRSTMODIFIERKEY
/// - HIDDKeyboardDriverDescriptors_LASTMODIFIERKEY
/// - HIDDKeyboardDriverDescriptors_FIRSTSTANDARDKEY
/// - HIDDKeyboardDriverDescriptors_LASTSTANDARDKEY
/// Key code of the first accepted modifier key.
#define HIDDKeyboardDriverDescriptors_FIRSTMODIFIERKEY HIDKeypad_LEFTCONTROL
/// Key code of the last accepted modifier key.
#define HIDDKeyboardDriverDescriptors_LASTMODIFIERKEY HIDKeypad_RIGHTGUI
/// Key code of the first accepted standard key.
#define HIDDKeyboardDriverDescriptors_FIRSTSTANDARDKEY 0
/// Key code of the last accepted standard key.
#define HIDDKeyboardDriverDescriptors_LASTSTANDARDKEY HIDKeypad_NUMLOCK
//------------------------------------------------------------------------------
/// Size of the report descriptor in bytes.
#define HIDDKeyboardDriverDescriptors_REPORTSIZE 61
//------------------------------------------------------------------------------
// Exported variables
//------------------------------------------------------------------------------
extern USBDDriverDescriptors hiddKeyboardDriverDescriptors;
extern const unsigned char hiddReportDescriptor[];
#endif //#ifndef HIDDKEYBOARDDRIVERDESCRIPTORS_H

View File

@ -0,0 +1,164 @@
/* ----------------------------------------------------------------------------
* 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: HIDDKeyboardInputReport implementation
About: Purpose
Implementation of the HIDDKeyboardInputReport class.
*/
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "HIDDKeyboardInputReport.h"
#include "HIDDKeyboardDriverDescriptors.h"
#include <utility/assert.h>
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Initializes a keyboard input report instance.
/// \param report Pointer to a HIDDKeyboardInputReport instance.
//------------------------------------------------------------------------------
void HIDDKeyboardInputReport_Initialize(HIDDKeyboardInputReport *report)
{
unsigned int i;
report->bmModifierKeys = 0;
for (i = 0; i < HIDDKeyboardInputReport_MAXKEYPRESSES; i++) {
report->pressedKeys[i] = 0;
}
}
//------------------------------------------------------------------------------
/// Reports a standard key as being pressed.
/// \param report Pointer to a HIDDKeyboardInputReport instance.
/// \param key Key code of the standard key.
//------------------------------------------------------------------------------
void HIDDKeyboardInputReport_PressStandardKey(HIDDKeyboardInputReport *report,
unsigned char key)
{
ASSERT(key <= HIDDKeyboardDriverDescriptors_LASTSTANDARDKEY,
"Invalid standard key code (%d)\n\r",
key);
// Find first available slot
unsigned int i = 0;
unsigned char found = 0;
while ((i < HIDDKeyboardInputReport_MAXKEYPRESSES) && !found) {
// Free slot: no key referenced (code = 0) or ErrorRollOver
if ((report->pressedKeys[i] == 0)
|| (report->pressedKeys[i] == HIDKeypad_ERRORROLLOVER)) {
found = 1;
report->pressedKeys[i] = key;
}
i++;
}
// Report ErrorRollOver in all fields if too many keys are pressed
if (!found) {
for (i=0; i < HIDDKeyboardInputReport_MAXKEYPRESSES; i++) {
report->pressedKeys[i] = HIDKeypad_ERRORROLLOVER;
}
}
}
//------------------------------------------------------------------------------
/// Reports a standard key as not being pressed anymore.
/// \param report Pointer to a HIDDKeyboardInputReport instance.
/// \param key Key code of the standard key
//------------------------------------------------------------------------------
void HIDDKeyboardInputReport_ReleaseStandardKey(HIDDKeyboardInputReport *report,
unsigned char key)
{
ASSERT(key <= HIDDKeyboardDriverDescriptors_LASTSTANDARDKEY,
"Invalid standard key code (%d)\n\r",
key);
// Look for key in array
unsigned int i = 0;
unsigned char found = 0;
while ((i < HIDDKeyboardInputReport_MAXKEYPRESSES) && !found) {
if (report->pressedKeys[i] == key) {
found = 1;
report->pressedKeys[i] = 0;
}
i++;
}
}
//------------------------------------------------------------------------------
/// Reports a modifier key as being currently pressed.
/// \param report Pointer to a HIDDKeyboardInputReport instance.
/// \param key Key code of the modifier key.
//------------------------------------------------------------------------------
void HIDDKeyboardInputReport_PressModifierKey(HIDDKeyboardInputReport *report,
unsigned char key)
{
ASSERT((key >= HIDDKeyboardDriverDescriptors_FIRSTMODIFIERKEY)
&& (key <= HIDDKeyboardDriverDescriptors_LASTMODIFIERKEY),
"Invalid standard key code (%d)\n\r",
key);
// Set corresponding bit
unsigned char bit = key - HIDDKeyboardDriverDescriptors_FIRSTMODIFIERKEY;
report->bmModifierKeys |= 1 << bit;
}
//------------------------------------------------------------------------------
/// Reports a modifier key as not being pressed anymore.
/// \param report Pointer to a HIDDKeyboardInputReport instance.
/// \param key Key code of the modifier key.
//------------------------------------------------------------------------------
void HIDDKeyboardInputReport_ReleaseModifierKey(HIDDKeyboardInputReport *report,
unsigned char key)
{
ASSERT((key >= HIDDKeyboardDriverDescriptors_FIRSTMODIFIERKEY)
&& (key <= HIDDKeyboardDriverDescriptors_LASTMODIFIERKEY),
"Invalid standard key code (%d)\n\r",
key);
// Clear corresponding bit
unsigned char bit = key - HIDDKeyboardDriverDescriptors_FIRSTMODIFIERKEY;
report->bmModifierKeys &= ~(1 << bit);
}

View File

@ -0,0 +1,149 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit HIDDKeyboardInputReport.h
!!!Purpose
Class for manipulating HID keyboard input reports.
!!!Usage
-# Initialize a newly created input report with
HIDDKeyboardInputReport_Initialize.
-# Change the standard keys that are pressed and released using
HIDDKeyboardInputReport_PressStandardKey and
HIDDKeyboardInputReport_ReleaseStandardKey.
-# Change the modifier keys that are currently pressed and released
using HIDDKeyboardInputReport_PressModifierKey and
HIDDKeyboardInputReport_ReleaseModifierKey.
*/
#ifndef HIDDKEYBOARDINPUTREPORT_H
#define HIDDKEYBOARDINPUTREPORT_H
//------------------------------------------------------------------------------
// Definitions
//------------------------------------------------------------------------------
/// Maximum number of simultaneous key presses.
#define HIDDKeyboardInputReport_MAXKEYPRESSES 3
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
#ifdef __ICCARM__ // IAR
#pragma pack(1) // IAR
#define __attribute__(...) // IAR
#endif // IAR
//------------------------------------------------------------------------------
/// HID input report structure used by the keyboard driver to notify the
/// host of pressed keys.
///
/// The first byte is used to report the state of modifier keys. The
/// other three contains the keycodes of the currently pressed keys.
//------------------------------------------------------------------------------
typedef struct {
/// State of modifier keys.
unsigned char bmModifierKeys:8;
/// Key codes of pressed keys.
unsigned char pressedKeys[HIDDKeyboardInputReport_MAXKEYPRESSES];
} __attribute__ ((packed)) HIDDKeyboardInputReport; // GCC
#ifdef __ICCARM__ // IAR
#pragma pack() // IAR
#endif // IAR
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
/*
Function: HIDDKeyboardInputReport_Initialize
Initializes a keyboard input report instance.
Parameters:
report - Pointer to a HIDDKeyboardInputReport instance.
*/
extern void HIDDKeyboardInputReport_Initialize(HIDDKeyboardInputReport *report);
/*
Function: HIDDKeyboardInputReport_PressStandardKey
Reports a standard key as being pressed.
Parameters:
report - Pointer to a HIDDKeyboardInputReport instance.
key - Key code of the standard key.
*/
extern void HIDDKeyboardInputReport_PressStandardKey(
HIDDKeyboardInputReport *report,
unsigned char key);
/*
Function: HIDDKeyboardInputReport_ReleaseStandardKey
Reports a standard key as not being pressed anymore.
Parameters:
report - Pointer to a HIDDKeyboardInputReport instance.
key - Key code of the standard key
*/
extern void HIDDKeyboardInputReport_ReleaseStandardKey(
HIDDKeyboardInputReport *report,
unsigned char key);
/*
Function: HIDDKeyboardInputReport_PressModifierKey
Reports a modifier key as being currently pressed.
Parameters:
report - Pointer to a HIDDKeyboardInputReport instance.
key - Key code of the modifier key.
*/
extern void HIDDKeyboardInputReport_PressModifierKey(
HIDDKeyboardInputReport *report,
unsigned char key);
/*
Function: HIDDKeyboardInputReport_ReleaseModifierKey
Reports a modifier key as not being pressed anymore.
Parameters:
report - Pointer to a HIDDKeyboardInputReport instance.
key - Key code of the modifier key.
*/
extern void HIDDKeyboardInputReport_ReleaseModifierKey(
HIDDKeyboardInputReport *report,
unsigned char key);
#endif //#ifndef HIDDKEYBOARDINPUTREPORT_H

View File

@ -0,0 +1,94 @@
/* ----------------------------------------------------------------------------
* 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: HIDDKeyboardOutputReport implementation
About: Purpose
Implementation of the HIDDKeyboardOutputReport class.
*/
//------------------------------------------------------------------------------
// Headers
//------------------------------------------------------------------------------
#include "HIDDKeyboardOutputReport.h"
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Initializes a keyboard output report.
/// \param report Pointer to a HIDDKeyboardOutputReport instance.
//------------------------------------------------------------------------------
void HIDDKeyboardOutputReport_Initialize(HIDDKeyboardOutputReport *report)
{
report->numLockStatus = 0;
report->capsLockStatus = 0;
report->scrollLockStatus = 0;
report->padding = 0;
}
//------------------------------------------------------------------------------
/// Indicates the current status of the num. lock LED according to the
/// given report.
/// \param report Pointer to a HIDDKeyboardOutputReport instance.
/// \return 1 if the num. lock LED is light on; otherwise 0.
//------------------------------------------------------------------------------
unsigned char HIDDKeyboardOutputReport_GetNumLockStatus(
const HIDDKeyboardOutputReport *report)
{
return report->numLockStatus;
}
//------------------------------------------------------------------------------
/// Indicates the current status of the caps lock LED according to the
/// given report.
/// \param report Pointer to a HIDDKeyboardOutputReport instance.
/// \return 1 if the caps lock LED is light on; otherwise 0.
//------------------------------------------------------------------------------
unsigned char HIDDKeyboardOutputReport_GetCapsLockStatus(
const HIDDKeyboardOutputReport *report)
{
return report->capsLockStatus;
}
//------------------------------------------------------------------------------
/// Indicates the current status of the scroll lock LED according to the
/// given report.
/// \param report Pointer to a HIDDKeyboardOutputReport instance.
/// \return 1 if the scroll lock LED is light on; otherwise 0.
//------------------------------------------------------------------------------
unsigned char HIDDKeyboardOutputReport_GetScrollLockStatus(
const HIDDKeyboardOutputReport *report)
{
return report->scrollLockStatus;
}

View File

@ -0,0 +1,96 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
\unit HIDDKeyboardOutputReport
!!!Purpose
Definition of a class for manipulating HID keyboard output reports.
!!!Usage
-# Initialize a newly-created output report instance with
HIDDKeyboardOutputReport_Initialize.
-# Retrieve the status of the three LEDs using
HIDDKeyboardOutputReport_GetNumLockStatus,
HIDDKeyboardOutputReport_GetCapsLockStatus and
HIDDKeyboardOutputReport_GetScrollLockStatus.
*/
#ifndef HIDKEYBOARDOUTPUTREPORT_H
#define HIDKEYBOARDOUTPUTREPORT_H
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
#ifdef __ICCARM__ // IAR
#pragma pack(1) // IAR
#define __attribute__(...) // IAR
#endif // IAR
//------------------------------------------------------------------------------
/// HID output report structure used by the host to control the state of
/// the keyboard LEDs.
///
/// Only the first three bits are relevant, the other 5 are used as
/// padding bits.
//------------------------------------------------------------------------------
typedef struct {
unsigned char numLockStatus:1, /// State of the num. lock LED.
capsLockStatus:1, /// State of the caps lock LED.
scrollLockStatus:1, /// State of the scroll lock LED.
padding:5; /// Padding bits.
} __attribute__ ((packed)) HIDDKeyboardOutputReport; // GCC
#ifdef __ICCARM__ // IAR
#pragma pack() // IAR
#endif // IAR
//------------------------------------------------------------------------------
// Exported functions
//------------------------------------------------------------------------------
extern void HIDDKeyboardOutputReport_Initialize(
HIDDKeyboardOutputReport *report);
extern unsigned char HIDDKeyboardOutputReport_GetNumLockStatus(
const HIDDKeyboardOutputReport *report);
extern unsigned char HIDDKeyboardOutputReport_GetCapsLockStatus(
const HIDDKeyboardOutputReport *report);
extern unsigned char HIDDKeyboardOutputReport_GetScrollLockStatus(
const HIDDKeyboardOutputReport *report);
#endif //#ifndef HIDKEYBOARDOUTPUTREPORT_H

View File

@ -0,0 +1,173 @@
# ----------------------------------------------------------------------------
# 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.
# ----------------------------------------------------------------------------
# Makefile for compiling the USB COMPOSITE project
#-------------------------------------------------------------------------------
# User-modifiable options
#-------------------------------------------------------------------------------
# Chip & board used for compilation
# (can be overriden by adding CHIP=chip and BOARD=board to the command-line)
CHIP = at91sam7se512
BOARD = at91sam7se-ek
# Trace level used for compilation
# (can be overriden by adding TRACE_LEVEL=#number to the command-line)
# TRACE_LEVEL_DEBUG 5
# TRACE_LEVEL_INFO 4
# TRACE_LEVEL_WARNING 3
# TRACE_LEVEL_ERROR 2
# TRACE_LEVEL_FATAL 1
# TRACE_LEVEL_NO_TRACE 0
TRACE_LEVEL = 3
# Optimization level, put in comment for debugging
OPTIMIZATION = -Os
# AT91 library directory
AT91LIB = ../at91lib
# Output file basename
OUTPUT = usb-device-composite-cdchid-project-$(usb_CLASS)-$(BOARD)-$(CHIP)
# Compile for all memories available on the board (this sets $(MEMORIES))
include $(AT91LIB)/boards/$(BOARD)/board.mak
# Output directories
BIN = bin
OBJ = obj
#-------------------------------------------------------------------------------
# Tools
#-------------------------------------------------------------------------------
# Tool suffix when cross-compiling
CROSS_COMPILE = arm-none-eabi-
# Compilation tools
CC = $(CROSS_COMPILE)gcc
SIZE = $(CROSS_COMPILE)size
OBJCOPY = $(CROSS_COMPILE)objcopy
# Flags
INCLUDES = -I$(AT91LIB)/boards/$(BOARD) -I$(AT91LIB)/peripherals
INCLUDES += -I$(AT91LIB)/components -I$(AT91LIB)/usb/device -I$(AT91LIB)
CFLAGS = -Wall -mlong-calls -ffunction-sections
CFLAGS += -g $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) -DTRACE_LEVEL=$(TRACE_LEVEL)
CFLAGS += -Dusb_CDCHID
ASFLAGS = -g $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) -D__ASSEMBLY__
LDFLAGS = -g $(OPTIMIZATION) -nostartfiles -Wl,--gc-sections
#-------------------------------------------------------------------------------
# Files
#-------------------------------------------------------------------------------
# Directories where source files can be found
USB = $(AT91LIB)/usb
UTILITY = $(AT91LIB)/utility
PERIPH = $(AT91LIB)/peripherals
BOARDS = $(AT91LIB)/boards
COMP = $(AT91LIB)/components
MEM = $(AT91LIB)/memories
VPATH += $(MEM)
VPATH += $(USB)/device/hid-keyboard $(USB)/common/hid
VPATH += $(USB)/device/composite
VPATH += $(USB)/device/core $(USB)/common/core
VPATH += $(USB)/common/cdc
VPATH += $(UTILITY)
VPATH += $(PERIPH)/dbgu $(PERIPH)/aic $(PERIPH)/usart $(PERIPH)/pio $(PERIPH)/pmc
VPATH += $(PERIPH)/cp15 $(PERIPH)/pit
VPATH += $(BOARDS)/$(BOARD) $(BOARDS)/$(BOARD)/$(CHIP)
# Objects built from C source files
C_OBJECTS = main.o
C_OBJECTS += COMPOSITEDDriver.o COMPOSITEDDriverDescriptors.o
C_OBJECTS += CDCSetControlLineStateRequest.o CDCLineCoding.o
C_OBJECTS += CDCDFunctionDriver.o
C_OBJECTS += HIDIdleRequest.o HIDReportRequest.o HIDKeypad.o
C_OBJECTS += HIDDKeyboardInputReport.o HIDDKeyboardOutputReport.o
C_OBJECTS += HIDDFunctionDriver.o
C_OBJECTS += USBD_OTGHS.o USBD_UDP.o USBD_UDPHS.o USBDDriver.o
C_OBJECTS += USBDCallbacks_Initialized.o
C_OBJECTS += USBDCallbacks_Reset.o
#C_OBJECTS += USBDCallbacks_Resumed.o
#C_OBJECTS += USBDCallbacks_Suspended.o
#C_OBJECTS += USBDDriverCb_CfgChanged.o
#C_OBJECTS += USBDDriverCb_IfSettingChanged.o
C_OBJECTS += USBSetAddressRequest.o USBGenericDescriptor.o USBInterfaceRequest.o
C_OBJECTS += USBGenericRequest.o USBGetDescriptorRequest.o
C_OBJECTS += USBSetConfigurationRequest.o USBFeatureRequest.o
C_OBJECTS += USBEndpointDescriptor.o USBConfigurationDescriptor.o
C_OBJECTS += led.o string.o stdio.o
C_OBJECTS += aic.o dbgu.o usart.o pio.o pio_it.o pmc.o cp15.o pit.o
C_OBJECTS += board_memories.o board_lowlevel.o
# Objects built from Assembly source files
ASM_OBJECTS = board_cstartup.o
ASM_OBJECTS += cp15_asm.o
# Append OBJ and BIN directories to output filename
OUTPUT := $(BIN)/$(OUTPUT)
#-------------------------------------------------------------------------------
# Rules
#-------------------------------------------------------------------------------
all: $(BIN) $(OBJ) $(MEMORIES)
$(BIN) $(OBJ):
mkdir $@
define RULES
C_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(C_OBJECTS))
ASM_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(ASM_OBJECTS))
$(1): $$(ASM_OBJECTS_$(1)) $$(C_OBJECTS_$(1))
$(CC) $(LDFLAGS) -T"$(AT91LIB)/boards/$(BOARD)/$(CHIP)/$$@.lds" -o $(OUTPUT)-$$@.elf $$^
$(OBJCOPY) -O binary $(OUTPUT)-$$@.elf $(OUTPUT)-$$@.bin
$(SIZE) $$^ $(OUTPUT)-$$@.elf
$$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile $(OBJ) $(BIN)
$(CC) $(CFLAGS) -D$(1) -c -o $$@ $$<
$$(ASM_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.S Makefile $(OBJ) $(BIN)
$(CC) $(ASFLAGS) -D$(1) -c -o $$@ $$<
debug_$(1): $(1)
perl ../resources/gdb/debug.pl $(OUTPUT)-$(1).elf
endef
$(foreach MEMORY, $(MEMORIES), $(eval $(call RULES,$(MEMORY))))
clean:
-rm -f $(OBJ)/*.o $(BIN)/*.bin $(BIN)/*.elf

File diff suppressed because it is too large Load Diff