Renamed main folder to firmware

This commit is contained in:
Christina Quast
2015-04-07 18:24:06 +02:00
parent f5cd7efede
commit 5a67c0fef3
326 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,109 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/** \file */
#ifndef AUDDFUNCTION_H
#define AUDDFUNCTION_H
/** \addtogroup usbd_aud_fun
*@{
*/
/*-----------------------------------------------------------------------------
* Headers
*---------------------------------------------------------------------------*/
#include <USBRequests.h>
#include <AUDDSpeakerPhone.h>
#include <USBD.h>
#include <USBDDriver.h>
/*-----------------------------------------------------------------------------
* Definitions
*---------------------------------------------------------------------------*/
/** \addtogroup audd_fun_desc USBD Audio Function definitions
* @{
*/
/** ID for Speaker */
#define AUDDFunction_Speaker 0
/** ID for Microphone */
#define AUDDFunction_Microhpone 1
/** Max number of interfaces that supported by the function (AC + 2*AS) */
#define AUDDFunction_MaxNumInterfaces 3
/** Max number of channels supported by speaker stream (including master) */
#define AUDDFunction_MaxNumSpeakerChannels 3
/** Max number of channels supported by microphone stream (including master) */
#define AUDDFunction_MaxNumMicrophoneChannels 3
/** Endpoint polling interval 2^(x-1) * 125us */
#define AUDDFunction_HS_INTERVAL 0x04
/** Endpoint polling interval 2^(x-1) * ms */
#define AUDDFunction_FS_INTERVAL 0x01
/** Playback input terminal ID */
#define AUDDFunction_INPUTTERMINAL AUDD_ID_SpeakerIT
/** Playback output terminal ID */
#define AUDDFunction_OUTPUTTERMINAL AUDD_ID_SpeakerOT
/** Playback feature unit ID */
#define AUDDFunction_FEATUREUNIT AUDD_ID_SpeakerFU
/** Record input terminal ID */
#define AUDDFunction_INPUTTERMINAL_REC AUDD_ID_MicrophoneIT
/** Record output terminal ID */
#define AUDDFunction_OUTPUTTERMINAL_REC AUDD_ID_MicrophoneOT
/** Record feature unit ID */
#define AUDDFunction_FEATUREUNIT_REC AUDD_ID_MicrophoneFU
/** @}*/
/*-----------------------------------------------------------------------------
* Exported functions
*---------------------------------------------------------------------------*/
extern void AUDDFunction_Initialize(
USBDDriver *pUsbd, uint8_t bInterface);
extern void AUDDFunction_Configure(
USBGenericDescriptor * pDescriptors, uint16_t wLength);
extern void AUDDFunction_InterfaceSettingChangedHandler(
uint8_t interface,uint8_t setting);
extern uint32_t AUDDFunction_RequestHandler(const USBGenericRequest * request);
extern uint8_t AUDDFunction_Read(
void * buffer, uint32_t length,
TransferCallback callback, void * argument);
extern uint8_t AUDDFunction_SetupWrite(
void * pListInit, void * pDmaInit, uint16_t listSize, uint16_t delaySize,
TransferCallback callback,void * argument);
extern uint8_t AUDDFunction_Write(void * buffer, uint16_t length);
extern void AUDDFunction_MuteChanged(
uint8_t idMic, uint8_t ch, uint8_t mute);
extern void AUDDFunction_StreamSettingChanged(
uint8_t idMic, uint8_t setting);
/**@}*/
#endif // #define AUDDFUNCTIONDRIVER_H

View File

@@ -0,0 +1,256 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* Definition of a USB Audio Speaker Driver with two playback channels.
*
* \section Usage
*
* -# Enable and setup USB related pins (see pio & board.h).
* -# Configure the USB Audio Speaker driver using AUDDSpeakerDriver_Initialize
* -# To get %audio stream frames from host, use AUDDSpeakerDriver_Read
*/
#ifndef AUDDSPEAKERDRIVER_H
#define AUDDSPEAKERDRIVER_H
/** \addtogroup usbd_audio_speaker
*@{
*/
/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
#include <USBLib_Types.h>
#include <USBRequests.h>
#include <USBDescriptors.h>
#include <AUDDescriptors.h>
#include <USBD.h>
#include <USBDDriver.h>
#include <AUDDSpeakerPhone.h>
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** \addtogroup usbd_audio_ch USB Device Audio Speaker Channel Numbers
* @{
* This page lists codes for USB Audio Speaker channel numbers.
*
* \par Playback channel numbers
* - \ref AUDDSpeakerDriver_MASTERCHANNEL
* - \ref AUDDSpeakerDriver_LEFTCHANNEL
* - \ref AUDDSpeakerDriver_RIGHTCHANNEL
*
* \par Record channel number
* - \ref AUDDSpeakerDriver_RECCHANNEL
*/
/** Master channel of playback. */
#define AUDDSpeakerDriver_MASTERCHANNEL 0
/** Front left channel of playback. */
#define AUDDSpeakerDriver_LEFTCHANNEL 1
/** Front right channel of playback. */
#define AUDDSpeakerDriver_RIGHTCHANNEL 2
/** Channel of record. */
#define AUDDSpeakerDriver_RECCHANNEL 0
/** Max Number of channels in audio stream (excluding master). */
#define AUDDSpeakerDriver_NUMCHANNELS 2
/** @}*/
/** \addtogroup usbd_audio_speaker_if USB Device Audio Speaker Interface IDs
* @{
* This page lists the interface numbers for USB Audio Speaker device.
* - \ref AUDDSpeakerDriverDescriptors_CONTROL
* - \ref AUDDSpeakerDriverDescriptors_STREAMING
* Total number of integrated interfaces
* - \ref AUDDSpeakerDriver_NUMINTERFACES
*/
/** Audio control interface ID. */
#define AUDDSpeakerDriverDescriptors_CONTROL 0
/** Audio streaming interface ID (OUT, for playback). */
#define AUDDSpeakerDriverDescriptors_STREAMING 1
/** Audio speaker total number of interfaces */
#define AUDDSpeakerDriver_NUMINTERFACES 2
/** @}*/
/** \addtogroup usbd_audio_entity USB Device Audio Speaker Entity IDs
* @{
* This page lists the entity IDs for USB Audio Speaker device.
* - \ref AUDDSpeakerDriverDescriptors_INPUTTERMINAL
* - \ref AUDDSpeakerDriverDescriptors_OUTPUTTERMINAL
* - \ref AUDDSpeakerDriverDescriptors_FEATUREUNIT
*/
/** Playback input terminal ID. */
#define AUDDSpeakerDriverDescriptors_INPUTTERMINAL AUDD_ID_SpeakerIT
/** Playback output terminal ID. */
#define AUDDSpeakerDriverDescriptors_OUTPUTTERMINAL AUDD_ID_SpeakerOT
/** Playback feature unit ID. */
#define AUDDSpeakerDriverDescriptors_FEATUREUNIT AUDD_ID_SpeakerFU
/** @}*/
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR*/
#pragma pack(1) /* IAR*/
#define __attribute__(...) /* IAR*/
#endif /* IAR*/
/**
* \typedef AUDHeaderDescriptor1
* \brief Header descriptor with 1 interface.
*/
typedef struct _AUDHeaderDescriptor1 {
/** Header descriptor. */
AUDHeaderDescriptor header;
/** Id of the first grouped interface - Speaker. */
uint8_t bInterface0;
} __attribute__ ((packed)) AUDHeaderDescriptor1; /* GCC*/
/**
* \typedef AUDFeatureUnitDescriptor3
* \brief Feature unit descriptor with 3 channel controls
* (master, right, left).
*/
typedef struct _AUDFeatureUnitDescriptor3 {
/** Feature unit descriptor. */
AUDFeatureUnitDescriptor feature;
/** Available controls for each channel. */
uint8_t bmaControls[3];
/** Index of a string descriptor for the feature unit. */
uint8_t iFeature;
} __attribute__ ((packed)) AUDFeatureUnitDescriptor3; /* GCC */
/**
* \typedef AUDDSpeakerDriverAudioControlDescriptors
* \brief List of descriptors for detailling the audio control interface of a
* device using a USB audio speaker driver.
*/
typedef struct _AUDDSpeakerDriverAudioControlDescriptors {
/** 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*/
/**
* \typedef AUDFormatTypeOneDescriptor1
* \brief Format type I descriptor with one discrete sampling frequency.
*/
typedef struct _AUDFormatTypeOneDescriptor1 {
/** Format type I descriptor. */
AUDFormatTypeOneDescriptor formatType;
/** Sampling frequency in Hz. */
uint8_t tSamFreq[3];
} __attribute__ ((packed)) AUDFormatTypeOneDescriptor1; /* GCC*/
/**
* \typedef AUDDSpeakerDriverConfigurationDescriptors
* \brief Holds a list of descriptors returned as part of the configuration of
* a USB audio speaker device.
*/
typedef struct _AUDDSpeakerDriverConfigurationDescriptors {
/** Standard configuration. */
USBConfigurationDescriptor configuration;
/** Audio control interface. */
USBInterfaceDescriptor control;
/** Descriptors for the audio control interface. */
AUDDSpeakerDriverAudioControlDescriptors controlDescriptors;
/* - AUDIO OUT */
/** Streaming out interface descriptor (with no endpoint, required). */
USBInterfaceDescriptor streamingOutNoIsochronous;
/** Streaming out interface descriptor. */
USBInterfaceDescriptor streamingOut;
/** Audio class descriptor for the streaming out interface. */
AUDStreamingInterfaceDescriptor streamingOutClass;
/** Stream format descriptor. */
AUDFormatTypeOneDescriptor1 streamingOutFormatType;
/** Streaming out endpoint descriptor. */
AUDEndpointDescriptor streamingOutEndpoint;
/** Audio class descriptor for the streaming out endpoint. */
AUDDataEndpointDescriptor streamingOutDataEndpoint;
} __attribute__ ((packed)) AUDDSpeakerDriverConfigurationDescriptors; /* GCC */
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*----------------------------------------------------------------------------
* Exported functions
*----------------------------------------------------------------------------*/
extern void AUDDSpeakerDriver_Initialize(
const USBDDriverDescriptors *pDescriptors);
extern void AUDDSpeakerDriver_ConfigurationChangeHandler(uint8_t cfgnum);
extern void AUDDSpeakerDriver_InterfaceSettingChangedHandler(
uint8_t interface, uint8_t setting);
extern void AUDDSpeakerDriver_RequestHandler(const USBGenericRequest *request);
extern uint8_t AUDDSpeakerDriver_Read(void *buffer,
uint32_t length,
TransferCallback callback,
void *argument);
extern void AUDDSpeakerDriver_MuteChanged(uint8_t channel,uint8_t muted);
extern void AUDDSpeakerDriver_StreamSettingChanged(uint8_t newSetting);
/**@}*/
#endif /*#ifndef AUDDSPEAKERDRIVER_H */

View File

@@ -0,0 +1,156 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/** \file
* USB Audio Speaker & Microphone Function.
*/
/** \addtogroup usbd_audio_speakerphone
*@{
* Implement speakerphone function that combine 1 AC interface, 1 AS interface
* for speaker and 1 AS interface for microphone.
*/
#ifndef _AUDD_SPEAKERPHONE_H_
#define _AUDD_SPEAKERPHONE_H_
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include <stdint.h>
#include <AUDDStream.h>
#include <USBD.h>
#include <USBDDriver.h>
/*------------------------------------------------------------------------------
* Defines
*------------------------------------------------------------------------------*/
/** \addtogroup usbd_audio_ids Audio Device IDs required by driver
* @{
* The driver uses following fixed entity IDs, use them to define your
* descriptor.
* \ref AUDD_ID_SpeakerIT
* \ref AUDD_ID_SpeakerOT
* \ref AUDD_ID_SpeakerFU
* \ref AUDD_ID_MicrophoneIT
* \ref AUDD_ID_MicrophoneOT
* \ref AUDD_ID_MicrophoneFU
*/
/** Speaker input terminal ID */
#define AUDD_ID_SpeakerIT 0x01
/** Speaker output terminal ID */
#define AUDD_ID_SpeakerOT 0x02
/** Speaker feature unit ID */
#define AUDD_ID_SpeakerFU 0x03
/** Microphone input terminal ID */
#define AUDD_ID_MicrophoneIT 0x04
/** Microphone output terminal ID */
#define AUDD_ID_MicrophoneOT 0x05
/** Microphone feature unit ID */
#define AUDD_ID_MicrophoneFU 0x06
/** @}*/
/** \addtogroup usbd_audio_chs Audio Device Channels
* @{
*/
/** Master channel ID */
#define AUDD_CH_Master 0x0
/** Left channel ID */
#define AUDD_CH_L 0x1
/** Right channel ID */
#define AUDD_CH_R 0x2
/** @}*/
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/**
* Struct of USB Audio Speakerphone Function, with
* - 1 control interface for features,
* - 1 input stream for microphone (Audio IN),
* - 1 output stream for speaker (Audio OUT).
*/
typedef struct _AUDDSpeakerPhone {
/** Pointer to USBD Driver Interface */
USBDDriver *pUsbd;
/** Pointer to AUDDStream Instance */
AUDDStream *pSpeaker;
/** Pointer to AUDDStream Instance */
AUDDStream *pMicrophone;
} AUDDSpeakerPhone;
/*------------------------------------------------------------------------------
* Functions
*------------------------------------------------------------------------------*/
extern void AUDDSpeakerPhone_InitializeStream(
AUDDStream * pAuds,
uint8_t numChannels,uint16_t wChannelVolumes [ ],
AUDDStreamEventCallback fCallback,void * pArg);
extern void AUDDSpeakerPhone_Initialize(
AUDDSpeakerPhone * pAudf,
USBDDriver * pUsbd,
AUDDStream * pSpeaker,AUDDStream * pMicrophone);
extern USBGenericDescriptor* AUDDSpeakerPhone_ParseInterfaces(
AUDDSpeakerPhone * pAudf,
USBGenericDescriptor * pDescriptors,
uint32_t dwLength);
extern uint32_t AUDDSpeakerPhone_RequestHandler(
AUDDSpeakerPhone * pAudf,
const USBGenericRequest * pRequest);
extern uint32_t AUDDSpeakerPhone_CloseStream(
AUDDSpeakerPhone * pAudf,
uint32_t bInterface);
extern uint32_t AUDDSpeakerPhone_SetupWrite(
AUDDSpeakerPhone * pAudf,
void * pListInit, void * pDmaInit, uint16_t listSize, uint16_t delaySize,
TransferCallback callback,void * argument);
extern uint32_t AUDDSpeakerPhone_Write(
AUDDSpeakerPhone * pAudf,
void * pBuffer,uint16_t wLength);
extern uint32_t AUDDSpeakerPhone_Read(
AUDDSpeakerPhone * pAudf,
void * pData, uint32_t dwSize,
TransferCallback fCallback,void * pArg);
/**@}*/
#endif /* _AUDD_SPEAKERPHONE_H_ */

View File

@@ -0,0 +1,311 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* Definition of a USB Audio Speakerphone Driver with two playback channels
* and one record channel.
*
* \section Usage
*
* -# Enable and setup USB related pins (see pio & board.h).
* -# Inplement a descriptor list using definitions
* - \ref usbd_audio_speakerphone_channel_num
* - \ref usbd_audio_speaker_interface_ids
* - \ref usbd_audio_speaker_entity_ids
* -# Configure the USB Audio Speakerphone driver using
* AUDDSpeakerPhoneDriver_Initialize
* -# To get %audio stream frames from host, use
* AUDDSpeakerPhoneDriver_Read
* -# To send %audio sampling stream to host, use
* AUDDSpeakerPhoneDriver_Write
*
*/
#ifndef AUDDSpeakerPhoneDriver_H
#define AUDDSpeakerPhoneDriver_H
/** \addtogroup usbd_audio_speakerphone
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include <USBRequests.h>
#include <USBDescriptors.h>
#include <AUDDescriptors.h>
#include <USBD.h>
#include <USBD_HAL.h>
#include <USBDDriver.h>
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** \addtogroup usbd_audio_speakerphone_channel_num Audio SpeakerPhone Channel Numbers
* @{
* This page lists codes for USB Audio Speakerphone channel numbers.
*
* \section Playback channel numbers
* - AUDDSpeakerPhoneDriver_MASTERCHANNEL
* - AUDDSpeakerPhoneDriver_LEFTCHANNEL
* - AUDDSpeakerPhoneDriver_RIGHTCHANNEL
*
* \section Record channel number
* - AUDDSpeakerPhoneDriver_RECCHANNEL
*/
/** Master channel of playback. */
#define AUDDSpeakerPhoneDriver_MASTERCHANNEL 0
/** Front left channel of playback. */
#define AUDDSpeakerPhoneDriver_LEFTCHANNEL 1
/** Front right channel of playback. */
#define AUDDSpeakerPhoneDriver_RIGHTCHANNEL 2
/** Channel of record. */
#define AUDDSpeakerPhoneDriver_RECCHANNEL 0
/** @}*/
/** \addtogroup usbd_audio_speaker_interface_ids Audio SpeakerPhone Interface IDs
* @{
* This page lists the interface numbers for USB Audio Speakerphone device.
*
* \section Interfaces
* - AUDDSpeakerPhoneDriverDescriptors_CONTROL
* - AUDDSpeakerPhoneDriverDescriptors_STREAMING
* - AUDDSpeakerPhoneDriverDescriptors_STREAMINGIN
*/
/** Audio control interface ID */
#define AUDDSpeakerPhoneDriverDescriptors_CONTROL 0
/** Audio streaming interface ID (OUT, for playback) */
#define AUDDSpeakerPhoneDriverDescriptors_STREAMING 1
/** Audio streaming interface ID (IN, for record) */
#define AUDDSpeakerPhoneDriverDescriptors_STREAMINGIN 2
/** @}*/
/** \addtogroup usbd_audio_speaker_entity_ids Audio SpeakerPhone Entity IDs
* @{
* This page lists the entity IDs for USB Audio Speaker device.
*
* \section Entities
* - AUDDSpeakerPhoneDriverDescriptors_INPUTTERMINAL
* - AUDDSpeakerPhoneDriverDescriptors_OUTPUTTERMINAL
* - AUDDSpeakerPhoneDriverDescriptors_FEATUREUNIT
* - AUDDSpeakerPhoneDriverDescriptors_INPUTTERMINAL_REC
* - AUDDSpeakerPhoneDriverDescriptors_OUTPUTTERMINAL_REC
* - AUDDSpeakerPhoneDriverDescriptors_FEATUREUNIT_REC
*/
/** Playback input terminal ID */
#define AUDDSpeakerPhoneDriverDescriptors_INPUTTERMINAL 0
/** Playback output terminal ID */
#define AUDDSpeakerPhoneDriverDescriptors_OUTPUTTERMINAL 1
/** Playback feature unit ID */
#define AUDDSpeakerPhoneDriverDescriptors_FEATUREUNIT 2
/** Record input terminal ID */
#define AUDDSpeakerPhoneDriverDescriptors_INPUTTERMINAL_REC 3
/** Record output terminal ID */
#define AUDDSpeakerPhoneDriverDescriptors_OUTPUTTERMINAL_REC 4
/** Record feature unit ID */
#define AUDDSpeakerPhoneDriverDescriptors_FEATUREUNIT_REC 5
/** @}*/
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Audio control header descriptor with one slave interface.
*------------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef AUDHeaderDescriptor2
* \brief Header descriptor with 1 interface.
*/
typedef struct _AUDHeaderDescriptor2 {
/** Header descriptor. */
AUDHeaderDescriptor header;
/** Id of the first grouped interface - Speaker. */
unsigned char bInterface0;
/** Id of the second grouped interface - Speakerphone. */
unsigned char bInterface1;
} __attribute__ ((packed)) AUDHeaderDescriptor2; /* GCC */
/**
* \typedef AUDFeatureUnitDescriptor3
* \brief Feature unit descriptor with 3 channel controls (master, right, left).
*/
typedef struct _AUDFeatureUnitDescriptor3 {
/** 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 */
/**
* \typedef AUDDSpeakerPhoneDriverAudioControlDescriptors
* \brief List of descriptors for detailling the audio control interface of a
* device using a USB Audio Speakerphoneer driver.
*/
typedef struct _AUDDSpeakerPhoneDriverAudioControlDescriptors {
/** Header descriptor (with one slave interface). */
AUDHeaderDescriptor2 header;
/** Input terminal descriptor. */
AUDInputTerminalDescriptor inputSpeakerPhone;
/** Output terminal descriptor. */
AUDOutputTerminalDescriptor outputSpeakerPhone;
/** Feature unit descriptor - SpeakerPhone. */
AUDFeatureUnitDescriptor3 featureSpeakerPhone;
/** Input terminal descriptor. */
AUDInputTerminalDescriptor inputRec;
/** Output terminal descriptor. */
AUDOutputTerminalDescriptor outputRec;
/** Feature unit descriptor - SpeakerPhonephone. */
AUDFeatureUnitDescriptor3 featureRec;
} __attribute__ ((packed)) AUDDSpeakerPhoneDriverAudioControlDescriptors; /* GCC */
/**
* \typedef AUDFormatTypeOneDescriptor1
* \brief Format type I descriptor with one discrete sampling frequency.
*/
typedef struct _AUDFormatTypeOneDescriptor1 {
/** Format type I descriptor. */
AUDFormatTypeOneDescriptor formatType;
/** Sampling frequency in Hz. */
unsigned char tSamFreq[3];
} __attribute__ ((packed)) AUDFormatTypeOneDescriptor1; /* GCC */
/**
* \typedef AUDDSpeakerPhoneDriverConfigurationDescriptors
* \brief Holds a list of descriptors returned as part of the configuration of
* a USB Audio Speakerphone device.
*/
typedef struct _AUDDSpeakerPhoneDriverConfigurationDescriptors {
/** Standard configuration. */
USBConfigurationDescriptor configuration;
/** Audio control interface. */
USBInterfaceDescriptor control;
/** Descriptors for the audio control interface. */
AUDDSpeakerPhoneDriverAudioControlDescriptors controlDescriptors;
/*- AUDIO OUT */
/** Streaming out interface descriptor (with no endpoint, required). */
USBInterfaceDescriptor streamingOutNoIsochronous;
/** Streaming out interface descriptor. */
USBInterfaceDescriptor streamingOut;
/** Audio class descriptor for the streaming out interface. */
AUDStreamingInterfaceDescriptor streamingOutClass;
/** Stream format descriptor. */
AUDFormatTypeOneDescriptor1 streamingOutFormatType;
/** Streaming out endpoint descriptor. */
AUDEndpointDescriptor streamingOutEndpoint;
/** Audio class descriptor for the streaming out endpoint. */
AUDDataEndpointDescriptor streamingOutDataEndpoint;
/*- AUDIO IN */
/** Streaming in interface descriptor (with no endpoint, required). */
USBInterfaceDescriptor streamingInNoIsochronous;
/** Streaming in interface descriptor. */
USBInterfaceDescriptor streamingIn;
/** Audio class descriptor for the streaming in interface. */
AUDStreamingInterfaceDescriptor streamingInClass;
/** Stream format descriptor. */
AUDFormatTypeOneDescriptor1 streamingInFormatType;
/** Streaming in endpoint descriptor. */
AUDEndpointDescriptor streamingInEndpoint;
/** Audio class descriptor for the streaming in endpoint. */
AUDDataEndpointDescriptor streamingInDataEndpoint;
} __attribute__ ((packed)) AUDDSpeakerPhoneDriverConfigurationDescriptors; /* GCC */
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
extern void AUDDSpeakerPhoneDriver_Initialize(
const USBDDriverDescriptors *pDescriptors);
extern void AUDDSpeakerPhoneDriver_ConfigurationChangeHandler(uint8_t cfgnum);
extern void AUDDSpeakerPhoneDriver_InterfaceSettingChangedHandler(
uint8_t interface,
uint8_t setting);
extern void AUDDSpeakerPhoneDriver_RequestHandler(
const USBGenericRequest *request);
extern uint8_t AUDDSpeakerPhoneDriver_Read(void *buffer,
uint32_t length,
TransferCallback callback,
void *argument);
extern uint8_t AUDDSpeakerPhoneDriver_SetupWrite(void * pListInit,
void * pDmaInit,
uint16_t listSize,
uint16_t delaySize,
TransferCallback callback,
void * argument);
extern uint8_t AUDDSpeakerPhoneDriver_Write(void * buffer,uint16_t length);
extern void AUDDSpeakerPhoneDriver_MuteChanged(uint8_t mic,
uint8_t channel,
uint8_t muted);
extern void AUDDSpeakerPhoneDriver_StreamSettingChanged(uint8_t mic,
uint8_t newSetting);
/**@}*/
#endif /*#ifndef AUDDSpeakerPhoneDriver_H */

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.
* ----------------------------------------------------------------------------
*/
/** \file
* USB Audio Device Streaming interface with controls.
* (3 channels (including master) supported).
*/
/** \addtogroup usbd_audio_speakerphone
*@{
* Implement speakerphone function that combine 1 AC interface, 1 AS interface
* for speaker and 1 AS interface for microphone.
*/
#ifndef _AUDD_STREAM_H_
#define _AUDD_STREAM_H_
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include <stdint.h>
#include <USBD.h>
#include <USBDDriver.h>
/*------------------------------------------------------------------------------
* Defines
*------------------------------------------------------------------------------*/
/** \addtopage usbd_audio_ec Audio Device Event codes
* @{
*/
/** Mute status changed */
#define AUDD_EC_MuteChanged 1
/** Volume status changed */
#define AUDD_EC_VolumeChanged 2
/** @}*/
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/** Callback function for Audio Stream Event */
typedef void (*AUDDStreamEventCallback)(uint32_t ec,
uint8_t channel,
void* pArg);
/**
* Struct of USB Audio Stream Interface.
* Support 1 control interface, with I & O stream.
* Unit ID 0xFF is reserved for not implemented.
*/
typedef struct _AUDDStream {
/** AudioControl Interface number */
uint8_t bAcInterface;
/** AudioControl Feature Unit ID for IN */
uint8_t bFeatureUnitOut;
/** AudioControl Feature Unit ID for OUT */
uint8_t bFeatureUnitIn;
/** AudioStreaming Interface number */
uint8_t bAsInterface;
/** Streaming OUT endpoint address */
uint8_t bEndpointOut;
/** Streaming IN endpoint address */
uint8_t bEndpointIn;
/** Number of channels (<=8) */
uint8_t bNumChannels;
/** Mute control bits (8b) */
uint8_t bmMute;
/** Volume control data */
uint16_t *pwVolumes;
/** Audio Streaming Events Callback */
AUDDStreamEventCallback fCallback;
/** Callback arguments */
void* pArg;
} AUDDStream;
/*------------------------------------------------------------------------------
* Functions
*------------------------------------------------------------------------------*/
extern void AUDDStream_Initialize(
AUDDStream * pAuds,
uint8_t numChannels,
uint16_t wChannelVolumes [ ],
AUDDStreamEventCallback fCallback,
void * pArg);
extern uint32_t AUDDStream_ChangeMute(
AUDDStream * pAuds,
uint8_t bChannel,
uint8_t bMute);
extern uint32_t AUDDStream_SetVolume(
AUDDStream * pAuds,
uint8_t bChannel,
uint16_t wVolume);
extern uint32_t AUDDStream_IsRequestAccepted(
AUDDStream *pAuds,
const USBGenericRequest *pReq);
extern uint32_t AUDDStream_Read(
AUDDStream * pAuds,
void * pData, uint32_t dwSize,
TransferCallback fCallback,void * pArg);
extern uint32_t AUDDStream_SetupWrite(
AUDDStream * pAuds,
void * pListInit, void * pDmaInit, uint16_t listSize,
uint16_t delaySize,
TransferCallback callback,void * argument);
extern uint32_t AUDDStream_Write(
AUDDStream * pAuds,
void * pBuffer,uint16_t wLength);
extern uint32_t AUDDStream_Close(AUDDStream * pStream);
#endif /* _AUDD_STREAM_H_ */

View File

@@ -0,0 +1,546 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/** \file
*
* Definitions and classes for USB Audio class descriptors.
*
* - For a USB %device:
* -# When declaring an Audio-specific descriptor, use the descriptor types
* and subtypes defined in this unit (see "USB Audio descriptor types"
* and "USB Audio descriptor subtypes").
* -# When declaring the %device descriptor of a USB %audio %device, use
* "USB Audio device descriptor values" defined here.
* -# Declare an AUDStreamingInterfaceDescriptor instance as part of the
* configuration descriptors returned by a USB %audio %device.
* -# Declare a AUDHeaderDescriptor as part of the configuration
* descriptors of the %device.
* -# Declare an AUDFeatureUnitDescriptor instance as part of the
* configuration descriptors returned by a USB %audio %device.
* -# Declare an instance of AUDFormatTypeOneDescriptor as part of the
* configuration descriptors of an audio device.
*/
#ifndef _AUDDESCRIPTORS_H_
#define _AUDDESCRIPTORS_H_
/** \addtogroup usb_audio
*@{
*/
/*----------------------------------------------------------------------------
* Includes
*----------------------------------------------------------------------------*/
#include <stdint.h>
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** \addtogroup usb_audio_desc_type USB Audio descriptor types
* @{
* This section lists the available types for USB audio-specific descriptors.
* - \ref AUDGenericDescriptor_DEVICE
* - \ref AUDGenericDescriptor_CONFIGURATION
* - \ref AUDGenericDescriptor_STRING
* - \ref AUDGenericDescriptor_INTERFACE
* - \ref AUDGenericDescriptor_ENDPOINT
*/
/** Descriptor gives detail about the whole device.*/
#define AUDGenericDescriptor_DEVICE 0x21
/** Descriptor gives detail about a configuration.*/
#define AUDGenericDescriptor_CONFIGURATION 0x22
/** Descriptor gives detail about a string.*/
#define AUDGenericDescriptor_STRING 0x23
/** Descriptor gives detail about an interface.*/
#define AUDGenericDescriptor_INTERFACE 0x24
/** Descriptor gives detail about an endpoint. */
#define AUDGenericDescriptor_ENDPOINT 0x25
/** @}*/
/** \addtogroup usb_audio_desc_subtype USB Audio descriptor subtypes
* @{
* This section lists the possible subtypes for USB audio-specific descriptors.
* - \ref AUDGenericDescriptor_HEADER
* - \ref AUDGenericDescriptor_INPUTTERMINAL
* - \ref AUDGenericDescriptor_OUTPUTTERMINAL
* - \ref AUDGenericDescriptor_MIXERUNIT
* - \ref AUDGenericDescriptor_SELECTORUNIT
* - \ref AUDGenericDescriptor_FEATUREUNIT
* - \ref AUDGenericDescriptor_PROCESSINGUNIT
* - \ref AUDGenericDescriptor_EXTENSIONUNIT
*/
/** Header descriptor subtype.*/
#define AUDGenericDescriptor_HEADER 0x01
/** Input terminal descriptor subtype.*/
#define AUDGenericDescriptor_INPUTTERMINAL 0x02
/** Output terminal descriptor subtype.*/
#define AUDGenericDescriptor_OUTPUTTERMINAL 0x03
/** Mixer unit descriptor subtype.*/
#define AUDGenericDescriptor_MIXERUNIT 0x04
/** Selector unit descriptor subtype.*/
#define AUDGenericDescriptor_SELECTORUNIT 0x05
/** Feature unit descriptor subtype.*/
#define AUDGenericDescriptor_FEATUREUNIT 0x06
/** Processing unit descriptor subtype.*/
#define AUDGenericDescriptor_PROCESSINGUNIT 0x07
/** Extension unit descriptor subtype.*/
#define AUDGenericDescriptor_EXTENSIONUNIT 0x08
/** @}*/
/** \addtogroup usb_audio_desc USB Audio Descriptors
* @{
* USB Audio device descriptor values
*
* This section lists the class, subclass & protocol codes that a USB audio
* device should display in its device descriptor.
* - \ref AUDDeviceDescriptor_CLASS
* - \ref AUDDeviceDescriptor_SUBCLASS
* - \ref AUDDeviceDescriptor_PROTOCOL
*/
/** Class code for a USB audio device. */
#define AUDDeviceDescriptor_CLASS 0x00
/** Subclass code for a USB audio device. */
#define AUDDeviceDescriptor_SUBCLASS 0x00
/** Protocol code for a USB audio device. */
#define AUDDeviceDescriptor_PROTOCOL 0x00
/** @}*/
/**
* \addtogroup usb_audio_stream_if USB Audio streaming interface codes
* @{
* This section lists the class, subclass and protocol codes that an Audio
* Streaming interface should display in its descriptor.
* - \ref AUDStreamingInterfaceDescriptor_CLASS
* - \ref AUDStreamingInterfaceDescriptor_SUBCLASS
* - \ref AUDStreamingInterfaceDescriptor_PROTOCOL
*/
/** Class code for an USB audio streaming interface.*/
#define AUDStreamingInterfaceDescriptor_CLASS 0x01
/** Subclass code for an audio streaming interface.*/
#define AUDStreamingInterfaceDescriptor_SUBCLASS 0x02
/** Protocol code for an audio streaming interface.*/
#define AUDStreamingInterfaceDescriptor_PROTOCOL 0x00
/** @}*/
/**
* \addtogroup usb_audio_stream_subtype USB Audio streaming descriptor subtypes
* @{
* This section lists the possible subtypes for audio-specific descriptor
* appended to an Audio Streaming interface.
* - \ref AUDStreamingInterfaceDescriptor_GENERAL
* - \ref AUDStreamingInterfaceDescriptor_FORMATTYPE
* - \ref AUDStreamingInterfaceDescriptor_FORMATSPECIFIC
*/
/** General descriptor subtype.*/
#define AUDStreamingInterfaceDescriptor_GENERAL 0x01
/** Format type descriptor subtype.*/
#define AUDStreamingInterfaceDescriptor_FORMATTYPE 0x02
/** Format specific descriptor subtype.*/
#define AUDStreamingInterfaceDescriptor_FORMATSPECIFIC 0x03
/** @}*/
/** \addtogroup usb_audio_ctrl_if USB Audio Control Interface
* @{
* This section lists the class, subclass and protocol codes that a USB Audio
* Control interface descriptor should display.
* - \ref AUDControlInterfaceDescriptor_CLASS
* - \ref AUDControlInterfaceDescriptor_SUBCLASS
* - \ref AUDControlInterfaceDescriptor_PROTOCOL
*/
/** Class code for an audio control interface. */
#define AUDControlInterfaceDescriptor_CLASS 0x01
/** Subclass code for an audio control interface. */
#define AUDControlInterfaceDescriptor_SUBCLASS 0x01
/** Protocol code for an audio control interface. */
#define AUDControlInterfaceDescriptor_PROTOCOL 0x00
/** @}*/
/** Descriptor subtype for an Audio data endpoint. */
#define AUDDataEndpointDescriptor_SUBTYPE 0x01
/** \addtogroup usb_audio_lock_delay USB Audio Lock delay units
* @{
* This section lists the valid lock delay unit types.
* - \ref AUDDataEndpointDescriptor_MILLISECONDS
* - \ref AUDDataEndpointDescriptor_PCMSAMPLES
*/
/** Lock delay is expressed in milliseconds. */
#define AUDDataEndpointDescriptor_MILLISECONDS 1
/** Lock delay is expressed in decoded PCM samples. */
#define AUDDataEndpointDescriptor_PCMSAMPLES 2
/** @}*/
/** \addtogroup usb_audio_class_ver USB Audio class releases
* @{
* This section lists the existing versions of the Audio class specification.
* - \ref AUDHeaderDescriptor_AUD1_00
*/
/** Indentifies the USB audio specification release 1.00.*/
#define AUDHeaderDescriptor_AUD1_00 0x0100
/** @}*/
#define AUDTerminalDescriptor_USBSTREAMING 0x0101
#define AUDTerminalDescriptor_MICROPHONE 0x0201
#define AUDTerminalDescriptor_HANDSETIN 0x0401
#define AUDTerminalDescriptor_SPEAKERPHONE 0x0403
#define AUDTerminalDescriptor_LINEIN 0x0501
/** \addtogroup usb_audio_in_term USB Audio Input terminal types
* @{
* This section lists the available types for an Input terminal.
* - \ref AUDInputTerminalDescriptor_USBSTREAMING
* - \ref AUDInputTerminalDescriptor_MICROPHONE
* - \ref AUDInputTerminalDescriptor_SPEAKERPHONE
* - \ref AUDInputTerminalDescriptor_LINEIN
*/
/** A terminal receiving its data from a USB isochronous endpoint.*/
#define AUDInputTerminalDescriptor_USBSTREAMING 0x0101
/** A terminal sampling data from a microphone.*/
#define AUDInputTerminalDescriptor_MICROPHONE 0x0201
/** A terminal sampling data from a Handset In.*/
#define AUDInputTerminalDescriptor_HANDSETIN 0x0401
/** A terminal sampling data from a speakerphone*/
#define AUDInputTerminalDescriptor_SPEAKERPHONE 0x0403
/** A terminal sampling data from a Phone Line In.*/
#define AUDInputTerminalDescriptor_LINEIN 0x0501
/** @}*/
/** \addtogroup usb_audio_ch_loc USB Audio Channel spatial locations
* @{
* This section lists the possible spatial locations for audio channels.
* - \ref AUDInputTerminalDescriptor_LEFTFRONT
* - \ref AUDInputTerminalDescriptor_RIGHTFRONT
* - \ref AUDInputTerminalDescriptor_CENTERFRONT
*/
/** Front left channel.*/
#define AUDInputTerminalDescriptor_LEFTFRONT (1 << 0)
/** Front right channel.*/
#define AUDInputTerminalDescriptor_RIGHTFRONT (1 << 1)
/** Front center channel.*/
#define AUDInputTerminalDescriptor_CENTERFRONT (1 << 2)
/** @}*/
/** \addtogroup usb_audio_out_term USB Audio Output terminal types
* @{
* This section lists the available types for an output terminal.
* - \ref AUDOutputTerminalDescriptor_USBTREAMING
* - \ref AUDOutputTerminalDescriptor_SPEAKER
* - \ref AUDOutputTerminalDescriptor_HANDSETOUT
* - \ref AUDOutputTerminalDescriptor_LINEOUT
*/
/** A terminal sending data through USB isochronous endpoint.*/
#define AUDOutputTerminalDescriptor_USBTREAMING 0x0101
/** A terminal sending data to a USB host through an Isochronous endpoint.*/
#define AUDOutputTerminalDescriptor_SPEAKER 0x0301
/** A terminal sending data to Handset Out.*/
#define AUDOutputTerminalDescriptor_HANDSETOUT 0x0401
/** A terminal sending data to Phone Line Out.*/
#define AUDOutputTerminalDescriptor_LINEOUT 0x0501
/** @}*/
/** \addtogroup usb_audio_ch_ctrl USB Audio Channel controls
* @{
* This section lists the available controls for each channel of the audio
* interface. Each channel can have any control combination; simply perform
* a bitwise OR ('|') to combine several values.
* -# \ref AUDFeatureUnitDescriptor_MUTE
* -# \ref AUDFeatureUnitDescriptor_VOLUME
* -# \ref AUDFeatureUnitDescriptor_BASS
* -# \ref AUDFeatureUnitDescriptor_MID
* -# \ref AUDFeatureUnitDescriptor_TREBLE
*/
/** Channel mute control. */
#define AUDFeatureUnitDescriptor_MUTE (1 << 0)
/** Channel volume control. */
#define AUDFeatureUnitDescriptor_VOLUME (1 << 1)
/** Channel bass control. */
#define AUDFeatureUnitDescriptor_BASS (1 << 2)
/** Channel middle control. */
#define AUDFeatureUnitDescriptor_MID (1 << 3)
/** Channel treble control. */
#define AUDFeatureUnitDescriptor_TREBLE (1 << 4)
/** @}*/
/** Format type for a format type I descriptor. */
#define AUDFormatTypeOneDescriptor_FORMATTYPEONE 0x01
/** AUDFormatTypeOneDescriptor_PCM - PCM format. */
#define AUDFormatTypeOneDescriptor_PCM 0x0001
/** Indicates the sampling frequency can have any value in the provided range. */
#define AUDFormatTypeOneDescriptor_CONTINUOUS 0
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef AUDStreamingInterfaceDescriptor
* \brief Provides additional information about an audio streaming interface to
* the USB host.
*/
typedef struct _AUDStreamingInterfaceDescriptor {
/** Size of descriptor in bytes.*/
uint8_t bLength;
/** Descriptor type (AUDGenericDescriptor_INTERFACE).*/
uint8_t bDescriptorType;
/** Descriptor subtype (AUDStreamingInterfaceDescriptor_GENERAL).*/
uint8_t bDescriptorSubType;
/** Terminal ID to which the interface is connected.*/
uint8_t bTerminalLink;
/** Delay introduced by the data path, in number of frames.*/
uint8_t bDelay;
/** Audio data format used by this interface.*/
uint16_t wFormatTag;
} __attribute__ ((packed)) AUDStreamingInterfaceDescriptor; /* GCC */
/**
* \typedef AUDEndpointDescriptor
* \brief Modified endpoint descriptor with two additional fields, with are
* USB audio specific.
*/
typedef struct _AUDEndpointDescriptor {
/** Size of the descriptor in bytes. */
uint8_t bLength;
/** Descriptor type (USBGenericDescriptor_ENDPOINT). */
uint8_t bDescriptorType;
/** Address and direction of the endpoint. */
uint8_t bEndpointAddress;
/** Endpoint type and additional characteristics (for isochronous endpoints). */
uint8_t bmAttributes;
/** Maximum packet size (in bytes) of the endpoint. */
uint16_t wMaxPacketSize;
/** Polling rate of the endpoint. */
uint8_t bInterval;
/** Refresh rate for a feedback endpoint. */
uint8_t bRefresh;
/** Address of the associated feedback endpoint if any. */
uint8_t bSyncAddress;
} __attribute__ ((packed)) AUDEndpointDescriptor; /* GCC */
/**
* \typedef AUDDataEndpointDescriptor
* \brief Gives additional information about an USB endpoint used to transmit audio
* data to or from the host.
*/
typedef struct _AUDDataEndpointDescriptor {
/** Size of descriptor in bytes. */
uint8_t bLength;
/** Descriptor type
(\ref AUDGenericDescriptor_ENDPOINT). */
uint8_t bDescriptorType;
/** Descriptor subtype
(\ref AUDDataEndpointDescriptor_SUBTYPE). */
uint8_t bDescriptorSubType;
/** Indicates available controls and requirement on packet sizes. */
uint8_t bmAttributes;
/** Indicates the units of the wLockDelay fields.
\sa usb_audio_lock_delay USB Audio Lock delay units */
uint8_t bLockDelayUnits;
/** Time it takes for the endpoint to lock its internal clock circuitry. */
uint16_t wLockDelay;
} __attribute__ ((packed)) AUDDataEndpointDescriptor; /* GCC */
/**
* \typedef AUDHeaderDescriptor
* \brief Groups the various audio interfaces to display one single function to
* the USB host. Subclass this structure to add a particular number of
* slave interface descriptors.
*/
typedef struct _AUDHeaderDescriptor {
/** Size of descriptor in bytes.*/
uint8_t bLength;
/** Descriptor type (\ref AUDGenericDescriptor_INTERFACE).*/
uint8_t bDescriptorType;
/** Descriptor subtype (\ref AUDGenericDescriptor_HEADER).*/
uint8_t bDescriptorSubType;
/** Audio class release number in BCD format
* \sa usb_audio_class_ver USB Audio class releases */
uint16_t bcdADC;
/** Length of all descriptors used to qualify the Audio Control interface.*/
uint16_t wTotalLength;
/** Number of Streaming interfaces contained in this collection.*/
uint8_t bInCollection;
} __attribute__ ((packed)) AUDHeaderDescriptor; /* GCC */
/**
* \typedef AUDInputTerminalDescriptor
* \brief Describes an input of a USB audio device.
*/
typedef struct _AUDInputTerminalDescriptor {
/** Size of descriptor in bytes.*/
uint8_t bLength;
/** Descriptor type (AUDGenericDescriptor_INTERFACE).*/
uint8_t bDescriptorType;
/** Descriptor subtype (AUDGenericDescriptor_INPUTTERMINAL).*/
uint8_t bDescriptorSubType;
/** ID of the terminal in the audio function.*/
uint8_t bTerminalID;
/** Terminal type.
* \sa usb_audio_in_term USB Audio Input terminal types
*/
uint16_t wTerminalType;
/** ID of the output terminal to which this input terminal is associated.*/
uint8_t bAssocTerminal;
/** Number of logical output channels in this terminal.*/
uint8_t bNrChannels;
/** Spatial configuration of the logical channels.*/
uint16_t wChannelConfig;
/** Index of a string descriptor for the first logical channel.*/
uint8_t iChannelNames;
/** Index of a string descriptor for this terminal. */
uint8_t iTerminal;
} __attribute__ ((packed)) AUDInputTerminalDescriptor; /* GCC */
/**
* \typedef AUDOutputTerminalDescriptor
* \brief Describes an output of the USB audio function.
*/
typedef struct _AUDOutputTerminalDescriptor {
/** Size of descriptor in bytes.*/
uint8_t bLength;
/** Descriptor type (\ref AUDGenericDescriptor_INTERFACE).*/
uint8_t bDescriptorType;
/** Descriptor subtype (\ref AUDGenericDescriptor_OUTPUTTERMINAL). */
uint8_t bDescriptorSubType;
/** Identifier for this terminal.*/
uint8_t bTerminalID;
/** Terminal type.
* \sa "USB Audio Output terminal types" */
uint16_t wTerminalType;
/** Identifier of the associated input terminal.*/
uint8_t bAssocTerminal;
/** Identifier of the unit or terminal to which this terminal
* is connected.*/
uint8_t bSourceID;
/** Index of a string descriptor for this terminal.*/
uint8_t iTerminal;
} __attribute__ ((packed)) AUDOutputTerminalDescriptor; /* GCC */
/**
* \typedef AUDFeatureUnitDescriptor
* \brief Describes available controls for each channel of the unit or terminal
* it is connected to.
*
* This type must be augmented with the relevant number
* of bmaControls fields and the iFeature field.
**/
typedef struct _AUDFeatureUnitDescriptor {
/** Size of descriptor in bytes.*/
uint8_t bLength;
/** Descriptor type (AUDGenericDescriptor_INTERFACE). */
uint8_t bDescriptorType;
/** Descriptor subtype (AUDGenericDescriptor_FEATURE). */
uint8_t bDescriptorSubType;
/** Identifier of this feature unit. */
uint8_t bUnitID;
/** Identifier of the unit or terminal this feature unit is connected to. */
uint8_t bSourceID;
/** Size in bytes of a channel controls field. */
uint8_t bControlSize;
} __attribute__ ((packed)) AUDFeatureUnitDescriptor; /* GCC */
/**
* \typedef AUDFormatTypeOneDescriptor
* \brief Describes an audio data stream that is constructed on a sample-by-sample
* basis.
*
* This type must be augmented with either the continuous sampling frequency range
* (if bSamFreqType = <\ref AUDFormatTypeOneDescriptor_CONTINUOUS>)
* or with an array containing the possible discrete frequencies.
*/
typedef struct _AUDFormatTypeOneDescriptor {
/** Size of descriptor in bytes. */
uint8_t bLength;
/** Descriptor type (\ref AUDGenericDescriptor_INTERFACE). */
uint8_t bDescriptorType;
/** Descriptor subtype (\ref AUDStreamingInterfaceDescriptor_FORMATTYPE).*/
uint8_t bDescriptorSubType;
/** Format type (\ref AUDFormatTypeOneDescriptor_FORMATTYPEONE).*/
uint8_t bFormatType;
/** Number of physical channels in the audio stream.*/
uint8_t bNrChannels;
/** Number of bytes occupied by one audio subframe.*/
uint8_t bSubFrameSize;
/** Number of bits effectively used in an audio subframe.*/
uint8_t bBitResolution;
/** Number of supported discrete sampling frequencies, or
* \ref AUDFormatTypeOneDescriptor_CONTINUOUS.*/
uint8_t bSamFreqType;
} __attribute__ ((packed)) AUDFormatTypeOneDescriptor; /* GCC */
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*----------------------------------------------------------------------------
* Functions
*----------------------------------------------------------------------------*/
/**@}*/
#endif /* _AUDDESCRIPTORS_H_ */

View File

@@ -0,0 +1,123 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/** \file
*
* Definitions and classes for USB Audio class requests.
*
* - For a USB %device:
* -# After receiving an Audio request from the host, use
* AUDGenericRequest_GetEntity to determine the target Unit or Terminal.
* -# After receiving an Audio request from the host, use
* AUDGenericRequest_GetInterface to know which interface is referenced.
* -# Use AUDFeatureUnitRequest_GetControl to determine which control
* shall be tweaked following a host request.
* -# Use AUDFeatureUnitRequest_GetChannel to identify the channel which
* will have its control altered.
*/
#ifndef _AUDREQUESTS_H_
#define _AUDREQUESTS_H_
/** \addtogroup usb_audio
*@{
*/
/*----------------------------------------------------------------------------
* Includes
*----------------------------------------------------------------------------*/
#include <USBRequests.h>
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** \addtogroup usb_audio_request USB Audio request codes
* @{
* This section lists the codes of the existing Audio requests.
* - \ref AUDGenericRequest_SETCUR
* - \ref AUDGenericRequest_GETCUR
*/
/** SET_CUR request code.*/
#define AUDGenericRequest_SETCUR 0x01
/** GET_CUR request code.*/
#define AUDGenericRequest_GETCUR 0x81
/** GET_MIN request code.*/
#define AUDGenericRequest_GETMIN 0x82
/** GET_MAX request code.*/
#define AUDGenericRequest_GETMAX 0x83
/** GET_RES request code.*/
#define AUDGenericRequest_GETRES 0x84
/** @}*/
/** \addtogroup usb_audio_ctrl_sel USB Audio Control selector values
* @{
* This section lists the available control selectors for a Feature Unit request.
* - \ref AUDFeatureUnitRequest_MUTE
*/
/** Mute control selector (MUTE_CONTROL). */
#define AUDFeatureUnitRequest_MUTE 0x01
/** Volume control selector (VOLUME_CONTROL). */
#define AUDFeatureUnitRequest_VOLUME 0x02
/** @}*/
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*----------------------------------------------------------------------------
* Functions
*----------------------------------------------------------------------------*/
extern uint8_t AUDGenericRequest_GetEntity(
const USBGenericRequest *request);
extern uint8_t AUDGenericRequest_GetInterface(
const USBGenericRequest *request);
extern uint8_t AUDFeatureUnitRequest_GetControl(
const USBGenericRequest *request);
extern uint8_t AUDFeatureUnitRequest_GetChannel(
const USBGenericRequest *request);
/**@}*/
#endif /* _AUDREQUESTS_H_ */

View File

@@ -0,0 +1,307 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* Definitions and methods for USB composite device implement.
*
*/
#ifndef CDCAUDDDRIVER_H
#define CDCAUDDDRIVER_H
/** \addtogroup usbd_cdc_aud
*@{
*/
/*---------------------------------------------------------------------------
* Headers
*---------------------------------------------------------------------------*/
#include <USBRequests.h>
#include <CDCDescriptors.h>
#include <AUDDescriptors.h>
#include <USBD.h>
#include <USBDDriver.h>
/*---------------------------------------------------------------------------
* Definitions
*---------------------------------------------------------------------------*/
/** \addtogroup usbd_cdc_aud_desc USB CDC(Serial) + AUD(Speaker) Definitions
* @{
*/
/** Number of interfaces of the device (5, can be 4 if no mic support */
#define CDCAUDDDriverDescriptors_MaxNumInterfaces 5
/** Number of the CDC interface. */
#define CDCAUDDDriverDescriptors_CDC_INTERFACE 0
/** Number of the Audio interface. */
#define CDCAUDDDriverDescriptors_AUD_INTERFACE 2
/** Number of Audio function channels (M,L,R) */
#define AUDD_NumChannels 3
/** @}*/
/*---------------------------------------------------------------------------
* Types
*---------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/** Audio header descriptor with 1 interface */
typedef struct _AUDHeaderDescriptor1{
/** Header descriptor.*/
AUDHeaderDescriptor header;
/** Id of the first grouped interface.*/
uint8_t bInterface0;
} __attribute__ ((packed)) AUDHeaderDescriptor1;
/** Audio header descriptor with 2 interface */
typedef struct _AUDHeaderDescriptor2 {
/** Header descriptor. */
AUDHeaderDescriptor header;
/** Id of the first grouped interface - Speaker. */
uint8_t bInterface0;
/** Id of the second grouped interface - Speakerphone. */
uint8_t bInterface1;
} __attribute__ ((packed)) AUDHeaderDescriptor2; /* GCC */
/**
* Feature unit descriptor with 3 channel controls (master, right, left).
*/
typedef struct _AUDFeatureUnitDescriptor3{
/** Feature unit descriptor.*/
AUDFeatureUnitDescriptor feature;
/** Available controls for each channel.*/
uint8_t bmaControls[AUDD_NumChannels];
/** Index of a string descriptor for the feature unit.*/
uint8_t iFeature;
} __attribute__ ((packed)) AUDFeatureUnitDescriptor3;
/**
* List of descriptors for detailling the audio control interface of a
* device using a USB audio speaker function.
*/
typedef struct _AUDDSpeakerAcDescriptors{
/** 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)) AUDDSpeakerAcDescriptors;
/**
* List of descriptors for detailling the audio control interface of a
* device using a USB Audio Speakerphoneer function.
*/
typedef struct _AUDDSpeakerPhoneAcDescriptors {
/** Header descriptor (with one slave interface). */
AUDHeaderDescriptor2 header;
/** Input terminal descriptor. */
AUDInputTerminalDescriptor inputSpeakerPhone;
/** Output terminal descriptor. */
AUDOutputTerminalDescriptor outputSpeakerPhone;
/** Feature unit descriptor - SpeakerPhone. */
AUDFeatureUnitDescriptor3 featureSpeakerPhone;
/** Input terminal descriptor. */
AUDInputTerminalDescriptor inputRec;
/** Output terminal descriptor. */
AUDOutputTerminalDescriptor outputRec;
/** Feature unit descriptor - SpeakerPhonephone. */
AUDFeatureUnitDescriptor3 featureRec;
} __attribute__ ((packed)) AUDDSpeakerPhoneAcDescriptors;
/**
* Format type I descriptor with one discrete sampling frequency.
*/
typedef struct _AUDFormatTypeOneDescriptor1{
/** Format type I descriptor.*/
AUDFormatTypeOneDescriptor formatType;
/** Sampling frequency in Hz.*/
uint8_t tSamFreq[3];
} __attribute__ ((packed)) AUDFormatTypeOneDescriptor1;
/**
* Configuration descriptor list for a device implementing
* CDC(Serial) + Audio(Speaker) composite driver.
*/
typedef struct _CdcAudspkdDriverConfigurationDescriptors {
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration;
/* --- 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;
/* --- AUDIO (AC) */
/** IAD 1*/
USBInterfaceAssociationDescriptor audIAD;
/** Audio control interface.*/
USBInterfaceDescriptor audInterface;
/** Descriptors for the audio control interface.*/
AUDDSpeakerAcDescriptors audControl;
/* -- AUDIO out (AS) */
/** 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;
} __attribute__ ((packed)) CdcAudspkdDriverConfigurationDescriptors;
/**
* Configuration descriptor list for a device implementing
* CDC(Serial) + Audio(SpeakerPhone) composite driver.
*/
typedef struct _CdcAuddDriverConfigurationDescriptors {
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration;
/* --- 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;
/* --- AUDIO (AC) */
/** IAD 1*/
USBInterfaceAssociationDescriptor audIAD;
/** Audio control interface.*/
USBInterfaceDescriptor audInterface;
/** Descriptors for the audio control interface.*/
AUDDSpeakerPhoneAcDescriptors audControl;
/* -- AUDIO out (AS) */
/** 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;
/*- AUDIO IN */
/** Streaming in interface descriptor (with no endpoint, required). */
USBInterfaceDescriptor streamingInNoIsochronous;
/** Streaming in interface descriptor. */
USBInterfaceDescriptor streamingIn;
/** Audio class descriptor for the streaming in interface. */
AUDStreamingInterfaceDescriptor streamingInClass;
/** Stream format descriptor. */
AUDFormatTypeOneDescriptor1 streamingInFormatType;
/** Streaming in endpoint descriptor. */
AUDEndpointDescriptor streamingInEndpoint;
/** Audio class descriptor for the streaming in endpoint. */
AUDDataEndpointDescriptor streamingInDataEndpoint;
} __attribute__ ((packed)) CdcAuddDriverConfigurationDescriptors;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*---------------------------------------------------------------------------
* Exported functions
*---------------------------------------------------------------------------*/
extern void CDCAUDDDriver_Initialize(const USBDDriverDescriptors * pDescriptors);
extern void CDCAUDDDriver_ConfigurationChangedHandler(uint8_t cfgnum);
extern void CDCAUDDDriver_InterfaceSettingChangedHandler(
uint8_t interface, uint8_t setting);
extern void CDCAUDDDriver_RequestHandler(const USBGenericRequest *request);
/**@}*/
#endif //#ifndef CDCHIDDDRIVER_H

View File

@@ -0,0 +1,106 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* Single CDC Serial Port Function for USB device & composite driver.
*/
#ifndef CDCDSERIAL_H
#define CDCDSERIAL_H
/** \addtogroup usbd_cdc
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
/* These headers were introduced in C99
by working group ISO/IEC JTC1/SC22/WG14. */
#include <stdint.h>
#include <USBRequests.h>
#include <USBDDriver.h>
#include <CDCDSerialPort.h>
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
extern void CDCDSerial_Initialize(
USBDDriver * pUsbd, uint8_t bInterfaceNb);
extern uint32_t CDCDSerial_RequestHandler(
const USBGenericRequest *request);
extern void CDCDSerial_ConfigureFunction(
USBGenericDescriptor * pDescriptors, uint16_t wLength);
extern uint32_t CDCDSerial_Write(
void *data,
uint32_t size,
TransferCallback callback,
void *argument);
extern uint32_t CDCDSerial_Read(
void *data,
uint32_t size,
TransferCallback callback,
void *argument);
extern void CDCDSerial_GetLineCoding(CDCLineCoding * pLineCoding);
extern uint8_t CDCDSerial_GetControlLineState(void);
extern uint16_t CDCDSerial_GetSerialState(void);
extern void CDCDSerial_SetSerialState(uint16_t serialState);
extern uint8_t CDCDSerial_LineCodingIsToChange(
CDCLineCoding * pLineCoding);
extern void CDCDSerial_ControlLineStateChanged(
uint8_t DTR,uint8_t RTS);
/**@}*/
#endif /*#ifndef CDCSERIAL_H*/

View File

@@ -0,0 +1,245 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* Definition of a class for implementing a USB device CDC serial driver.
*
* \section Usage
*
* -# Re-implement the USBDCallbacks_RequestReceived method to pass
* received requests to CDCDSerialDriver_RequestHandler. *This is
* automatically done unless the NOAUTOCALLBACK symbol is defined*.
* -# Initialize the CDC serial and USB drivers using
* CDCDSerialDriver_Initialize.
* -# Logically connect the device to the host using USBD_Connect.
* -# Send serial data to the USB host using CDCDSerialDriver_Write.
* -# Receive serial data from the USB host using CDCDSerialDriver_Read.
*/
#ifndef CDCDSERIALDRIVER_H
#define CDCDSERIALDRIVER_H
/** \addtogroup usbd_cdc
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
/* These headers were introduced in C99
by working group ISO/IEC JTC1/SC22/WG14. */
#include <stdint.h>
#include <USBRequests.h>
#include <CDCRequests.h>
#include <CDCDescriptors.h>
#include <CDCNotifications.h>
#include <CDCDSerial.h>
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** \addtogroup usbd_cdc_if USB Device CDC Serial Interface IDs
* @{
*/
/** Communication Class Interface ID */
#define CDCDSerialDriver_CC_INTERFACE 0
/** Data Class Interface ID */
#define CDCDSerialDriver_DC_INTERFACE 1
/** @}*/
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/**
* \typedef CDCDSerialDriverConfigurationDescriptors
* \brief Configuration descriptor list for a device implementing a
* CDC serial driver.
*/
typedef struct _CDCDSerialDriverConfigurationDescriptors {
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration;
/** Communication interface descriptor. */
USBInterfaceDescriptor communication;
/** CDC header functional descriptor. */
CDCHeaderDescriptor header;
/** CDC call management functional descriptor. */
CDCCallManagementDescriptor callManagement;
/** CDC abstract control management functional descriptor. */
CDCAbstractControlManagementDescriptor abstractControlManagement;
/** CDC union functional descriptor (with one slave interface). */
CDCUnionDescriptor union1;
/** Notification endpoint descriptor. */
USBEndpointDescriptor notification;
/** Data interface descriptor. */
USBInterfaceDescriptor data;
/** Data OUT endpoint descriptor. */
USBEndpointDescriptor dataOut;
/** Data IN endpoint descriptor. */
USBEndpointDescriptor dataIn;
} __attribute__ ((packed)) CDCDSerialDriverConfigurationDescriptors;
/**
* \typedef CDCDSerialDriverConfigurationDescriptorsOTG
* \brief Configuration descriptor list for a device implementing a
* CDC serial OTG driver.
*/
typedef struct _CDCDSerialDriverConfigurationDescriptorsOTG {
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration;
/* OTG descriptor */
USBOtgDescriptor otgDescriptor;
/** Communication interface descriptor. */
USBInterfaceDescriptor communication;
/** CDC header functional descriptor. */
CDCHeaderDescriptor header;
/** CDC call management functional descriptor. */
CDCCallManagementDescriptor callManagement;
/** CDC abstract control management functional descriptor. */
CDCAbstractControlManagementDescriptor abstractControlManagement;
/** CDC union functional descriptor (with one slave interface). */
CDCUnionDescriptor union1;
/** Notification endpoint descriptor. */
USBEndpointDescriptor notification;
/** Data interface descriptor. */
USBInterfaceDescriptor data;
/** Data OUT endpoint descriptor. */
USBEndpointDescriptor dataOut;
/** Data IN endpoint descriptor. */
USBEndpointDescriptor dataIn;
} __attribute__ ((packed)) CDCDSerialDriverConfigurationDescriptorsOTG;
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
extern void CDCDSerialDriver_Initialize(
const USBDDriverDescriptors *pDescriptors);
extern void CDCDSerialDriver_ConfigurationChangedHandler(uint8_t cfgnum);
extern void CDCDSerialDriver_RequestHandler(
const USBGenericRequest *request);
extern uint8_t CDCDSerialDriver_LineCodingIsToChange(
CDCLineCoding * pLineCoding);
extern void CDCDSerialDriver_ControlLineStateChanged(
uint8_t DTR,uint8_t RTS);
/**
* Sends a data buffer through the virtual COM port created by the CDC
* device serial driver. This function behaves exactly like USBD_Write.
* \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 read operation has been started normally;
* otherwise, the corresponding error code.
*/
static inline uint32_t CDCDSerialDriver_Write(
void *data,
uint32_t size,
TransferCallback callback,
void *argument)
{
return CDCDSerial_Write(data, size, callback, argument);
}
/**
* Receives data from the host through the virtual COM port created by
* the CDC device serial driver. This function behaves like USBD_Read.
* \param data Pointer to the data buffer to put received data.
* \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 read operation has been started normally;
* otherwise, the corresponding error code.
*/
static inline uint32_t CDCDSerialDriver_Read(
void *data,
uint32_t size,
TransferCallback callback,
void *argument)
{
return CDCDSerial_Read(data, size, callback, argument);
}
/**
* Copy current line coding settings to pointered space.
* \param pLineCoding Pointer to CDCLineCoding instance.
*/
static inline void CDCDSerialDriver_GetLineCoding(CDCLineCoding * pLineCoding)
{
CDCDSerial_GetLineCoding(pLineCoding);
}
/**
* Returns the current control line state of the RS-232 line.
*/
static inline uint8_t CDCDSerialDriver_GetControlLineState(void)
{
return CDCDSerial_GetControlLineState();
}
/**
* Returns the current status of the RS-232 line.
*/
static inline uint16_t CDCDSerialDriver_GetSerialState(void)
{
return CDCDSerial_GetSerialState();
}
/**
* Sets the current serial state of the device to the given value.
* \param serialState New device state.
*/
static inline void CDCDSerialDriver_SetSerialState(uint16_t serialState)
{
CDCDSerial_SetSerialState(serialState);
}
/**@}*/
#endif /*#ifndef CDCSERIALDRIVER_H*/

View File

@@ -0,0 +1,167 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/** \file
* Definition of a class for implementing a USB device
* CDC serial port function.
*/
#ifndef _CDCDSERIALPORT_H_
#define _CDCDSERIALPORT_H_
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
/* These headers were introduced in C99
by working group ISO/IEC JTC1/SC22/WG14. */
#include <stdint.h>
#include <USBRequests.h>
#include <CDCRequests.h>
#include <CDCNotifications.h>
#include <USBD.h>
#include <USBDDriver.h>
/** \addtogroup usbd_cdc
*@{
*/
/*------------------------------------------------------------------------------
* Defines
*------------------------------------------------------------------------------*/
/** \addtogroup usbd_cdc_serial_desc USB Device Serial Port Descriptor Values
* @{
*/
/** Default CDC interrupt endpoints max packat size (8). */
#define CDCDSerialPort_INTERRUPT_MAXPACKETSIZE 8
/** Default CDC interrupt endpoint polling rate of High Speed (16ms). */
#define CDCDSerialPort_INTERRUPT_INTERVAL_HS 8
/** Default CDC interrupt endpoint polling rate of Full Speed (16ms). */
#define CDCDSerialPort_INTERRUPT_INTERVAL_FS 16
/** Default CDC bulk endpoints max packat size (512, for HS actually). */
#define CDCDSerialPort_BULK_MAXPACKETSIZE_HS 512
/** Default CDC bulk endpoints max packat size (64, for FS actually). */
#define CDCDSerialPort_BULK_MAXPACKETSIZE_FS 64
/** @}*/
/** \addtogroup usbd_cdc_serial_events USB Device Serial Port Events
* @{
*/
/** SetControlLineState event, value is changed */
#define CDCDSerialPortEvent_SETCONTROLLINESTATE 0
/** SetLineCoding event, value is to changed according to return value */
#define CDCDSerialPortEvent_SETLINECODING 1
/** @}*/
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/** Callback function for serial port events */
typedef uint32_t (*CDCDSerialPortEventHandler)(uint32_t dwEvent,
uint32_t dwParam,
void * pArguments);
/**
* Struct for USB CDC virtual COM serial port function.
*/
typedef struct _CDCDSerialPort {
/** USB Driver for the %device */
USBDDriver *pUsbd;
/** Callback for serial port events */
CDCDSerialPortEventHandler fEventHandler;
/** Callback arguments */
void *pArg;
/** USB starting interface index */
uint8_t bInterfaceNdx;
/** USB number of interfaces */
uint8_t bNumInterface;
/** USB interrupt IN endpoint address */
uint8_t bIntInPIPE;
/** USB bulk IN endpoint address */
uint8_t bBulkInPIPE;
/** USB bulk OUT endpoint address */
uint8_t bBulkOutPIPE;
/** Serial port ControlLineState */
uint8_t bControlLineState;
/** Serial port SerialState */
uint16_t wSerialState;
/** Serial port linecoding */
CDCLineCoding lineCoding;
uint8_t bReserved;
} CDCDSerialPort;
/*------------------------------------------------------------------------------
* Functions
*------------------------------------------------------------------------------*/
extern void CDCDSerialPort_Initialize(CDCDSerialPort *pCdcd,
USBDDriver *pUsbd,
CDCDSerialPortEventHandler fCallback,
void *pArg,
uint8_t firstInterface,
uint8_t numInterface);
extern USBGenericDescriptor * CDCDSerialPort_ParseInterfaces(
CDCDSerialPort * pCdcd,
USBGenericDescriptor * pDescriptors, uint32_t dwLength);
extern uint32_t CDCDSerialPort_RequestHandler(
CDCDSerialPort *pCdcd,
const USBGenericRequest *pRequest);
extern uint32_t CDCDSerialPort_Write(
const CDCDSerialPort *pCdcd,
void *pData, uint32_t dwSize,
TransferCallback fCallback, void* pArg);
extern uint32_t CDCDSerialPort_Read(
const CDCDSerialPort *pCdcd,
void *pData, uint32_t dwSize,
TransferCallback fCallback, void* pArg);
extern uint16_t CDCDSerialPort_GetSerialState(
const CDCDSerialPort *pCdcd);
extern void CDCDSerialPort_SetSerialState(
CDCDSerialPort *pCdcd,
uint16_t wSerialState);
extern uint8_t CDCDSerialPort_GetControlLineState(
const CDCDSerialPort * pCdcd);
extern void CDCDSerialPort_GetLineCoding(
const CDCDSerialPort * pCdcd,
CDCLineCoding * pLineCoding);
/**@}*/
#endif /* #ifndef _CDCDSERIALPORT_H_ */

View File

@@ -0,0 +1,275 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/** \file
*
* Definitions and classes for USB CDC class descriptors.
*/
#ifndef _CDCDESCRIPTORS_H_
#define _CDCDESCRIPTORS_H_
/** \addtogroup usb_cdc
*@{
*/
/*----------------------------------------------------------------------------
* Includes
*----------------------------------------------------------------------------*/
#include <stdint.h>
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** \addtogroup usb_cdc_ver USB CDC Specification Release Numbers
* @{
* This section list the CDC Spec. Release Numbers.
* - \ref CDCGenericDescriptor_CDC1_10
*/
/** Identify CDC specification version 1.10. */
#define CDCGenericDescriptor_CDC1_10 0x0110
/** @}*/
/** \addtogroup usb_cdc_desc_type CDC Descriptro Types
* @{
* This section lists CDC descriptor types.
* - \ref CDCGenericDescriptor_INTERFACE
* - \ref 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
/** @}*/
/** \addtogroup usb_cdc_desc_subtype CDC Descriptor Subtypes
* @{
* This section lists CDC descriptor sub types
* - \ref CDCGenericDescriptor_HEADER
* - \ref CDCGenericDescriptor_CALLMANAGEMENT
* - \ref CDCGenericDescriptor_ABSTRACTCONTROLMANAGEMENT
* - \ref 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
/** @}*/
/** \addtogroup usb_cdc_descriptor USB CDC Device Descriptor Values
* @{
* This section lists the values for CDC Device Descriptor.
* - \ref CDCDeviceDescriptor_CLASS
* - \ref CDCDeviceDescriptor_SUBCLASS
* - \ref 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
/** @}*/
/** \addtogroup usb_cdc_if_desc USB CDC Communication Interface Descriptor
* @{
* This section lists the values for CDC Communication Interface Descriptor.
* - \ref CDCCommunicationInterfaceDescriptor_CLASS
* - \ref CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL
* - \ref 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
/** @}*/
/** \addtogroup usb_cdc_data_if USB CDC Data Interface Values
* @{
* This section lists the values for CDC Data Interface Descriptor.
* - \ref CDCDataInterfaceDescriptor_CLASS
* - \ref CDCDataInterfaceDescriptor_SUBCLASS
* - \ref 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
/** @}*/
/** \addtogroup usb_cdc_cb_man_desc USB CDC CallManagement Capabilities
* @{
* This section lists CDC CallManagement Capabilities.
* - \ref CDCCallManagementDescriptor_SELFCALLMANAGEMENT
* - \ref 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)
/** @}*/
/** \addtogroup usb_cdc_acm USB CDC ACM Capabilities
* @{
*
* This section lists the capabilities of the CDC ACM.
* - \ref CDCAbstractControlManagementDescriptor_COMMFEATURE
* - \ref CDCAbstractControlManagementDescriptor_LINE
* - \ref CDCAbstractControlManagementDescriptor_SENDBREAK
* - \ref 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 */
/**
* \typedef CDCHeaderDescriptor
* \brief Marks the beginning of the concatenated set of functional descriptors
* for the interface.
*/
typedef struct _CDCHeaderDescriptor {
/** Size of this descriptor in bytes. */
uint8_t bFunctionLength;
/** Descriptor type . */
uint8_t bDescriptorType;
/** Descriptor sub-type . */
uint8_t bDescriptorSubtype;
/** USB CDC specification release number. */
uint16_t bcdCDC;
} __attribute__ ((packed)) CDCHeaderDescriptor; /* GCC */
/**
* \typedef CDCUnionDescriptor
* \brief Describes the relationship between a group of interfaces that can
* be considered to form a functional unit.
*/
typedef struct _CDCUnionDescriptor {
/** Size of the descriptor in bytes. */
uint8_t bFunctionLength;
/** Descriptor type . */
uint8_t bDescriptorType;
/** Descriptor subtype . */
uint8_t bDescriptorSubtype;
/** Number of the master interface for this union. */
uint8_t bMasterInterface;
/** Number of the first slave interface for this union. */
uint8_t bSlaveInterface0;
} __attribute__ ((packed)) CDCUnionDescriptor; /* GCC */
/**
* \typedef CDCCallManagementDescriptor
* \brief Describes the processing of calls for the communication class
* interface.
*/
typedef struct _CDCCallManagementDescriptor {
/** Size of this descriptor in bytes. */
uint8_t bFunctionLength;
/** Descriptor type . */
uint8_t bDescriptorType;
/** Descriptor sub-type . */
uint8_t bDescriptorSubtype;
/** Configuration capabilities
\sa usb_cdc_cb_man_desc CDC CallManagement Capabilities. */
uint8_t bmCapabilities;
/** Interface number of the data class interface used for call management
(optional). */
uint8_t bDataInterface;
} __attribute__ ((packed)) CDCCallManagementDescriptor; /* GCC */
/**
* \typedef CDCAbstractControlManagementDescriptor
* \brief Describes the command supported by the communication interface class
* with the Abstract Control Model subclass code.
*/
typedef struct _CDCAbstractControlManagementDescriptor {
/** Size of this descriptor in bytes. */
uint8_t bFunctionLength;
/** Descriptor type . */
uint8_t bDescriptorType;
/** Descriptor subtype . */
uint8_t bDescriptorSubtype;
/** Configuration capabilities.
\sa usb_cdc_acm CDC ACM Capabilities. */
uint8_t bmCapabilities;
} __attribute__ ((packed)) CDCAbstractControlManagementDescriptor; /* GCC */
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*----------------------------------------------------------------------------
* Functions
*----------------------------------------------------------------------------*/
/**@}*/
#endif /* #ifndef _CDCDESCRIPTORS_H_ */

View File

@@ -0,0 +1,152 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* Definitions and methods for USB composite device implement.
*
* \section Usage
*
* -# Initialize USB function specified driver ( for MSD currently )
* - MSDDFunctionDriver_Initialize()
*
* -# Initialize USB composite driver and USB driver
* - CDCHIDDDriver_Initialize()
*
* -# Handle and dispach USB requests
* - CDCHIDDDriver_RequestHandler()
*
* -# Try starting a remote wake-up sequence
* - CDCHIDDDriver_RemoteWakeUp()
*/
#ifndef CDCHIDDDRIVER_H
#define CDCHIDDDRIVER_H
/** \addtogroup usbd_cdc_hid
*@{
*/
/*---------------------------------------------------------------------------
* Headers
*---------------------------------------------------------------------------*/
#include <USBRequests.h>
#include <CDCDescriptors.h>
#include <HIDDescriptors.h>
#include <USBD.h>
#include <USBDDriver.h>
/*---------------------------------------------------------------------------
* Definitions
*---------------------------------------------------------------------------*/
/** \addtogroup usbd_cdc_hid_desc USB CDC(Serial) + HID(Kbd) Descriptors define
* @{
*/
/** Number of interfaces of the device */
#define CDCHIDDDriverDescriptors_NUMINTERFACE 3
/** Number of the CDC interface. */
#define CDCHIDDDriverDescriptors_CDC_INTERFACE 0
/** Number of the HID interface. */
#define CDCHIDDDriverDescriptors_HID_INTERFACE 2
/** @}*/
/*---------------------------------------------------------------------------
* Types
*---------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef CdcHidDriverConfigurationDescriptors
* \brief Configuration descriptor list for a device implementing a
* composite driver.
*/
typedef struct _CdcHidDriverConfigurationDescriptors {
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration;
/* --- 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;
/* --- HID */
USBInterfaceDescriptor hidInterface;
HIDDescriptor1 hid;
USBEndpointDescriptor hidInterruptIn;
USBEndpointDescriptor hidInterruptOut;
} __attribute__ ((packed)) CdcHidDriverConfigurationDescriptors;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*---------------------------------------------------------------------------
* Exported functions
*---------------------------------------------------------------------------*/
/* -CDCHID */
extern void CDCHIDDDriver_Initialize(
const USBDDriverDescriptors * pDescriptors);
extern void CDCHIDDDriver_ConfigurationChangedHandler(uint8_t cfgnum);
extern void CDCHIDDDriver_RequestHandler(const USBGenericRequest *request);
extern void CDCHIDDDriver_RemoteWakeUp(void);
/**@}*/
#endif //#ifndef CDCHIDDDRIVER_H

View File

@@ -0,0 +1,155 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* Definitions and methods for USB CDCMSD device implement.
*
* \section Usage
*
* -# Initialize USB function specified driver ( for MSD currently )
* - MSDDFunctionDriver_Initialize
*
* -# Initialize USB CDCMSD driver and USB driver
* - CDCMSDDDriver_Initialize
*
* -# Handle and dispach USB requests
* - CDCMSDDDriver_RequestHandler
*
* -# Try starting a remote wake-up sequence
* - CDCMSDDDriver_RemoteWakeUp
*/
#ifndef CDCMSDDDRIVER_H
#define CDCMSDDDRIVER_H
/** \addtogroup usbd_composite_cdcmsd
*@{
*/
/*---------------------------------------------------------------------------
* Headers
*---------------------------------------------------------------------------*/
#include <USBRequests.h>
#include <CDCDescriptors.h>
#include <MSDescriptors.h>
#include <MSDLun.h>
#include <USBD.h>
#include <USBDDriver.h>
/*---------------------------------------------------------------------------
* Consts
*---------------------------------------------------------------------------*/
/** \addtogroup usbd_cdc_msd_desc USB CDC(Serial) + MS Descriptors define
* @{
*/
/** Number of interfaces of the device */
#define CDCMSDDriverDescriptors_NUMINTERFACE 3
/** Number of the CDC interface. */
#define CDCMSDDriverDescriptors_CDC_INTERFACE 0
/** Number of the HID interface. */
#define CDCMSDDriverDescriptors_MSD_INTERFACE 2
/** @}*/
/*---------------------------------------------------------------------------
* Types
*---------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef CDCMSDDriverConfigurationDescriptors
* \brief Configuration descriptor list for a device implementing
* a CDCMSD driver.
*/
typedef struct _CDCMSDDriverConfigurationDescriptors {
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration;
/* --- 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;
/* --- MSD */
/** Mass storage interface descriptor. */
USBInterfaceDescriptor msdInterface;
/** Bulk-out endpoint descriptor. */
USBEndpointDescriptor msdBulkOut;
/** Bulk-in endpoint descriptor. */
USBEndpointDescriptor msdBulkIn;
} __attribute__ ((packed)) CDCMSDDriverConfigurationDescriptors;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*---------------------------------------------------------------------------
* Exported functions
*---------------------------------------------------------------------------*/
/* -CDCMSD */
extern void CDCMSDDriver_Initialize(
const USBDDriverDescriptors *pDescriptors,
MSDLun *pLuns, unsigned char numLuns);
extern void CDCMSDDriver_ConfigurationChangedHandler(unsigned char cfgnum);
extern void CDCMSDDriver_RequestHandler(const USBGenericRequest *request);
/**@}*/
#endif /* #ifndef CDCMSDDDRIVER_H */

View File

@@ -0,0 +1,111 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/** \file
* Definitions and methods for USB CDC Notifications.
*/
#ifndef _CDCNOTIFICATIONS_H_
#define _CDCNOTIFICATIONS_H_
/** \addtogroup usb_cdc
*@{
*/
/*----------------------------------------------------------------------------
* Includes
*----------------------------------------------------------------------------*/
#include <stdint.h>
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** \addtogroup cdc_serial_states CDC SerialState bits
* @{
* This page lists the bit map for CDC Serial States.
*
* - \ref CDCSerialState_RXDRIVER
* - \ref CDCSerialState_TXCARRIER
* - \ref CDCSerialState_BREAK
* - \ref CDCSerialState_RINGSIGNAL
* - \ref CDCSerialState_FRAMING
* - \ref CDCSerialState_PARITY
* - \ref CDCSerialState_OVERRUN
*/
/** Indicates the receiver carrier signal is present */
#define CDCSerialState_RXDRIVER (1 << 0)
/** Indicates the transmission carrier signal is present */
#define CDCSerialState_TXCARRIER (1 << 1)
/** Indicates a break has been detected */
#define CDCSerialState_BREAK (1 << 2)
/** Indicates a ring signal has been detected */
#define CDCSerialState_RINGSIGNAL (1 << 3)
/** Indicates a framing error has occured */
#define CDCSerialState_FRAMING (1 << 4)
/** Indicates a parity error has occured */
#define CDCSerialState_PARITY (1 << 5)
/** Indicates a data overrun error has occured */
#define CDCSerialState_OVERRUN (1 << 6)
/** @}*/
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/** USB CDC SerialState struct (bitmap) */
typedef struct _CDCSerialState {
uint16_t bRxCarrier:1, /**< State of receive carrier detection (V2.4 signal
109 and RS-232 signal DCD) */
bTxCarrier:1, /**< State of transmission carrier */
bBreak:1, /**< State of break detection */
bRingSignal:1, /**< State of ring signal */
bFraming:1, /**< Framing error */
bParity:1, /**< Parity error */
bOverRun:1, /**< Received data discarded due to overrun error */
reserved:9; /**< Reserved */
} __attribute__ ((packed)) CDCSerialState;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*----------------------------------------------------------------------------
* Functions
*----------------------------------------------------------------------------*/
/**@}*/
#endif /* #ifndef _CDCNOTIFICATIONS_H_ */

View File

@@ -0,0 +1,182 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/** \file
*
* Definitions and classes for USB CDC class requests
* (mostly for ACM).
*
* \section CDCLineCoding
*
* -# 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 _CDCREQUESTS_H_
#define _CDCREQUESTS_H_
/** \addtogroup usb_cdc
*@{
*/
/*----------------------------------------------------------------------------
* Includes
*----------------------------------------------------------------------------*/
#include <stdint.h>
#include <USBRequests.h>
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** \addtogroup usb_cdc_request USB CDC Request Codes
* @{
* This section lists USB CDC Request Codes.
* - \ref CDCGenericRequest_SETLINECODING
* - \ref CDCGenericRequest_GETLINECODING
* - \ref CDCGenericRequest_SETCONTROLLINESTATE
*/
/** SetLineCoding request code. */
#define CDCGenericRequest_SETLINECODING 0x20
/** GetLineCoding request code. */
#define CDCGenericRequest_GETLINECODING 0x21
/** SetControlLineState request code. */
#define CDCGenericRequest_SETCONTROLLINESTATE 0x22
/** @}*/
/** \addtogroup usb_cdc_ctrl_line_state USB CDC ControlLineState bitmap
* @{
* This section lists CDC ControlLineState bitmap.
* - \ref CDCControlLineState_DTR, CDCControlLineState_DTE_PRESENT
* - \ref CDCControlLineState_RTS, CDCControlLineState_CARRIER_ON
*/
/** Indicates to DCE if DTE is present or not. */
#define CDCControlLineState_DTE_PRESENT (1 << 0)
/** RS232 signal DTR: Data Terminal Ready. */
#define CDCControlLineState_DTR (1 << 0)
/** Carrier control for half duplex modems. */
#define CDCControlLineState_CARRIER_ON (1 << 1)
/** RS232 signal RTS: Request to send. */
#define CDCControlLineState_RTS (1 << 1)
/** @}*/
/** \addtogroup usb_cdc_stop USB CDC LineCoding StopBits
* @{
* This section lists Stop Bits for CDC Line Coding.
* - \ref CDCLineCoding_ONESTOPBIT
* - \ref CDCLineCoding_ONE5STOPBIT
* - \ref 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
/** @}*/
/** \addtogroup usb_cdc_parity USB CDC LineCoding ParityCheckings
* @{
* This section lists Parity checkings for CDC Line Coding.
* - \ref CDCLineCoding_NOPARITY
* - \ref CDCLineCoding_ODDPARITY
* - \ref CDCLineCoding_EVENPARITY
* - \ref CDCLineCoding_MARKPARITY
* - \ref 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 */
/**
* \typedef CDCLineCoding
* \brief Format of the data returned when a GetLineCoding request is received.
*/
typedef struct _CDCLineCoding {
/** Data terminal rate in bits per second. */
uint32_t dwDTERate;
/** Number of stop bits.
\sa usb_cdc_stop CDC LineCoding StopBits. */
uint8_t bCharFormat;
/** Type of parity checking used.
\sa usb_cdc_parity CDC LineCoding ParityCheckings. */
uint8_t bParityType;
/** Number of data bits (5, 6, 7, 8 or 16). */
uint8_t bDataBits;
} __attribute__ ((packed)) CDCLineCoding; /* GCC */
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*----------------------------------------------------------------------------
* Functions
*----------------------------------------------------------------------------*/
extern uint8_t CDCSetControlLineStateRequest_IsDtePresent(
const USBGenericRequest *request);
extern uint8_t CDCSetControlLineStateRequest_ActivateCarrier(
const USBGenericRequest *request);
extern void CDCLineCoding_Initialize(CDCLineCoding *lineCoding,
uint32_t bitrate,
uint8_t stopbits,
uint8_t parity,
uint8_t databits);
/**@}*/
#endif /* #define _CDCREQUESTS_H_ */

View File

@@ -0,0 +1,157 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* Definitions and methods for USB composite device implement.
*
*/
#ifndef DUALCDCDDRIVER_H
#define DUALCDCDDRIVER_H
/** \addtogroup usbd_composite_cdccdc
*@{
*/
/*---------------------------------------------------------------------------
* Headers
*---------------------------------------------------------------------------*/
#include <USBRequests.h>
#include <CDCDescriptors.h>
#include <USBD.h>
#include <CDCDSerialPort.h>
/*---------------------------------------------------------------------------
* Defines
*---------------------------------------------------------------------------*/
/** \addtogroup usbd_composite_cdccdc_desc
* The driver uses these interface numbers in configuration descriptor.
* @{
*/
/** Number of interfaces of the device */
#define DUALCDCDDriverDescriptors_NUMINTERFACE 4
/** Number of the CDC0 interface. */
#define DUALCDCDDriverDescriptors_INTERFACENUM0 0
/** Number of the CDC1 interface. */
#define DUALCDCDDriverDescriptors_INTERFACENUM1 2
/** @}*/
/*---------------------------------------------------------------------------
* Types
*---------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef DualCdcDriverConfigurationDescriptors
* \brief Configuration descriptor list for a device implementing a
* dual CDC serial composite driver.
*/
typedef struct _DualCdcDriverConfigurationDescriptors {
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration;
/* --- 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;
/* --- 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;
} __attribute__ ((packed)) DualCdcDriverConfigurationDescriptors;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*---------------------------------------------------------------------------
* Exported functions
*---------------------------------------------------------------------------*/
/* -DUALCDC */
extern void DUALCDCDDriver_Initialize(
const USBDDriverDescriptors* pDescriptors);
extern void DUALCDCDDriver_ConfigurationChangeHandler(uint8_t cfgnum);
extern void DUALCDCDDriver_RequestHandler(const USBGenericRequest *request);
extern CDCDSerialPort* DUALCDCDDriver_GetSerialPort(uint32_t port);
/**@}*/
#endif /* #ifndef DUALCDCDDRIVER_H */

View File

@@ -0,0 +1,191 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* Definitions and methods for USB composite device implement.
*
*/
#ifndef HIDAUDDDRIVER_H
#define HIDAUDDDRIVER_H
/** \addtogroup usbd_hid_aud
*@{
*/
/*---------------------------------------------------------------------------
* Headers
*---------------------------------------------------------------------------*/
#include <USBRequests.h>
#include <HIDDescriptors.h>
#include <AUDDescriptors.h>
#include <USBD.h>
#include <USBDDriver.h>
/*---------------------------------------------------------------------------
* Definitions
*---------------------------------------------------------------------------*/
/** \addtogroup usbd_hid_aud_desc USB HID(Keyboard) + AUD(Speaker) Definitions
* @{
*/
/** Number of interfaces of the device 1+2 */
#define HIDAUDDDriverDescriptors_NUMINTERFACE 3
/** Number of the CDC interface. */
#define HIDAUDDDriverDescriptors_HID_INTERFACE 0
/** Number of the Audio interface. */
#define HIDAUDDDriverDescriptors_AUD_INTERFACE 1
/** @}*/
/*---------------------------------------------------------------------------
* Types
*---------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/** Structure of audio header descriptor*/
typedef struct _AUDHeaderDescriptor1{
/** Header descriptor.*/
AUDHeaderDescriptor header;
/** Id of the first grouped interface.*/
unsigned char bInterface0;
} __attribute__ ((packed)) AUDHeaderDescriptor1;
/**
* Feature unit descriptor with 3 channel controls (master, right, left).
*/
typedef struct _AUDFeatureUnitDescriptor3{
/** 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;
/**
* List of descriptors for detailling the audio control interface of a
* device using a USB audio speaker driver.
*/
typedef struct _AUDDSpeakerDriverAudioControlDescriptors{
/** 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 _AUDFormatTypeOneDescriptor1{
/** Format type I descriptor.*/
AUDFormatTypeOneDescriptor formatType;
/** Sampling frequency in Hz.*/
unsigned char tSamFreq[3];
} __attribute__ ((packed)) AUDFormatTypeOneDescriptor1; // GCC
/**
* \typedef CdcAudDriverConfigurationDescriptors
* \brief Configuration descriptor list for a device implementing a
* composite HID (Keyboard) + Audio (Speaker) driver.
*/
typedef struct _HidAuddDriverConfigurationDescriptors {
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration;
/* --- HID */
/** HID interface. */
USBInterfaceDescriptor hidInterface;
/** HID descriptor */
HIDDescriptor1 hid;
/** HID interrupt IN */
USBEndpointDescriptor hidInterruptIn;
/** HID interrupt OUT */
USBEndpointDescriptor hidInterruptOut;
/* --- AUDIO (AC) */
/** Audio IAD */
USBInterfaceAssociationDescriptor audIAD;
/** Audio control interface.*/
USBInterfaceDescriptor audInterface;
/** Descriptors for the audio control interface.*/
AUDDSpeakerDriverAudioControlDescriptors audControl;
/* -- AUDIO out (AS) */
/** 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;
} __attribute__ ((packed)) HidAuddDriverConfigurationDescriptors;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*---------------------------------------------------------------------------
* Exported functions
*---------------------------------------------------------------------------*/
extern void HIDAUDDDriver_Initialize(const USBDDriverDescriptors * pDescriptors);
extern void HIDAUDDDriver_ConfigurationChangedHandler(uint8_t cfgnum);
extern void HIDAUDDDriver_InterfaceSettingChangedHandler(
uint8_t interface, uint8_t setting);
extern void HIDAUDDDriver_RequestHandler(const USBGenericRequest *request);
/**@}*/
#endif //#ifndef CDCHIDDDRIVER_H

View File

@@ -0,0 +1,210 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/**\file
*
* Definitions used for general HID support.
*
* The HID Function supports following:
* - 1 interface with 1 pipe in and 1 pipe out;
* - An input report list;
* - An output report list;
* - handles requests:
* - handles: GET_IDLE/SET_IDLE,
* GET_REPORT/SET_REPORT,
* SET_PROTOCOL/GET_PROTOCOL;
* - stall : SET_DESCRIPTOR.
*/
#ifndef _HIDDFUNCTION_H_
#define _HIDDFUNCTION_H_
/** \addtogroup usbd_hid
* @{
*/
/*----------------------------------------------------------------------------
* Includes
*----------------------------------------------------------------------------*/
#include <stdint.h>
#include <HIDRequests.h>
#include <HIDDescriptors.h>
#include <USBD.h>
#include <USBDDriver.h>
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** \addtogroup usbd_hid_events HIDD Event codes
* @{
*/
/** Report sent */
#define HIDD_EC_REPORTSENT 1
/** Report changed */
#define HIDD_EC_REPORTCHANGED 2
/** Report sent because of GET_REPORT Request */
#define HIDD_EC_GETREPORT 3
/** Report changed because of SET_REPORT Request */
#define HIDD_EC_SETREPORT 4
/** @}*/
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
/**
* Callback function for HID report events.
*/
typedef void(*HIDDReportEventCallback)(uint32_t ec, void *pArg);
/**
* Struct for a header of basic HID report descriptor.
*/
typedef struct _HIDDReportHeader {
/** Callback when report done */
HIDDReportEventCallback fCallback;
/** Callback arguments */
void* pArg;
/** Report size (ID + DATA) */
uint16_t wMaxSize;
/** Transfered size */
uint16_t wTransferred;
/** Report idle rate */
uint8_t bIdleRate;
/** Delay count for Idle */
uint8_t bDelay;
/** Report ID */
uint8_t bID;
} HIDDReportHeader;
/**
* Struct for an basic HID report descriptor.
*/
typedef struct _HIDDReport {
/** Callback when report done */
HIDDReportEventCallback fCallback;
/** Callback arguments */
void* pArg;
/** Report size (ID + DATA) */
uint16_t wMaxSize;
/** Transfered size */
uint16_t wTransferred;
/** Report idle rate */
uint8_t bIdleRate;
/** Delay count for Idle */
uint8_t bDelay;
/** Report ID */
uint8_t bID;
/** Report data block start ... */
uint8_t bData[1];
} HIDDReport;
/**
* Struct for an HID general function.
* Supports Input/Output reports. No feature report support.
*/
typedef struct _HIDDFunction {
/** USB Driver for the %device */
USBDDriver *pUsbd;
/** HID descriptor */
HIDDescriptor *pHidDescriptor;
/** HID Specific report descriptor */
uint8_t *pReportDescriptor;
/** USB interface for HID function */
uint8_t bInterface;
/** USB interrupt IN EP */
uint8_t bPipeIN;
/** USB interrupt OUT EP */
uint8_t bPipeOUT;
/** HID Protocol */
uint8_t bProtocol;
/** HID Input reports list */
HIDDReport **pInputList;
/** HID Output reports list */
HIDDReport **pOutputList;
/** HID Input report list size */
uint8_t bInputListSize;
/** Current input report */
uint8_t bCurrInput;
/** HID Output reports list */
uint8_t bOutputListSize;
/** Current output report */
uint8_t bCurrOutput;
} HIDDFunction;
/*----------------------------------------------------------------------------
* Functions
*----------------------------------------------------------------------------*/
extern void HIDDFunction_Initialize(
HIDDFunction * pHidd,
USBDDriver * pUsbd, uint8_t bInterfaceNb,
const uint8_t * pReportDescriptor,
HIDDReport * pInputList [ ], uint8_t bInputListSize,
HIDDReport * pOutputList [ ], uint8_t bOutputListSize);
extern USBGenericDescriptor* HIDDFunction_ParseInterface(
HIDDFunction * pHidd,
USBGenericDescriptor * pDescriptors,
uint32_t dwLength);
extern uint32_t HIDDFunction_RequestHandler(
HIDDFunction * pHidd,
const USBGenericRequest * request);
extern uint32_t HIDDFunction_StartSendingInputs(HIDDFunction * pHidd);
extern uint32_t HIDDFunction_StartPollingOutputs(HIDDFunction * pHidd);
extern uint32_t HIDDFunction_Read(
const HIDDFunction * pHidd,
void * pData, uint32_t dwLength,
TransferCallback fCallback, void * pArg);
extern uint32_t HIDDFunction_Write(
const HIDDFunction * pHidd,
void * pData, uint32_t dwLength,
TransferCallback fCallback, void * pArg);
extern void HIDDFunction_InitializeReport(
HIDDReport * pReport,
uint16_t wSize,
uint8_t bID,
HIDDReportEventCallback fCallback, void* pArg);
/**@}*/
#endif /* #define _HIDDFUNCTION_H_ */

View File

@@ -0,0 +1,216 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
* Definition of methods for using a HID keyboard function.
*/
#ifndef HIDDKEYBOARD_H
#define HIDDKEYBOARD_H
/** \addtogroup usbd_hid_key
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include "board.h"
#include "USBDescriptors.h"
#include "USBRequests.h"
#include "HIDDescriptors.h"
#include "USBDDriver.h"
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** \addtogroup usbd_hid_kbd_desc HIDD Keyboard Driver Definitions
* @{
*/
/** Maximum number of simultaneous key presses. */
#define HIDDKeyboardInputReport_MAXKEYPRESSES 3
/** \addtogroup usbd_hid_kbd_keys HID Keypad keys
* @{
* This page lists definition for HID keypad keys.
*
* \section Keys
* - HIDDKeyboardDescriptors_FIRSTMODIFIERKEY
* - HIDDKeyboardDescriptors_LASTMODIFIERKEY
* - HIDDKeyboardDescriptors_FIRSTSTANDARDKEY
* - HIDDKeyboardDescriptors_LASTSTANDARDKEY
*/
/** Key code of the first accepted modifier key */
#define HIDDKeyboardDescriptors_FIRSTMODIFIERKEY HIDKeypad_LEFTCONTROL
/** Key code of the last accepted modifier key */
#define HIDDKeyboardDescriptors_LASTMODIFIERKEY HIDKeypad_RIGHTGUI
/** Key code of the first accepted standard key */
#define HIDDKeyboardDescriptors_FIRSTSTANDARDKEY 0
/** Key code of the last accepted standard key */
#define HIDDKeyboardDescriptors_LASTSTANDARDKEY HIDKeypad_NUMLOCK
/** @}*/
/** \addtogroup usbd_hid_kbd_polling HID Keyboard Default Polling Rates
* @{
*/
/** Default HID interrupt IN endpoint polling rate FS (16ms). */
#define HIDDKeyboardDescriptors_INTERRUPTIN_POLLING_FS 16
/** Default HID interrupt IN endpoint polling rate HS (16ms). */
#define HIDDKeyboardDescriptors_INTERRUPTIN_POLLING_HS 8
/** Default interrupt OUT endpoint polling rate FS (16ms). */
#define HIDDKeyboardDescriptors_INTERRUPTOUT_POLLING_FS 16
/** Default interrupt OUT endpoint polling rate HS (16ms). */
#define HIDDKeyboardDescriptors_INTERRUPTOUT_POLLING_HS 8
/** @}*/
/** Size of the report descriptor in bytes */
#define HIDDKeyboard_REPORTDESCRIPTORSIZE 61
/** @}*/
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef HIDDKeyboardOutputReport
* \brief 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 _HIDDKeyboardOutputReport {
uint8_t 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 */
/**
* \typedef HIDDKeyboardInputReport
* \brief 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 _HIDDKeyboardInputReport {
/** State of modifier keys. */
uint8_t bmModifierKeys:8;
/** Key codes of pressed keys. */
uint8_t pressedKeys[HIDDKeyboardInputReport_MAXKEYPRESSES];
} __attribute__ ((packed)) HIDDKeyboardInputReport; /* GCC */
/**
* \typedef HIDDKeyboardDriverConfigurationDescriptors
* \brief List of descriptors that make up the configuration descriptors of a
* device using the HID keyboard driver.
*/
typedef struct _HIDDKeyboardDriverConfigurationDescriptors {
/** Configuration descriptor. */
USBConfigurationDescriptor configuration;
/** Interface descriptor. */
USBInterfaceDescriptor interface;
/** HID descriptor. */
HIDDescriptor1 hid;
/** Interrupt IN endpoint descriptor. */
USBEndpointDescriptor interruptIn;
/** Interrupt OUT endpoint descriptor. */
USBEndpointDescriptor interruptOut;
} __attribute__ ((packed)) HIDDKeyboardDriverConfigurationDescriptors;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
extern void HIDDKeyboard_Initialize(USBDDriver * pUsbd,uint8_t bInterfaceNb);
extern void HIDDKeyboard_ConfigureFunction( USBGenericDescriptor * pDescriptors, uint16_t wLength);
extern uint32_t HIDDKeyboard_RequestHandler( const USBGenericRequest *request);
extern uint32_t HIDDKeyboard_ChangeKeys(
uint8_t *pressedKeys,
uint8_t pressedKeysSize,
uint8_t *releasedKeys,
uint8_t releasedKeysSize);
extern void HIDDKeyboard_RemoteWakeUp(void);
extern void HIDDKeyboardCallbacks_LedsChanged(
uint8_t numLockStatus,
uint8_t capsLockStatus,
uint8_t scrollLockStatus);
extern void HIDDKeyboardInputReport_Initialize(HIDDKeyboardInputReport *report);
extern void HIDDKeyboardInputReport_PressStandardKey( HIDDKeyboardInputReport *report, uint8_t key ) ;
extern void HIDDKeyboardInputReport_ReleaseStandardKey( HIDDKeyboardInputReport *report, uint8_t key ) ;
extern void HIDDKeyboardInputReport_PressModifierKey( HIDDKeyboardInputReport *report, uint8_t key);
extern void HIDDKeyboardInputReport_ReleaseModifierKey( HIDDKeyboardInputReport *report, uint8_t key);
extern void HIDDKeyboardOutputReport_Initialize( HIDDKeyboardOutputReport *report);
extern uint8_t HIDDKeyboardOutputReport_GetNumLockStatus( const HIDDKeyboardOutputReport *report);
extern uint8_t HIDDKeyboardOutputReport_GetCapsLockStatus( const HIDDKeyboardOutputReport *report);
extern uint8_t HIDDKeyboardOutputReport_GetScrollLockStatus( const HIDDKeyboardOutputReport *report);
/**@}*/
#endif /*#ifndef HIDDKEYBOARD_H*/

View File

@@ -0,0 +1,125 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* Definition of methods for using a HID keyboard device driver.
*
* \section 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
/** \addtogroup usbd_hid_key
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include <USBDescriptors.h>
#include <USBRequests.h>
#include <HIDDescriptors.h>
#include <HIDDKeyboard.h>
#include <USBDDriver.h>
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
extern void HIDDKeyboardDriver_Initialize(
const USBDDriverDescriptors *pDescriptors);
extern void HIDDKeyboardDriver_ConfigurationChangedHandler(
uint8_t cfgnum);
extern void HIDDKeyboardDriver_RequestHandler(
const USBGenericRequest *request);
/**
* 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.
*/
static inline uint32_t HIDDKeyboardDriver_ChangeKeys(
uint8_t *pressedKeys,
uint8_t pressedKeysSize,
uint8_t *releasedKeys,
uint8_t releasedKeysSize){
return HIDDKeyboard_ChangeKeys(pressedKeys, pressedKeysSize,
releasedKeys, releasedKeysSize);
}
/**
* Starts a remote wake-up sequence if the host has explicitely enabled it
* by sending the appropriate SET_FEATURE request.
*/
static inline void HIDDKeyboardDriver_RemoteWakeUp(void) {
HIDDKeyboard_RemoteWakeUp();
}
/**@}*/
#endif /*#ifndef HIDDKEYBOARDDRIVER_H*/

View File

@@ -0,0 +1,151 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**\file
*
* \section Purpose
*
* Definition of methods for using a HID mouse device driver.
*
* \section Usage
*
* -# Re-implement the USBDCallbacks_RequestReceived callback to forward
* requests to HIDDMouseDriver_RequestHandler. This is done
* automatically unless the NOAUTOCALLBACK symbol is defined during
* compilation.
* -# Initialize the driver using HIDDMouseDriver_Initialize. The
* USB driver is automatically initialized by this method.
* -# Call the HIDDMouseDriver_ChangePoints method when one or more
* keys are pressed/released.
*/
#ifndef HIDDKEYBOARDDRIVER_H
#define HIDDKEYBOARDDRIVER_H
/** \addtogroup usbd_hid_mouse
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include <USBRequests.h>
#include <HIDDescriptors.h>
#include <HIDRequests.h>
#include <USBDDriver.h>
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** \addtogroup usbd_hid_mouse_button_bitmaps HID Mouse Button bitmaps
* @{
* \section Bits
* - HIDDMouse_LEFT_BUTTON
* - HIDDMouse_RIGHT_BUTTON
* - HIDDMouse_MIDDLE_BUTTON
*/
/** Left mouse button */
#define HIDDMouse_LEFT_BUTTON (1 << 0)
/** Right mouse button */
#define HIDDMouse_RIGHT_BUTTON (1 << 1)
/** Middle mouse button */
#define HIDDMouse_MIDDLE_BUTTON (1 << 2)
/** @}*/
/** Size of the report descriptor in bytes. */
#define HIDDMouseDriver_REPORTDESCRIPTORSIZE 50
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef HIDDMouseDriverConfigurationDescriptors
* \brief List of descriptors that make up the configuration descriptors of a
* device using the HID Mouse driver.
*/
typedef struct _HIDDMouseDriverConfigurationDescriptors {
/** Configuration descriptor. */
USBConfigurationDescriptor configuration;
/** Interface descriptor. */
USBInterfaceDescriptor interface;
/** HID descriptor. */
HIDDescriptor1 hid;
/** Interrupt IN endpoint descriptor. */
USBEndpointDescriptor interruptIn;
} __attribute__ ((packed)) HIDDMouseDriverConfigurationDescriptors;
/**
* \typedef HIDDMouseInputReport
* \brief HID input report data struct used by the Mouse driver to notify the
* host of pressed keys.
*/
typedef struct _HIDDMouseInputReport {
uint8_t bmButtons; /**< Bitmap state of three mouse buttons. */
int8_t bX; /**< Pointer displacement along the X axis. */
int8_t bY; /**< Pointer displacement along the Y axis. */
} __attribute__ ((packed)) HIDDMouseInputReport; /* GCC */
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
extern void HIDDMouseDriver_Initialize(const USBDDriverDescriptors *pDescriptors);
extern void HIDDMouseDriver_ConfigurationChangedHandler(uint8_t cfgnum);
extern void HIDDMouseDriver_RequestHandler(const USBGenericRequest *request);
extern uint8_t HIDDMouseDriver_ChangePoints(uint8_t bmButtons,
int8_t deltaX,
int8_t deltaY);
extern void HIDDMouseDriver_RemoteWakeUp(void);
/**@}*/
#endif /*#ifndef HIDDKEYBOARDDRIVER_H */

View File

@@ -0,0 +1,141 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
*\file
*
*\section Purpose
*
*Definition of methods for using a HID transfer %device driver.
*
*\section Usage
*
*-# Re-implement the USBDCallbacks_RequestReceived callback to forward
* requests to HIDDTransferDriver_RequestHandler. This is done
* automatically unless the NOAUTOCALLBACK symbol is defined during
* compilation.
*-# Initialize the driver using HIDDTransferDriver_Initialize. The
* USB driver is automatically initialized by this method.
*-# Call the HIDDTransferDriver_Write method when sendint data to host.
*-# Call the HIDDTransferRead, HIDDTransferReadReport when checking and getting
* received data from host.
*/
#ifndef HIDDKEYBOARDDRIVER_H
#define HIDDKEYBOARDDRIVER_H
/** \addtogroup usbd_hid_tran
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include <USBDescriptors.h>
#include <HIDDescriptors.h>
#include <USBRequests.h>
#include <USBD.h>
#include <USBDDriver.h>
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** Size of the input and output report, in bytes */
#define HIDDTransferDriver_REPORTSIZE 32
/** Size of the report descriptor, in bytes */
#define HIDDTransferDriver_REPORTDESCRIPTORSIZE 32
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef HIDDTransferDriverConfigurationDescriptors
* \brief List of descriptors that make up the configuration descriptors of a
* device using the HID Transfer driver.
*/
typedef struct _HIDDTransferDriverConfigurationDescriptors {
/** Configuration descriptor. */
USBConfigurationDescriptor configuration;
/** Interface descriptor. */
USBInterfaceDescriptor interface;
/** HID descriptor. */
HIDDescriptor1 hid;
/** Interrupt IN endpoint descriptor. */
USBEndpointDescriptor interruptIn;
/** Interrupt OUT endpoint descriptor. */
USBEndpointDescriptor interruptOut;
} __attribute__ ((packed)) HIDDTransferDriverConfigurationDescriptors;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
extern void HIDDTransferDriver_Initialize(
const USBDDriverDescriptors * pDescriptors);
extern void HIDDTransferDriver_ConfigurationChangedHandler(uint8_t cfgnum);
extern void HIDDTransferDriver_RequestHandler(
const USBGenericRequest *request);
extern uint16_t HIDDTransferDriver_Read(void *pData,
uint32_t dLength);
extern uint16_t HIDDTransferDriver_ReadReport(void *pData,
uint32_t dLength);
extern uint8_t HIDDTransferDriver_Write(const void *pData,
uint32_t size,
TransferCallback callback,
void *pArg);
extern void HIDDTransferDriver_RemoteWakeUp(void);
/**@}*/
#endif /*#ifndef HIDDKEYBOARDDRIVER_H*/

View File

@@ -0,0 +1,229 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/**\file
*
* \section Purpose
*
* Definitions used for declaring the descriptors of a HID device.
*
*/
#ifndef _HIDDESCRIPTORS_H_
#define _HIDDESCRIPTORS_H_
/** \addtogroup usb_hid
*@{
*/
/*----------------------------------------------------------------------------
* Includes
*----------------------------------------------------------------------------*/
#include <stdint.h>
#include "HIDReports.h"
#include "HIDUsages.h"
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** \addtogroup usb_hid_device_descriptor_codes HID Device Descriptor Codes
* @{
* This page lists HID device class, subclass and protocol codes.
*
* \section 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
/** @}*/
/** \addtogroup usb_hid_interface_descriptor_codes HID Interface Descriptor Codes
* @{
* This page lists HID Interface class, subclass and protocol codes.
*
* \section 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
/** @}*/
/** \addtogroup usb_hid_ver HID Release Numbers
* @{
* - \ref HIDDescriptor_HID1_11
*/
/** Identifies version 1.11 of the HID specification. */
#define HIDDescriptor_HID1_11 0x0111
/** @}*/
/** \addtogroup usb_descriptors_types HID Descriptors Types
* @{
*
* \section 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
/** @}*/
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef HIDDescriptor
* \brief Identifies the length of type of subordinate descriptors of a HID
* device. This particular type has no subordinate descriptor.
*/
typedef struct _HIDDescriptor {
/** Size of descriptor in bytes. */
uint8_t bLength;
/** Descriptor type (\ref HIDGenericDescriptor_HID). */
uint8_t bDescriptorType;
/** HID class specification release number in BCD format. */
uint16_t bcdHID;
/** Country code of the device if it is localized. */
uint8_t bCountryCode;
/** Number of subordinate descriptors. */
uint8_t bNumDescriptors;
} __attribute__ ((packed)) HIDDescriptor; /* GCC */
/**
* \typedef HIDDescriptor
* \brief Identifies the length of type of subordinate descriptors of a HID
* device. This particular type only supports one subordinate descriptor.
*/
typedef struct _HIDDescriptor1 {
/** Size of descriptor in bytes. */
uint8_t bLength;
/** Descriptor type (\ref HIDGenericDescriptor_HID). */
uint8_t bDescriptorType;
/** HID class specification release number in BCD format. */
uint16_t bcdHID;
/** Country code of the device if it is localized. */
uint8_t bCountryCode;
/** Number of subordinate descriptors. */
uint8_t bNumDescriptors;
/** Type of the first subordinate descriptor. */
uint8_t bDescriptorType0;
/** Size in bytes of the first subordinate descriptor. */
/* uint8_t bDescriptorLength0[2]; */
uint16_t wDescriptorLength0;
} __attribute__ ((packed)) HIDDescriptor1; /* GCC */
/**
* HID Physical Descriptor set 0: specifies the number of additional
* descriptor sets.
*/
typedef struct _HIDPhysicalDescriptor0 {
/** Numeric expression specifying the number of Physical Descriptor sets
Physical Descriptor 0 itself not included */
uint8_t bNumber;
/** Numeric expression identifying the length of each Physical descriptor */
uint8_t bLength[2];
} __attribute__ ((packed)) HIDPhysicalDescriptor0; /* GCC */
/**
* HID Physical information
*/
typedef union _HIDPhysicalInfo {
/** Bits specifying physical information: 7..5 Bias, 4..0 Preference */
uint8_t bData;
struct {
uint8_t Preference:5, /**< 0=Most preferred */
Bias:3; /**< indicates which hand the descriptor
set is characterizing */
} sPhysicalInfo;
} HIDPhysicalInfo;
/**
* HID Physical Descriptor
*/
typedef struct _HIDPhysicalDescriptor {
/** Designator: indicates which part of the body affects the item */
uint8_t bDesignator;
/** Bits specifying flags:
7..5 Qualifier;
4..0 Effort */
uint8_t bFlags;
} __attribute__ ((packed)) HIDPhysicalDescriptor; /* GCC */
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*----------------------------------------------------------------------------
* Functions
*----------------------------------------------------------------------------*/
/**@}*/
#endif /* #ifndef _HIDDESCRIPTORS_H_ */

View File

@@ -0,0 +1,140 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/** \file
*
* \section Purpose
*
* Definitions and methods for USB HID + MSD device implement.
*
* \section Usage
*
* -# Initialize USB function specified driver ( for MSD currently )
* - MSDDFunctionDriver_Initialize()
*
* -# Initialize USB HIDMSD driver and USB driver
* - HIDMSDDDriver_Initialize()
*
* -# Handle and dispach USB requests
* - HIDMSDDDriver_RequestHandler()
*
* -# Try starting a remote wake-up sequence
* - HIDMSDDDriver_RemoteWakeUp()
*/
#ifndef HIDMSDDDRIVER_H
#define HIDMSDDDRIVER_H
/** \addtogroup usbd_composite_hidmsd
*@{
*/
/*---------------------------------------------------------------------------
* Headers
*---------------------------------------------------------------------------*/
#include <USBRequests.h>
#include <HIDDescriptors.h>
#include <MSDescriptors.h>
#include <MSDLun.h>
#include <USBD.h>
#include <USBDDriver.h>
/*---------------------------------------------------------------------------
* Consts
*---------------------------------------------------------------------------*/
/** \addtogroup usbd_hid_msd_desc USB HID(Kbd) + MSD Descriptors define
* @{
*/
/** Number of interfaces of the device */
#define HIDMSDDriverDescriptors_NUMINTERFACE 2
/** Number of the HID (Keyboard) interface. */
#define HIDMSDDriverDescriptors_HID_INTERFACE 0
/** Number of the MSD interface. */
#define HIDMSDDriverDescriptors_MSD_INTERFACE 1
/** @}*/
/*---------------------------------------------------------------------------
* Types
*---------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef HidMsdDriverConfigurationDescriptors
* \brief Configuration descriptor list for a device implementing a
* HID MSD composite driver.
*/
typedef struct _HidMsdDriverConfigurationDescriptors {
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration;
/* --- HID */
USBInterfaceDescriptor hidInterface;
HIDDescriptor1 hid;
USBEndpointDescriptor hidInterruptIn;
USBEndpointDescriptor hidInterruptOut;
/* --- MSD */
/** Mass storage interface descriptor. */
USBInterfaceDescriptor msdInterface;
/** Bulk-out endpoint descriptor. */
USBEndpointDescriptor msdBulkOut;
/** Bulk-in endpoint descriptor. */
USBEndpointDescriptor msdBulkIn;
} __attribute__ ((packed)) HidMsdDriverConfigurationDescriptors;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*---------------------------------------------------------------------------
* Exported functions
*---------------------------------------------------------------------------*/
/* -HIDMSD Composite device */
extern void HIDMSDDriver_Initialize(
const USBDDriverDescriptors *pDescriptors,
MSDLun *pLuns, uint8_t numLuns);
extern void HIDMSDDriver_ConfigurationChangedHandler(uint8_t cfgnum);
extern void HIDMSDDriver_RequestHandler(const USBGenericRequest *request);
extern void HIDMSDDriver_RemoteWakeUp(void);
/**@}*/
#endif //#ifndef HIDMSDDDRIVER_H

View File

@@ -0,0 +1,299 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/**\file
*
* \section Purpose
*
* Definitions used when declaring an HID report descriptors.
*
* \section Usage
*
* Use the definitions provided here when declaring a report descriptor,
* which shall be an uint8_t array.
*/
#ifndef _HIDREPORTS_H_
#define _HIDREPORTS_H_
/** \addtogroup usb_hid
*@{
* \addtogroup usb_hid_report USB HID Report
* @{
*/
/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
#include <stdint.h>
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** \addtogroup usb_hid_item HID Items Definitions
* @{
*/
/** Item size 0 bytes */
#define HIDItemSize_0B 0
/** Item size 1 bytes */
#define HIDItemSize_1B 1
/** Item size 2 bytes */
#define HIDItemSize_2B 2
/** Item size 4 bytes */
#define HIDItemSize_4B 3
/** Item type: Main */
#define HIDItemType_MAIN 0
/** Item type: Global */
#define HIDItemType_GLOBAL 1
/** Item type: Local */
#define HIDItemType_LOCAL 2
/** Item prefix for long items */
#define HIDItem_LONGITEM 0xFE
/** @}*/
/** \addtogroup usb_hid_main HID Main Item Tags
* @{
* This section lists the Main Item Tags defined for HID device.
* ( HID Spec. 6.2.2.4 )
*
* - \ref HIDReport_INPUT
* - \ref HIDReport_FEATURE
* - \ref HIDReport_COLLECTION
* - \ref 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
/** @}*/
/** \addtogroup usb_hid_data HID Items for Data Fields
* @{
* This section 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 )
* - \ref HIDReport_CONSTANT
* - \ref HIDReport_VARIABLE
* - \ref HIDReport_RELATIVE
* - \ref HIDReport_WRAP
* - \ref HIDReport_NONLINEAR
* - \ref HIDReport_NOPREFERRED
* - \ref HIDReport_NULLSTATE
* - \ref HIDReport_VOLATILE
* - \ref 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)
/** @}*/
/** \addtogroup usb_hid_collection HID Collection Items
* @{
* This section lists definitions for HID Collection Items.
* ( HID Spec. 6.2.2.6 )
* - \ref HIDReport_COLLECTION_PHYSICAL
* - \ref HIDReport_COLLECTION_APPLICATION
* - \ref HIDReport_COLLECTION_LOGICAL
* - \ref HIDReport_COLLECTION_REPORT
* - \ref HIDReport_COLLECTION_NAMEDARRAY
* - \ref HIDReport_COLLECTION_USAGESWITCH
* - \ref 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
/** @}*/
/** \addtogroup usb_hid_global HID Global Items
* @{
* This section lists HID Global Items.
* ( HID Spec. 6.2.2.7 )
* - \ref HIDReport_GLOBAL_USAGEPAGE
* - \ref HIDReport_GLOBAL_LOGICALMINIMUM
* - \ref HIDReport_GLOBAL_LOGICALMAXIMUM
* - \ref HIDReport_GLOBAL_PHYSICALMINIMUM
* - \ref HIDReport_GLOBAL_PHYSICALMAXIMUM
* - \ref HIDReport_GLOBAL_UNITEXPONENT
* - \ref HIDReport_GLOBAL_UNIT
* - \ref HIDReport_GLOBAL_REPORTSIZE
* - \ref HIDReport_GLOBAL_REPORTID
* - \ref HIDReport_GLOBAL_REPORTCOUNT
* - \ref HIDReport_GLOBAL_PUSH
* - \ref 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
/** @}*/
/** \addtogroup usb_hid_local HID Local Items
* @{
* This section lists definitions for HID Local Items.
* ( HID Spec. 6.2.2.8 )
* - \ref HIDReport_LOCAL_USAGE
* - \ref HIDReport_LOCAL_USAGEMINIMUM
* - \ref HIDReport_LOCAL_USAGEMAXIMUM
* - \ref HIDReport_LOCAL_DESIGNATORINDEX
* - \ref HIDReport_LOCAL_DESIGNATORMINIMUM
* - \ref HIDReport_LOCAL_DESIGNATORMAXIMUM
* - \ref HIDReport_LOCAL_STRINGINDEX
* - \ref HIDReport_LOCAL_STRINGMINIMUM
* - \ref HIDReport_LOCAL_STRINGMAXIMUM
* - \ref 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
/** @}*/
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/** HID Short Item Header, followed by bSize bytes of data */
typedef struct _HIDShortItem {
uint8_t bSize:2, /**< data size (0, 1, 2 or 4) */
bType:2, /**< fundamental type */
bTag:4; /**< item type */
} HIDShortItem;
/** HID Long Item Header, followed by bDataSize bytes of data */
typedef struct _HIDLongItem {
uint8_t bPrefix; /**< Prefix, 0xFE */
uint8_t bDataSize; /**< data size */
uint16_t bLongItemTag; /**< item type */
} HIDLongItem;
/** HID Report without ID (with one byte data) */
typedef struct _HIDReportNoID {
uint8_t bData[1]; /**< First report data byte */
} HIDReportNoID;
/** HID Report with ID (with one byte data) */
typedef struct _HIDReport {
uint8_t bID; /**< Report ID */
uint8_t bData[1]; /**< First report data byte */
} HIDReport;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*----------------------------------------------------------------------------
* Functions
*----------------------------------------------------------------------------*/
/** @}*/
/**@}*/
#endif /*#ifndef _HIDREPORTS_H_ */

View File

@@ -0,0 +1,154 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/**\file
*
* \section Purpose
*
* Definitions used for declaring the requests of a HID device.
*
* -# 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.
* -# Retrieve the idle rate indicated by a GET_IDLE or SET_IDLE request
* with HIDIdleRequest_GetIdleRate.
*/
#ifndef _HIDREQUESTS_H_
#define _HIDREQUESTS_H_
/** \addtogroup usb_hid
*@{
*/
/*----------------------------------------------------------------------------
* Includes
*----------------------------------------------------------------------------*/
#include <stdint.h>
#include <USBRequests.h>
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** \addtogroup usb_hid_request_codes HID Request Codes
* @{
*
* \section 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
/** @}*/
/** \addtogroup usb_hid_report_types HID Report Types
* @{
* This page lists the types for USB HID Reports.
*
* \section 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
/** @}*/
/** \addtogroup usb_hid_protocol_types HID Protocol Types
* @{
*/
/** Boot Protocol */
#define HIDProtocol_BOOT 0
/** Report Protocol */
#define HIDProtocol_REPORT 1
/** Infinite idle rate.*/
#define HIDIdleRequest_INFINITE 0
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*----------------------------------------------------------------------------
* Functions
*----------------------------------------------------------------------------*/
extern uint8_t HIDReportRequest_GetReportType(
const USBGenericRequest *request);
extern uint8_t HIDReportRequest_GetReportId(
const USBGenericRequest *request);
static inline uint16_t HIDProtocolRequest_GetProtocol(
const USBGenericRequest *request)
{
return USBGenericRequest_GetValue(request);
}
extern uint8_t HIDIdleRequest_GetReportId(
const USBGenericRequest * request);
extern uint8_t HIDIdleRequest_GetIdleRate(
const USBGenericRequest *request);
/**@}*/
#endif /* #define _HIDREQUESTS_H_ */

View File

@@ -0,0 +1,393 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/**\file
*
* \section Purpose
*
* Definitions used for declaring the usages of a HID device.
*
*/
#ifndef _HIDUSAGES_H_
#define _HIDUSAGES_H_
/** \addtogroup usb_hid
*@{
*/
/*----------------------------------------------------------------------------
* Includes
*----------------------------------------------------------------------------*/
#include <stdint.h>
/*----------------------------------------------------------------------------
* Defines
*----------------------------------------------------------------------------*/
/** \addtogroup usb_hid_usage_pages HID Usage Pages' IDs
* @{
* (HUT section 3)
*/
/** ID for the HID Generic Desktop Controls. */
#define HIDUsage_GENERICDESKTOP 1
/** ID for the HID Game Controls. */
#define HIDUsage_GAME 5
/** ID for the HID Generic Device Controls. */
#define HIDUsage_GENERICDEVICE 6
/** ID for the HID Keyboard/Keypad */
#define HIDUsage_KEYBOARD 7
/** ID for the HID LEDs. */
#define HIDUsage_LEDS 8
/** ID for the HID buttons. */
#define HIDUsage_BUTTON 9
/** ID for Bar Code Scanner page. */
#define HIDUsage_BARCODE 0x8C
/** ID for Camera Control Page. */
#define HIDUsage_CAMERA 0x90
/** ID for vendor-defined controls. */
#define HIDUsage_VENDOR 0xFF
/** @}*/
/** \addtogroup usb_hid_genericdesktop_page_id HID GenericDesktop Page ID
* @{
*
* \section ID
* - HIDGenericDesktop_PAGEID
*/
/** ID for the HID generic desktop usage page. */
#define HIDGenericDesktop_PAGEID 0x01
/** @}*/
/** \addtogroup usb_hid_genericdesktop_usages HID GenericDesktop Usages
* @{
*
* \section 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
/** @}*/
/** \addtogroup usb_hid_keypad_page_id HID Keypad Page ID
* @{
* This page lists HID Keypad page ID.
*
* \section ID
* - HIDKeypad_PAGEID
*/
/** Identifier for the HID keypad usage page */
#define HIDKeypad_PAGEID 0x07
/** @}*/
/** \addtogroup usb_hid_alphabetic_keys HID Alphabetic Keys
* @{
*
* \section 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
/** @}*/
/** \addtogroup usb_hid_numeric_keys HID Numeric Keys
* @{
*
* \section 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
/** @}*/
/** \addtogroup usb_hid_special_keys HID Special Keys
* @{
*
* \section 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
/** @}*/
/** \addtogroup usb_hid_modified_keys HID Modified Keys
* @{
*
* \section 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
/** @}*/
/** \addtogroup usb_hid_error_codes HID Error Codes
* @{
*
* \section Codes
* - HIDKeypad_ERRORROLLOVER
* - HIDKeypad_POSTFAIL
* - HIDKeypad_ERRORUNDEFINED
*/
/** Indicates that too many keys have been pressed at the same time. */
#define HIDKeypad_ERRORROLLOVER 1
/** postfail */
#define HIDKeypad_POSTFAIL 2
/** Indicates an undefined error. */
#define HIDKeypad_ERRORUNDEFINED 3
/** @}*/
/** \addtogroup usb_hid_leds_page_id HID LEDs Page ID
* @{
* This page lists the page ID of the HID LEDs usage page.
*
* \section ID
* - HIDLeds_PAGEID
*/
/** ID of the HID LEDs usage page. */
#define HIDLeds_PAGEID 0x08
/** @}*/
/** \addtogroup usb_hid_leds_usage HID LEDs Usages
* @{
* This page lists the Usages of the HID LEDs.
*
* \section 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
/** @}*/
/** \addtogroup usb_hid_buttons_page_id HID BUTTONs Page ID
* @{
*/
/** Identifier for the HID button usage page*/
#define HIDButton_PAGEID 0x09
/** @}*/
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
extern uint8_t HIDKeypad_IsModifierKey(uint8_t key);
/**@}*/
#endif /* #define _HIDUSAGES_H_ */

View File

@@ -0,0 +1,245 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/** \file
* \section Purpose
*
* Mass Storage class definitions.
*
* See
* - <a
* href="http://www.usb.org/developers/devclass_docs/usb_msc_overview_1.2.pdf">
* USB Mass Storage Class Spec. Overview</a>
* - <a href="http://www.usb.org/developers/devclass_docs/usbmassbulk_10.pdf">
* USB Mass Storage Class Bulk-Only Transport</a>
*
* \section Usage
*
* -# Uses "MSD Requests" to check incoming requests from USB Host.
* -# Uses "MSD Subclass Codes" and "MSD Protocol Codes" to fill %device
* interface descriptors for a MSD %device.
* -# Handle the incoming Bulk data with "MSD CBW Definitions" and MSCbw
* structure.
* -# Prepare the outgoing Bulk data with "MSD CSW Definitions" and MSCsw
* structure.
*/
#ifndef MSD_H
#define MSD_H
/** \addtogroup usbd_msd
*@{
*/
/*------------------------------------------------------------------------------
* Includes
*------------------------------------------------------------------------------*/
#include <stdint.h>
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/*
* MSD Requests
* This section lists MSD-specific requests ( Actually for Bulk-only protocol ).
*
* \section Requests
* - MSD_BULK_ONLY_RESET
* - MSD_GET_MAX_LUN
*/
/** Reset the mass storage %device and its associated interface. */
#define MSD_BULK_ONLY_RESET 0xFF
/** Return the maximum LUN number supported by the %device. */
#define MSD_GET_MAX_LUN 0xFE
/** \addtogroup usbd_msd_subclass MSD Subclass Codes
* @{
* This page lists the Subclass Codes for bInterfaceSubClass field.
* (Table 2.1, USB Mass Storage Class Spec. Overview)
*
* \section SubClasses
* - MSD_SUBCLASS_RBC
* - MSD_SUBCLASS_SFF_MCC
* - MSD_SUBCLASS_QIC
* - MSD_SUBCLASS_UFI
* - MSD_SUBCLASS_SFF
* - MSD_SUBCLASS_SCSI
*/
/** Reduced Block Commands (RBC) T10 */
#define MSD_SUBCLASS_RBC 0x01
/** C/DVD devices */
#define MSD_SUBCLASS_SFF_MCC 0x02
/** Tape device */
#define MSD_SUBCLASS_QIC 0x03
/** Floppy disk drive (FDD) device */
#define MSD_SUBCLASS_UFI 0x04
/** Floppy disk drive (FDD) device */
#define MSD_SUBCLASS_SFF 0x05
/** SCSI transparent command set */
#define MSD_SUBCLASS_SCSI 0x06
/** @} */
/** \addtogroup usbd_msd_protocol_codes MSD Protocol Codes
* @{
* This page lists the Transport Protocol codes for MSD.
* (Table 3.1, USB Mass Storage Class Spec. Overview)
*
* \section Protocols
* - MSD_PROTOCOL_CBI_COMPLETION
* - MSD_PROTOCOL_CBI
* - MSD_PROTOCOL_BULK_ONLY
*/
/** Control/Bulk/Interrupt (CBI) Transport (with command complete interrupt) */
#define MSD_PROTOCOL_CBI_COMPLETION 0x00
/** Control/Bulk/Interrupt (CBI) Transport (no command complete interrupt) */
#define MSD_PROTOCOL_CBI 0x01
/** Bulk-Only Transport */
#define MSD_PROTOCOL_BULK_ONLY 0x50
/** @}*/
/** \addtogroup usbd_msd_cbw_def MSD CBW Definitions
* @{
* This page lists the Command Block Wrapper (CBW) definitions.
*
* \section Constants
* - MSD_CBW_SIZE
* - MSD_CBW_SIGNATURE
*
* \section Fields
* - MSD_CBW_DEVICE_TO_HOST
*/
/** Command Block Wrapper Size */
#define MSD_CBW_SIZE 31
/** 'USBC' 0x43425355 */
#define MSD_CBW_SIGNATURE 0x43425355
/** CBW bmCBWFlags field */
#define MSD_CBW_DEVICE_TO_HOST (1 << 7)
/** @}*/
/** \addtogroup usbd_msd_csw_def MSD CSW Definitions
* @{
* This page lists the Command Status Wrapper (CSW) definitions.
*
* \section Constants
* - MSD_CSW_SIZE
* - MSD_CSW_SIGNATURE
*
* \section Command Block Status Values
* (Table 5.3 , USB Mass Storage Class Bulk-Only Transport)
* - MSD_CSW_COMMAND_PASSED
* - MSD_CSW_COMMAND_FAILED
* - MSD_CSW_PHASE_ERROR
*/
/** Command Status Wrapper Size */
#define MSD_CSW_SIZE 13
/** 'USBS' 0x53425355 */
#define MSD_CSW_SIGNATURE 0x53425355
/** Command Passed (good status) */
#define MSD_CSW_COMMAND_PASSED 0
/** Command Failed */
#define MSD_CSW_COMMAND_FAILED 1
/** Phase Error */
#define MSD_CSW_PHASE_ERROR 2
/** @}*/
/*------------------------------------------------------------------------------
* Structures
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Command Block Wrapper (CBW),
* See Table 5.1, USB Mass Storage Class Bulk-Only Transport.
*
* The CBW shall start on a packet boundary and shall end as a
* short packet with exactly 31 (1Fh) bytes transferred.
*------------------------------------------------------------------------------*/
typedef struct {
/** 'USBC' 0x43425355 (little endian) */
uint32_t dCBWSignature;
/** Must be the same as dCSWTag */
uint32_t dCBWTag;
/** Number of bytes transfer */
uint32_t dCBWDataTransferLength;
/** Indicates the directin of the transfer:
* - 0x80=IN=device-to-host;
* - 0x00=OUT=host-to-device
*/
uint8_t bmCBWFlags;
/** bits 0->3: bCBWLUN */
uint8_t bCBWLUN :4,
bReserved1:4; /** reserved */
/** bits 0->4: bCBWCBLength */
uint8_t bCBWCBLength:5,
bReserved2 :3; /** reserved */
/** Command block */
uint8_t pCommand[16];
} MSCbw;
/*------------------------------------------------------------------------------
* Command Status Wrapper (CSW),
* See Table 5.2, USB Mass Storage Class Bulk-Only Transport.
*------------------------------------------------------------------------------*/
typedef struct
{
/** 'USBS' 0x53425355 (little endian) */
uint32_t dCSWSignature;
/** Must be the same as dCBWTag */
uint32_t dCSWTag;
/**
* For Data-Out the device shall report in the dCSWDataResidue the
* difference between the amount of data expected as stated in the
* dCBWDataTransferLength, and the actual amount of data processed by
* the device. For Data-In the device shall report in the dCSWDataResidue
* the difference between the amount of data expected as stated in the
* dCBWDataTransferLength and the actual amount of relevant data sent by
* the device. The dCSWDataResidue shall not exceed the value sent in the
* dCBWDataTransferLength.
*/
uint32_t dCSWDataResidue;
/** Indicates the success or failure of the command. */
uint8_t bCSWStatus;
} MSCsw;
/**@}*/
#endif /*#ifndef MSD_H */

View File

@@ -0,0 +1,256 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/** \file
* \section Purpose
*
* Definitions, structs, functions required by a Mass Storage device driver
* state machine..
*
* \section Usage
*
* - For a USB device:
* -# MSDD_StateMachine is invoked to run the MSD state machine.
*
*-----------------------------------------------------------------------------*/
#ifndef MSDDSTATEMACHINE_H
#define MSDDSTATEMACHINE_H
/** \addtogroup usbd_msd
*@{
*/
/*-----------------------------------------------------------------------------
* Headers
*-----------------------------------------------------------------------------*/
#include "MSD.h"
#include "MSDLun.h"
#include <USBDDriver.h>
#include <USBLib_Trace.h>
/*-----------------------------------------------------------------------------
* Definitions
*-----------------------------------------------------------------------------*/
/** \addtogroup usbd_msd_driver_possible_states MSD Driver Possible states
* @{
*
* - MSDD_STATE_READ_CBW
* - MSDD_STATE_WAIT_CBW
* - MSDD_STATE_PROCESS_CBW
* - MSDD_STATE_WAIT_HALT
* - MSDD_STATE_SEND_CSW
* - MSDD_STATE_WAIT_CSW
* - MSDD_STATE_WAIT_RESET
*/
/** \brief Driver is expecting a command block wrapper */
#define MSDD_STATE_READ_CBW (1 << 0)
/** \brief Driver is waiting for the transfer to finish */
#define MSDD_STATE_WAIT_CBW (1 << 1)
/** \brief Driver is processing the received command */
#define MSDD_STATE_PROCESS_CBW (1 << 2)
/** \brief Driver is halted because pipe halt or wait reset */
#define MSDD_STATE_WAIT_HALT (1 << 3)
/** \brief Driver is starting the transmission of a command status wrapper */
#define MSDD_STATE_SEND_CSW (1 << 4)
/** \brief Driver is waiting for the CSW transmission to finish */
#define MSDD_STATE_WAIT_CSW (1 << 5)
/** \brief Driver is waiting for the MassStorageReset */
#define MSDD_STATE_WAIT_RESET (1 << 6)
/** @}*/
/** \addtogroup usbd_msd_driver_result_codes MSD Driver Result Codes
* @{
* This page lists result codes for MSD functions.
*
* \section Codes
* - MSDD_STATUS_SUCCESS
* - MSDD_STATUS_ERROR
* - MSDD_STATUS_INCOMPLETE
* - MSDD_STATUS_PARAMETER
* - MSDD_STATUS_RW
*/
/** \brief Method was successful */
#define MSDD_STATUS_SUCCESS 0x00
/** \brief There was an error when trying to perform a method */
#define MSDD_STATUS_ERROR 0x01
/** \brief No error was encountered but the application should call the
method again to continue the operation */
#define MSDD_STATUS_INCOMPLETE 0x02
/** \brief A wrong parameter has been passed to the method */
#define MSDD_STATUS_PARAMETER 0x03
/** \brief An error when reading/writing disk (protected or not present) */
#define MSDD_STATUS_RW 0x04
/** @}*/
/** \addtogroup usbd_msd_driver_action_cases MSD Driver Action Cases
* @{
* This page lists actions to perform during the post-processing phase of a
* command.
*
* \section Actions
* - MSDD_CASE_PHASE_ERROR
* - MSDD_CASE_STALL_IN
* - MSDD_CASE_STALL_OUT
*/
/** \brief Indicates that the CSW should report a phase error */
#define MSDD_CASE_PHASE_ERROR (1 << 0)
/** \brief The driver should halt the Bulk IN pipe after the transfer */
#define MSDD_CASE_STALL_IN (1 << 1)
/** \brief The driver should halt the Bulk OUT pipe after the transfer */
#define MSDD_CASE_STALL_OUT (1 << 2)
/** @}*/
/*------------------------------------------------------------------------------ */
/** \addtogroup usbd_msd_driver_xfr_directions MSD Driver Xfr Directions
* @{
* This page lists possible direction values for a data transfer
* - MSDD_DEVICE_TO_HOST
* - MSDD_HOST_TO_DEVICE
* - MSDD_NO_TRANSFER
*/
/** Data transfer from device to host (READ) */
#define MSDD_DEVICE_TO_HOST 0
/** Data transfer from host to device (WRITE) */
#define MSDD_HOST_TO_DEVICE 1
/** No data transfer */
#define MSDD_NO_TRANSFER 2
/** @}*/
/*-----------------------------------------------------------------------------
* Types
*-----------------------------------------------------------------------------*/
/**
* \typedef MSDTransfer
* \brief Structure for holding the result of a USB transfer
* \see MSDDriver_Callback
*/
typedef struct _MSDTransfer {
uint32_t transferred; /** Number of bytes transferred */
uint32_t remaining; /** Number of bytes not transferred */
volatile uint16_t semaphore; /** Semaphore to indicate transfer completion */
uint16_t status; /** Operation result code */
} MSDTransfer;
/**
* \typedef MSDCommandState
* \brief Status of an executing command
* \see MSDCbw
* \see MSDCsw
* \see MSDTransfer
*------------------------------------------------------------------------------*/
typedef struct _MSDCommandState {
MSDTransfer transfer; /**< Current transfer status (USB) */
MSDTransfer disktransfer;/**< Current transfer status (Disk) */
uint32_t length; /**< Remaining length of command */
MSCbw cbw; /**< Received CBW (31 bytes) */
uint8_t state; /**< Current command state */
MSCsw csw; /**< CSW to send (13 bytes) */
uint8_t postprocess; /**< Actions to perform when command is complete */
uint8_t pipeIN; /**< Pipe ID for input */
uint8_t pipeOUT; /**< Pipe ID for output */
} MSDCommandState;
/**
* \typedef MSDDriver
* \brief MSD driver state variables
* \see MSDCommandState
* \see MSDLun
*/
typedef struct _MSDDriver {
/** USB Driver for the %device. */
USBDDriver *pUsbd;
/** LUN list for the %device. */
MSDLun *luns;
/** State of the currently executing command */
MSDCommandState commandState;
/** Associated interface number */
uint8_t interfaceNb;
/** Maximum LUN index */
uint8_t maxLun;
/** Current state of the driver */
uint8_t state;
/** Indicates if the driver is waiting for a reset recovery */
uint8_t waitResetRecovery;
} MSDDriver;
/*-----------------------------------------------------------------------------
* Inline functions
*-----------------------------------------------------------------------------*/
/**
* This function is to be used as a callback for USB or LUN transfers.
* \param transfer Pointer to the transfer structure to update
* \param status Operation result code
* \param transferred Number of bytes transferred by the command
* \param remaining Number of bytes not transferred
*/
static inline void MSDDriver_Callback(MSDTransfer *transfer,
uint8_t status,
uint32_t transferred,
uint32_t remaining)
{
TRACE_DEBUG( "Cbk " ) ;
transfer->semaphore++;
transfer->status = status;
transfer->transferred = transferred;
transfer->remaining = remaining;
}
/*-----------------------------------------------------------------------------
* Exported functions
*-----------------------------------------------------------------------------*/
extern void MSDD_StateMachine(MSDDriver * pMsdDriver);
/**@}*/
#endif /* #define MSDDSTATEMACHINE_H */

View File

@@ -0,0 +1,141 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/** \file
* \section Purpose
*
* Mass storage %device driver implementation.
*
* \section Usage
*
* -# Enable and setup USB related pins (see pio & board.h).
* -# Configure the memory interfaces used for Mass Storage LUNs
* (see memories, MSDLun.h).
* -# Instance the USB device configure descriptor as
* MSDConfigurationDescriptors or MSDConfigurationDescriptorsOTG defined.
* Interface number should be 0.
* -# Configure the USB MSD %driver using MSDDriver_Initialize.
* -# Invoke MSDDriver_StateMachine in main loop to handle all Mass Storage
* operations.
*/
#ifndef MSDDRIVER_H
#define MSDDRIVER_H
/** \addtogroup usbd_msd
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include <stdint.h>
#include <MSDLun.h>
#include <MSD.h>
#include <MSDDStateMachine.h>
#include <MSDFunction.h>
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef MSDConfigurationDescriptors
* \brief List of configuration descriptors used by a Mass Storage device driver.
*/
typedef struct _MSDConfigurationDescriptors {
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration;
/** Mass storage interface descriptor. */
USBInterfaceDescriptor interface;
/** Bulk-out endpoint descriptor. */
USBEndpointDescriptor bulkOut;
/** Bulk-in endpoint descriptor. */
USBEndpointDescriptor bulkIn;
} __attribute__ ((packed)) MSDConfigurationDescriptors;
/**
* \typedef MSDConfigurationDescriptorsOTG
* \brief List of configuration descriptors used by a
* Mass Storage device driver, with OTG support.
*/
typedef struct _MSDConfigurationDescriptorsOTG {
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration;
/* OTG descriptor */
USBOtgDescriptor otgDescriptor;
/** Mass storage interface descriptor. */
USBInterfaceDescriptor interface;
/** Bulk-out endpoint descriptor. */
USBEndpointDescriptor bulkOut;
/** Bulk-in endpoint descriptor. */
USBEndpointDescriptor bulkIn;
} __attribute__ ((packed)) MSDConfigurationDescriptorsOTG;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*------------------------------------------------------------------------------
* Global functions
*------------------------------------------------------------------------------*/
extern void MSDDriver_Initialize(
const USBDDriverDescriptors *pDescriptors,
MSDLun *luns, uint8_t numLuns);
extern void MSDDriver_RequestHandler(
const USBGenericRequest *request);
extern void MSDDriver_ConfigurationChangeHandler(
uint8_t cfgnum);
/**
* State machine for the MSD driver
* \param pMsdDriver Pointer to MSDDriver instance.
*/
static inline void MSDDriver_StateMachine(void) {
MSDFunction_StateMachine();
}
/**@}*/
#endif /* #ifndef MSDDRIVER_H */

View File

@@ -0,0 +1,74 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/** \file
* Mass storage function driver definitions.
*/
#ifndef MSDFUNCTION_H
#define MSDFUNCTION_H
/** \addtogroup usbd_msd
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include <stdint.h>
#include <MSDLun.h>
#include <MSD.h>
#include <MSDDStateMachine.h>
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Global functions
*------------------------------------------------------------------------------*/
extern void MSDFunction_Initialize(
USBDDriver * pUsbd, uint8_t bInterfaceNb,
MSDLun * pLuns, uint8_t numLuns);
extern uint32_t MSDFunction_RequestHandler(
const USBGenericRequest *request);
extern void MSDFunction_Configure(
USBGenericDescriptor * pDescriptors, uint16_t wLength);
extern void MSDFunction_StateMachine(void);
/**@}*/
#endif /* #ifndef MSDDRIVER_H */

View File

@@ -0,0 +1,145 @@
/* ----------------------------------------------------------------------------
* 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 _MSDIOFIFO_H
#define _MSDIOFIFO_H
/** \file
* \addtogroup usbd_msd
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** Idle state, do nothing */
#define MSDIO_IDLE 0
/** Start, to start IO operation */
#define MSDIO_START 1
/** Wait, waiting for IO operation done */
#define MSDIO_WAIT 2
/** Next, to check if the next block can be performed */
#define MSDIO_NEXT 3
/** Pause, to pause the process for buffer full or null */
#define MSDIO_PAUSE 4
/** Abort, to abort the process */
#define MSDIO_ABORT 5
/** Done, finish without error */
#define MSDIO_DONE 6
/** Error, any error happens */
#define MSDIO_ERROR 7
/** FIFO offset before USB transmit start */
/*#define MSDIO_FIFO_OFFSET (4*512) */
/** FIFO trunk size (in each transfer, large amount of data) */
#if !defined(MSD_OP_BUFFER)
#define MSDIO_READ10_CHUNK_SIZE (4*512)
#define MSDIO_WRITE10_CHUNK_SIZE (4*512)
#endif
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/** \brief FIFO buffer for READ/WRITE (disk) operation of a mass storage device */
typedef struct _MSDIOFifo {
/** Pointer to the ring buffer allocated for read/write */
unsigned char * pBuffer;
/** The size of the buffer allocated */
unsigned int bufferSize;
#ifdef MSDIO_FIFO_OFFSET
/** The offset to start USB transfer (READ10) */
unsigned int bufferOffset;
#endif
/** The index of input data (loaded to fifo buffer) */
unsigned int inputNdx;
/** The total size of the loaded data */
unsigned int inputTotal;
/** The index of output data (sent from the fifo buffer) */
unsigned int outputNdx;
/** The total size of the output data */
unsigned int outputTotal;
/** The total size of the data */
unsigned int dataTotal;
/** The size of the block in bytes */
unsigned short blockSize;
#if defined(MSDIO_READ10_CHUNK_SIZE) || defined(MSDIO_WRITE10_CHUNK_SIZE)
/** The size of one chunk */
/** (1 block, or several blocks for large amount data R/W) */
unsigned int chunkSize;
#endif
/** State of input & output */
unsigned char inputState;
unsigned char outputState;
/*- Statistics */
/** Times when fifo has no data to send */
unsigned short nullCnt;
/** Times when fifo can not load more input data */
unsigned short fullCnt;
} MSDIOFifo, *PMSDIOFifo;
/*------------------------------------------------------------------------------
* MACROS
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Increase the index, by defined block size, in the ring buffer
* \param ndx The index to be increased
* \param sectSize The defined block size
* \param bufSize The ring buffer size
*------------------------------------------------------------------------------*/
#define MSDIOFifo_IncNdx(ndx, sectSize, bufSize) \
if ((ndx) >= (bufSize) - (sectSize)) (ndx) = 0; \
else (ndx) += (sectSize)
/*------------------------------------------------------------------------------
* Exported Functions
*------------------------------------------------------------------------------*/
extern void MSDIOFifo_Init(MSDIOFifo *pFifo,
void * pBuffer, unsigned short bufferSize);
/**@}*/
#endif /* _MSDIOFIFO_H */

View File

@@ -0,0 +1,176 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/** \file
* \section Purpose
*
* Logical Unit Number (LUN) used by the Mass Storage driver and the SCSI
* protocol. Represents a logical hard-drive.
*
* \section Usage
* -# Initialize Memory related pins (see pio & board.h).
* -# Initialize a Media instance for the LUN (see memories).
* -# Initlalize the LUN with LUN_Init, and link to the initialized Media.
* -# To read data from the LUN linked media, uses LUN_Read.
* -# To write data to the LUN linked media, uses LUN_Write.
* -# To unlink the media, uses LUN_Eject.
*/
#ifndef MSDLUN_H
#define MSDLUN_H
/** \addtogroup usbd_msd
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include <stdint.h>
#include "memories.h"
#include "SBC.h"
#include "MSDIOFifo.h"
#include "USBD.h"
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** LUN RC: success */
#define LUN_STATUS_SUCCESS 0x00
/** LUN RC: error */
#define LUN_STATUS_ERROR 0x02
/** Media of LUN is removed */
#define LUN_NOT_PRESENT 0x00
/** LUN is ejected by host */
#define LUN_EJECTED 0x01
/** Media of LUN is changed */
#define LUN_CHANGED 0x10
/** LUN Not Ready to Ready transition */
#define LUN_TRANS_READY LUN_CHANGED
/** Media of LUN is ready */
#define LUN_READY 0x11
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/** Mass storage device data flow monitor function type
* \param flowDirection 1 - device to host (READ10)
* 0 - host to device (WRITE10)
* \param dataLength Length of data transferred in bytes.
* \param fifoNullCount Times that FIFO is NULL to wait
* \param fifoFullCount Times that FIFO is filled to wait
*/
typedef void(*MSDLunDataMonitorFunction)(uint8_t flowDirection,
uint32_t dataLength,
uint32_t fifoNullCount,
uint32_t fifoFullCount);
/*------------------------------------------------------------------------------
* Structures
*------------------------------------------------------------------------------*/
/** \brief LUN structure */
typedef struct {
/** Pointer to a SBCInquiryData instance. */
SBCInquiryData *inquiryData;
/** Fifo for USB transfer, must be assigned. */
MSDIOFifo ioFifo;
/** Pointer to Media instance for the LUN. */
Media *media;
/** Pointer to a Monitor Function to analyze the flow of LUN.
* \param flowDirection 1 - device to host (READ10)
* 0 - host to device (WRITE10)
* \param dataLength Length of data transferred in bytes.
* \param fifoNullCount Times that FIFO is NULL to wait
* \param fifoFullCount Times that FIFO is filled to wait
*/
void (*dataMonitor)(uint8_t flowDirection,
uint32_t dataLength,
uint32_t fifoNullCount,
uint32_t fifoFullCount);
/** The start position of the media (blocks) allocated to the LUN. */
uint32_t baseAddress;
/** The size of the media (blocks) allocated to the LUN. */
uint32_t size;
/** Sector size of the media in number of media blocks */
uint16_t blockSize;
/** The LUN can be readonly even the media is writable */
uint8_t protected;
/** The LUN status (Ejected/Changed/) */
uint8_t status;
/** Data for the RequestSense command. */
SBCRequestSenseData requestSenseData;
/** Data for the ReadCapacity command. */
SBCReadCapacity10Data readCapacityData;
} MSDLun;
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
extern void LUN_Init(MSDLun *lun,
Media *media,
uint8_t *ioBuffer,
uint32_t ioBufferSize,
uint32_t baseAddress,
uint32_t size,
uint16_t blockSize,
uint8_t protected,
void (*dataMonitor)(uint8_t flowDirection,
uint32_t dataLength,
uint32_t fifoNullCount,
uint32_t fifoFullCount));
extern uint32_t LUN_Eject(MSDLun *lun);
extern uint32_t LUN_Write(MSDLun *lun,
uint32_t blockAddress,
void *data,
uint32_t length,
TransferCallback callback,
void *argument);
extern uint32_t LUN_Read(MSDLun *lun,
uint32_t blockAddress,
void *data,
uint32_t length,
TransferCallback callback,
void *argument);
/**@}*/
#endif /*#ifndef MSDLUN_H */

View File

@@ -0,0 +1,109 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/** \file
*
* \section ms_dev_desc Device Descriptors
*
* Declaration of constants for using Device Descriptors with a Mass Storage
* driver.
*
* - For a USB device:
* -# When declaring a USBDeviceDescriptor instance, use the Mass Storage
* codes defined in this file (see "MS device codes").
*
* \section ms_if_desc Interface Descriptors
*
* Definition of several constants used when manipulating Mass Storage interface
* descriptors.
*
* - For a USB device:
* -# When declaring an interface descriptor for a Mass Storage device, use
* the class, subclass and protocol codes defined here (see
* "MS interface codes").
*/
#ifndef _MSDESCRIPTORS_H_
#define _MSDESCRIPTORS_H_
/**\addtogroup usb_msd
*@{
*/
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** \addtogroup usbd_ms_device_codes MS device codes
* @{
* This page lists the class, subclass & protocol codes used by a device with
* a Mass Storage driver.
*
* \section Codes
*
* - MSDeviceDescriptor_CLASS
* - MSDeviceDescriptor_SUBCLASS
* - MSDeviceDescriptor_PROTOCOL
*/
/** Class code for a Mass Storage device. */
#define MSDeviceDescriptor_CLASS 0
/** Subclass code for a Mass Storage device. */
#define MSDeviceDescriptor_SUBCLASS 0
/** Protocol code for a Mass Storage device. */
#define MSDeviceDescriptor_PROTOCOL 0
/** @}*/
/** \addtogroup usb_ms_interface_code MS interface codes
* @{
* This page lists the available class, subclass & protocol codes for a Mass
* Storage interface.
*
* \section Codes
*
* - MSInterfaceDescriptor_CLASS
* - MSInterfaceDescriptor_SCSI
* - MSInterfaceDescriptor_BULKONLY
*/
/** Class code for a Mass Storage interface. */
#define MSInterfaceDescriptor_CLASS 0x08
/** Subclass code for a Mass Storage interface using the SCSI protocol. */
#define MSInterfaceDescriptor_SCSI 0x06
/** Protocol code for a Mass Storage interface using Bulk-Only Transport. */
#define MSInterfaceDescriptor_BULKONLY 0x50
/** @}*/
/**@}*/
#endif /* #ifndef _MSDESCRIPTORS_H_ */

View File

@@ -0,0 +1,678 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/** \file
* \section Purpose
*
* SCSI definitions.
*
* \section Usage
*
* -# After command block received, Access and decode the SCSI command block
* with SBCCommand structure.
*/
#ifndef SBC_H
#define SBC_H
/** \addtogroup usbd_msd
*@{
*/
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** \addtogroup usbd_sbc_operation_codes SBC Operation Codes
* @{
* This page lists operation codes of commands described in the SBC-3
* standard.
*
* \note That most commands are actually defined in other standards,
* like SPC-4. Optional commands are not included here.
*
* \see sbc3r07.pdf - Section 5.1 - Table 12
* \see spc4r06.pdf
* \see SBCCommand
*
* \section Codes
* - SBC_INQUIRY
* - SBC_READ_10
* - SBC_READ_CAPACITY_10
* - SBC_REQUEST_SENSE
* - SBC_TEST_UNIT_READY
* - SBC_WRITE_10
*
* \section Optional Codes but required by Windows
* - SBC_PREVENT_ALLOW_MEDIUM_REMOVAL
* - SBC_MODE_SENSE_6
* - SBC_VERIFY_10
* - SBC_READ_FORMAT_CAPACITIES
*/
/** Request information regarding parameters of the target and Logical Unit. */
#define SBC_INQUIRY 0x12
/** Request the transfer data to the host. */
#define SBC_READ_10 0x28
/** Request capacities of the currently installed medium. */
#define SBC_READ_CAPACITY_10 0x25
/** Request that the device server transfer sense data. */
#define SBC_REQUEST_SENSE 0x03
/** Check if the LUN is ready */
#define SBC_TEST_UNIT_READY 0x00
/** Request that the device write the data transferred by the host. */
#define SBC_WRITE_10 0x2A
/** Request that the target enable or disable the removal of the medium in */
/** the Logical Unit. */
#define SBC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1E
/** Report parameters. */
#define SBC_MODE_SENSE_6 0x1A
/** Request that the %device verify the data on the medium. */
#define SBC_VERIFY_10 0x2F
/** Request a list of the possible capacities that can be formatted on medium */
#define SBC_READ_FORMAT_CAPACITIES 0x23
/** @}*/
/** \addtogroup usbd_sbc_periph_quali SBC Periph. Qualifiers
* @{
* This page lists the peripheral qualifier values specified in the INQUIRY
* data
* \see spc4r06.pdf - Section 6.4.2 - Table 83
* \see SBCInquiryData
*
* \section Qualifiers
* - SBC_PERIPHERAL_DEVICE_CONNECTED
* - SBC_PERIPHERAL_DEVICE_NOT_CONNECTED
* - SBC_PERIPHERAL_DEVICE_NOT_SUPPORTED
*/
#define SBC_PERIPHERAL_DEVICE_CONNECTED 0x00
#define SBC_PERIPHERAL_DEVICE_NOT_CONNECTED 0x01
#define SBC_PERIPHERAL_DEVICE_NOT_SUPPORTED 0x03
/** @}*/
/** \addtogroup usbd_sbc_periph_types SBC Periph. Types
* @{
* This page lists peripheral device types specified in the INQUIRY data
* \see spc4r06.pdf - Section 6.4.2 - Table 84
* \see SBCInquiryData
*
* \section Types
* - SBC_DIRECT_ACCESS_BLOCK_DEVICE
* - SBC_SEQUENTIAL_ACCESS_DEVICE
* - SBC_PRINTER_DEVICE
* - SBC_PROCESSOR_DEVICE
* - SBC_WRITE_ONCE_DEVICE
* - SBC_CD_DVD_DEVICE
* - SBC_SCANNER_DEVICE
* - SBC_OPTICAL_MEMORY_DEVICE
* - SBC_MEDIA_CHANGER_DEVICE
* - SBC_COMMUNICATION_DEVICE
* - SBC_STORAGE_ARRAY_CONTROLLER_DEVICE
* - SBC_ENCLOSURE_SERVICES_DEVICE
* - SBC_SIMPLIFIED_DIRECT_ACCESS_DEVICE
* - SBC_OPTICAL_CARD_READER_WRITER_DEVICE
* - SBC_BRIDGE_CONTROLLER_COMMANDS
* - SBC_OBJECT_BASED_STORAGE_DEVICE
*/
#define SBC_DIRECT_ACCESS_BLOCK_DEVICE 0x00
#define SBC_SEQUENTIAL_ACCESS_DEVICE 0x01
#define SBC_PRINTER_DEVICE 0x02
#define SBC_PROCESSOR_DEVICE 0x03
#define SBC_WRITE_ONCE_DEVICE 0x04
#define SBC_CD_DVD_DEVICE 0x05
#define SBC_SCANNER_DEVICE 0x06
#define SBC_OPTICAL_MEMORY_DEVICE 0x07
#define SBC_MEDIA_CHANGER_DEVICE 0x08
#define SBC_COMMUNICATION_DEVICE 0x09
#define SBC_STORAGE_ARRAY_CONTROLLER_DEVICE 0x0C
#define SBC_ENCLOSURE_SERVICES_DEVICE 0x0D
#define SBC_SIMPLIFIED_DIRECT_ACCESS_DEVICE 0x0E
#define SBC_OPTICAL_CARD_READER_WRITER_DEVICE 0x0F
#define SBC_BRIDGE_CONTROLLER_COMMANDS 0x10
#define SBC_OBJECT_BASED_STORAGE_DEVICE 0x11
/** @}*/
/*------------------------------------------------------------------------------ */
/** \brief Version value for the SBC-3 specification */
/** \see spc4r06.pdf - Section 6.4.2 - Table 85 */
#define SBC_SPC_VERSION_4 0x06
/*------------------------------------------------------------------------------ */
/*------------------------------------------------------------------------------ */
/** \brief Values for the TPGS field returned in INQUIRY data */
/** \see spc4r06.pdf - Section 6.4.2 - Table 86 */
#define SBC_TPGS_NONE 0x0
#define SBC_TPGS_ASYMMETRIC 0x1
#define SBC_TPGS_SYMMETRIC 0x2
#define SBC_TPGS_BOTH 0x3
/*------------------------------------------------------------------------------ */
/*------------------------------------------------------------------------------ */
/** \brief Version descriptor value for the SBC-3 specification */
/** \see spc4r06.pdf - Section 6.4.2 - Table 87 */
#define SBC_VERSION_DESCRIPTOR_SBC_3 0x04C0
/*------------------------------------------------------------------------------ */
/** \addtogroup usbd_sbc_secse_codes SBC Sense Response Codes
* @{
* This page lists sense data response codes returned in REQUEST SENSE data
* \see spc4r06.pdf - Section 4.5.1 - Table 12
*
* \section Codes
* - SBC_SENSE_DATA_FIXED_CURRENT
* - SBC_SENSE_DATA_FIXED_DEFERRED
* - SBC_SENSE_DATA_DESCRIPTOR_CURRENT
* - SBC_SENSE_DATA_DESCRIPTOR_DEFERRED
*/
#define SBC_SENSE_DATA_FIXED_CURRENT 0x70
#define SBC_SENSE_DATA_FIXED_DEFERRED 0x71
#define SBC_SENSE_DATA_DESCRIPTOR_CURRENT 0x72
#define SBC_SENSE_DATA_DESCRIPTOR_DEFERRED 0x73
/** @}*/
/** \addtogroup usbd_sbc_sense_keys SBC Sense Keys
* @{
* This page lists sense key values returned in the REQUEST SENSE data
* \see spc4r06.pdf - Section 4.5.6 - Table 27
*
* \section Keys
* - SBC_SENSE_KEY_NO_SENSE
* - SBC_SENSE_KEY_RECOVERED_ERROR
* - SBC_SENSE_KEY_NOT_READY
* - SBC_SENSE_KEY_MEDIUM_ERROR
* - SBC_SENSE_KEY_HARDWARE_ERROR
* - SBC_SENSE_KEY_ILLEGAL_REQUEST
* - SBC_SENSE_KEY_UNIT_ATTENTION
* - SBC_SENSE_KEY_DATA_PROTECT
* - SBC_SENSE_KEY_BLANK_CHECK
* - SBC_SENSE_KEY_VENDOR_SPECIFIC
* - SBC_SENSE_KEY_COPY_ABORTED
* - SBC_SENSE_KEY_ABORTED_COMMAND
* - SBC_SENSE_KEY_VOLUME_OVERFLOW
* - SBC_SENSE_KEY_MISCOMPARE
*/
/** No specific sense key. Successful command. */
#define SBC_SENSE_KEY_NO_SENSE 0x00
/** Command completed succesfully with some recovery action by the %device. */
#define SBC_SENSE_KEY_RECOVERED_ERROR 0x01
/** The device can not be accessed. */
#define SBC_SENSE_KEY_NOT_READY 0x02
/** Command terminated with a error condition that was probably caused by a */
/** flaw in the medium or an error in the recorded data. */
#define SBC_SENSE_KEY_MEDIUM_ERROR 0x03
/** Hardware failure while performing the command or during a self test. */
#define SBC_SENSE_KEY_HARDWARE_ERROR 0x04
/** Illegal parameter found in the command or additional parameters. */
#define SBC_SENSE_KEY_ILLEGAL_REQUEST 0x05
/** Removable medium may have been changed or the %device has been reset. */
#define SBC_SENSE_KEY_UNIT_ATTENTION 0x06
/** Write on a block that is protected. */
#define SBC_SENSE_KEY_DATA_PROTECT 0x07
/** Indicates that a write-once device or a sequential-access device */
/** encountered blank medium or format-defined end-of-data indication while */
/** reading or a write-once device encountered a non-blank medium while writing. */
#define SBC_SENSE_KEY_BLANK_CHECK 0x08
/** Reporting vendor specific conditions. */
#define SBC_SENSE_KEY_VENDOR_SPECIFIC 0x09
/** EXTENDED COPY command was aborted. */
#define SBC_SENSE_KEY_COPY_ABORTED 0x0A
/** Device aborted the command. */
#define SBC_SENSE_KEY_ABORTED_COMMAND 0x0B
/** A buffered peripheral device is overflow. */
#define SBC_SENSE_KEY_VOLUME_OVERFLOW 0x0D
/** The source data did not match the data read from the medium. */
#define SBC_SENSE_KEY_MISCOMPARE 0x0E
/** @}*/
/** \addtogroup usbd_sbc_sense_additionals SBC Sense Additionals
* @{
* This page lists additional sense code values returned in REQUEST SENSE data
* \see spc4r06.pdf - Section 4.5.6 - Table 28
*
* \section Additional Codes
* - SBC_ASC_LOGICAL_UNIT_NOT_READY
* - SBC_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE
* - SBC_ASC_INVALID_FIELD_IN_CDB
* - SBC_ASC_WRITE_PROTECTED
* - SBC_ASC_FORMAT_CORRUPTED
* - SBC_ASC_INVALID_COMMAND_OPERATION_CODE
* - SBC_ASC_TOO_MUCH_WRITE_DATA
* - SBC_ASC_NOT_READY_TO_READY_CHANGE
* - SBC_ASC_MEDIUM_NOT_PRESENT
*/
#define SBC_ASC_LOGICAL_UNIT_NOT_READY 0x04
#define SBC_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x21
#define SBC_ASC_INVALID_FIELD_IN_CDB 0x24
#define SBC_ASC_WRITE_PROTECTED 0x27
#define SBC_ASC_FORMAT_CORRUPTED 0x31
#define SBC_ASC_INVALID_COMMAND_OPERATION_CODE 0x20
#define SBC_ASC_TOO_MUCH_WRITE_DATA 0x26
#define SBC_ASC_NOT_READY_TO_READY_CHANGE 0x28
#define SBC_ASC_MEDIUM_NOT_PRESENT 0x3A
/** @}*/
/*------------------------------------------------------------------------------ */
/** \brief MEDIUM TYPE field value for direct-access block devices */
/** \see sbc3r06.pdf - Section 6.3.1 */
#define SBC_MEDIUM_TYPE_DIRECT_ACCESS_BLOCK_DEVICE 0x00
/*------------------------------------------------------------------------------ */
/*------------------------------------------------------------------------------ */
/** \brief MRIE field values */
/** \see sbc3r06.pdf - Section 7.4.11 - Table 286 */
#define SBC_MRIE_NO_REPORTING 0x00
#define SBC_MRIE_ASYNCHRONOUS 0x01
#define SBC_MRIE_GENERATE_UNIT_ATTENTION 0x02
#define SBC_MRIE_COND_GENERATE_RECOVERED_ERROR 0x03
#define SBC_MRIE_UNCOND_GENERATE_RECOVERED_ERROR 0x04
#define SBC_MRIE_GENERATE_NO_SENSE 0x05
#define SBC_MRIE_ON_REQUEST 0x06
/*------------------------------------------------------------------------------ */
/*------------------------------------------------------------------------------ */
/** \brief Supported mode pages */
/** \see sbc3r06.pdf - Section 6.3.1 - Table 115 */
#define SBC_PAGE_READ_WRITE_ERROR_RECOVERY 0x01
#define SBC_PAGE_INFORMATIONAL_EXCEPTIONS_CONTROL 0x1C
#define SBC_PAGE_RETURN_ALL 0x3F
#define SBC_PAGE_VENDOR_SPECIFIC 0x00
/*------------------------------------------------------------------------------ */
/** \addtogroup usbd_msd_endian_macros MSD Endian Macros
* @{
* This page lists the macros for endianness conversion.
*
* \section Macros
* - WORDB
* - DWORDB
* - STORE_DWORDB
* - STORE_WORDB
*/
/** \brief Converts a byte array to a word value using the big endian format */
#define WORDB(bytes) ((unsigned short) ((bytes[0] << 8) | bytes[1]))
/** \brief Converts a byte array to a dword value using the big endian format */
#define DWORDB(bytes) ((unsigned int) ((bytes[0] << 24) | (bytes[1] << 16) \
| (bytes[2] << 8) | bytes[3]))
/** \brief Stores a dword value in a byte array, in big endian format */
#define STORE_DWORDB(dword, bytes) \
bytes[0] = (unsigned char) (((dword) >> 24) & 0xFF); \
bytes[1] = (unsigned char) (((dword) >> 16) & 0xFF); \
bytes[2] = (unsigned char) (((dword) >> 8) & 0xFF); \
bytes[3] = (unsigned char) ((dword) & 0xFF);
/** \brief Stores a word value in a byte array, in big endian format */
#define STORE_WORDB(word, bytes) \
bytes[0] = (unsigned char) (((word) >> 8) & 0xFF); \
bytes[1] = (unsigned char) ((word) & 0xFF);
/** @}*/
/*------------------------------------------------------------------------------
* Structures
*------------------------------------------------------------------------------*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* \typedef SBCInquiry
* \brief Structure for the INQUIRY command
* \see spc4r06.pdf - Section 6.4.1 - Table 81
*/
typedef struct _SBCInquiry {
unsigned char bOperationCode; /*!< 0x12 : SBC_INQUIRY */
unsigned char isEVPD:1, /*!< Type of requested data */
bReserved1:7; /*!< Reserved bits */
unsigned char bPageCode; /*!< Specifies the VPD to return */
unsigned char pAllocationLength[2]; /*!< Size of host buffer */
unsigned char bControl; /*!< 0x00 */
} __attribute__ ((packed)) SBCInquiry; /* GCC */
/**
* \typedef SBCInquiryData
* \brief Standard INQUIRY data format returned by the device
* \see spc4r06.pdf - Section 6.4.2 - Table 82
*/
typedef struct _SBCInquiryData {
unsigned char bPeripheralDeviceType:5, /*!< Peripheral device type */
bPeripheralQualifier :3; /*!< Peripheral qualifier */
unsigned char bReserved1:7, /*!< Reserved bits */
isRMB :1; /*!< Is media removable ? */
unsigned char bVersion; /*!< SPC version used */
unsigned char bResponseDataFormat:4, /*!< Must be 0x2 */
isHIGHSUP :1, /*!< Hierarchical addressing used ? */
isNORMACA :1, /*!< ACA attribute supported ? */
bObsolete1 :2; /*!< Obsolete bits */
unsigned char bAdditionalLength; /*!< Length of remaining INQUIRY data */
unsigned char isSCCS :1, /*!< Embedded SCC ? */
isACC :1, /*!< Access control coordinator ? */
bTPGS :2, /*!< Target port support group */
is3PC :1, /*!< Third-party copy supported ? */
bReserved2:2, /*!< Reserved bits */
isProtect :1; /*!< Protection info supported ? */
unsigned char bObsolete2:1, /*!< Obsolete bit */
isEncServ :1, /*!< Embedded enclosure service comp? */
isVS :1, /*!< ??? */
isMultiP :1, /*!< Multi-port device ? */
bObsolete3:3, /*!< Obsolete bits */
bUnused1 :1; /*!< Unused feature */
unsigned char bUnused2:6, /*!< Unused features */
isCmdQue:1, /*!< Task management model supported ? */
isVS2 :1; /*!< ??? */
unsigned char pVendorID[8]; /*!< T10 vendor identification */
unsigned char pProductID[16]; /*!< Vendor-defined product ID */
unsigned char pProductRevisionLevel[4];/*!< Vendor-defined product revision */
unsigned char pVendorSpecific[20]; /*!< Vendor-specific data */
unsigned char bUnused3; /*!< Unused features */
unsigned char bReserved3; /*!< Reserved bits */
unsigned short pVersionDescriptors[8]; /*!< Standards the device complies to */
unsigned char pReserved4[22]; /*!< Reserved bytes */
} __attribute__ ((packed)) SBCInquiryData; /* GCC */
/**
* \typedef SBCRead10
* \brief Data structure for the READ (10) command
* \see sbc3r07.pdf - Section 5.7 - Table 34
*/
typedef struct _SBCRead10 {
unsigned char bOperationCode; /*!< 0x28 : SBC_READ_10 */
unsigned char bObsolete1:1, /*!< Obsolete bit */
isFUA_NV:1, /*!< Cache control bit */
bReserved1:1, /*!< Reserved bit */
isFUA:1, /*!< Cache control bit */
isDPO:1, /*!< Cache control bit */
bRdProtect:3; /*!< Protection information to send */
unsigned char pLogicalBlockAddress[4]; /*!< Index of first block to read */
unsigned char bGroupNumber:5, /*!< Information grouping */
bReserved2:3; /*!< Reserved bits */
unsigned char pTransferLength[2]; /*!< Number of blocks to transmit */
unsigned char bControl; /*!< 0x00 */
} __attribute__ ((packed)) SBCRead10; /* GCC */
/**
* \typedef SBCReadCapacity10
* \brief Structure for the READ CAPACITY (10) command
* \see sbc3r07.pdf - Section 5.11.1 - Table 40
*/
typedef struct _SBCReadCapacity10 {
unsigned char bOperationCode; /*!< 0x25 : RBC_READ_CAPACITY */
unsigned char bObsolete1:1, /*!< Obsolete bit */
bReserved1:7; /*!< Reserved bits */
unsigned char pLogicalBlockAddress[4]; /*!< Block to evaluate if PMI is set */
unsigned char pReserved2[2]; /*!< Reserved bytes */
unsigned char isPMI:1, /*!< Partial medium indicator bit */
bReserved3:7; /*!< Reserved bits */
unsigned char bControl; /*!< 0x00 */
} SBCReadCapacity10;
/*------------------------------------------------------------------------------
* \brief Data returned by the device after a READ CAPACITY (10) command
* \see sbc3r07.pdf - Section 5.11.2 - Table 41
*------------------------------------------------------------------------------*/
typedef struct {
unsigned char pLogicalBlockAddress[4]; /*!< Address of last logical block */
unsigned char pLogicalBlockLength[4]; /*!< Length of each logical block */
} SBCReadCapacity10Data;
/*------------------------------------------------------------------------------
* \brief Structure for the REQUEST SENSE command
* \see spc4r06.pdf - Section 6.26 - Table 170
*------------------------------------------------------------------------------*/
typedef struct {
unsigned char bOperationCode; /*!< 0x03 : SBC_REQUEST_SENSE */
unsigned char isDesc :1, /*!< Type of information expected */
bReserved1:7; /*!< Reserved bits */
unsigned char pReserved2[2]; /*!< Reserved bytes */
unsigned char bAllocationLength; /*!< Size of host buffer */
unsigned char bControl; /*!< 0x00 */
} SBCRequestSense;
/*------------------------------------------------------------------------------
* \brief Fixed format sense data returned after a REQUEST SENSE command has
* been received with a DESC bit cleared.
* \see spc4r06.pdf - Section 4.5.3 - Table 26
*------------------------------------------------------------------------------*/
typedef struct {
unsigned char bResponseCode:7, /*!< Sense data format */
isValid :1; /*!< Information field is standard */
unsigned char bObsolete1; /*!< Obsolete byte */
unsigned char bSenseKey :4, /*!< Generic error information */
bReserved1:1, /*!< Reserved bit */
isILI :1, /*!< SSC */
isEOM :1, /*!< SSC */
isFilemark:1; /*!< SSC */
unsigned char pInformation[4]; /*!< Command-specific */
unsigned char bAdditionalSenseLength; /*!< sizeof(SBCRequestSense_data)-8 */
unsigned char pCommandSpecificInformation[4]; /*!< Command-specific */
unsigned char bAdditionalSenseCode; /*!< Additional error information */
unsigned char bAdditionalSenseCodeQualifier; /*!< Further error information */
unsigned char bFieldReplaceableUnitCode; /*!< Specific component code */
unsigned char bSenseKeySpecific:7, /*!< Additional exception info */
isSKSV :1; /*!< Is sense key specific valid? */
unsigned char pSenseKeySpecific[2]; /*!< Additional exception info */
} SBCRequestSenseData;
/**
* \brief SBCTestUnitReady
* Data structure for the TEST UNIT READY command
* \see spc4r06.pdf - Section 6.34 - Table 192
*/
typedef struct _SBCTestUnitReady {
unsigned char bOperationCode; /*!< 0x00 : SBC_TEST_UNIT_READY */
unsigned char pReserved1[4]; /*!< Reserved bits */
unsigned char bControl; /*!< 0x00 */
} __attribute__ ((packed)) SBCTestUnitReady; /* GCC */
/**
* \typedef SBCWrite10
* \brief Structure for the WRITE (10) command
* \see sbc3r07.pdf - Section 5.26 - Table 70
*/
typedef struct _SBCWrite10 {
unsigned char bOperationCode; /*!< 0x2A : SBC_WRITE_10 */
unsigned char bObsolete1:1, /*!< Obsolete bit */
isFUA_NV:1, /*!< Cache control bit */
bReserved1:1, /*!< Reserved bit */
isFUA:1, /*!< Cache control bit */
isDPO:1, /*!< Cache control bit */
bWrProtect:3; /*!< Protection information to send */
unsigned char pLogicalBlockAddress[4]; /*!< First block to write */
unsigned char bGroupNumber:5, /*!< Information grouping */
bReserved2:3; /*!< Reserved bits */
unsigned char pTransferLength[2]; /*!< Number of blocks to write */
unsigned char bControl; /*!< 0x00 */
} SBCWrite10;
/**
* \typedef SBCMediumRemoval
* \brief Structure for the PREVENT/ALLOW MEDIUM REMOVAL command
* \see sbc3r07.pdf - Section 5.5 - Table 30
*/
typedef struct _SBCMediumRemoval {
unsigned char bOperationCode; /*!< 0x1E : SBC_PREVENT_ALLOW_MEDIUM_REMOVAL */
unsigned char pReserved1[3]; /*!< Reserved bytes */
unsigned char bPrevent:2, /*!< Accept/prohibit removal */
bReserved2:6; /*!< Reserved bits */
unsigned char bControl; /*!< 0x00 */
} __attribute__ ((packed)) SBCMediumRemoval; /* GCC */
/**
* \typedef SBCModeSense6
* \brief Structure for the MODE SENSE (6) command
* \see spc4r06 - Section 6.9.1 - Table 98
*/
typedef struct _SBCModeSense6 {
unsigned char bOperationCode; /*!< 0x1A : SBC_MODE_SENSE_6 */
unsigned char bReserved1:3, /*!< Reserved bits */
isDBD:1, /*!< Disable block descriptors bit */
bReserved2:4; /*!< Reserved bits */
unsigned char bPageCode:6, /*!< Mode page to return */
bPC:2; /*!< Type of parameter values to return */
unsigned char bSubpageCode; /*!< Mode subpage to return */
unsigned char bAllocationLength; /*!< Host buffer allocated size */
unsigned char bControl; /*!< 0x00 */
} __attribute__ ((packed)) SBCModeSense6; /* GCC */
/**
* \typedef SBCModeParameterHeader6
* \brief Header for the data returned after a MODE SENSE (6) command
* \see spc4r06.pdf - Section 7.4.3 - Table 268
*/
typedef struct _SBCModeParameterHeader6 {
unsigned char bModeDataLength; /*!< Length of mode data to follow */
unsigned char bMediumType; /*!< Type of medium (SBC_MEDIUM_TYPE_DIRECT_ACCESS_BLOCK_DEVICE) */
unsigned char bReserved1:4, /*!< Reserved bits */
isDPOFUA:1, /*!< DPO/FUA bits supported ? */
bReserved2:2, /*!< Reserved bits */
isWP:1; /*!< Is medium write-protected ? */
unsigned char bBlockDescriptorLength; /*!< Length of all block descriptors */
} __attribute__ ((packed)) SBCModeParameterHeader6; /* GCC */
/**
* \typedef SBCInformationalExceptionsControl
* \brief Informational exceptions control mode page
* \see spc4r06.pdf - Section 7.4.11 - Table 285
*/
typedef struct _SBCInformationalExceptionsControl {
unsigned char bPageCode:6, /*!< 0x1C : SBC_PAGE_INFORMATIONAL_EXCEPTIONS_CONTROL */
isSPF:1, /*!< Page or subpage data format */
isPS:1; /*!< Parameters saveable ? */
unsigned char bPageLength; /*!< Length of page data (0x0A) */
unsigned char isLogErr:1, /*!< Should informational exceptions be logged ? */
isEBackErr:1, /*!< Enable background error bit */
isTest:1, /*!< Create a device test failure ? */
isDExcpt:1, /*!< Disable exception control bit */
isEWasc:1, /*!< Report warnings ? */
isEBF:1, /*!< Enable background function bit */
bReserved1:1, /*!< Reserved bit */
isPerf:1; /*!< Delay acceptable when treating exceptions ? */
unsigned char bMRIE:4, /*!< Method of reporting informational exceptions */
bReserved2:4; /*!< Reserved bits */
unsigned char pIntervalTimer[4]; /*!< Error reporting period */
unsigned char pReportCount[4]; /*!< Maximum number of time a report can be issued */
} __attribute__ ((packed)) SBCInformationalExceptionsControl; /* GCC */
/**
* \typedef SBCReadWriteErrorRecovery
* \brief Read/write error recovery mode page
* \see sbc3r07.pdf - Section 6.3.5 - Table 122
*/
typedef struct _SBCReadWriteErrorRecovery {
unsigned char bPageCode:6, /*!< 0x01 : SBC_PAGE_READ_WRITE_ERROR_RECOVERY */
isSPF:1, /*!< Page or subpage data format */
isPS:1; /*!< Parameters saveable ? */
unsigned char bPageLength; /*!< Length of page data (0x0A) */
unsigned char isDCR:1, /*!< Disable correction bit */
isDTE:1, /*!< Data terminate on error bit */
isPER:1, /*!< Post error bit */
isEER:1, /*!< Enable early recovery bit */
isRC:1, /*!< Read continuous bit */
isTB:1, /*!< Transfer block bit */
isARRE:1, /*!< Automatic read reallocation enabled bit */
isAWRE:1; /*!< Automatic write reallocation enabled bit */
unsigned char bReadRetryCount; /*!< Number of retries when reading */
unsigned char pObsolete1[3]; /*!< Obsolete bytes */
unsigned char bReserved1; /*!< Reserved byte */
unsigned char bWriteRetryCount; /*!< Number of retries when writing */
unsigned char bReserved2; /*!< Reserved byte */
unsigned char pRecoveryTimeLimit[2]; /*!< Maximum time duration for error recovery */
} __attribute__ ((packed)) SBCReadWriteErrorRecovery; /* GCC */
/**
* \typedef SBCCommand
* \brief Generic structure for holding information about SBC commands
* \see SBCInquiry
* \see SBCRead10
* \see SBCReadCapacity10
* \see SBCRequestSense
* \see SBCTestUnitReady
* \see SBCWrite10
* \see SBCMediumRemoval
* \see SBCModeSense6
*/
typedef union _SBCCommand {
unsigned char bOperationCode; /*!< Operation code of the command */
SBCInquiry inquiry; /*!< INQUIRY command */
SBCRead10 read10; /*!< READ (10) command */
SBCReadCapacity10 readCapacity10; /*!< READ CAPACITY (10) command */
SBCRequestSense requestSense; /*!< REQUEST SENSE command */
SBCTestUnitReady testUnitReady; /*!< TEST UNIT READY command */
SBCWrite10 write10; /*!< WRITE (10) command */
SBCMediumRemoval mediumRemoval; /*!< PREVENT/ALLOW MEDIUM REMOVAL command */
SBCModeSense6 modeSense6; /*!< MODE SENSE (6) command */
} SBCCommand;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/**@}*/
#endif /*#ifndef SBC_H */

View File

@@ -0,0 +1,118 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/** \file
* \section Purpose
*
* SCSI commands implementation.
*
* section Usage
*
* -# After a CBW is received from host, use SBC_GetCommandInformation to check
* if the command is supported, and get the command length and type
* information before processing it.
* -# Then SBC_ProcessCommand can be used to handle a valid command, to
* perform the command operations.
* -# SBC_UpdateSenseData is used to update the sense data that will be sent
* to host.
*/
#ifndef SBCMETHODS_H
#define SBCMETHODS_H
/** \addtogroup usbd_msd
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include "SBC.h"
#include "MSDLun.h"
#include "MSDDStateMachine.h"
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** \addtogroup usbd_sbc_command_state SBC Command States
* @{
* This page lists the possible states of a SBC command.
*
* \section States
* - SBC_STATE_READ
* - SBC_STATE_WAIT_READ
* - SBC_STATE_WRITE
* - SBC_STATE_WAIT_WRITE
* - SBC_STATE_NEXT_BLOCK
*/
/** Start of reading bulk data */
#define SBC_STATE_READ 0x01
/** Waiting for the bulk data reading complete */
#define SBC_STATE_WAIT_READ 0x02
/** Read error state */
#define SBC_STATE_READ_ERROR 0x03
/** Start next read block */
#define SBC_STATE_NEXT_READ 0x04
/** Start writing bulk data to host */
#define SBC_STATE_WRITE 0x05
/** Waiting for the bulk data sending complete */
#define SBC_STATE_WAIT_WRITE 0x06
/** Write error state */
#define SBC_STATE_WRITE_ERROR 0x07
/** Start next write block */
#define SBC_STATE_NEXT_WRITE 0x08
/** Start next command block */
#define SBC_STATE_NEXT_BLOCK 0x09
/** @}*/
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
void SBC_UpdateSenseData(SBCRequestSenseData *requestSenseData,
unsigned char senseKey,
unsigned char additionalSenseCode,
unsigned char additionalSenseCodeQualifier);
unsigned char SBC_GetCommandInformation(void *command,
unsigned int *length,
unsigned char *type,
MSDLun *lun);
unsigned char SBC_ProcessCommand(MSDLun *lun,
MSDCommandState *commandState);
/**@}*/
#endif /*#ifndef SBCMETHODS_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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* Collection of methods for using the USB device controller on AT91
* microcontrollers.
*
* \section Usage
*
* Please refer to the corresponding application note.
* - \ref usbd_framework AT91 USB device framework
* - \ref usbd_api USBD API
*
*/
#ifndef USBD_H
#define USBD_H
/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
#include "USBDescriptors.h"
#include "USBRequests.h"
#include "USBLib_Types.h"
#include <stdio.h>
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/* Define attribute */
#if defined ( __CC_ARM ) /* Keil µVision 4 */
#define WEAK __attribute__ ((weak))
#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
#define WEAK __weak
#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */
#define WEAK __attribute__ ((weak))
#endif
/* Define NO_INIT attribute */
#if defined ( __CC_ARM )
#define NO_INIT
#elif defined ( __ICCARM__ )
#define NO_INIT __no_init
#elif defined ( __GNUC__ )
#define NO_INIT
#endif
/** \addtogroup usbd_interface
*@{*/
/**
* \addtogroup usbd_rc USB device API return codes
* @{
* This section lists the return codes for the USB device driver API
* - \ref USBD_STATUS_SUCCESS
* - \ref USBD_STATUS_LOCKED
* - \ref USBD_STATUS_ABORTED
* - \ref USBD_STATUS_RESET
*/
/** Indicates the operation was successful. */
#define USBD_STATUS_SUCCESS USBRC_SUCCESS
/** Endpoint/device is already busy. */
#define USBD_STATUS_LOCKED USBRC_BUSY
/** Operation has been aborted (error or stall). */
#define USBD_STATUS_ABORTED USBRC_ABORTED
/** Operation has been canceled (by user). */
#define USBD_STATUS_CANCELED USBRC_CANCELED
/** Operation has been aborted because the device init/reset/un-configure. */
#define USBD_STATUS_RESET USBRC_RESET
/** Part ot operation successfully done. */
#define USBD_STATUS_PARTIAL_DONE USBRC_PARTIAL_DONE
/** Operation failed because parameter error */
#define USBD_STATUS_INVALID_PARAMETER USBRC_PARAM_ERR
/** Operation failed because in unexpected state */
#define USBD_STATUS_WRONG_STATE USBRC_STATE_ERR
/** Operation failed because SW not supported */
#define USBD_STATUS_SW_NOT_SUPPORTED USBRC_SW_NOT_SUPPORTED
/** Operation failed because HW not supported */
#define USBD_STATUS_HW_NOT_SUPPORTED USBRC_HW_NOT_SUPPORTED
/** @}*/
/** \addtogroup usbd_states USB device states
* @{
* This section lists the device states of the USB device driver.
* - \ref USBD_STATE_SUSPENDED
* - \ref USBD_STATE_ATTACHED
* - \ref USBD_STATE_POWERED
* - \ref USBD_STATE_DEFAULT
* - \ref USBD_STATE_ADDRESS
* - \ref USBD_STATE_CONFIGURED
*/
/** The device is currently suspended. */
#define USBD_STATE_SUSPENDED 0
/** USB cable is plugged into the device. */
#define USBD_STATE_ATTACHED 1
/** Host is providing +5V through the USB cable. */
#define USBD_STATE_POWERED 2
/** Device has been reset. */
#define USBD_STATE_DEFAULT 3
/** The device has been given an address on the bus. */
#define USBD_STATE_ADDRESS 4
/** A valid configuration has been selected. */
#define USBD_STATE_CONFIGURED 5
/** @}*/
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
/**
* \brief Buffer struct used for multi-buffer-listed transfer.
*
* The driver can process 255 bytes of buffers or buffer list window.
*/
typedef struct _USBDTransferBuffer {
/** Pointer to frame buffer */
uint8_t * pBuffer;
/** Size of the frame (up to 64K-1) */
uint16_t size;
/** Bytes transferred */
uint16_t transferred;
/** Bytes in FIFO */
uint16_t buffered;
/** Bytes remaining */
uint16_t remaining;
} USBDTransferBuffer;
#ifdef __ICCARM__ /* IAR*/
#define __attribute__(...) /* IAR*/
#endif /* IAR*/
/**
* \brief Struct used for USBD DMA Link List Transfer Descriptor, must be 16-bytes
* aligned.
*
* (For USB, DMA transfer is linked to EPs and FIFO address is EP defined)
*/
typedef struct _USBDDmaDescriptor {
/** Pointer to Next Descriptor */
void* pNxtDesc;
/** Pointer to data buffer address */
void* pDataAddr;
/** DMA Control setting register value */
uint32_t ctrlSettings:8, /** Control settings */
reserved:8, /** Not used */
bufferLength:16; /** Length of buffer */
/** Loaded to DMA register, OK to modify */
uint32_t used;
} __attribute__((aligned(16))) USBDDmaDescriptor;
#ifdef __ICCARM__ /* IAR*/
#pragma pack() /* IAR*/
#endif /* IAR*/
/**
* Callback used by transfer functions (USBD_Read & USBD_Write) to notify
* that a transaction is complete.
*/
typedef void (*TransferCallback)(void *pArg,
uint8_t status,
uint32_t transferred,
uint32_t remaining);
/**
* Callback used by MBL transfer functions (USBD_Read & USBD_Write) to notify
* that a transaction is complete.
* \param pArg Pointer to callback arguments.
* \param status USBD status.
*/
typedef void (*MblTransferCallback)(void *pArg,
uint8_t status);
/**@}*/
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
//extern void USBD_IrqHandler(void);
extern void USBD_Init(void);
extern void USBD_ConfigureSpeed(uint8_t forceFS);
extern void USBD_Connect(void);
extern void USBD_Disconnect(void);
extern uint8_t USBD_Write(
uint8_t bEndpoint,
const void *pData,
uint32_t size,
TransferCallback callback,
void *pArg);
extern uint8_t USBD_Read(
uint8_t bEndpoint,
void *pData,
uint32_t dLength,
TransferCallback fCallback,
void *pArg);
extern uint8_t USBD_Stall(uint8_t bEndpoint);
extern void USBD_Halt(uint8_t bEndpoint);
extern void USBD_Unhalt(uint8_t bEndpoint);
extern void USBD_ConfigureEndpoint(const USBEndpointDescriptor *pDescriptor);
extern uint8_t USBD_IsHalted(uint8_t bEndpoint);
extern void USBD_RemoteWakeUp(void);
extern void USBD_SetAddress(uint8_t address);
extern void USBD_SetConfiguration(uint8_t cfgnum);
extern uint8_t USBD_GetState(void);
extern uint8_t USBD_IsHighSpeed(void);
extern void USBD_Test(uint8_t bIndex);
extern void USBD_SuspendHandler(void);
extern void USBD_ResumeHandler(void);
extern void USBD_ResetHandler(void);
extern void USBD_RequestHandler(uint8_t bEndpoint,
const USBGenericRequest * pRequest);
extern void USBDCallbacks_Initialized(void);
extern void USBDCallbacks_Reset(void);
extern void USBDCallbacks_Suspended(void);
extern void USBDCallbacks_Resumed(void);
extern void USBDCallbacks_RequestReceived(const USBGenericRequest *request);
#endif /*#ifndef USBD_H*/

View File

@@ -0,0 +1,148 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \section Purpose
*
* USB Device Driver class definition.
*
* \section Usage
*
* -# Instanciate a USBDDriver object and initialize it using
* USBDDriver_Initialize.
* -# When a USB SETUP request is received, forward it to the standard
* driver using USBDDriver_RequestHandler.
* -# Check the Remote Wakeup setting via USBDDriver_IsRemoteWakeUpEnabled.
*/
#ifndef USBDDRIVER_H
#define USBDDRIVER_H
/** \addtogroup usbd_interface
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
/* These headers were introduced in C99 by working group
* ISO/IEC JTC1/SC22/WG14.
*/
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <USBRequests.h>
#include <USBDescriptors.h>
#include <USBLib_Types.h>
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/**
* \typedef USBDDriverDescriptors
* \brief List of all descriptors used by a USB device driver. Each descriptor
* can be provided in two versions: full-speed and high-speed. Devices
* which are not high-speed capable do not need to provided high-speed
* descriptors and the full-speed qualifier & other speed descriptors.
*/
typedef struct _USBDDriverDescriptors {
/** Pointer to the full-speed device descriptor */
const USBDeviceDescriptor *pFsDevice;
/** Pointer to the full-speed configuration descriptor array */
const USBConfigurationDescriptor **pFsConfiguration;
/** Pointer to the full-speed qualifier descriptor */
const USBDeviceQualifierDescriptor *pFsQualifier;
/** Pointer to the full-speed other speed configuration descriptor */
const USBConfigurationDescriptor *pFsOtherSpeed;
/** Pointer to the high-speed device descriptor */
const USBDeviceDescriptor *pHsDevice;
/** Pointer to the high-speed configuration descriptor */
const USBConfigurationDescriptor *pHsConfiguration;
/** Pointer to the high-speed qualifier descriptor */
const USBDeviceQualifierDescriptor *pHsQualifier;
/** Pointer to the high-speed other speed configuration descriptor */
const USBConfigurationDescriptor *pHsOtherSpeed;
/** Pointer to the list of string descriptors */
const uint8_t **pStrings;
/** Number of string descriptors in list */
uint8_t numStrings;
} USBDDriverDescriptors;
/**
* \typedef USBDDriver
* \brief USB device driver structure, holding a list of descriptors identifying
* the device as well as the driver current state.
*/
typedef struct _USBDDriver {
/** List of descriptors used by the device. */
const USBDDriverDescriptors *pDescriptors;
/** Current setting for each interface. */
uint8_t *pInterfaces;
/** Current configuration number (0 -> device is not configured). */
uint8_t cfgnum;
/** Indicates if remote wake up has been enabled by the host. */
uint8_t isRemoteWakeUpEnabled;
/** Features supported by OTG */
uint8_t otg_features_supported;
} USBDDriver;
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
extern USBDDriver *USBD_GetDriver(void);
extern void USBDDriver_Initialize(
USBDDriver *pDriver,
const USBDDriverDescriptors *pDescriptors,
uint8_t *pInterfaces);
extern USBConfigurationDescriptor* USBDDriver_GetCfgDescriptors(
USBDDriver * pDriver,
uint8_t cfgNum);
extern void USBDDriver_RequestHandler(
USBDDriver *pDriver,
const USBGenericRequest *pRequest);
extern uint8_t USBDDriver_IsRemoteWakeUpEnabled(const USBDDriver *pDriver);
extern uint8_t USBDDriver_returnOTGFeatures(const USBDDriver *pDriver);
extern void USBDDriver_clearOTGFeatures(USBDDriver *pDriver);
extern void USBDDriverCallbacks_ConfigurationChanged(uint8_t cfgnum);
extern void USBDDriverCallbacks_InterfaceSettingChanged(uint8_t interface, uint8_t setting);
/**@}*/
#endif /*#ifndef USBDDRIVER_H*/

View File

@@ -0,0 +1,107 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2009, 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 USBD_HAL_H
#define USBD_HAL_H
/**
* \file
*
* This file defines functions for USB Device Hardware Access Level.
*/
/** \addtogroup usbd_hal
*@{*/
/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
/* Introduced in C99 by working group ISO/IEC JTC1/SC22/WG14. */
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "USBD.h"
#include <USBDescriptors.h>
#include <USBRequests.h>
/*----------------------------------------------------------------------------
* Consts
*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------
* Macros
*----------------------------------------------------------------------------*/
/** Get bitmap for an endpoint */
#define bmEP(bEP) (1 << (bEP))
/*----------------------------------------------------------------------------
* Types
*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------
* Exported functoins
*----------------------------------------------------------------------------*/
extern void USBD_HAL_Init(void);
extern void USBD_HAL_Connect(void);
extern void USBD_HAL_Disconnect(void);
extern void USBD_HAL_RemoteWakeUp(void);
extern void USBD_HAL_SetConfiguration(uint8_t cfgnum);
extern void USBD_HAL_SetAddress(uint8_t address);
extern uint8_t USBD_HAL_IsHighSpeed(void);
extern void USBD_HAL_Suspend(void);
extern void USBD_HAL_Activate(void);
extern void USBD_HAL_ResetEPs(uint32_t bmEPs,uint8_t bStatus, uint8_t bKeepCfg);
extern void USBD_HAL_CancelIo(uint32_t bmEPs);
extern uint8_t USBD_HAL_ConfigureEP(const USBEndpointDescriptor * pDescriptor);
extern uint8_t USBD_HAL_SetTransferCallback(uint8_t bEP,
TransferCallback fCallback,
void * pCbData);
extern uint8_t USBD_HAL_SetupMblTransfer(uint8_t bEndpoint,
USBDTransferBuffer * pMbList,
uint16_t mblSize,
uint16_t startOffset);
extern uint8_t USBD_HAL_Write(uint8_t bEndpoint,
const void * pData,
uint32_t dLength);
extern uint8_t USBD_HAL_Read(uint8_t bEndpoint,
void * pData,
uint32_t dLength);
extern uint8_t USBD_HAL_Stall(uint8_t bEP);
extern uint8_t USBD_HAL_Halt(uint8_t bEndpoint,uint8_t ctl);
/**@}*/
#endif // #define USBD_HAL_H

View File

@@ -0,0 +1,552 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/** \file
* \section Purpose
*
* Definitions and methods for USB descriptor structures described by the
* USB specification.
*
* \section Usage
*
*/
#ifndef _USBDESCRIPTORS_H_
#define _USBDESCRIPTORS_H_
/** \addtogroup usb_general
* @{
* \addtogroup usb_descriptor USB Descriptors
* @{
*/
/*---------------------------------------------------------------------------
* Headers
*---------------------------------------------------------------------------*/
/* These headers were introduced in C99 by working group
* ISO/IEC JTC1/SC22/WG14.
*/
#include <stdint.h>
/*---------------------------------------------------------------------------
* Definitions
*---------------------------------------------------------------------------*/
/*--------- Generic Descriptors --------*/
/** \addtogroup usb_desc_type USB Descriptor types
* @{
* This section lists the codes of the usb descriptor types
* - \ref USBGenericDescriptor_DEVICE
* - \ref USBGenericDescriptor_CONFIGURATION
* - \ref USBGenericDescriptor_STRING
* - \ref USBGenericDescriptor_INTERFACE
* - \ref USBGenericDescriptor_ENDPOINT
* - \ref USBGenericDescriptor_DEVICEQUALIFIER
* - \ref USBGenericDescriptor_OTHERSPEEDCONFIGURATION
* - \ref USBGenericDescriptor_INTERFACEPOWER
* - \ref USBGenericDescriptor_OTG
* - \ref USBGenericDescriptor_DEBUG
* - \ref USBGenericDescriptor_INTERFACEASSOCIATION
*/
/** Device descriptor type. */
#define USBGenericDescriptor_DEVICE 1
/** Configuration descriptor type. */
#define USBGenericDescriptor_CONFIGURATION 2
/** String descriptor type. */
#define USBGenericDescriptor_STRING 3
/** Interface descriptor type. */
#define USBGenericDescriptor_INTERFACE 4
/** Endpoint descriptor type. */
#define USBGenericDescriptor_ENDPOINT 5
/** Device qualifier descriptor type. */
#define USBGenericDescriptor_DEVICEQUALIFIER 6
/** Other speed configuration descriptor type. */
#define USBGenericDescriptor_OTHERSPEEDCONFIGURATION 7
/** Interface power descriptor type. */
#define USBGenericDescriptor_INTERFACEPOWER 8
/** On-The-Go descriptor type. */
#define USBGenericDescriptor_OTG 9
/** Debug descriptor type. */
#define USBGenericDescriptor_DEBUG 10
/** Interface association descriptor type. */
#define USBGenericDescriptor_INTERFACEASSOCIATION 11
/** @}*/
/*--------- Device Descriptors --------*/
/** \addtogroup usb_release_number USB release numbers
* @{
* This section lists the codes of USB release numbers.
* - \ref USBDeviceDescriptor_USB2_00
*/
/** The device supports USB 2.00. */
#define USBDeviceDescriptor_USB2_00 0x0200
/** @}*/
/*--------- Configuration Descriptors --------*/
/** \addtogroup usb_attributes USB Device Attributes
* @{
* This section lists the codes of the usb attributes.
* - \ref USBConfigurationDescriptor_BUSPOWERED_NORWAKEUP
* - \ref USBConfigurationDescriptor_SELFPOWERED_NORWAKEUP
* - \ref USBConfigurationDescriptor_BUSPOWERED_RWAKEUP
* - \ref USBConfigurationDescriptor_SELFPOWERED_RWAKEUP
* - \ref USBConfigurationDescriptor_POWER
*/
/** Device is bus-powered and not support remote wake-up. */
#define USBConfigurationDescriptor_BUSPOWERED_NORWAKEUP 0x80
/** Device is self-powered and not support remote wake-up. */
#define USBConfigurationDescriptor_SELFPOWERED_NORWAKEUP 0xC0
/** Device is bus-powered and supports remote wake-up. */
#define USBConfigurationDescriptor_BUSPOWERED_RWAKEUP 0xA0
/** Device is self-powered and supports remote wake-up. */
#define USBConfigurationDescriptor_SELFPOWERED_RWAKEUP 0xE0
/** Calculates the value of the power consumption field given the value in mA.
* \param power The power consumption value in mA
* \return The value that should be set to the field in descriptor
*/
#define USBConfigurationDescriptor_POWER(power) (power / 2)
/** @}*/
/*--------- Endpoint Descriptors --------*/
/** \addtogroup usb_ep_define USB Endpoint definitions
* @{
* This section lists definitions and macro for endpoint descriptors.
* - \ref usb_ep_dir USB Endpoint directions
* - \ref USBEndpointDescriptor_OUT
* - \ref USBEndpointDescriptor_IN
*
* - \ref usb_ep_type USB Endpoint types
* - \ref USBEndpointDescriptor_CONTROL
* - \ref USBEndpointDescriptor_ISOCHRONOUS
* - \ref USBEndpointDescriptor_BULK
* - \ref USBEndpointDescriptor_INTERRUPT
*
* - \ref usb_ep_size USB Endpoint maximun sizes
* - \ref USBEndpointDescriptor_MAXCTRLSIZE_FS
* - \ref USBEndpointDescriptor_MAXCTRLSIZE_HS
* - \ref USBEndpointDescriptor_MAXBULKSIZE_FS
* - \ref USBEndpointDescriptor_MAXBULKSIZE_HS
* - \ref USBEndpointDescriptor_MAXINTERRUPTSIZE_FS
* - \ref USBEndpointDescriptor_MAXINTERRUPTSIZE_HS
* - \ref USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS
* - \ref USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS
*
* - \ref usb_ep_addr USB Endpoint address define
* - \ref USBEndpointDescriptor_ADDRESS
*/
/** \addtogroup usb_ep_dir USB Endpoint directions
* @{
* This section lists definitions of USB endpoint directions.
* - USBEndpointDescriptor_OUT
* - USBEndpointDescriptor_IN
*/
/** Endpoint receives data from the host. */
#define USBEndpointDescriptor_OUT 0
/** Endpoint sends data to the host. */
#define USBEndpointDescriptor_IN 1
/** @}*/
/** \addtogroup usb_ep_type USB Endpoint types
* @{
* This section lists definitions of USB endpoint types.
* - \ref USBEndpointDescriptor_CONTROL
* - \ref USBEndpointDescriptor_ISOCHRONOUS
* - \ref USBEndpointDescriptor_BULK
* - \ref USBEndpointDescriptor_INTERRUPT
*/
/** Control endpoint type. */
#define USBEndpointDescriptor_CONTROL 0
/** Isochronous endpoint type. */
#define USBEndpointDescriptor_ISOCHRONOUS 1
/** Bulk endpoint type. */
#define USBEndpointDescriptor_BULK 2
/** Interrupt endpoint type. */
#define USBEndpointDescriptor_INTERRUPT 3
/** @}*/
/** \addtogroup usb_ep_size USB Endpoint maximun sizes
* @{
* This section lists definitions of USB endpoint maximun sizes.
* - \ref USBEndpointDescriptor_MAXCTRLSIZE_FS
* - \ref USBEndpointDescriptor_MAXCTRLSIZE_HS
* - \ref USBEndpointDescriptor_MAXBULKSIZE_FS
* - \ref USBEndpointDescriptor_MAXBULKSIZE_HS
* - \ref USBEndpointDescriptor_MAXINTERRUPTSIZE_FS
* - \ref USBEndpointDescriptor_MAXINTERRUPTSIZE_HS
* - \ref USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS
* - \ref USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS
*/
/** Maximum size for a full-speed control endpoint. */
#define USBEndpointDescriptor_MAXCTRLSIZE_FS 64
/** Maximum size for a high-speed control endpoint. */
#define USBEndpointDescriptor_MAXCTRLSIZE_HS 64
/** Maximum size for a full-speed bulk endpoint. */
#define USBEndpointDescriptor_MAXBULKSIZE_FS 64
/** Maximum size for a high-speed bulk endpoint. */
#define USBEndpointDescriptor_MAXBULKSIZE_HS 512
/** Maximum size for a full-speed interrupt endpoint. */
#define USBEndpointDescriptor_MAXINTERRUPTSIZE_FS 64
/** Maximum size for a high-speed interrupt endpoint. */
#define USBEndpointDescriptor_MAXINTERRUPTSIZE_HS 1024
/** Maximum size for a full-speed isochronous endpoint. */
#define USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS 1023
/** Maximum size for a high-speed isochronous endpoint. */
#define USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS 1024
/** @}*/
/** \addtogroup usb_ep_addr USB Endpoint address define
* @{
* This section lists macro for USB endpoint address definition.
* - \ref USBEndpointDescriptor_ADDRESS
*/
/**
* Calculates the address of an endpoint given its number and direction
* \param direction USB endpoint direction definition
* \param number USB endpoint number
* \return The value used to set the endpoint descriptor based on input number
* and direction
*/
#define USBEndpointDescriptor_ADDRESS(direction, number) \
(((direction & 0x01) << 7) | (number & 0xF))
/** @}*/
/** @}*/
/*--------- Generic Descriptors --------*/
/** \addtogroup usb_string_descriptor USB String Descriptor Definitions
* @{
* This section lists the codes and macros for USB string descriptor definition.
*
* \par Language IDs
* - USBStringDescriptor_ENGLISH_US
*
* \par String Descriptor Length
* - USBStringDescriptor_LENGTH
*
* \par ASCII to UNICODE convertion
* - USBStringDescriptor_UNICODE
*/
/** Language ID for US english. */
#define USBStringDescriptor_ENGLISH_US 0x09, 0x04
/**
* Calculates the length of a string descriptor given the number of ascii
* characters/language IDs in it.
* \param length The ascii format string length.
* \return The actual data length in bytes.
*/
#define USBStringDescriptor_LENGTH(length) ((length) * 2 + 2)
/**
* Converts an ascii character to its unicode representation.
* \param ascii The ASCII character to convert
* \return A 2-byte-array for the UNICODE based on given ASCII
*/
#define USBStringDescriptor_UNICODE(ascii) (ascii), 0
/** @}*/
/*---------------------------------------------------------------------------
* Types
*---------------------------------------------------------------------------*/
/*
* Function types
*/
typedef uint32_t (*USBDescriptorParseFunction)(void *descriptor, void *parseArg);
/*
* Descriptor structs types
*/
#pragma pack(1)
#if defined ( __CC_ARM ) /* Keil µVision 4 */
#elif defined ( __ICCARM__ ) /* IAR Ewarm 5.41+ */
#define __attribute__(...)
#elif defined ( __GNUC__ ) /* GCC CS3 2009q3-68 */
#endif
/**
\typedef USBGenericDescriptor
\brief Holds the few fields shared by all USB descriptors.
*/
typedef struct _USBGenericDescriptor {
/** Length of the descriptor in bytes. */
uint8_t bLength;
/** Descriptor type. */
uint8_t bDescriptorType;
} __attribute__ ((packed)) USBGenericDescriptor; /* GCC */
/**
* \typedef USBDeviceDescriptor
* \brief USB standard device descriptor structure.
*/
typedef struct _USBDeviceDescriptor {
/** Size of this descriptor in bytes. */
uint8_t bLength;
/** Descriptor type (USBGenericDescriptor_DEVICE). */
uint8_t bDescriptorType;
/** USB specification release number in BCD format. */
uint16_t bcdUSB;
/** Device class code. */
uint8_t bDeviceClass;
/** Device subclass code. */
uint8_t bDeviceSubClass;
/** Device protocol code. */
uint8_t bDeviceProtocol;
/** Maximum packet size of endpoint 0 (in bytes). */
uint8_t bMaxPacketSize0;
/** Vendor ID. */
uint16_t idVendor;
/** Product ID. */
uint16_t idProduct;
/** Device release number in BCD format. */
uint16_t bcdDevice;
/** Index of the manufacturer string descriptor. */
uint8_t iManufacturer;
/** Index of the product string descriptor. */
uint8_t iProduct;
/** Index of the serial number string descriptor. */
uint8_t iSerialNumber;
/** Number of possible configurations for the device. */
uint8_t bNumConfigurations;
} __attribute__ ((packed)) USBDeviceDescriptor; /* GCC */
/**
* \typedef USBOtgDescriptor
* \brief USB On-The-Go descriptor struct.
*/
typedef struct _USBOtgDescriptor {
/** Size of this descriptor in bytes. */
uint8_t bLength;
/** Descriptor type (USBGenericDescriptor_OTG). */
uint8_t bDescriptorType;
/** Attribute Fields D7?: Reserved D1: HNP support D0: SRP support */
uint8_t bmAttributes;
} __attribute__ ((packed)) USBOtgDescriptor; /* GCC */
/**
* \typedef USBDeviceQualifierDescriptor
* \brief Alternate device descriptor indicating the capabilities of the device
* in full-speed, if currently in high-speed; or in high-speed, if it is
* currently in full-speed. Only relevant for devices supporting the
* high-speed mode.
*/
typedef struct _USBDeviceQualifierDescriptor {
/** Size of the descriptor in bytes. */
uint8_t bLength;
/** Descriptor type (USBDESC_DEVICE_QUALIFIER or "USB device types"). */
uint8_t bDescriptorType;
/** USB specification release number (in BCD format). */
uint16_t bcdUSB;
/** Device class code. */
uint8_t bDeviceClass;
/** Device subclass code. */
uint8_t bDeviceSubClass;
/** Device protocol code. */
uint8_t bDeviceProtocol;
/** Maximum packet size of endpoint 0. */
uint8_t bMaxPacketSize0;
/** Number of possible configurations for the device. */
uint8_t bNumConfigurations;
/** Reserved. */
uint8_t bReserved;
} __attribute__ ((packed)) USBDeviceQualifierDescriptor; /* GCC */
/**
* \typedef USBConfigurationDescriptor
* \brief USB standard configuration descriptor structure.
*/
typedef struct _USBConfigurationDescriptor {
/** Size of the descriptor in bytes. */
uint8_t bLength;
/** Descriptor type
(USBDESC_CONFIGURATION of \ref usb_desc_type USB Descriptor types). */
uint8_t bDescriptorType;
/** Length of all descriptors returned along with this configuration
descriptor. */
uint16_t wTotalLength;
/** Number of interfaces in this configuration. */
uint8_t bNumInterfaces;
/** Value for selecting this configuration. */
uint8_t bConfigurationValue;
/** Index of the configuration string descriptor. */
uint8_t iConfiguration;
/** Configuration characteristics. */
uint8_t bmAttributes;
/** Maximum power consumption of the device when in this configuration. */
uint8_t bMaxPower;
} __attribute__ ((packed)) USBConfigurationDescriptor; /* GCC*/
/**
* \typedef USBInterfaceAssociationDescriptor
* \brief
*/
typedef struct _USBInterfaceAssociationDescriptor {
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*/
/**
* \typedef USBInterfaceDescriptor
* \brief USB standard interface descriptor structure.
*/
typedef struct _USBInterfaceDescriptor {
/** Size of the descriptor in bytes. */
uint8_t bLength;
/** Descriptor type (USBGenericDescriptor_INTERFACE). */
uint8_t bDescriptorType;
/** Number of the interface in its configuration. */
uint8_t bInterfaceNumber;
/** Value to select this alternate interface setting. */
uint8_t bAlternateSetting;
/** Number of endpoints used by the inteface (excluding endpoint 0). */
uint8_t bNumEndpoints;
/** Interface class code. */
uint8_t bInterfaceClass;
/** Interface subclass code. */
uint8_t bInterfaceSubClass;
/** Interface protocol code. */
uint8_t bInterfaceProtocol;
/** Index of the interface string descriptor. */
uint8_t iInterface;
} __attribute__ ((packed)) USBInterfaceDescriptor; /* GCC */
/**
* \typedef USBEndpointDescriptor
* \brief USB standard endpoint descriptor structure.
*/
typedef struct _USBEndpointDescriptor {
/** Size of the descriptor in bytes. */
uint8_t bLength;
/** Descriptor type (\ref USBGenericDescriptor_ENDPOINT). */
uint8_t bDescriptorType;
/** Address and direction of the endpoint. */
uint8_t bEndpointAddress;
/** Endpoint type and additional characteristics
(for isochronous endpoints). */
uint8_t bmAttributes;
/** Maximum packet size (in bytes) of the endpoint. */
uint16_t wMaxPacketSize;
/** Polling rate of the endpoint. */
uint8_t bInterval;
} __attribute__ ((packed)) USBEndpointDescriptor; /* GCC*/
#pragma pack()
/*---------------------------------------------------------------------------
* Exported Functions
*---------------------------------------------------------------------------*/
extern uint32_t USBGenericDescriptor_GetLength(
const USBGenericDescriptor *descriptor);
extern uint8_t USBGenericDescriptor_GetType(
const USBGenericDescriptor *descriptor);
extern USBGenericDescriptor *USBGenericDescriptor_GetNextDescriptor(
const USBGenericDescriptor *descriptor);
extern USBGenericDescriptor *USBGenericDescriptor_Parse(
const USBGenericDescriptor * descriptor,
uint32_t totalLength,
USBDescriptorParseFunction parseFunction,
void * parseArg);
extern uint32_t USBConfigurationDescriptor_GetTotalLength(
const USBConfigurationDescriptor *configuration);
extern uint8_t USBConfigurationDescriptor_GetNumInterfaces(
const USBConfigurationDescriptor *configuration);
extern uint8_t USBConfigurationDescriptor_IsSelfPowered(
const USBConfigurationDescriptor *configuration);
extern void USBConfigurationDescriptor_Parse(
const USBConfigurationDescriptor *configuration,
USBInterfaceDescriptor **interfaces,
USBEndpointDescriptor **endpoints,
USBGenericDescriptor **others);
extern uint8_t USBEndpointDescriptor_GetNumber(
const USBEndpointDescriptor *endpoint);
extern uint8_t USBEndpointDescriptor_GetDirection(
const USBEndpointDescriptor *endpoint);
extern uint8_t USBEndpointDescriptor_GetType(
const USBEndpointDescriptor *endpoint);
extern uint16_t USBEndpointDescriptor_GetMaxPacketSize(
const USBEndpointDescriptor *endpoint);
extern uint8_t USBEndpointDescriptor_GetInterval(
const USBEndpointDescriptor *endpoint);
/** @}*/
/**@}*/
#endif /* #ifndef _USBDESCRIPTORS_H_ */

View File

@@ -0,0 +1,213 @@
/* ----------------------------------------------------------------------------
* 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.
* ----------------------------------------------------------------------------
*/
/**
* \file
*
* \par Purpose
*
* Standard output methods for reporting debug information, warnings and
* errors, which can be easily be turned on/off.
*
* \par Usage
* -# Initialize the debug message port in application, for stdio printf().
* -# Uses the TRACE_DEBUG(), TRACE_INFO(), TRACE_WARNING(), TRACE_ERROR()
* TRACE_FATAL() macros to output traces throughout the program.
* -# Each type of trace has a level : Debug 5, Info 4, Warning 3, Error 2
* and Fatal 1. Disable a group of traces by changing the value of
* TRACE_LEVEL during compilation; traces with a level bigger than TRACE_LEVEL
* are not generated. To generate no trace, use the reserved value 0.
* -# Trace disabling can be static or dynamic. If dynamic disabling is selected
* the trace level can be modified in runtime. If static disabling is selected
* the disabled traces are not compiled.
*
* \par traceLevels Trace level description
* -# TRACE_DEBUG (5): Traces whose only purpose is for debugging the program,
* and which do not produce meaningful information otherwise.
* -# TRACE_INFO (4): Informational trace about the program execution. Should
* enable the user to see the execution flow.
* -# TRACE_WARNING (3): Indicates that a minor error has happened. In most case
* it can be discarded safely; it may even be expected.
* -# TRACE_ERROR (2): Indicates an error which may not stop the program execution,
* but which indicates there is a problem with the code.
* -# TRACE_FATAL (1): Indicates a major error which prevents the program from going
* any further.
*/
#ifndef _USBLIB_TRACE_H
#define _USBLIB_TRACE_H
/*
* Headers
*/
#include <stdio.h>
/*
* Global Definitions
*/
/** Softpack Version */
#define USBLIB_VERSION "0.1"
#define TRACE_LEVEL_DEBUG 5
#define TRACE_LEVEL_INFO 4
#define TRACE_LEVEL_WARNING 3
#define TRACE_LEVEL_ERROR 2
#define TRACE_LEVEL_FATAL 1
#define TRACE_LEVEL_NO_TRACE 0
/* By default, all traces are output except the debug one. */
#if !defined(TRACE_LEVEL)
#define TRACE_LEVEL TRACE_LEVEL_INFO
#endif
/* By default, trace level is static (not dynamic) */
#if !defined(DYN_TRACES)
#define DYN_TRACES 0
#endif
#if defined(NOTRACE)
#error "Error: NOTRACE has to be not defined !"
#endif
#undef NOTRACE
#if (DYN_TRACES==0)
#if (TRACE_LEVEL == TRACE_LEVEL_NO_TRACE)
#define NOTRACE
#endif
#endif
/* ------------------------------------------------------------------------------
* Global Macros
* ------------------------------------------------------------------------------
*/
#ifndef DYNTRACE
#define DYNTRACE 0
#endif
/**
* Outputs a formatted string using 'printf' if the log level is high
* enough. Can be disabled by defining TRACE_LEVEL=0 during compilation.
* \param ... Additional parameters depending on formatted string.
*/
#if defined(NOTRACE)
/* Empty macro */
#define TRACE_DEBUG(...) { }
#define TRACE_INFO(...) { }
#define TRACE_WARNING(...) { }
#define TRACE_ERROR(...) { }
#define TRACE_FATAL(...) { while(1); }
#define TRACE_DEBUG_WP(...) { }
#define TRACE_INFO_WP(...) { }
#define TRACE_WARNING_WP(...) { }
#define TRACE_ERROR_WP(...) { }
#define TRACE_FATAL_WP(...) { while(1); }
#elif (DYN_TRACES == 1)
/* Trace output depends on dwTraceLevel value */
#define TRACE_DEBUG(...) { if (dwTraceLevel >= TRACE_LEVEL_DEBUG) { printf("-D- " __VA_ARGS__); } }
#define TRACE_INFO(...) { if (dwTraceLevel >= TRACE_LEVEL_INFO) { printf("-I- " __VA_ARGS__); } }
#define TRACE_WARNING(...) { if (dwTraceLevel >= TRACE_LEVEL_WARNING) { printf("-W- " __VA_ARGS__); } }
#define TRACE_ERROR(...) { if (dwTraceLevel >= TRACE_LEVEL_ERROR) { printf("-E- " __VA_ARGS__); } }
#define TRACE_FATAL(...) { if (dwTraceLevel >= TRACE_LEVEL_FATAL) { printf("-F- " __VA_ARGS__); while(1); } }
#define TRACE_DEBUG_WP(...) { if (dwTraceLevel >= TRACE_LEVEL_DEBUG) { printf(__VA_ARGS__); } }
#define TRACE_INFO_WP(...) { if (dwTraceLevel >= TRACE_LEVEL_INFO) { printf(__VA_ARGS__); } }
#define TRACE_WARNING_WP(...) { if (dwTraceLevel >= TRACE_LEVEL_WARNING) { printf(__VA_ARGS__); } }
#define TRACE_ERROR_WP(...) { if (dwTraceLevel >= TRACE_LEVEL_ERROR) { printf(__VA_ARGS__); } }
#define TRACE_FATAL_WP(...) { if (dwTraceLevel >= TRACE_LEVEL_FATAL) { printf(__VA_ARGS__); while(1); } }
#else
/* Trace compilation depends on TRACE_LEVEL value */
#if (TRACE_LEVEL >= TRACE_LEVEL_DEBUG)
#define TRACE_DEBUG(...) { printf("-D- " __VA_ARGS__); }
#define TRACE_DEBUG_WP(...) { printf(__VA_ARGS__); }
#else
#define TRACE_DEBUG(...) { }
#define TRACE_DEBUG_WP(...) { }
#endif
#if (TRACE_LEVEL >= TRACE_LEVEL_INFO)
#define TRACE_INFO(...) { printf("-I- " __VA_ARGS__); }
#define TRACE_INFO_WP(...) { printf(__VA_ARGS__); }
#else
#define TRACE_INFO(...) { }
#define TRACE_INFO_WP(...) { }
#endif
#if (TRACE_LEVEL >= TRACE_LEVEL_WARNING)
#define TRACE_WARNING(...) { printf("-W- " __VA_ARGS__); }
#define TRACE_WARNING_WP(...) { printf(__VA_ARGS__); }
#else
#define TRACE_WARNING(...) { }
#define TRACE_WARNING_WP(...) { }
#endif
#if (TRACE_LEVEL >= TRACE_LEVEL_ERROR)
#define TRACE_ERROR(...) { printf("-E- " __VA_ARGS__); }
#define TRACE_ERROR_WP(...) { printf(__VA_ARGS__); }
#else
#define TRACE_ERROR(...) { }
#define TRACE_ERROR_WP(...) { }
#endif
#if (TRACE_LEVEL >= TRACE_LEVEL_FATAL)
#define TRACE_FATAL(...) { printf("-F- " __VA_ARGS__); while(1); }
#define TRACE_FATAL_WP(...) { printf(__VA_ARGS__); while(1); }
#else
#define TRACE_FATAL(...) { while(1); }
#define TRACE_FATAL_WP(...) { while(1); }
#endif
#endif
#if defined(USB_NO_DEBUG)
#undef TRACE_DEBUG_WP
#undef TRACE_INFO_WP
#endif
/**
* Exported variables
*/
/** Depending on DYN_TRACES, dwTraceLevel is a modifable runtime variable or a define */
#if !defined(NOTRACE) && (DYN_TRACES == 1)
extern uint32_t dwTraceLevel ;
#endif
#endif /* #ifndef _USBLIB_TRACE_H */

View File

@@ -0,0 +1,65 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/** \file
* Definitions for USB Lib compiling.
*/
#ifndef USBLIB_TYPES_H
#define USBLIB_TYPES_H
/*----------------------------------------------------------------------------
* Defines
*----------------------------------------------------------------------------*/
/** USB status ReturnCode */
typedef enum _USBRC {
USBRC_OK = 0, /**< Operation was successful */
USBRC_SUCCESS = 0, /**< Operation was successful */
/* Bool codes */
USBRC_FALSE = 0, /**< As boolean TRUE */
USBRC_TRUE = 1, /**< As boolean FALSE */
/* Error codes */
USBRC_BUSY, /**< EP/Device is already busy */
USBRC_ABORTED, /**< Operation aborted due to error or stall */
USBRC_CANCELED, /**< Operation canceled by user */
USBRC_RESET, /**< Operation aborted due to init/reset/un-configure */
USBRC_PARTIAL_DONE,/**< Part of operation successfully done */
USBRC_FINISHED, /**< All operation successfully done and terminate */
USBRC_PARAM_ERR, /**< Failed due to parameter error */
USBRC_STATE_ERR, /**< Failed due to state error */
USBRC_ERROR, /**< General error */
USBRC_SW_NOT_SUPPORTED = 0xFD, /**< Failed due to SW not supported */
USBRC_HW_NOT_SUPPORTED = 0xFE /**< Failed due to HW not supported */
} USBRC;
#endif /* #define USBLIB_TYPES_H */

View File

@@ -0,0 +1,354 @@
/* ----------------------------------------------------------------------------
* ATMEL Microcontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2010, 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.
* ----------------------------------------------------------------------------
*/
/** \file
* \section Purpose
*
* Definitions and methods for USB request structures described by the
* USB specification.
*
* \section Usage
*
*/
#ifndef _USBREQUESTS_H_
#define _USBREQUESTS_H_
/** \addtogroup usb_general
* @{
* \addtogroup usb_request USB Requests
* @{
*/
/*---------------------------------------------------------------------------
* Headers
*---------------------------------------------------------------------------*/
/* These headers were introduced in C99 by working group
* ISO/IEC JTC1/SC22/WG14.
*/
#include <stdint.h>
/*---------------------------------------------------------------------------
* Definitions
*---------------------------------------------------------------------------*/
/*----------- Generic Request ------------*/
/** \addtogroup usb_request_define USB Generic Request definitions
* @{
* This section lists the codes of USB generic request.
*
* - \ref usb_request_code USB Request codes
* - \ref USBGenericRequest_GETSTATUS
* - \ref USBGenericRequest_CLEARFEATURE
* - \ref USBGenericRequest_SETFEATURE
* - \ref USBGenericRequest_SETADDRESS
* - \ref USBGenericRequest_GETDESCRIPTOR
* - \ref USBGenericRequest_SETDESCRIPTOR
* - \ref USBGenericRequest_GETCONFIGURATION
* - \ref USBGenericRequest_SETCONFIGURATION
* - \ref USBGenericRequest_GETINTERFACE
* - \ref USBGenericRequest_SETINTERFACE
* - \ref USBGenericRequest_SYNCHFRAME
*
* - \ref usb_request_recipient USB Request Recipients
* - \ref USBGenericRequest_DEVICE
* - \ref USBGenericRequest_INTERFACE
* - \ref USBGenericRequest_ENDPOINT
* - \ref USBGenericRequest_OTHER
*
* - \ref usb_request_type USB Request Types
* - \ref USBGenericRequest_STANDARD
* - \ref USBGenericRequest_CLASS
* - \ref USBGenericRequest_VENDOR
*
* - \ref usb_request_dir USB Request Directions
* - \ref USBGenericRequest_IN
* - \ref USBGenericRequest_OUT
*/
/** \addtogroup usb_request_code USB Request codes
* @{
* This section lists the USB generic request codes.
* - \ref USBGenericRequest_GETSTATUS
* - \ref USBGenericRequest_CLEARFEATURE
* - \ref USBGenericRequest_SETFEATURE
* - \ref USBGenericRequest_SETADDRESS
* - \ref USBGenericRequest_GETDESCRIPTOR
* - \ref USBGenericRequest_SETDESCRIPTOR
* - \ref USBGenericRequest_GETCONFIGURATION
* - \ref USBGenericRequest_SETCONFIGURATION
* - \ref USBGenericRequest_GETINTERFACE
* - \ref USBGenericRequest_SETINTERFACE
* - \ref USBGenericRequest_SYNCHFRAME
*/
/** GET_STATUS request code. */
#define USBGenericRequest_GETSTATUS 0
/** CLEAR_FEATURE request code. */
#define USBGenericRequest_CLEARFEATURE 1
/** SET_FEATURE request code. */
#define USBGenericRequest_SETFEATURE 3
/** SET_ADDRESS request code. */
#define USBGenericRequest_SETADDRESS 5
/** GET_DESCRIPTOR request code. */
#define USBGenericRequest_GETDESCRIPTOR 6
/** SET_DESCRIPTOR request code. */
#define USBGenericRequest_SETDESCRIPTOR 7
/** GET_CONFIGURATION request code. */
#define USBGenericRequest_GETCONFIGURATION 8
/** SET_CONFIGURATION request code. */
#define USBGenericRequest_SETCONFIGURATION 9
/** GET_INTERFACE request code. */
#define USBGenericRequest_GETINTERFACE 10
/** SET_INTERFACE request code. */
#define USBGenericRequest_SETINTERFACE 11
/** SYNCH_FRAME request code. */
#define USBGenericRequest_SYNCHFRAME 12
/** @}*/
/** \addtogroup usb_request_recipient USB Request Recipients
* @{
* This section lists codes of USB request recipients.
* - \ref USBGenericRequest_DEVICE
* - \ref USBGenericRequest_INTERFACE
* - \ref USBGenericRequest_ENDPOINT
* - \ref USBGenericRequest_OTHER
*/
/** Recipient is the whole device. */
#define USBGenericRequest_DEVICE 0
/** Recipient is an interface. */
#define USBGenericRequest_INTERFACE 1
/** Recipient is an endpoint. */
#define USBGenericRequest_ENDPOINT 2
/** Recipient is another entity. */
#define USBGenericRequest_OTHER 3
/** @}*/
/** \addtogroup usb_request_type USB Request Types
* @{
* This section lists codes of USB request types.
* - \ref USBGenericRequest_STANDARD
* - \ref USBGenericRequest_CLASS
* - \ref USBGenericRequest_VENDOR
*/
/** Request is standard. */
#define USBGenericRequest_STANDARD 0
/** Request is class-specific. */
#define USBGenericRequest_CLASS 1
/** Request is vendor-specific. */
#define USBGenericRequest_VENDOR 2
/** @}*/
/** \addtogroup usb_request_dir USB Request Directions
* @{
* This section lists codes of USB request directions.
* - \ref USBGenericRequest_IN
* - \ref USBGenericRequest_OUT
*/
/** Transfer occurs from device to the host. */
#define USBGenericRequest_OUT 0
/** Transfer occurs from the host to the device. */
#define USBGenericRequest_IN 1
/** @}*/
/** @}*/
/*----------- Feature Request ------------*/
/** \addtogroup usb_feature_def USB Feature Request Definitions
* @{
* This section lists codes of USB Feature Request
*
* - \ref usb_feature_sel USB Feature selectors
* - \ref USBFeatureRequest_ENDPOINTHALT
* - \ref USBFeatureRequest_DEVICEREMOTEWAKEUP
* - \ref USBFeatureRequest_TESTMODE
*
* - \ref usb_test_sel USB Test mode selectors
* - \ref USBFeatureRequest_TESTJ
* - \ref USBFeatureRequest_TESTK
* - \ref USBFeatureRequest_TESTSE0NAK
* - \ref USBFeatureRequest_TESTPACKET
* - \ref USBFeatureRequest_TESTFORCEENABLE
* - \ref USBFeatureRequest_TESTSENDZLP
*/
/** \addtogroup usb_feature_sel USB Feature selectors
* @{
* This section lists codes of USB feature selectors.
* - \ref USBFeatureRequest_ENDPOINTHALT
* - \ref USBFeatureRequest_DEVICEREMOTEWAKEUP
* - \ref USBFeatureRequest_TESTMODE
*/
/** Halt feature of an endpoint. */
#define USBFeatureRequest_ENDPOINTHALT 0
/** Remote wake-up feature of the device. */
#define USBFeatureRequest_DEVICEREMOTEWAKEUP 1
/** Test mode of the device. */
#define USBFeatureRequest_TESTMODE 2
/** OTG set feature */
#define USBFeatureRequest_OTG 0x0B
/** OTG b_hnp_enable */
#define USBFeatureRequest_OTG_B_HNP_ENABLE 3
/** OTG a_hnp_support */
#define USBFeatureRequest_OTG_A_HNP_SUPPORT 4
/** OTG a_alt_hnp_support */
#define USBFeatureRequest_OTG_A_ALT_HNP_SUPPORT 5
/** @}*/
/** \addtogroup usb_test_sel USB Test mode selectors
* @{
* This section lists codes of USB high speed test mode selectors.
* - \ref USBFeatureRequest_TESTJ
* - \ref USBFeatureRequest_TESTK
* - \ref USBFeatureRequest_TESTSE0NAK
* - \ref USBFeatureRequest_TESTPACKET
* - \ref USBFeatureRequest_TESTFORCEENABLE
* - \ref USBFeatureRequest_TESTSENDZLP
*/
/** Tests the high-output drive level on the D+ line. */
#define USBFeatureRequest_TESTJ 1
/** Tests the high-output drive level on the D- line. */
#define USBFeatureRequest_TESTK 2
/** Tests the output impedance, low-level output voltage and loading
characteristics. */
#define USBFeatureRequest_TESTSE0NAK 3
/** Tests rise and fall times, eye patterns and jitter. */
#define USBFeatureRequest_TESTPACKET 4
/** Tests the hub disconnect detection. */
#define USBFeatureRequest_TESTFORCEENABLE 5
/** Send a ZLP in Test Mode. */
#define USBFeatureRequest_TESTSENDZLP 6
/** @}*/
/** @}*/
/*---------------------------------------------------------------------------
* Types
*---------------------------------------------------------------------------*/
/*
* Function types
*/
/*
* Descriptor structs types
*/
#ifdef __ICCARM__ /* IAR */
#pragma pack(1) /* IAR */
#define __attribute__(...) /* IAR */
#endif /* IAR */
/**
* Generic USB SETUP request sent over Control endpoints.
*/
typedef struct {
/** Type of request
* \sa usb_request_recipient "USB Request Recipients"
* \sa usb_request_type "USB Request Types"
* \sa usb_request_dir "USB Request Directions" */
uint8_t bmRequestType:8;
/** Request code
* \sa usb_request_code "USB Request Codes" */
uint8_t bRequest:8;
/** Request-specific value parameter. */
uint16_t wValue:16;
/** Request-specific index parameter. */
uint16_t wIndex:16;
/** Expected length (in bytes) of the data phase. */
uint16_t wLength:16;
} USBGenericRequest;
#ifdef __ICCARM__ /* IAR */
#pragma pack() /* IAR */
#endif /* IAR */
/*---------------------------------------------------------------------------
* Exported Functions
*---------------------------------------------------------------------------*/
extern uint8_t USBGenericRequest_GetType(
const USBGenericRequest *request);
extern uint8_t USBGenericRequest_GetRequest(
const USBGenericRequest *request);
extern uint16_t USBGenericRequest_GetValue(
const USBGenericRequest *request);
extern uint16_t USBGenericRequest_GetIndex(
const USBGenericRequest *request);
extern uint16_t USBGenericRequest_GetLength(
const USBGenericRequest *request);
extern uint8_t USBGenericRequest_GetEndpointNumber(
const USBGenericRequest *request);
extern uint8_t USBGenericRequest_GetRecipient(
const USBGenericRequest *request);
extern uint8_t USBGenericRequest_GetDirection(
const USBGenericRequest *request);
extern uint8_t USBGetDescriptorRequest_GetDescriptorType(
const USBGenericRequest *request);
extern uint8_t USBGetDescriptorRequest_GetDescriptorIndex(
const USBGenericRequest *request);
extern uint8_t USBSetAddressRequest_GetAddress(
const USBGenericRequest *request);
extern uint8_t USBSetConfigurationRequest_GetConfiguration(
const USBGenericRequest *request);
extern uint8_t USBInterfaceRequest_GetInterface(
const USBGenericRequest *request);
extern uint8_t USBInterfaceRequest_GetAlternateSetting(
const USBGenericRequest *request);
extern uint8_t USBFeatureRequest_GetFeatureSelector(
const USBGenericRequest *request);
extern uint8_t USBFeatureRequest_GetTestSelector(
const USBGenericRequest *request);
/** @}*/
/**@}*/
#endif /* #ifndef _USBREQUESTS_H_ */