mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-23 16:58:33 +03:00
Removed unused code and header files from atmel lib
Also, remove includes of unused header files in chip.h
This commit is contained in:
@@ -1,70 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
*
|
||||
* This file implements functions for USB AUDIO class feature unit requests.
|
||||
*/
|
||||
|
||||
/** \addtogroup usb_audio
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#include "AUDRequests.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Returns the control selector value indicating the target of a Feature Unit
|
||||
* request.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
* \sa usb_audio_ctrl_sel USB Audio Control selector values
|
||||
*/
|
||||
uint8_t AUDFeatureUnitRequest_GetControl(const USBGenericRequest *request)
|
||||
{
|
||||
return ((USBGenericRequest_GetValue(request) >> 8) & 0xFF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the channel number of a Feature unit which should be altered by the
|
||||
* given request.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
uint8_t AUDFeatureUnitRequest_GetChannel(const USBGenericRequest *request)
|
||||
{
|
||||
return (USBGenericRequest_GetValue(request) & 0xFF);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,67 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
*
|
||||
* This file implements functions for USB AUDIO class requests.
|
||||
*/
|
||||
|
||||
/** \addtogroup usb_audio
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#include "AUDRequests.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Returns the ID of the unit or terminal targetted by an USB audio request.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
uint8_t AUDGenericRequest_GetEntity(const USBGenericRequest *request)
|
||||
{
|
||||
return ((USBGenericRequest_GetIndex(request) >> 8) & 0xFF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ID of the interface targetted by an USB audio request.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
uint8_t AUDGenericRequest_GetInterface(const USBGenericRequest *request)
|
||||
{
|
||||
return (USBGenericRequest_GetIndex(request) & 0xFF);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,71 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
Implementation of the CDCLineCoding class.
|
||||
*/
|
||||
/** \addtogroup usb_cdc
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#include <CDCRequests.h>
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the bitrate, number of stop bits, parity checking and
|
||||
* number of data bits of a CDCLineCoding object.
|
||||
* \param lineCoding Pointer to a CDCLineCoding instance.
|
||||
* \param bitrate Bitrate of the virtual COM connection.
|
||||
* \param stopbits Number of stop bits
|
||||
* (\ref usb_cdc_stop CDC LineCoding StopBits).
|
||||
* \param parity Parity check type
|
||||
* (\ref usb_cdc_parity CDC LineCoding ParityChecking).
|
||||
* \param databits Number of data bits.
|
||||
*/
|
||||
void CDCLineCoding_Initialize(CDCLineCoding *lineCoding,
|
||||
uint32_t bitrate,
|
||||
uint8_t stopbits,
|
||||
uint8_t parity,
|
||||
uint8_t databits)
|
||||
{
|
||||
lineCoding->dwDTERate = bitrate;
|
||||
lineCoding->bCharFormat = stopbits;
|
||||
lineCoding->bParityType = parity;
|
||||
lineCoding->bDataBits = databits;
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
*
|
||||
* Implementation of the CDCSetControlLineStateRequest class.
|
||||
*/
|
||||
|
||||
/** \addtogroup usb_cdc
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#include <CDCRequests.h>
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Notifies if the given request indicates that the DTE signal is present.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
* \return 1 if the DTE signal is present, otherwise 0.
|
||||
*/
|
||||
uint8_t CDCSetControlLineStateRequest_IsDtePresent(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
if ((USBGenericRequest_GetValue(request) & 0x0001) != 0) {
|
||||
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies if the given request indicates that the device carrier should
|
||||
* be activated.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
* \return 1 is the device should activate its carrier, 0 otherwise.
|
||||
*/
|
||||
uint8_t CDCSetControlLineStateRequest_ActivateCarrier(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
if ((USBGenericRequest_GetValue(request) & 0x0002) != 0) {
|
||||
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
Title: HIDIdleRequest implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of the HIDIdleRequest methods.
|
||||
*/
|
||||
|
||||
/**\addtogroup usb_hid
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "HIDRequests.h"
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Indicates the ID of the report targetted by a SET_IDLE or GET_IDLE
|
||||
* request. This value should be 0 if report IDs are not used.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
* \return Requested report ID.
|
||||
*/
|
||||
uint8_t HIDIdleRequest_GetReportId(const USBGenericRequest *request)
|
||||
{
|
||||
return (USBGenericRequest_GetValue(request) & 0xFF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the Idle rate (in milliseconds) indicated by a SET_IDLE
|
||||
* request.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
* \return New idle rate for the report.
|
||||
*/
|
||||
uint8_t HIDIdleRequest_GetIdleRate(const USBGenericRequest *request)
|
||||
{
|
||||
return ((USBGenericRequest_GetValue(request) >> 8) & 0xFF);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,61 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
Title: HIDKeypad implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of HID keypad usage page methods.
|
||||
*/
|
||||
|
||||
/**\addtogroup usb_hid
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "HIDUsages.h"
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Indicates if the given key code is associated with a modified key.
|
||||
* \param key Key code.
|
||||
* \return 1 if the key code represents a modifier key; otherwise 0.
|
||||
*/
|
||||
uint8_t HIDKeypad_IsModifierKey(uint8_t key)
|
||||
{
|
||||
return ((key >= HIDKeypad_LEFTCONTROL) && (key <= HIDKeypad_RIGHTGUI));
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,73 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
Title: HIDReportRequest implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of the HIDReportRequest methods.
|
||||
*/
|
||||
|
||||
/**\addtogroup usb_hid
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "HIDRequests.h"
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Indicates the type of report targetted by a SET_REPORT or GET_REPORT
|
||||
* request.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
* \return Requested report type (see "HID Report Types").
|
||||
*/
|
||||
uint8_t HIDReportRequest_GetReportType(const USBGenericRequest *request)
|
||||
{
|
||||
return ((USBGenericRequest_GetValue(request) >> 8) & 0xFF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates the ID of the report targetted by a SET_REPORT or GET_REPORT
|
||||
* request. This value should be 0 if report IDs are not used.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
* \return Requested report ID.
|
||||
*/
|
||||
uint8_t HIDReportRequest_GetReportId(const USBGenericRequest *request)
|
||||
{
|
||||
return (USBGenericRequest_GetValue(request) & 0xFF);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,234 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_audio_speaker
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <AUDDSpeakerDriver.h>
|
||||
|
||||
#include <AUDDSpeakerPhone.h>
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
#include <AUDRequests.h>
|
||||
|
||||
#include <USBD.h>
|
||||
#include <USBD_HAL.h>
|
||||
#include <USBDDriver.h>
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Internal types
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \brief Audio speaker driver struct.
|
||||
*/
|
||||
typedef struct _AUDDSpeakerDriver {
|
||||
/** Speaker & Phone function */
|
||||
AUDDSpeakerPhone fun;
|
||||
/** Stream instance for speaker */
|
||||
AUDDStream speaker;
|
||||
/** Array for storing the current setting of each interface */
|
||||
uint8_t bAltInterfaces[AUDDSpeakerDriver_NUMINTERFACES];
|
||||
} AUDDSpeakerDriver;
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/** Global USB audio speaker driver instance. */
|
||||
static AUDDSpeakerDriver auddSpeakerDriver;
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Dummy callbacks
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Callback triggerred after the mute or volume status of the channel has been
|
||||
* changed.
|
||||
* \param ec Event code.
|
||||
* \param channel Channel number.
|
||||
* \param pArg Pointer to AUDDStream instance.
|
||||
*/
|
||||
static void AUDDSpeaker_EventCallback(uint32_t ec,
|
||||
uint8_t channel,
|
||||
AUDDStream *pArg)
|
||||
{
|
||||
if (ec == AUDD_EC_MuteChanged) {
|
||||
if (AUDDSpeakerDriver_MuteChanged)
|
||||
AUDDSpeakerDriver_MuteChanged(channel, pArg->bmMute);
|
||||
}
|
||||
else if (ec == AUDD_EC_VolumeChanged) {
|
||||
/* Not supported now */
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes an USB audio speaker device driver, as well as the underlying
|
||||
* USB controller.
|
||||
*/
|
||||
void AUDDSpeakerDriver_Initialize(const USBDDriverDescriptors *pDescriptors)
|
||||
{
|
||||
AUDDSpeakerDriver *pAudd = &auddSpeakerDriver;
|
||||
AUDDSpeakerPhone *pAudf = &pAudd->fun;
|
||||
AUDDStream *pAuds = &pAudd->speaker;
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
AUDDSpeakerPhone_InitializeStream(
|
||||
pAuds, AUDDSpeakerDriver_NUMCHANNELS, 0,
|
||||
(AUDDStreamEventCallback)AUDDSpeaker_EventCallback, pAuds);
|
||||
|
||||
AUDDSpeakerPhone_Initialize(
|
||||
pAudf, pUsbd, pAuds, 0);
|
||||
|
||||
/* Initialize the USB driver */
|
||||
USBDDriver_Initialize(pUsbd,
|
||||
pDescriptors,
|
||||
pAudd->bAltInterfaces);
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the active configuration of device is changed by the
|
||||
* host.
|
||||
* \param cfgnum Configuration number.
|
||||
*/
|
||||
void AUDDSpeakerDriver_ConfigurationChangeHandler(uint8_t cfgnum)
|
||||
{
|
||||
AUDDSpeakerDriver *pAudd = &auddSpeakerDriver;
|
||||
AUDDSpeakerPhone *pAudf = &pAudd->fun;
|
||||
const USBDDriverDescriptors *pDescriptors = pAudf->pUsbd->pDescriptors;
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
|
||||
if (cfgnum > 0) {
|
||||
|
||||
/* Parse endpoints for data & notification */
|
||||
if (USBD_HAL_IsHighSpeed() && pDescriptors->pHsConfiguration)
|
||||
pDesc = (USBConfigurationDescriptor*)pDescriptors->pHsConfiguration;
|
||||
else
|
||||
pDesc = (USBConfigurationDescriptor*)pDescriptors->pFsConfiguration[0];
|
||||
|
||||
AUDDSpeakerPhone_ParseInterfaces(pAudf,
|
||||
(USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the active setting of an interface is changed by the
|
||||
* host. Changes the status of the third LED accordingly.
|
||||
* \param interface Interface number.
|
||||
* \param setting Newly active setting.
|
||||
*/
|
||||
void AUDDSpeakerDriver_InterfaceSettingChangedHandler(uint8_t interface,
|
||||
uint8_t setting)
|
||||
{
|
||||
AUDDSpeakerDriver *pSpeakerd = &auddSpeakerDriver;
|
||||
AUDDSpeakerPhone *pAudf = &pSpeakerd->fun;
|
||||
|
||||
if (setting == 0) {
|
||||
AUDDSpeakerPhone_CloseStream(pAudf, interface);
|
||||
}
|
||||
|
||||
if (AUDDSpeakerDriver_StreamSettingChanged)
|
||||
AUDDSpeakerDriver_StreamSettingChanged(setting);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles audio-specific USB requests sent by the host, and forwards
|
||||
* standard ones to the USB device driver.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
void AUDDSpeakerDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
AUDDSpeakerDriver *pAudd = &auddSpeakerDriver;
|
||||
AUDDSpeakerPhone *pAudf = &pAudd->fun;
|
||||
USBDDriver *pUsbd = pAudf->pUsbd;
|
||||
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
|
||||
/* Handle Audio Class requests */
|
||||
if (AUDDSpeakerPhone_RequestHandler(pAudf, request) == USBRC_SUCCESS) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Handle STD requests */
|
||||
if (USBGenericRequest_GetType(request) == USBGenericRequest_STANDARD) {
|
||||
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
/* Unsupported request */
|
||||
else {
|
||||
|
||||
TRACE_WARNING(
|
||||
"AUDDSpeakerDriver_RequestHandler: Unsupported request (%d,%x)\n\r",
|
||||
USBGenericRequest_GetType(request),
|
||||
USBGenericRequest_GetRequest(request));
|
||||
USBD_Stall(0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads incoming audio data sent by the USB host into the provided
|
||||
* buffer. When the transfer is complete, an optional callback function is
|
||||
* invoked.
|
||||
* \param buffer Pointer to the data storage buffer.
|
||||
* \param length Size of the buffer in bytes.
|
||||
* \param callback Optional callback function.
|
||||
* \param argument Optional argument to the callback function.
|
||||
* \return USBD_STATUS_SUCCESS if the transfer is started successfully;
|
||||
* otherwise an error code.
|
||||
*/
|
||||
uint8_t AUDDSpeakerDriver_Read(void *buffer,
|
||||
uint32_t length,
|
||||
TransferCallback callback,
|
||||
void *argument)
|
||||
{
|
||||
AUDDSpeakerDriver *pAudd = &auddSpeakerDriver;
|
||||
AUDDSpeakerPhone *pAudf = &pAudd->fun;
|
||||
return USBD_Read(pAudf->pSpeaker->bEndpointOut,
|
||||
buffer, length,
|
||||
callback, argument);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,74 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* Default callbacks implement for Audio Speaker Driver.
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_audio_speaker
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Headers
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/* These headers were introduced in C99
|
||||
by working group ISO/IEC JTC1/SC22/WG14. */
|
||||
#include <stdint.h>
|
||||
|
||||
#include "AUDDSpeakerDriver.h"
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Default WEAK Callbacks
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Invoked when an audio channel get muted or unmuted. Mutes/unmutes the
|
||||
* channel at the DAC level.
|
||||
* \param channel Channel number that changed.
|
||||
* \param muted Indicates the new mute status of the channel.
|
||||
*/
|
||||
WEAK void AUDDSpeakerDriver_MuteChanged(uint8_t channel,uint8_t muted)
|
||||
{
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked when an audio streaming interface setting changed. Actually control
|
||||
* streaming rate.
|
||||
* \param newSetting New stream (interface) setting.
|
||||
*/
|
||||
WEAK void AUDDSpeakerDriver_StreamSettingChanged(uint8_t newSetting)
|
||||
{
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,468 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_audio_speakerphone
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <AUDDSpeakerPhoneDriver.h>
|
||||
|
||||
#include <AUDRequests.h>
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal types
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Structs of USB Audio Stream Function Interface.
|
||||
*/
|
||||
typedef struct _AUDDStream {
|
||||
|
||||
/* -- USB Interface settings -- */
|
||||
/** Audio Control Interface Number */
|
||||
uint8_t bAcInterface;
|
||||
/** Audio Streaming Interface Number */
|
||||
uint8_t bAsInterface;
|
||||
/** Audio Streaming endpoint address */
|
||||
uint8_t bEpNum;
|
||||
/** Audio Control Unit ID */
|
||||
uint8_t bUnitID;
|
||||
|
||||
/* -- Channel settings -- */
|
||||
/** Number of channels (including master 0, max 32) */
|
||||
uint16_t bNumChannels;
|
||||
/** Mute Controls bitmap */
|
||||
uint16_t bmMuteControls;
|
||||
/** Volume Controls (Master,L,R..) array */
|
||||
uint16_t *pVolumes;
|
||||
} AUDDStream;
|
||||
|
||||
/**
|
||||
* \brief Audio SpeakerPhone driver internal state.
|
||||
*/
|
||||
typedef struct _AUDDSpeakerPhoneDriver {
|
||||
|
||||
/** Pointer to USBDDriver instance */
|
||||
USBDDriver * pUsbd;
|
||||
/** Intermediate storage variable for the mute status of a stream */
|
||||
uint8_t muted;
|
||||
/** Array for storing the current setting of each interface. */
|
||||
uint8_t interfaces[3];
|
||||
/** Audio Speaker interface */
|
||||
AUDDStream speaker;
|
||||
/** Audio Microphone interface */
|
||||
AUDDStream mic;
|
||||
} AUDDSpeakerPhoneDriver;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Global USB audio SpeakerPhone driver instance. */
|
||||
static AUDDSpeakerPhoneDriver auddSpeakerPhoneDriver;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Parse descriptors: Interrupt IN, Bulk EP IN/OUT.
|
||||
* \param desc Pointer to descriptor.
|
||||
* \param arg Argument, pointer to AUDDSpeakerPhoneDriver instance.
|
||||
*/
|
||||
static uint32_t AUDDSpeakerPhone_Parse(USBGenericDescriptor* desc,
|
||||
AUDDSpeakerPhoneDriver* arg)
|
||||
{
|
||||
/* Not a valid descriptor */
|
||||
if (desc->bLength == 0) {
|
||||
return USBD_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
/* Parse endpoint descriptor */
|
||||
if (desc->bDescriptorType == USBGenericDescriptor_ENDPOINT) {
|
||||
USBEndpointDescriptor *pEP = (USBEndpointDescriptor*)desc;
|
||||
if (pEP->bmAttributes == USBEndpointDescriptor_ISOCHRONOUS) {
|
||||
if (pEP->bEndpointAddress & 0x80)
|
||||
arg->mic.bEpNum = pEP->bEndpointAddress & 0x7F;
|
||||
else
|
||||
arg->speaker.bEpNum = pEP->bEndpointAddress;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback triggered after the new mute status of a channel has been read
|
||||
* by AUDDSpeakerPhoneDriver_SetFeatureCurrentValue. Changes the mute status
|
||||
* of the given channel accordingly.
|
||||
* \param channel Number of the channel whose mute status has changed.
|
||||
*/
|
||||
static void AUDDSpeakerPhone_MuteReceived(uint32_t channel)
|
||||
{
|
||||
AUDDSpeakerPhoneDriver *pAudd = &auddSpeakerPhoneDriver;
|
||||
AUDDStream *pAuds;
|
||||
|
||||
if ((uint8_t)(channel >> 8) ==
|
||||
AUDDSpeakerPhoneDriverDescriptors_OUTPUTTERMINAL_REC) {
|
||||
pAuds = &pAudd->mic;
|
||||
}
|
||||
else {
|
||||
pAuds = &pAudd->speaker;
|
||||
}
|
||||
|
||||
if (pAudd->muted != pAuds->bmMuteControls) {
|
||||
pAuds->bmMuteControls = pAudd->muted;
|
||||
AUDDSpeakerPhoneDriver_MuteChanged(0, channel, pAudd->muted);
|
||||
}
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the SET_CUR request.
|
||||
* \param pReq Pointer to USBGenericRequest instance.
|
||||
*/
|
||||
static void AUDDSpeakerPhone_SetCUR(const USBGenericRequest* pReq)
|
||||
{
|
||||
AUDDSpeakerPhoneDriver *pAudd = &auddSpeakerPhoneDriver;
|
||||
uint8_t bIf = AUDGenericRequest_GetInterface(pReq);
|
||||
uint8_t bEntity = AUDGenericRequest_GetEntity(pReq);
|
||||
uint8_t bLength = USBGenericRequest_GetLength(pReq);
|
||||
uint8_t bCh = AUDFeatureUnitRequest_GetChannel(pReq);
|
||||
uint8_t bCtrl = AUDFeatureUnitRequest_GetControl(pReq);
|
||||
uint8_t bSet = 0;
|
||||
AUDDStream *pAuds = 0;
|
||||
|
||||
TRACE_INFO_WP("sCUR ");
|
||||
TRACE_DEBUG("\b(E%d, CtlS%d, Ch%d, L%d) ", bEntity, bCtrl, bCh, bLength);
|
||||
/* Only AC.FeatureUnit accepted */
|
||||
if (bCtrl == AUDFeatureUnitRequest_MUTE
|
||||
&& bLength == 1) {
|
||||
|
||||
if (bEntity == pAudd->speaker.bUnitID)
|
||||
pAuds = &pAudd->speaker;
|
||||
else if (bEntity == pAudd->mic.bUnitID)
|
||||
pAuds = &pAudd->mic;
|
||||
|
||||
if (pAuds != 0
|
||||
&& bIf == pAuds->bAcInterface
|
||||
&& bCh <= pAuds->bNumChannels) {
|
||||
bSet = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (bSet) {
|
||||
|
||||
uint32_t argument = bCh | (bEntity << 8);
|
||||
USBD_Read(0, /* Endpoint #0 */
|
||||
&pAudd->muted,
|
||||
sizeof(uint8_t),
|
||||
(TransferCallback) AUDDSpeakerPhone_MuteReceived,
|
||||
(void *) argument);
|
||||
}
|
||||
else {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the GET_CUR request.
|
||||
* \param pReq Pointer to USBGenericRequest instance.
|
||||
*/
|
||||
static void AUDDSpeakerPhone_GetCUR(const USBGenericRequest *pReq)
|
||||
{
|
||||
AUDDSpeakerPhoneDriver *pAudd = &auddSpeakerPhoneDriver;
|
||||
uint8_t bIf = AUDGenericRequest_GetInterface(pReq);
|
||||
uint8_t bEntity = AUDGenericRequest_GetEntity(pReq);
|
||||
uint8_t bLength = USBGenericRequest_GetLength(pReq);
|
||||
uint8_t bCh = AUDFeatureUnitRequest_GetChannel(pReq);
|
||||
uint8_t bCtrl = AUDFeatureUnitRequest_GetControl(pReq);
|
||||
uint8_t bGet = 0;
|
||||
AUDDStream *pAuds = 0;
|
||||
|
||||
TRACE_INFO_WP("gCUR ");
|
||||
TRACE_DEBUG("\b(E%d, CtlS%d, Ch%d, L%d) ", bEntity, bCtrl, bCh, bLength);
|
||||
/* Only AC.FeatureUnit accepted */
|
||||
if (bCtrl == AUDFeatureUnitRequest_MUTE
|
||||
&& bLength == 1) {
|
||||
|
||||
if (bEntity == pAudd->speaker.bUnitID)
|
||||
pAuds = &pAudd->speaker;
|
||||
else if (bEntity == pAudd->mic.bUnitID)
|
||||
pAuds = &pAudd->mic;
|
||||
|
||||
if (pAuds != 0
|
||||
&& bIf == pAuds->bAcInterface
|
||||
&& bCh <= pAuds->bNumChannels) {
|
||||
bGet = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (bGet) {
|
||||
|
||||
pAudd->muted = pAuds->bmMuteControls;
|
||||
USBD_Write(0, &pAudd->muted, sizeof(uint8_t), 0, 0);
|
||||
}
|
||||
else {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes an USB audio SpeakerPhone device driver, as well as the underlying
|
||||
* USB controller.
|
||||
*/
|
||||
void AUDDSpeakerPhoneDriver_Initialize(const USBDDriverDescriptors *pDescriptors)
|
||||
{
|
||||
AUDDSpeakerPhoneDriver *pAudd = &auddSpeakerPhoneDriver;
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
pAudd->pUsbd = pUsbd;
|
||||
|
||||
/* Initialize SpeakerPhone channels */
|
||||
pAudd->speaker.bNumChannels = 3;
|
||||
pAudd->speaker.bmMuteControls = 0;
|
||||
pAudd->speaker.pVolumes = 0;
|
||||
|
||||
pAudd->mic.bNumChannels = 1;
|
||||
pAudd->mic.bmMuteControls = 0;
|
||||
pAudd->mic.pVolumes = 0;
|
||||
|
||||
pAudd->mic.bAcInterface = AUDDSpeakerPhoneDriverDescriptors_CONTROL;
|
||||
pAudd->mic.bAsInterface = AUDDSpeakerPhoneDriverDescriptors_STREAMINGIN;
|
||||
pAudd->mic.bEpNum = 5;//AUDDSpeakerPhoneDriverDescriptors_DATAIN;
|
||||
pAudd->mic.bUnitID = AUDDSpeakerPhoneDriverDescriptors_FEATUREUNIT_REC;
|
||||
|
||||
pAudd->speaker.bAcInterface = AUDDSpeakerPhoneDriverDescriptors_CONTROL;
|
||||
pAudd->speaker.bAsInterface = AUDDSpeakerPhoneDriverDescriptors_STREAMING;
|
||||
pAudd->speaker.bEpNum = 4;//AUDDSpeakerPhoneDriverDescriptors_DATAOUT;
|
||||
pAudd->speaker.bUnitID = AUDDSpeakerPhoneDriverDescriptors_FEATUREUNIT;
|
||||
|
||||
/* Initialize the USB driver */
|
||||
USBDDriver_Initialize(pUsbd,
|
||||
pDescriptors,
|
||||
pAudd->interfaces);
|
||||
USBD_Init();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the active configuration of device is changed by the
|
||||
* host.
|
||||
* \param cfgnum Configuration number.
|
||||
*/
|
||||
void AUDDSpeakerPhoneDriver_ConfigurationChangeHandler(uint8_t cfgnum)
|
||||
{
|
||||
AUDDSpeakerPhoneDriver *pAudd = &auddSpeakerPhoneDriver;
|
||||
const USBDDriverDescriptors *pDescriptors = pAudd->pUsbd->pDescriptors;
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
|
||||
if (cfgnum > 0) {
|
||||
|
||||
/* Parse endpoints for data & notification */
|
||||
if (USBD_HAL_IsHighSpeed() && pDescriptors->pHsConfiguration)
|
||||
pDesc = (USBConfigurationDescriptor*)pDescriptors->pHsConfiguration;
|
||||
else
|
||||
pDesc = (USBConfigurationDescriptor*)pDescriptors->pFsConfiguration[0];
|
||||
|
||||
USBGenericDescriptor_Parse((USBGenericDescriptor*)pDesc, pDesc->wTotalLength,
|
||||
(USBDescriptorParseFunction)AUDDSpeakerPhone_Parse, pAudd);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the active setting of an interface is changed by the
|
||||
* host. Changes the status of the third LED accordingly.
|
||||
* \param interface Interface number.
|
||||
* \param setting Newly active setting.
|
||||
*/
|
||||
void AUDDSpeakerPhoneDriver_InterfaceSettingChangedHandler(uint8_t interface,
|
||||
uint8_t setting)
|
||||
{
|
||||
AUDDSpeakerPhoneDriver *pAudd = &auddSpeakerPhoneDriver;
|
||||
|
||||
if (interface == pAudd->speaker.bAsInterface) {
|
||||
/* reset ISO OUT ep */
|
||||
if (setting == 0 && pAudd->speaker.bEpNum) {
|
||||
USBD_HAL_ResetEPs(1 << pAudd->speaker.bEpNum,
|
||||
USBD_STATUS_CANCELED, 1);
|
||||
}
|
||||
AUDDSpeakerPhoneDriver_StreamSettingChanged(0, setting);
|
||||
}
|
||||
if (interface == pAudd->mic.bAsInterface) {
|
||||
/* reset ISO IN ep */
|
||||
if (setting == 0 && pAudd->mic.bEpNum) {
|
||||
USBD_HAL_ResetEPs(1 << pAudd->mic.bEpNum,
|
||||
USBD_STATUS_CANCELED, 1);
|
||||
}
|
||||
AUDDSpeakerPhoneDriver_StreamSettingChanged(1, setting);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Handles audio-specific USB requests sent by the host, and forwards
|
||||
* standard ones to the USB device driver.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
void AUDDSpeakerPhoneDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
AUDDSpeakerPhoneDriver *pAudd = &auddSpeakerPhoneDriver;
|
||||
USBDDriver *pUsbd = pAudd->pUsbd;
|
||||
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
|
||||
/* Check if this is a class request */
|
||||
if (USBGenericRequest_GetType(request) == USBGenericRequest_CLASS) {
|
||||
|
||||
/* Check if the request is supported */
|
||||
switch (USBGenericRequest_GetRequest(request)) {
|
||||
|
||||
case AUDGenericRequest_SETCUR:
|
||||
|
||||
AUDDSpeakerPhone_SetCUR(request);
|
||||
break;
|
||||
|
||||
case AUDGenericRequest_GETCUR:
|
||||
|
||||
AUDDSpeakerPhone_GetCUR(request);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
TRACE_WARNING(
|
||||
"AUDDSpeakerPhoneDriver_RequestHandler: Unsupported request (%d)\n\r",
|
||||
USBGenericRequest_GetRequest(request));
|
||||
USBD_Stall(0);
|
||||
}
|
||||
}
|
||||
/* Check if this is a standard request */
|
||||
else if (USBGenericRequest_GetType(request) == USBGenericRequest_STANDARD) {
|
||||
|
||||
/* Forward request to the standard handler */
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
/* Unsupported request type */
|
||||
else {
|
||||
|
||||
TRACE_WARNING(
|
||||
"AUDDSpeakerPhoneDriver_RequestHandler: Unsupported request type (%d)\n\r",
|
||||
USBGenericRequest_GetType(request));
|
||||
USBD_Stall(0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads incoming audio data sent by the USB host into the provided
|
||||
* buffer. When the transfer is complete, an optional callback function is
|
||||
* invoked.
|
||||
* \param buffer Pointer to the data storage buffer.
|
||||
* \param length Size of the buffer in bytes.
|
||||
* \param callback Optional callback function.
|
||||
* \param argument Optional argument to the callback function.
|
||||
* \return USBD_STATUS_SUCCESS if the transfer is started successfully;
|
||||
* otherwise an error code.
|
||||
*/
|
||||
uint8_t AUDDSpeakerPhoneDriver_Read(void *buffer,
|
||||
uint32_t length,
|
||||
TransferCallback callback,
|
||||
void *argument)
|
||||
{
|
||||
AUDDSpeakerPhoneDriver *pAudd = &auddSpeakerPhoneDriver;
|
||||
return USBD_Read(pAudd->speaker.bEpNum,
|
||||
buffer,
|
||||
length,
|
||||
callback,
|
||||
argument);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize Frame List for sending audio data.
|
||||
*
|
||||
* \param pListInit Pointer to the allocated list for audio write.
|
||||
* \param pDmaInit Pointer to the allocated DMA descriptors for autio write
|
||||
* (if DMA supported).
|
||||
* \param listSize Circular list size.
|
||||
* \param delaySize Start transfer after delaySize frames filled in.
|
||||
* \param callback Optional callback function for transfer.
|
||||
* \param argument Optional callback argument.
|
||||
* \return USBD_STATUS_SUCCESS if setup successfully; otherwise an error code.
|
||||
*/
|
||||
uint8_t AUDDSpeakerPhoneDriver_SetupWrite(void * pListInit,
|
||||
void * pDmaInit,
|
||||
uint16_t listSize,
|
||||
uint16_t delaySize,
|
||||
TransferCallback callback,
|
||||
void * argument)
|
||||
{
|
||||
AUDDSpeakerPhoneDriver *pAudd = &auddSpeakerPhoneDriver;
|
||||
uint8_t error;
|
||||
|
||||
if (pAudd->mic.bEpNum == 0)
|
||||
return USBRC_STATE_ERR;
|
||||
|
||||
error = USBD_HAL_SetupMblTransfer(pAudd->mic.bEpNum,
|
||||
pListInit,
|
||||
listSize,
|
||||
delaySize);
|
||||
if (error) return error;
|
||||
error = USBD_HAL_SetTransferCallback(
|
||||
pAudd->mic.bEpNum,
|
||||
callback, argument);
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add frame buffer to audio sending list.
|
||||
* \buffer Pointer to data frame to send.
|
||||
* \length Frame size in bytes.
|
||||
* \return USBD_STATUS_SUCCESS if the transfer is started successfully;
|
||||
* otherwise an error code.
|
||||
*/
|
||||
uint8_t AUDDSpeakerPhoneDriver_Write(void* buffer, uint16_t length)
|
||||
{
|
||||
AUDDSpeakerPhoneDriver *pAudd = &auddSpeakerPhoneDriver;
|
||||
|
||||
return USBD_HAL_Write(pAudd->mic.bEpNum,
|
||||
buffer, length);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,76 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* Default callbacks implement for Audio SpeakerPhone Driver.
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_audio_speakerphone
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Headers
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/* These headers were introduced in C99
|
||||
by working group ISO/IEC JTC1/SC22/WG14. */
|
||||
#include <stdint.h>
|
||||
|
||||
#include "AUDDSpeakerPhoneDriver.h"
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Default WEAK Callbacks
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Invoked when an audio channel get muted or unmuted. Mutes/unmutes the
|
||||
* channel at the DAC level.
|
||||
* \param mic Microphone/Speaker stream changed.
|
||||
* \param channel Channel number that changed.
|
||||
* \param muted Indicates the new mute status of the channel.
|
||||
*/
|
||||
WEAK void AUDDSpeakerPhoneDriver_MuteChanged(uint8_t mic,uint8_t channel,uint8_t muted)
|
||||
{
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked when an audio streaming interface setting changed. Actually control
|
||||
* streaming rate.
|
||||
* \param mic Microphone/Speaker stream changed.
|
||||
* \param newSetting New stream (interface) setting.
|
||||
*/
|
||||
WEAK void AUDDSpeakerPhoneDriver_StreamSettingChanged(uint8_t mic,uint8_t newSetting)
|
||||
{
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,770 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 supported).
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_audio_speakerphone
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <AUDDSpeakerPhone.h>
|
||||
|
||||
#include <USBDescriptors.h>
|
||||
#include <USBRequests.h>
|
||||
#include <AUDDescriptors.h>
|
||||
#include <AUDRequests.h>
|
||||
|
||||
#include <USBD_HAL.h>
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Types
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Parse data extention for descriptor parsing */
|
||||
typedef struct _AUDDParseData {
|
||||
/** Pointer to AUDDSpeakerPhone instance */
|
||||
AUDDSpeakerPhone * pAudf;
|
||||
/** Pointer to found interface descriptor */
|
||||
USBInterfaceDescriptor * pIfDesc;
|
||||
|
||||
} AUDDParseData;
|
||||
|
||||
/** Transfer callback extention */
|
||||
typedef struct _AUDDXfrExt {
|
||||
/** Pointer to AUDDStream instance */
|
||||
AUDDStream *pStream;
|
||||
/** Buffer for USB device to get data from host */
|
||||
uint16_t usbBuffer;
|
||||
/** Additional information: Entity */
|
||||
uint8_t bEntity;
|
||||
/** Additional information: Channel */
|
||||
uint8_t bCh;
|
||||
} AUDDXfrExt;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal Variable
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Transfer data extension */
|
||||
static AUDDXfrExt auddXfrData;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal Functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Parse descriptors: Interface, ISO IN/OUT, Feature Unit IDs.
|
||||
* \param desc Pointer to descriptor list.
|
||||
* \param arg Argument, pointer to AUDDParseData instance.
|
||||
*/
|
||||
static uint32_t AUDDSpeakerPhone_Parse(USBGenericDescriptor *pDesc,
|
||||
AUDDParseData * pArg)
|
||||
{
|
||||
AUDDStream *pSpeaker = pArg->pAudf->pSpeaker;
|
||||
AUDDStream *pMic = pArg->pAudf->pMicrophone;
|
||||
USBEndpointDescriptor* pEp = (USBEndpointDescriptor*)pDesc;
|
||||
uint8_t bSpeakerDone = 0, bMicDone = 0;
|
||||
|
||||
/* Validate descriptor */
|
||||
if (pDesc->bLength == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
|
||||
/* Log current interface */
|
||||
if (pDesc->bDescriptorType == USBGenericDescriptor_INTERFACE) {
|
||||
USBInterfaceDescriptor* pIf = (USBInterfaceDescriptor*)pDesc;
|
||||
/* AudioControl interface */
|
||||
if (pIf->bInterfaceClass ==
|
||||
AUDControlInterfaceDescriptor_CLASS
|
||||
&& pIf->bInterfaceSubClass ==
|
||||
AUDControlInterfaceDescriptor_SUBCLASS) {
|
||||
pArg->pIfDesc = pIf;
|
||||
|
||||
if (pSpeaker) pSpeaker->bAcInterface = pIf->bInterfaceNumber;
|
||||
if (pMic) pMic->bAcInterface = pIf->bInterfaceNumber;
|
||||
}
|
||||
/* AudioStreaming interface with endpoint */
|
||||
else if (pIf->bInterfaceClass ==
|
||||
AUDStreamingInterfaceDescriptor_CLASS
|
||||
&& pIf->bInterfaceSubClass ==
|
||||
AUDStreamingInterfaceDescriptor_SUBCLASS) {
|
||||
pArg->pIfDesc = pIf;
|
||||
}
|
||||
/* Not Audio interface, force end */
|
||||
else if (pArg->pIfDesc){
|
||||
return USBRC_PARTIAL_DONE;
|
||||
}
|
||||
}
|
||||
|
||||
if (pArg->pIfDesc) {
|
||||
/* Find Control Interface */
|
||||
/* Find Entities */
|
||||
/* Find Streaming Interface & Endpoints */
|
||||
if (pDesc->bDescriptorType == USBGenericDescriptor_ENDPOINT
|
||||
&& (pEp->bmAttributes & 0x3) == USBEndpointDescriptor_ISOCHRONOUS) {
|
||||
if (pEp->bEndpointAddress & 0x80
|
||||
&& pMic) {
|
||||
pMic->bEndpointIn = pEp->bEndpointAddress & 0x7F;
|
||||
pMic->bAsInterface = pArg->pIfDesc->bInterfaceNumber;
|
||||
/* Fixed FU */
|
||||
pMic->bFeatureUnitIn = AUDD_ID_MicrophoneFU;
|
||||
}
|
||||
else if (pSpeaker) {
|
||||
pSpeaker->bEndpointOut = pEp->bEndpointAddress;
|
||||
pSpeaker->bAsInterface = pArg->pIfDesc->bInterfaceNumber;
|
||||
/* Fixed FU */
|
||||
pSpeaker->bFeatureUnitOut = AUDD_ID_SpeakerFU;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pSpeaker) {
|
||||
if (pSpeaker->bAcInterface != 0xFF
|
||||
&& pSpeaker->bAsInterface != 0xFF
|
||||
&& pSpeaker->bFeatureUnitOut != 0xFF
|
||||
&& pSpeaker->bEndpointOut != 0) {
|
||||
bSpeakerDone = 1;
|
||||
}
|
||||
}
|
||||
else bSpeakerDone = 1;
|
||||
|
||||
if (pMic) {
|
||||
if (pMic->bAcInterface != 0xFF
|
||||
&& pMic->bAsInterface != 0xFF
|
||||
&& pMic->bFeatureUnitIn != 0xFF
|
||||
&& pMic->bEndpointIn != 0) {
|
||||
bMicDone = 1;
|
||||
}
|
||||
}
|
||||
else bMicDone = 1;
|
||||
|
||||
if (bSpeakerDone && bMicDone)
|
||||
return USBRC_FINISHED;
|
||||
|
||||
return USBRC_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback triggered after the new mute status of a channel has been read.
|
||||
* Changes the mute status of the given channel accordingly.
|
||||
* \param pData Pointer to AUDDXfrExt (transfer extension data).
|
||||
*/
|
||||
static void AUDD_MuteReceived(AUDDXfrExt *pData)
|
||||
{
|
||||
AUDDStream_ChangeMute(pData->pStream,
|
||||
pData->bCh,
|
||||
(uint8_t)pData->usbBuffer);
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback triggered after the new volume status of a channel has been read.
|
||||
* Changes the volume status of the given channel accordingly.
|
||||
* \param pData Pointer to AUDDXfrExt (transfer extension data).
|
||||
*/
|
||||
static void AUDD_VolumeReceived(AUDDXfrExt *pData)
|
||||
{
|
||||
AUDDStream_SetVolume(pData->pStream,
|
||||
pData->bCh,
|
||||
pData->usbBuffer);
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Target AUDDStream for control
|
||||
* \param pAudf Pointer to AUDDSpeakerPhone instance.
|
||||
* \param bAcInterface Interface number
|
||||
* \param bEntity Entity ID
|
||||
* \param bChannel Channel number
|
||||
* \return Pointer to AUDDStream instance
|
||||
*/
|
||||
static AUDDStream *AUDD_GetCtlStream(
|
||||
AUDDSpeakerPhone *pAudf,
|
||||
uint8_t bAcInterface,
|
||||
uint8_t bEntity,
|
||||
uint8_t bChannel)
|
||||
{
|
||||
AUDDStream *pAuds = 0;
|
||||
|
||||
if (bEntity == pAudf->pSpeaker->bFeatureUnitOut
|
||||
|| bEntity == pAudf->pSpeaker->bFeatureUnitIn)
|
||||
pAuds = pAudf->pSpeaker;
|
||||
else if (bEntity == pAudf->pMicrophone->bFeatureUnitIn
|
||||
|| bEntity == pAudf->pMicrophone->bFeatureUnitOut)
|
||||
pAuds = pAudf->pMicrophone;
|
||||
|
||||
if (pAuds != 0
|
||||
&& bAcInterface == pAuds->bAcInterface
|
||||
&& bChannel <= pAuds->bNumChannels) {
|
||||
return pAuds;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the SET_CUR request.
|
||||
* \param pAudf Pointer to AUDDSpeakerPhone instance.
|
||||
* \param pReq Pointer to USBGenericRequest instance.
|
||||
*/
|
||||
static void AUDD_SetCUR(
|
||||
AUDDSpeakerPhone *pAudf,
|
||||
const USBGenericRequest* pReq)
|
||||
{
|
||||
uint8_t bIf = AUDGenericRequest_GetInterface(pReq);
|
||||
uint8_t bEntity = AUDGenericRequest_GetEntity(pReq);
|
||||
uint8_t bLength = USBGenericRequest_GetLength(pReq);
|
||||
uint8_t bCh = AUDFeatureUnitRequest_GetChannel(pReq);
|
||||
uint8_t bCtrl = AUDFeatureUnitRequest_GetControl(pReq);
|
||||
uint8_t bSet = 1;
|
||||
AUDDStream *pAuds = AUDD_GetCtlStream(pAudf, bIf, bEntity, bCh);
|
||||
TransferCallback fCallback;
|
||||
|
||||
TRACE_INFO_WP("sCUR ");
|
||||
TRACE_DEBUG("\b(E%d, CtlS%d, Ch%d, L%d) ", bEntity, bCtrl, bCh, bLength);
|
||||
|
||||
/* Set Mute to AC, 1 byte */
|
||||
if (bCtrl == AUDFeatureUnitRequest_MUTE
|
||||
&& bLength == 1
|
||||
&& pAuds) {
|
||||
fCallback = (TransferCallback) AUDD_MuteReceived;
|
||||
}
|
||||
else if (bCtrl == AUDFeatureUnitRequest_VOLUME
|
||||
&& bLength == 2
|
||||
&& pAuds && pAuds->pwVolumes) {
|
||||
fCallback = (TransferCallback) AUDD_VolumeReceived;
|
||||
}
|
||||
else
|
||||
bSet = 0;
|
||||
|
||||
if (bSet) {
|
||||
|
||||
auddXfrData.pStream = pAuds;
|
||||
auddXfrData.bEntity = bEntity;
|
||||
auddXfrData.bCh = bCh;
|
||||
USBD_Read(0,
|
||||
&auddXfrData.usbBuffer,
|
||||
bLength,
|
||||
fCallback,
|
||||
(void *) &auddXfrData);
|
||||
}
|
||||
else {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the GET_CUR request.
|
||||
* \param pAudf Pointer to AUDDSpeakerPhone instance.
|
||||
* \param pReq Pointer to USBGenericRequest instance.
|
||||
*/
|
||||
static void AUDD_GetCUR(
|
||||
AUDDSpeakerPhone *pAudf,
|
||||
const USBGenericRequest *pReq)
|
||||
{
|
||||
uint8_t bIf = AUDGenericRequest_GetInterface(pReq);
|
||||
uint8_t bEntity = AUDGenericRequest_GetEntity(pReq);
|
||||
uint8_t bLength = USBGenericRequest_GetLength(pReq);
|
||||
uint8_t bCh = AUDFeatureUnitRequest_GetChannel(pReq);
|
||||
uint8_t bCtrl = AUDFeatureUnitRequest_GetControl(pReq);
|
||||
uint8_t bGet = 1;
|
||||
AUDDStream *pAuds = AUDD_GetCtlStream(pAudf, bIf, bEntity, bCh);
|
||||
|
||||
TRACE_INFO_WP("gCUR ");
|
||||
TRACE_DEBUG("\b(E%d, CtlS%d, Ch%d, L%d) ", bEntity, bCtrl, bCh, bLength);
|
||||
|
||||
/* Get Mute 1 byte */
|
||||
if (bCtrl == AUDFeatureUnitRequest_MUTE
|
||||
&& bLength == 1
|
||||
&& pAuds) {
|
||||
auddXfrData.usbBuffer = ((pAuds->bmMute & (1<<bCh)) > 0);
|
||||
}
|
||||
else if (bCtrl == AUDFeatureUnitRequest_VOLUME
|
||||
&& bLength == 2
|
||||
&& pAuds && pAuds->pwVolumes) {
|
||||
auddXfrData.usbBuffer = pAuds->pwVolumes[bCh];
|
||||
}
|
||||
else
|
||||
bGet = 0;
|
||||
|
||||
if (bGet) {
|
||||
|
||||
USBD_Write(0, &auddXfrData.usbBuffer, bLength, 0, 0);
|
||||
}
|
||||
else {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported Functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initialize AUDDStream instance.
|
||||
* Note the number of channels excludes the master control, so
|
||||
* actual volume array size should be (1 + numChannels).
|
||||
* \param pAuds Pointer to AUDDStream instance.
|
||||
* \param numChannels Number of channels in the stream (<31).
|
||||
* \param wChannelVolumes Data array for channel volume values.
|
||||
* \param fCallback Callback function for stream events.
|
||||
* \param pArg Pointer to event handler arguments.
|
||||
*/
|
||||
void AUDDStream_Initialize(AUDDStream *pAuds,
|
||||
uint8_t numChannels,
|
||||
uint16_t wChannelVolumes[],
|
||||
AUDDStreamEventCallback fCallback,
|
||||
void* pArg)
|
||||
{
|
||||
pAuds->bAcInterface = 0xFF;
|
||||
pAuds->bFeatureUnitOut = 0xFF;
|
||||
pAuds->bFeatureUnitIn = 0xFF;
|
||||
pAuds->bAsInterface = 0xFF;
|
||||
pAuds->bEndpointOut = 0;
|
||||
pAuds->bEndpointIn = 0;
|
||||
|
||||
pAuds->bNumChannels = numChannels;
|
||||
pAuds->bmMute = 0;
|
||||
pAuds->pwVolumes = wChannelVolumes;
|
||||
|
||||
pAuds->fCallback = fCallback;
|
||||
pAuds->pArg = pArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the request is accepted.
|
||||
* \param pAuds Pointer to AUDDStream instance.
|
||||
* \param pReq Pointer to a USBGenericRequest instance.
|
||||
* \return 1 if accepted.
|
||||
*/
|
||||
uint32_t AUDDStream_IsRequestAccepted(
|
||||
AUDDStream *pAuds,
|
||||
const USBGenericRequest *pReq)
|
||||
{
|
||||
uint8_t bIf = AUDGenericRequest_GetInterface(pReq);
|
||||
uint8_t bEntity = AUDGenericRequest_GetEntity(pReq);
|
||||
uint8_t bCh = AUDFeatureUnitRequest_GetChannel(pReq);
|
||||
/* AudioControl Interface */
|
||||
if (bIf == pAuds->bAcInterface) {
|
||||
if (bCh > pAuds->bNumChannels)
|
||||
return 0;
|
||||
if (bEntity != pAuds->bFeatureUnitIn
|
||||
&& bEntity != pAuds->bFeatureUnitOut)
|
||||
return 0;
|
||||
}
|
||||
/* AudioStream Interface not handled */
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Change Stream Mute status.
|
||||
* \param pAuds Pointer to AUDDStream instance.
|
||||
* \param bChannel Channel number.
|
||||
* \param bmMute 1 to mute, 0 to unmute.
|
||||
*/
|
||||
uint32_t AUDDStream_ChangeMute(AUDDStream *pAuds,
|
||||
uint8_t bChannel,
|
||||
uint8_t bMute)
|
||||
{
|
||||
uint8_t bmMute = (bMute << bChannel);
|
||||
|
||||
if (pAuds->bNumChannels < bChannel)
|
||||
return USBRC_PARAM_ERR;
|
||||
|
||||
if (bMute)
|
||||
pAuds->bmMute |= bmMute;
|
||||
else
|
||||
pAuds->bmMute &= ~bmMute;
|
||||
|
||||
if (pAuds->fCallback)
|
||||
pAuds->fCallback(AUDD_EC_MuteChanged,
|
||||
bChannel,
|
||||
pAuds->pArg);
|
||||
|
||||
return USBRC_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Stream Volume status.
|
||||
* \param pAuds Pointer to AUDDStream instance.
|
||||
* \param bChannel Channel number.
|
||||
* \param wVolume New volume value.
|
||||
*/
|
||||
uint32_t AUDDStream_SetVolume(AUDDStream *pAuds,
|
||||
uint8_t bChannel,
|
||||
uint16_t wVolume)
|
||||
{
|
||||
if (pAuds->pwVolumes == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
if (bChannel > pAuds->bNumChannels)
|
||||
return USBRC_PARAM_ERR;
|
||||
|
||||
pAuds->pwVolumes[bChannel] = wVolume;
|
||||
if (pAuds->fCallback) {
|
||||
pAuds->fCallback(AUDD_EC_VolumeChanged,
|
||||
bChannel,
|
||||
pAuds->pArg);
|
||||
}
|
||||
|
||||
return USBRC_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Receives data from the host through the audio function (as speaker).
|
||||
* This function behaves like USBD_Read.
|
||||
* \param pAuds Pointer to AUDDStream instance.
|
||||
* \param pData Pointer to the data buffer to put received data.
|
||||
* \param dwSize Size of the data buffer in bytes.
|
||||
* \param fCallback Optional callback function to invoke when the transfer
|
||||
* finishes.
|
||||
* \param pArg Optional argument to the callback function.
|
||||
* \return USBD_STATUS_SUCCESS if the read operation has been started normally;
|
||||
* otherwise, the corresponding error code.
|
||||
*/
|
||||
uint32_t AUDDStream_Read(
|
||||
AUDDStream *pAuds,
|
||||
void * pData,uint32_t dwSize,
|
||||
TransferCallback fCallback,void * pArg)
|
||||
{
|
||||
if (pAuds->bEndpointOut == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
return USBD_Read(pAuds->bEndpointOut,
|
||||
pData, dwSize,
|
||||
fCallback, pArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize Frame List for sending audio data.
|
||||
* \param pAuds Pointer to AUDDStream instance.
|
||||
* \param pListInit Pointer to the allocated list for audio write.
|
||||
* \param pDmaInit Pointer to the allocated DMA descriptors for autio write
|
||||
* (if DMA supported).
|
||||
* \param listSize Circular list size.
|
||||
* \param delaySize Start transfer after delaySize frames filled in.
|
||||
* \param callback Optional callback function for transfer.
|
||||
* \param argument Optional callback argument.
|
||||
* \return USBD_STATUS_SUCCESS if setup successfully; otherwise an error code.
|
||||
*/
|
||||
uint32_t AUDDStream_SetupWrite(
|
||||
AUDDStream *pAuds,
|
||||
void * pListInit,
|
||||
void * pDmaInit,
|
||||
uint16_t listSize,
|
||||
uint16_t delaySize,
|
||||
TransferCallback callback,
|
||||
void * argument)
|
||||
{
|
||||
uint32_t error;
|
||||
|
||||
if (pAuds->bEndpointIn == 0)
|
||||
return USBRC_STATE_ERR;
|
||||
|
||||
error = USBD_HAL_SetupMblTransfer(pAuds->bEndpointIn,
|
||||
pListInit,
|
||||
listSize,
|
||||
delaySize);
|
||||
if (error) return error;
|
||||
|
||||
error = USBD_HAL_SetTransferCallback(pAuds->bEndpointIn,
|
||||
callback, argument);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add frame buffer to audio sending list.
|
||||
* \param pAuds Pointer to AUDDStream instance.
|
||||
* \param pBuffer Pointer to data frame to send.
|
||||
* \param wLength Frame size in bytes.
|
||||
* \return USBD_STATUS_SUCCESS if the transfer is started successfully;
|
||||
* otherwise an error code.
|
||||
*/
|
||||
uint32_t AUDDStream_Write(AUDDStream *pAuds, void* pBuffer, uint16_t wLength)
|
||||
{
|
||||
if (pAuds->bEndpointIn == 0)
|
||||
return USBRC_STATE_ERR;
|
||||
|
||||
return USBD_HAL_Write(pAuds->bEndpointIn,
|
||||
pBuffer, wLength);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the stream. All pending transfers are canceled.
|
||||
* \param pStream Pointer to AUDDStream instance.
|
||||
*/
|
||||
uint32_t AUDDStream_Close(AUDDStream *pStream)
|
||||
{
|
||||
uint32_t bmEPs = 0;
|
||||
|
||||
/* Close output stream */
|
||||
if (pStream->bEndpointIn) {
|
||||
bmEPs |= 1 << pStream->bEndpointIn;
|
||||
}
|
||||
/* Close input stream */
|
||||
if (pStream->bEndpointOut) {
|
||||
bmEPs |= 1 << pStream->bEndpointOut;
|
||||
}
|
||||
USBD_HAL_ResetEPs(bmEPs, USBRC_CANCELED, 1);
|
||||
|
||||
return USBRC_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* Audio Speakerphone functions
|
||||
*/
|
||||
|
||||
/**
|
||||
* Initialize AUDDStream instance.
|
||||
* Note the number of channels excludes the master control, so
|
||||
* actual volume array size should be (1 + numChannels).
|
||||
* \param pAuds Pointer to AUDDStream instance.
|
||||
* \param numChannels Number of channels in the stream (excluding master,<31).
|
||||
* \param wChannelVolumes Data array for channel volume values,
|
||||
* must include master (1 + numChannels).
|
||||
* \param fCallback Callback function for stream control events.
|
||||
* \param pArg Pointer to event handler arguments.
|
||||
*/
|
||||
void AUDDSpeakerPhone_InitializeStream(
|
||||
AUDDStream *pAuds,
|
||||
uint8_t numChannels,
|
||||
uint16_t wChannelVolumes[],
|
||||
AUDDStreamEventCallback fCallback,
|
||||
void* pArg)
|
||||
{
|
||||
pAuds->bAcInterface = 0xFF;
|
||||
pAuds->bFeatureUnitOut = 0xFF;
|
||||
pAuds->bFeatureUnitIn = 0xFF;
|
||||
pAuds->bAsInterface = 0xFF;
|
||||
pAuds->bEndpointOut = 0;
|
||||
pAuds->bEndpointIn = 0;
|
||||
|
||||
pAuds->bNumChannels = numChannels;
|
||||
pAuds->bmMute = 0;
|
||||
pAuds->pwVolumes = wChannelVolumes;
|
||||
|
||||
pAuds->fCallback = fCallback;
|
||||
pAuds->pArg = pArg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize AUDDSpeakerPhone instance.
|
||||
* \param pAudf Pointer to AUDDSpeakerPhone instance.
|
||||
* \param pUsbd Pointer to USBDDriver instance.
|
||||
* \param pSpeaker Pointer to speaker streaming interface.
|
||||
* \param pMicrophone Pointer to microphone streaming interface.
|
||||
*/
|
||||
void AUDDSpeakerPhone_Initialize(
|
||||
AUDDSpeakerPhone *pAudf,
|
||||
USBDDriver *pUsbd,
|
||||
AUDDStream *pSpeaker,
|
||||
AUDDStream *pMicrophone)
|
||||
{
|
||||
pAudf->pUsbd = pUsbd;
|
||||
pAudf->pSpeaker = pSpeaker;
|
||||
pAudf->pMicrophone = pMicrophone;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse USB Audio streaming information for AUDDStream instance.
|
||||
* \param pAudf Pointer to AUDDSpeakerPhone instance.
|
||||
* \param pDescriptors Pointer to descriptor list.
|
||||
* \param dwLength Descriptor list size in bytes.
|
||||
*/
|
||||
USBGenericDescriptor *AUDDSpeakerPhone_ParseInterfaces(
|
||||
AUDDSpeakerPhone *pAudf,
|
||||
USBGenericDescriptor *pDescriptors,
|
||||
uint32_t dwLength)
|
||||
{
|
||||
AUDDParseData data;
|
||||
|
||||
data.pAudf = pAudf;
|
||||
data.pIfDesc = 0;
|
||||
|
||||
return USBGenericDescriptor_Parse(pDescriptors,
|
||||
dwLength,
|
||||
(USBDescriptorParseFunction)AUDDSpeakerPhone_Parse,
|
||||
(void*)&data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Close the stream. All pending transfers are canceled.
|
||||
* \param pAudf Pointer to AUDDSpeakerPhone instance.
|
||||
* \param bInterface Stream interface number
|
||||
*/
|
||||
uint32_t AUDDSpeakerPhone_CloseStream(
|
||||
AUDDSpeakerPhone *pAudf,
|
||||
uint32_t bInterface)
|
||||
{
|
||||
if (pAudf->pSpeaker->bAsInterface == bInterface) {
|
||||
USBD_HAL_ResetEPs(1 << pAudf->pSpeaker->bEndpointOut,
|
||||
USBRC_CANCELED,
|
||||
1);
|
||||
}
|
||||
else if (pAudf->pMicrophone->bAsInterface == bInterface) {
|
||||
USBD_HAL_ResetEPs(1 << pAudf->pMicrophone->bEndpointIn,
|
||||
USBRC_CANCELED,
|
||||
1);
|
||||
}
|
||||
|
||||
return USBRC_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles audio-specific USB requests sent by the host
|
||||
* \param pAudf Pointer to AUDDSpeakerPhone instance.
|
||||
* \param pRequest Pointer to a USBGenericRequest instance.
|
||||
* \return USBRC_PARAM_ERR if not handled.
|
||||
*/
|
||||
uint32_t AUDDSpeakerPhone_RequestHandler(
|
||||
AUDDSpeakerPhone *pAudf,
|
||||
const USBGenericRequest* pRequest)
|
||||
{
|
||||
//USBDDriver *pUsbd = pAudf->pUsbd;
|
||||
|
||||
if (USBGenericRequest_GetType(pRequest) != USBGenericRequest_CLASS)
|
||||
return USBRC_PARAM_ERR;
|
||||
|
||||
TRACE_INFO_WP("Aud ");
|
||||
switch (USBGenericRequest_GetRequest(pRequest)) {
|
||||
case AUDGenericRequest_SETCUR:
|
||||
AUDD_SetCUR(pAudf, pRequest);
|
||||
break;
|
||||
case AUDGenericRequest_GETCUR:
|
||||
AUDD_GetCUR(pAudf, pRequest);
|
||||
break;
|
||||
|
||||
default:
|
||||
return USBRC_PARAM_ERR;
|
||||
}
|
||||
|
||||
return USBRC_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Receives data from the host through the audio function (as speaker).
|
||||
* This function behaves like USBD_Read.
|
||||
* \param pAudf Pointer to AUDDSpeakerPhone instance.
|
||||
* \param pData Pointer to the data buffer to put received data.
|
||||
* \param dwSize Size of the data buffer in bytes.
|
||||
* \param fCallback Optional callback function to invoke when the transfer
|
||||
* finishes.
|
||||
* \param pArg Optional argument to the callback function.
|
||||
* \return USBD_STATUS_SUCCESS if the read operation has been started normally;
|
||||
* otherwise, the corresponding error code.
|
||||
*/
|
||||
uint32_t AUDDSpeakerPhone_Read(
|
||||
AUDDSpeakerPhone *pAudf,
|
||||
void * pData,uint32_t dwSize,
|
||||
TransferCallback fCallback,void * pArg)
|
||||
{
|
||||
if (pAudf->pSpeaker == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
if (pAudf->pSpeaker->bEndpointOut == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
return USBD_Read(pAudf->pSpeaker->bEndpointOut,
|
||||
pData, dwSize,
|
||||
fCallback, pArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize Frame List for sending audio data.
|
||||
* \param pAudf Pointer to AUDDSpeakerPhone instance.
|
||||
* \param pListInit Pointer to the allocated list for audio write.
|
||||
* \param pDmaInit Pointer to the allocated DMA descriptors for autio write
|
||||
* (if DMA supported).
|
||||
* \param listSize Circular list size.
|
||||
* \param delaySize Start transfer after delaySize frames filled in.
|
||||
* \param callback Optional callback function for transfer.
|
||||
* \param argument Optional callback argument.
|
||||
* \return USBD_STATUS_SUCCESS if setup successfully; otherwise an error code.
|
||||
*/
|
||||
uint32_t AUDDSpeakerPhone_SetupWrite(
|
||||
AUDDSpeakerPhone *pAudf,
|
||||
void * pListInit,
|
||||
void * pDmaInit,
|
||||
uint16_t listSize,
|
||||
uint16_t delaySize,
|
||||
TransferCallback callback,
|
||||
void * argument)
|
||||
{
|
||||
uint32_t error;
|
||||
|
||||
if (pAudf->pMicrophone == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
if (pAudf->pMicrophone->bEndpointIn == 0)
|
||||
return USBRC_STATE_ERR;
|
||||
|
||||
error = USBD_HAL_SetupMblTransfer(pAudf->pMicrophone->bEndpointIn,
|
||||
pListInit,
|
||||
listSize,
|
||||
delaySize);
|
||||
if (error) return error;
|
||||
|
||||
error = USBD_HAL_SetTransferCallback(
|
||||
pAudf->pMicrophone->bEndpointIn,
|
||||
callback, argument);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add frame buffer to audio sending list.
|
||||
* \param pAudf Pointer to AUDDSpeakerPhone instance.
|
||||
* \param pBuffer Pointer to data frame to send.
|
||||
* \param wLength Frame size in bytes.
|
||||
* \return USBD_STATUS_SUCCESS if the transfer is started successfully;
|
||||
* otherwise an error code.
|
||||
*/
|
||||
uint32_t AUDDSpeakerPhone_Write(AUDDSpeakerPhone *pAudf, void* pBuffer, uint16_t wLength)
|
||||
{
|
||||
if (pAudf->pSpeaker == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
if (pAudf->pSpeaker->bEndpointIn == 0)
|
||||
return USBRC_STATE_ERR;
|
||||
|
||||
return USBD_HAL_Write(pAudf->pSpeaker->bEndpointIn,
|
||||
pBuffer, wLength);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,237 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* Implementation of a single CDC serial port function for USB device.
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_cdc
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "CDCDSerial.h"
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
#include <USBDDriver.h>
|
||||
#include <USBD_HAL.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Types
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Serial Port instance list */
|
||||
static CDCDSerialPort cdcdSerial;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* USB CDC Serial Port Event Handler.
|
||||
* \param event Event code.
|
||||
* \param param Event parameter.
|
||||
*/
|
||||
static uint32_t CDCDSerial_EventHandler(uint32_t event,
|
||||
uint32_t param)
|
||||
{
|
||||
switch (event) {
|
||||
case CDCDSerialPortEvent_SETCONTROLLINESTATE:
|
||||
{
|
||||
if (CDCDSerial_ControlLineStateChanged) {
|
||||
CDCDSerial_ControlLineStateChanged(
|
||||
(param & CDCControlLineState_DTR) > 0,
|
||||
(param & CDCControlLineState_RTS) > 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CDCDSerialPortEvent_SETLINECODING:
|
||||
{
|
||||
if (CDCDSerial_LineCodingIsToChange) {
|
||||
event = CDCDSerial_LineCodingIsToChange(
|
||||
(CDCLineCoding*)param);
|
||||
if (event != USBRC_SUCCESS)
|
||||
return event;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return USBRC_SUCCESS;
|
||||
}
|
||||
|
||||
return USBRC_SUCCESS;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the USB Device CDC serial driver & USBD Driver.
|
||||
* \param pUsbd Pointer to USBDDriver instance.
|
||||
* \param bInterfaceNb Interface number for the function.
|
||||
*/
|
||||
void CDCDSerial_Initialize(
|
||||
USBDDriver *pUsbd, uint8_t bInterfaceNb)
|
||||
{
|
||||
CDCDSerialPort *pCdcd = &cdcdSerial;
|
||||
|
||||
TRACE_INFO("CDCDSerial_Initialize\n\r");
|
||||
|
||||
/* Initialize serial port function */
|
||||
CDCDSerialPort_Initialize(
|
||||
pCdcd, pUsbd,
|
||||
(CDCDSerialPortEventHandler)CDCDSerial_EventHandler,
|
||||
0,
|
||||
bInterfaceNb, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the device is changed by the
|
||||
* host.
|
||||
* \pDescriptors Pointer to the descriptors for function configure.
|
||||
* \wLength Length of descriptors in number of bytes.
|
||||
*/
|
||||
void CDCDSerial_ConfigureFunction(USBGenericDescriptor *pDescriptors,
|
||||
uint16_t wLength)
|
||||
{
|
||||
CDCDSerialPort *pCdcd = &cdcdSerial;
|
||||
CDCDSerialPort_ParseInterfaces(pCdcd,
|
||||
(USBGenericDescriptor*)pDescriptors,
|
||||
wLength);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles CDC-specific SETUP requests. Should be called from a
|
||||
* re-implementation of USBDCallbacks_RequestReceived() method.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
uint32_t CDCDSerial_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
CDCDSerialPort * pCdcd = &cdcdSerial;
|
||||
|
||||
TRACE_INFO_WP("Cdcf ");
|
||||
return CDCDSerialPort_RequestHandler(pCdcd, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
uint32_t CDCDSerial_Read(void *data,
|
||||
uint32_t size,
|
||||
TransferCallback callback,
|
||||
void *argument)
|
||||
{
|
||||
CDCDSerialPort * pCdcd = &cdcdSerial;
|
||||
return CDCDSerialPort_Read(pCdcd, data, size, callback, argument);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
uint32_t CDCDSerial_Write(void *data,
|
||||
uint32_t size,
|
||||
TransferCallback callback,
|
||||
void *argument)
|
||||
{
|
||||
CDCDSerialPort * pCdcd = &cdcdSerial;
|
||||
return CDCDSerialPort_Write(pCdcd, data, size, callback, argument);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current control line state of the RS-232 line.
|
||||
*/
|
||||
uint8_t CDCDSerial_GetControlLineState(void)
|
||||
{
|
||||
CDCDSerialPort * pCdcd = &cdcdSerial;
|
||||
return CDCDSerialPort_GetControlLineState(pCdcd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy current line coding settings to pointered space.
|
||||
* \param pLineCoding Pointer to CDCLineCoding instance.
|
||||
*/
|
||||
void CDCDSerial_GetLineCoding(CDCLineCoding* pLineCoding)
|
||||
{
|
||||
CDCDSerialPort * pCdcd = &cdcdSerial;
|
||||
CDCDSerialPort_GetLineCoding(pCdcd, pLineCoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current status of the RS-232 line.
|
||||
*/
|
||||
uint16_t CDCDSerial_GetSerialState(void)
|
||||
{
|
||||
CDCDSerialPort * pCdcd = &cdcdSerial;
|
||||
return CDCDSerialPort_GetSerialState(pCdcd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current serial state of the device to the given value.
|
||||
* \param serialState New device state.
|
||||
*/
|
||||
void CDCDSerial_SetSerialState(uint16_t serialState)
|
||||
{
|
||||
CDCDSerialPort * pCdcd = &cdcdSerial;
|
||||
CDCDSerialPort_SetSerialState(pCdcd, serialState);
|
||||
}
|
||||
|
||||
WEAK uint8_t CDCDSerial_LineCodingIsToChange(CDCLineCoding * pLineCoding)
|
||||
{
|
||||
/* Nothing to do */
|
||||
}
|
||||
|
||||
WEAK void CDCDSerial_ControlLineStateChanged(uint8_t DTR,uint8_t RTS)
|
||||
{
|
||||
/* Nothing to do */
|
||||
}
|
||||
/**@}*/
|
||||
@@ -1,116 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* Title: CDCDSerialDriver implementation
|
||||
*
|
||||
* About: Purpose
|
||||
* Implementation of the CDCDSerialDriver class methods.
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_cdc
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "CDCDSerialDriver.h"
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
#include <USBDDriver.h>
|
||||
#include <USBD_HAL.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Types
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the USB Device CDC serial driver & USBD Driver.
|
||||
* \param pDescriptors Pointer to Descriptors list for CDC Serial Device.
|
||||
*/
|
||||
void CDCDSerialDriver_Initialize(const USBDDriverDescriptors *pDescriptors)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
/* Initialize the standard driver */
|
||||
USBDDriver_Initialize(pUsbd,
|
||||
pDescriptors,
|
||||
0); /* Multiple settings for interfaces not supported */
|
||||
|
||||
CDCDSerial_Initialize(pUsbd, CDCDSerialDriver_CC_INTERFACE);
|
||||
|
||||
/* Initialize the USB driver */
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the active configuration of device is changed by the
|
||||
* host.
|
||||
* \param cfgnum Configuration number.
|
||||
*/
|
||||
void CDCDSerialDriver_ConfigurationChangedHandler(uint8_t cfgnum)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
if (cfgnum) {
|
||||
pDesc = USBDDriver_GetCfgDescriptors(pUsbd, cfgnum);
|
||||
CDCDSerial_ConfigureFunction((USBGenericDescriptor *)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles CDC-specific SETUP requests. Should be called from a
|
||||
* re-implementation of USBDCallbacks_RequestReceived() method.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
void CDCDSerialDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
if (CDCDSerial_RequestHandler(request))
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Headers
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/* These headers were introduced in C99
|
||||
by working group ISO/IEC JTC1/SC22/WG14. */
|
||||
#include <stdint.h>
|
||||
|
||||
#include "CDCDSerialDriver.h"
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Default callback functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Invoked when the CDC LineCoding is requested to changed
|
||||
* \param port Port number.
|
||||
* \param pLineCoding Pointer to new LineCoding settings.
|
||||
*/
|
||||
extern WEAK uint8_t CDCDSerialDriver_LineCodingIsToChange(
|
||||
CDCLineCoding * pLineCoding)
|
||||
{
|
||||
/* Accept any of linecoding settings */
|
||||
return USBD_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked when the CDC ControlLineState is changed
|
||||
* \param port Port number.
|
||||
* \param DTR New DTR value.
|
||||
* \param RTS New RTS value.
|
||||
*/
|
||||
extern WEAK void CDCDSerialDriver_ControlLineStateChanged(uint8_t DTR,
|
||||
uint8_t RTS)
|
||||
{
|
||||
/* Do nothing */
|
||||
}
|
||||
|
||||
@@ -1,455 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* Implementation of the CDCDSerialPort class methods.
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_cdc
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <CDCDSerialPort.h>
|
||||
#include <CDCDescriptors.h>
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Types
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Parse data extention for descriptor parsing */
|
||||
typedef struct _CDCDParseData {
|
||||
/** Pointer to CDCDSerialPort instance */
|
||||
CDCDSerialPort * pCdcd;
|
||||
/** Pointer to found interface descriptor */
|
||||
USBInterfaceDescriptor * pIfDesc;
|
||||
|
||||
} CDCDParseData;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Line coding values */
|
||||
static CDCLineCoding lineCoding;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Parse descriptors: Interface, Bulk IN/OUT, Interrupt IN.
|
||||
* \param desc Pointer to descriptor list.
|
||||
* \param arg Argument, pointer to AUDDParseData instance.
|
||||
*/
|
||||
static uint32_t _Interfaces_Parse(USBGenericDescriptor *pDesc,
|
||||
CDCDParseData * pArg)
|
||||
{
|
||||
CDCDSerialPort *pCdcd = pArg->pCdcd;
|
||||
|
||||
/* Not a valid descriptor */
|
||||
if (pDesc->bLength == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
|
||||
/* Find interface descriptor */
|
||||
if (pDesc->bDescriptorType == USBGenericDescriptor_INTERFACE) {
|
||||
USBInterfaceDescriptor *pIf = (USBInterfaceDescriptor*)pDesc;
|
||||
|
||||
/* Obtain interface from descriptor */
|
||||
if (pCdcd->bInterfaceNdx == 0xFF) {
|
||||
/* First interface is communication */
|
||||
if (pIf->bInterfaceClass ==
|
||||
CDCCommunicationInterfaceDescriptor_CLASS) {
|
||||
pCdcd->bInterfaceNdx = pIf->bInterfaceNumber;
|
||||
pCdcd->bNumInterface = 2;
|
||||
}
|
||||
/* Only data interface */
|
||||
else if(pIf->bInterfaceClass == CDCDataInterfaceDescriptor_CLASS) {
|
||||
pCdcd->bInterfaceNdx = pIf->bInterfaceNumber;
|
||||
pCdcd->bNumInterface = 1;
|
||||
}
|
||||
pArg->pIfDesc = pIf;
|
||||
}
|
||||
else if (pCdcd->bInterfaceNdx <= pIf->bInterfaceNumber
|
||||
&& pCdcd->bInterfaceNdx + pCdcd->bNumInterface
|
||||
> pIf->bInterfaceNumber) {
|
||||
pArg->pIfDesc = pIf;
|
||||
}
|
||||
}
|
||||
|
||||
/* Parse valid interfaces */
|
||||
if (pArg->pIfDesc == 0)
|
||||
return 0;
|
||||
|
||||
/* Find endpoint descriptors */
|
||||
if (pDesc->bDescriptorType == USBGenericDescriptor_ENDPOINT) {
|
||||
USBEndpointDescriptor *pEp = (USBEndpointDescriptor*)pDesc;
|
||||
switch(pEp->bmAttributes & 0x3) {
|
||||
case USBEndpointDescriptor_INTERRUPT:
|
||||
if (pEp->bEndpointAddress & 0x80)
|
||||
pCdcd->bIntInPIPE = pEp->bEndpointAddress & 0x7F;
|
||||
break;
|
||||
case USBEndpointDescriptor_BULK:
|
||||
if (pEp->bEndpointAddress & 0x80)
|
||||
pCdcd->bBulkInPIPE = pEp->bEndpointAddress & 0x7F;
|
||||
else
|
||||
pCdcd->bBulkOutPIPE = pEp->bEndpointAddress;
|
||||
}
|
||||
}
|
||||
|
||||
if ( pCdcd->bInterfaceNdx != 0xFF
|
||||
&& pCdcd->bBulkInPIPE != 0
|
||||
&& pCdcd->bBulkOutPIPE != 0)
|
||||
return USBRC_FINISHED;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback function which should be invoked after the data of a
|
||||
* SetLineCoding request has been retrieved. Sends a zero-length packet
|
||||
* to the host for acknowledging the request.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
*/
|
||||
static void _SetLineCodingCallback(CDCDSerialPort * pCdcd)
|
||||
{
|
||||
uint32_t exec = 1;
|
||||
if (pCdcd->fEventHandler) {
|
||||
uint32_t rc = pCdcd->fEventHandler(
|
||||
CDCDSerialPortEvent_SETLINECODING,
|
||||
(uint32_t)(&lineCoding),
|
||||
pCdcd->pArg);
|
||||
if (rc == USBD_STATUS_SUCCESS) {
|
||||
pCdcd->lineCoding.dwDTERate = lineCoding.dwDTERate;
|
||||
pCdcd->lineCoding.bCharFormat = lineCoding.bCharFormat;
|
||||
pCdcd->lineCoding.bParityType = lineCoding.bParityType;
|
||||
pCdcd->lineCoding.bDataBits = lineCoding.bDataBits;
|
||||
}
|
||||
else
|
||||
exec = 0;
|
||||
}
|
||||
if (exec) USBD_Write(0, 0, 0, 0, 0);
|
||||
else USBD_Stall(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Receives new line coding information from the USB host.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
*/
|
||||
static void _SetLineCoding(CDCDSerialPort * pCdcd)
|
||||
{
|
||||
TRACE_INFO_WP("sLineCoding ");
|
||||
|
||||
USBD_Read(0,
|
||||
(void *) & (lineCoding),
|
||||
sizeof(CDCLineCoding),
|
||||
(TransferCallback)_SetLineCodingCallback,
|
||||
(void*)pCdcd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the current line coding information to the host through Control
|
||||
* endpoint 0.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
*/
|
||||
static void _GetLineCoding(CDCDSerialPort * pCdcd)
|
||||
{
|
||||
TRACE_INFO_WP("gLineCoding ");
|
||||
|
||||
USBD_Write(0,
|
||||
(void *) &(pCdcd->lineCoding),
|
||||
sizeof(CDCLineCoding),
|
||||
0,
|
||||
0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the state of the serial driver according to the information
|
||||
* sent by the host via a SetControlLineState request, and acknowledges
|
||||
* the request with a zero-length packet.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
static void _SetControlLineState(
|
||||
CDCDSerialPort * pCdcd,
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
uint8_t DTR, RTS;
|
||||
|
||||
DTR = ((request->wValue & CDCControlLineState_DTR) > 0);
|
||||
RTS = ((request->wValue & CDCControlLineState_RTS) > 0);
|
||||
TRACE_INFO_WP("sControlLineState(%d, %d) ", DTR, RTS);
|
||||
|
||||
pCdcd->bControlLineState = (uint8_t)request->wValue;
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
|
||||
if (pCdcd->fEventHandler)
|
||||
pCdcd->fEventHandler(CDCDSerialPortEvent_SETCONTROLLINESTATE,
|
||||
|
||||
(uint32_t)pCdcd->bControlLineState,
|
||||
pCdcd->pArg);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the USB Device CDC serial port function.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
* \param pUsbd Pointer to USBDDriver instance.
|
||||
* \param fEventHandler Pointer to event handler function.
|
||||
* \param firstInterface First interface index for the function
|
||||
* (0xFF to parse from descriptors).
|
||||
* \param numInterface Number of interfaces for the function.
|
||||
*/
|
||||
void CDCDSerialPort_Initialize(CDCDSerialPort * pCdcd,
|
||||
USBDDriver * pUsbd,
|
||||
CDCDSerialPortEventHandler fEventHandler,
|
||||
void * pArg,
|
||||
uint8_t firstInterface,uint8_t numInterface)
|
||||
{
|
||||
TRACE_INFO("CDCDSerialPort_Initialize\n\r");
|
||||
|
||||
/* Initialize event handler */
|
||||
pCdcd->fEventHandler = fEventHandler;
|
||||
pCdcd->pArg = pArg;
|
||||
|
||||
/* Initialize USB Device Driver interface */
|
||||
pCdcd->pUsbd = pUsbd;
|
||||
pCdcd->bInterfaceNdx = firstInterface;
|
||||
pCdcd->bNumInterface = numInterface;
|
||||
pCdcd->bIntInPIPE = 0;
|
||||
pCdcd->bBulkInPIPE = 0;
|
||||
pCdcd->bBulkOutPIPE = 0;
|
||||
|
||||
/* Initialize Abstract Control Model attributes */
|
||||
pCdcd->bControlLineState = 0;
|
||||
pCdcd->wSerialState = 0;
|
||||
CDCLineCoding_Initialize(&(pCdcd->lineCoding),
|
||||
115200,
|
||||
CDCLineCoding_ONESTOPBIT,
|
||||
CDCLineCoding_NOPARITY,
|
||||
8);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse CDC Serial Port information for CDCDSerialPort instance.
|
||||
* Accepted interfaces:
|
||||
* - Communication Interface + Data Interface
|
||||
* - Data Interface ONLY
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
* \param pDescriptors Pointer to descriptor list.
|
||||
* \param dwLength Descriptor list size in bytes.
|
||||
*/
|
||||
USBGenericDescriptor *CDCDSerialPort_ParseInterfaces(
|
||||
CDCDSerialPort *pCdcd,
|
||||
USBGenericDescriptor *pDescriptors,
|
||||
uint32_t dwLength)
|
||||
{
|
||||
CDCDParseData parseData;
|
||||
|
||||
parseData.pCdcd = pCdcd;
|
||||
parseData.pIfDesc = 0;
|
||||
|
||||
return USBGenericDescriptor_Parse(
|
||||
pDescriptors, dwLength,
|
||||
(USBDescriptorParseFunction)_Interfaces_Parse,
|
||||
&parseData);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Handles CDC-specific SETUP requests. Should be called from a
|
||||
* re-implementation of USBDCallbacks_RequestReceived() method.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
* \return USBRC_SUCCESS if request handled, otherwise error.
|
||||
*/
|
||||
uint32_t CDCDSerialPort_RequestHandler(
|
||||
CDCDSerialPort *pCdcd,
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
if (USBGenericRequest_GetType(request) != USBGenericRequest_CLASS)
|
||||
return USBRC_PARAM_ERR;
|
||||
|
||||
TRACE_INFO_WP("Cdcs ");
|
||||
|
||||
/* Validate interface */
|
||||
if (request->wIndex >= pCdcd->bInterfaceNdx &&
|
||||
request->wIndex < pCdcd->bInterfaceNdx + pCdcd->bNumInterface) {
|
||||
}
|
||||
else {
|
||||
return USBRC_PARAM_ERR;
|
||||
}
|
||||
|
||||
/* Handle the request */
|
||||
switch (USBGenericRequest_GetRequest(request)) {
|
||||
|
||||
case CDCGenericRequest_SETLINECODING:
|
||||
|
||||
_SetLineCoding(pCdcd);
|
||||
break;
|
||||
|
||||
case CDCGenericRequest_GETLINECODING:
|
||||
|
||||
_GetLineCoding(pCdcd);
|
||||
break;
|
||||
|
||||
case CDCGenericRequest_SETCONTROLLINESTATE:
|
||||
|
||||
_SetControlLineState(pCdcd, request);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
return USBRC_PARAM_ERR;
|
||||
}
|
||||
|
||||
return USBRC_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Receives data from the host through the virtual COM port created by
|
||||
* the CDC device serial driver. This function behaves like USBD_Read.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
* \param pData Pointer to the data buffer to put received data.
|
||||
* \param dwSize Size of the data buffer in bytes.
|
||||
* \param fCallback Optional callback function to invoke when the transfer
|
||||
* finishes.
|
||||
* \param pArg Optional argument to the callback function.
|
||||
* \return USBD_STATUS_SUCCESS if the read operation has been started normally;
|
||||
* otherwise, the corresponding error code.
|
||||
*/
|
||||
uint32_t CDCDSerialPort_Read(const CDCDSerialPort * pCdcd,
|
||||
void * pData,uint32_t dwSize,
|
||||
TransferCallback fCallback,void * pArg)
|
||||
{
|
||||
if (pCdcd->bBulkOutPIPE == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
|
||||
return USBD_Read(pCdcd->bBulkOutPIPE,
|
||||
pData, dwSize,
|
||||
fCallback, pArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a data buffer through the virtual COM port created by the CDC
|
||||
* device serial driver. This function behaves exactly like USBD_Write.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
* \param pData Pointer to the data buffer to send.
|
||||
* \param dwSize Size of the data buffer in bytes.
|
||||
* \param fCallback Optional callback function to invoke when the transfer
|
||||
* finishes.
|
||||
* \param pArg Optional argument to the callback function.
|
||||
* \return USBD_STATUS_SUCCESS if the read operation has been started normally;
|
||||
* otherwise, the corresponding error code.
|
||||
*/
|
||||
uint32_t CDCDSerialPort_Write(const CDCDSerialPort * pCdcd,
|
||||
void * pData, uint32_t dwSize,
|
||||
TransferCallback fCallback, void * pArg)
|
||||
{
|
||||
if (pCdcd->bBulkInPIPE == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
|
||||
return USBD_Write(pCdcd->bBulkInPIPE,
|
||||
pData, dwSize,
|
||||
fCallback, pArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current control line state of the RS-232 line.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
*/
|
||||
uint8_t CDCDSerialPort_GetControlLineState(const CDCDSerialPort * pCdcd)
|
||||
{
|
||||
return pCdcd->bControlLineState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy current line coding settings to pointered space.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
* \param pLineCoding Pointer to CDCLineCoding instance.
|
||||
*/
|
||||
void CDCDSerialPort_GetLineCoding(const CDCDSerialPort * pCdcd,
|
||||
CDCLineCoding* pLineCoding)
|
||||
{
|
||||
if (pLineCoding) {
|
||||
pLineCoding->dwDTERate = pCdcd->lineCoding.dwDTERate;
|
||||
pLineCoding->bCharFormat = pCdcd->lineCoding.bCharFormat;
|
||||
pLineCoding->bParityType = pCdcd->lineCoding.bParityType;
|
||||
pLineCoding->bDataBits = pCdcd->lineCoding.bDataBits;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current status of the RS-232 line.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
*/
|
||||
uint16_t CDCDSerialPort_GetSerialState(const CDCDSerialPort * pCdcd)
|
||||
{
|
||||
return pCdcd->wSerialState;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current serial state of the device to the given value.
|
||||
* \param pCdcd Pointer to CDCDSerialPort instance.
|
||||
* \param wSerialState New device state.
|
||||
*/
|
||||
void CDCDSerialPort_SetSerialState(CDCDSerialPort * pCdcd,
|
||||
uint16_t wSerialState)
|
||||
{
|
||||
if (pCdcd->bIntInPIPE == 0)
|
||||
return;
|
||||
|
||||
/* If new state is different from previous one, send a notification to the
|
||||
host */
|
||||
if (pCdcd->wSerialState != wSerialState) {
|
||||
|
||||
pCdcd->wSerialState = wSerialState;
|
||||
USBD_Write(pCdcd->bIntInPIPE,
|
||||
&(pCdcd->wSerialState),
|
||||
2,
|
||||
0,
|
||||
0);
|
||||
|
||||
/* Reset one-time flags */
|
||||
pCdcd->wSerialState &= ~(CDCSerialState_OVERRUN
|
||||
| CDCSerialState_PARITY
|
||||
| CDCSerialState_FRAMING
|
||||
| CDCSerialState_RINGSIGNAL
|
||||
| CDCSerialState_BREAK);
|
||||
}
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,235 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
/** \addtogroup usbd_aud_fun
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
#include <AUDDFunction.h>
|
||||
#include <AUDDSpeakerPhone.h>
|
||||
|
||||
#include <AUDRequests.h>
|
||||
|
||||
#include <USBD.h>
|
||||
#include <USBD_HAL.h>
|
||||
#include <USBDDriver.h>
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Internal types
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \brief Audio speaker driver struct.
|
||||
*/
|
||||
typedef struct _AUDDFunction {
|
||||
/** Speaker & Phone function */
|
||||
AUDDSpeakerPhone drv;
|
||||
/** Stream instance for speaker */
|
||||
AUDDStream speaker;
|
||||
/** Stream instance for microphone */
|
||||
AUDDStream mic;
|
||||
} AUDDFunction;
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/** Global USB audio function driver instance. */
|
||||
static AUDDFunction auddFunction;
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Callback triggerred after the mute or volume status of the channel has been
|
||||
* changed.
|
||||
* \param ec Event code.
|
||||
* \param channel Channel number.
|
||||
* \param pArg Pointer to AUDDStream instance.
|
||||
*/
|
||||
static void AUDDFunction_EventCallback(uint32_t ec,
|
||||
uint8_t channel,
|
||||
AUDDStream *pArg)
|
||||
{
|
||||
AUDDFunction *pAudf = &auddFunction;
|
||||
uint8_t mic = ((uint32_t)pArg == (uint32_t)(&pAudf->mic));
|
||||
if (ec == AUDD_EC_MuteChanged) {
|
||||
if (AUDDFunction_MuteChanged)
|
||||
AUDDFunction_MuteChanged(mic, channel, pArg->bmMute);
|
||||
}
|
||||
else if (ec == AUDD_EC_VolumeChanged) {
|
||||
/* Not supported now */
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes an USB audio speaker device driver, as well as the underlying
|
||||
* USB controller.
|
||||
*/
|
||||
void AUDDFunction_Initialize(USBDDriver *pUsbd, uint8_t bInterface)
|
||||
{
|
||||
AUDDFunction *pAudf = &auddFunction;
|
||||
AUDDSpeakerPhone *pDrv = &pAudf->drv;
|
||||
AUDDStream *pSpk = &pAudf->speaker;
|
||||
AUDDStream *pMic = &pAudf->mic;
|
||||
|
||||
/* 0: Speaker */
|
||||
AUDDSpeakerPhone_InitializeStream(
|
||||
pSpk, AUDDFunction_MaxNumSpeakerChannels, 0,
|
||||
(AUDDStreamEventCallback)AUDDFunction_EventCallback,
|
||||
(void*)pSpk);
|
||||
/* 1: Mic */
|
||||
AUDDSpeakerPhone_InitializeStream(
|
||||
pMic, AUDDFunction_MaxNumMicrophoneChannels, 0,
|
||||
(AUDDStreamEventCallback)AUDDFunction_EventCallback,
|
||||
(void*)pMic);
|
||||
/* Audio Driver initialize */
|
||||
AUDDSpeakerPhone_Initialize(pDrv, pUsbd, pSpk, pMic);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure function with expected descriptors and start functionality.
|
||||
* Usually invoked when device is configured.
|
||||
* \pDescriptors Pointer to the descriptors for function configure.
|
||||
* \wLength Length of descriptors in number of bytes.
|
||||
*/
|
||||
void AUDDFunction_Configure(USBGenericDescriptor *pDescriptors,
|
||||
uint16_t wLength)
|
||||
{
|
||||
AUDDFunction *pAudf = &auddFunction;
|
||||
AUDDSpeakerPhone *pDrv = &pAudf->drv;
|
||||
AUDDSpeakerPhone_ParseInterfaces(pDrv, pDescriptors, wLength);
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the active setting of an interface is changed by the
|
||||
* host. Changes the status of the third LED accordingly.
|
||||
* \param interface Interface number.
|
||||
* \param setting Newly active setting.
|
||||
*/
|
||||
void AUDDFunction_InterfaceSettingChangedHandler(uint8_t interface,
|
||||
uint8_t setting)
|
||||
{
|
||||
AUDDFunction *pAudf = &auddFunction;
|
||||
AUDDSpeakerPhone *pDrv = &pAudf->drv;
|
||||
if (setting == 0) AUDDSpeakerPhone_CloseStream(pDrv, interface);
|
||||
if (AUDDFunction_StreamSettingChanged) {
|
||||
uint8_t mic = (interface == pDrv->pMicrophone->bAsInterface);
|
||||
AUDDFunction_StreamSettingChanged(mic, setting);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles AUDIO-specific USB requests sent by the host
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
* \return USBRC_SUCCESS if request is handled.
|
||||
*/
|
||||
uint32_t AUDDFunction_RequestHandler(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
AUDDFunction *pAudf = &auddFunction;
|
||||
AUDDSpeakerPhone *pDrv = &pAudf->drv;
|
||||
return AUDDSpeakerPhone_RequestHandler(pDrv, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads incoming audio data sent by the USB host into the provided buffer.
|
||||
* When the transfer is complete, an optional callback function is invoked.
|
||||
* \param buffer Pointer to the data storage buffer.
|
||||
* \param length Size of the buffer in bytes.
|
||||
* \param callback Optional callback function.
|
||||
* \param argument Optional argument to the callback function.
|
||||
* \return <USBD_STATUS_SUCCESS> if the transfer is started successfully;
|
||||
* otherwise an error code.
|
||||
*/
|
||||
uint8_t AUDDFunction_Read(void *buffer,
|
||||
uint32_t length,
|
||||
TransferCallback callback,
|
||||
void *argument)
|
||||
{
|
||||
AUDDFunction *pAudf = &auddFunction;
|
||||
AUDDSpeakerPhone *pDrv = &pAudf->drv;
|
||||
return AUDDSpeakerPhone_Read(pDrv, buffer, length, callback, argument);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize Frame List for sending audio data.
|
||||
*
|
||||
* \param pListInit Pointer to the allocated list for audio write.
|
||||
* \param pDmaInit Pointer to the allocated DMA descriptors for autio write
|
||||
* (if DMA supported).
|
||||
* \param listSize Circular list size.
|
||||
* \param delaySize Start transfer after delaySize frames filled in.
|
||||
* \param callback Optional callback function for transfer.
|
||||
* \param argument Optional callback argument.
|
||||
* \return USBD_STATUS_SUCCESS if setup successfully; otherwise an error code.
|
||||
*/
|
||||
uint8_t AUDDFunction_SetupWrite(void * pListInit,
|
||||
void * pDmaInit,
|
||||
uint16_t listSize,
|
||||
uint16_t delaySize,
|
||||
TransferCallback callback,
|
||||
void * argument)
|
||||
{
|
||||
AUDDFunction *pAudf = &auddFunction;
|
||||
AUDDSpeakerPhone *pDrv = &pAudf->drv;
|
||||
return AUDDSpeakerPhone_SetupWrite(pDrv,
|
||||
pListInit, pDmaInit, listSize, delaySize,
|
||||
callback, argument);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add frame buffer to audio sending list.
|
||||
* \buffer Pointer to data frame to send.
|
||||
* \length Frame size in bytes.
|
||||
* \return USBD_STATUS_SUCCESS if the transfer is started successfully;
|
||||
* otherwise an error code.
|
||||
*/
|
||||
uint8_t AUDDFunction_Write(void* buffer, uint16_t length)
|
||||
{
|
||||
AUDDFunction *pAudf = &auddFunction;
|
||||
AUDDSpeakerPhone *pDrv = &pAudf->drv;
|
||||
return AUDDSpeakerPhone_Write(pDrv, buffer, length);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_composite_cdcaud
|
||||
*@{
|
||||
*/
|
||||
/*---------------------------------------------------------------------------
|
||||
* Headers
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
#include <CDCAUDDDriver.h>
|
||||
#include <CDCDSerial.h>
|
||||
#include <AUDDFunction.h>
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Defines
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Types
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/** Array for storing the current setting of each interface */
|
||||
static uint8_t bAltInterfaces[CDCAUDDDriverDescriptors_MaxNumInterfaces];
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the USB device composite device driver.
|
||||
*/
|
||||
void CDCAUDDDriver_Initialize(const USBDDriverDescriptors *pDescriptors)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
/* Initialize the standard USB driver */
|
||||
USBDDriver_Initialize(pUsbd,
|
||||
pDescriptors,
|
||||
bAltInterfaces);
|
||||
|
||||
/* CDC */
|
||||
CDCDSerial_Initialize(pUsbd, CDCAUDDDriverDescriptors_CDC_INTERFACE);
|
||||
/* Audio */
|
||||
AUDDFunction_Initialize(pUsbd, CDCAUDDDriverDescriptors_AUD_INTERFACE);
|
||||
|
||||
/* Initialize the USB driver */
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the configuration value of a device is changed by the host
|
||||
* \param cfgnum Configuration number.
|
||||
*/
|
||||
void CDCAUDDDriver_ConfigurationChangedHandler(uint8_t cfgnum)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
if (cfgnum > 0) {
|
||||
pDesc = USBDDriver_GetCfgDescriptors(pUsbd, cfgnum);
|
||||
/* CDC */
|
||||
CDCDSerial_ConfigureFunction((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
/* AUD */
|
||||
AUDDFunction_Configure((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the active setting of an interface is changed by the
|
||||
* host. Changes the status of the third LED accordingly.
|
||||
* \param interface Interface number.
|
||||
* \param setting Newly active setting.
|
||||
*/
|
||||
void CDCAUDDDriver_InterfaceSettingChangedHandler(uint8_t interface,
|
||||
uint8_t setting)
|
||||
{
|
||||
AUDDFunction_InterfaceSettingChangedHandler(interface, setting);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles composite-specific USB requests sent by the host, and forwards
|
||||
* standard ones to the USB device driver.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
void CDCAUDDDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
|
||||
if (CDCDSerial_RequestHandler(request) == USBRC_SUCCESS)
|
||||
return;
|
||||
|
||||
if (AUDDFunction_RequestHandler(request) == USBRC_SUCCESS)
|
||||
return;
|
||||
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,138 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_composite_cdchid
|
||||
*@{
|
||||
*/
|
||||
/*---------------------------------------------------------------------------
|
||||
* Headers
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
#include <CDCHIDDDriver.h>
|
||||
#include <CDCDSerial.h>
|
||||
#include <HIDDKeyboard.h>
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Defines
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Types
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the USB device composite device driver.
|
||||
*/
|
||||
void CDCHIDDDriver_Initialize(const USBDDriverDescriptors *pDescriptors)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
/* Initialize the standard USB driver */
|
||||
USBDDriver_Initialize(pUsbd,
|
||||
pDescriptors,
|
||||
0);
|
||||
|
||||
/* CDC */
|
||||
CDCDSerial_Initialize(pUsbd, CDCHIDDDriverDescriptors_CDC_INTERFACE);
|
||||
/* HID */
|
||||
HIDDKeyboard_Initialize(pUsbd, CDCHIDDDriverDescriptors_HID_INTERFACE);
|
||||
|
||||
/* Initialize the USB driver */
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the configuration value of a device is changed by the host
|
||||
* \param cfgnum Configuration number.
|
||||
*/
|
||||
void CDCHIDDDriver_ConfigurationChangedHandler(uint8_t cfgnum)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
if (cfgnum > 0) {
|
||||
pDesc = USBDDriver_GetCfgDescriptors(pUsbd, cfgnum);
|
||||
/* CDC */
|
||||
CDCDSerial_ConfigureFunction((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
/* HID */
|
||||
HIDDKeyboard_ConfigureFunction((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles composite-specific USB requests sent by the host, and forwards
|
||||
* standard ones to the USB device driver.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
void CDCHIDDDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
|
||||
if (CDCDSerial_RequestHandler(request) == USBRC_SUCCESS)
|
||||
return;
|
||||
|
||||
if (HIDDKeyboard_RequestHandler(request) == USBRC_SUCCESS)
|
||||
return;
|
||||
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a remote wake-up sequence if the host has explicitely enabled it
|
||||
* by sending the appropriate SET_FEATURE request.
|
||||
*/
|
||||
void CDCHIDDDriver_RemoteWakeUp(void)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
/* Remote wake-up has been enabled */
|
||||
if (USBDDriver_IsRemoteWakeUpEnabled(pUsbd)) {
|
||||
|
||||
USBD_RemoteWakeUp();
|
||||
}
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,128 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
/** \addtogroup usbd_composite_cdcmsd
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Headers
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
#include <CDCMSDDriver.h>
|
||||
|
||||
#include <CDCDSerial.h>
|
||||
#include <MSDFunction.h>
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Defines
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Types
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the USB device CDCMSD device driver.
|
||||
*/
|
||||
void CDCMSDDriver_Initialize(
|
||||
const USBDDriverDescriptors *pDescriptors,
|
||||
MSDLun *pLuns, unsigned char numLuns)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
/* Initialize the standard USB driver */
|
||||
USBDDriver_Initialize(pUsbd, pDescriptors, 0);
|
||||
|
||||
/* CDC */
|
||||
CDCDSerial_Initialize(pUsbd, CDCMSDDriverDescriptors_CDC_INTERFACE);
|
||||
|
||||
/* MSD */
|
||||
MSDFunction_Initialize(pUsbd, CDCMSDDriverDescriptors_MSD_INTERFACE,
|
||||
pLuns, numLuns);
|
||||
|
||||
/* Initialize the USB driver */
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the configuration value of a device is changed by the host
|
||||
* \param cfgnum Configuration number.
|
||||
*/
|
||||
void CDCMSDDriver_ConfigurationChangedHandler(unsigned char cfgnum)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
if (cfgnum > 0) {
|
||||
pDesc = USBDDriver_GetCfgDescriptors(pUsbd, cfgnum);
|
||||
/* CDC */
|
||||
CDCDSerial_ConfigureFunction((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
/* MSD */
|
||||
MSDFunction_Configure((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles CDCMSD-specific USB requests sent by the host, and forwards
|
||||
* standard ones to the USB device driver.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
void CDCMSDDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
|
||||
if (CDCDSerial_RequestHandler(request) == USBRC_SUCCESS)
|
||||
return;
|
||||
|
||||
if (MSDFunction_RequestHandler(request) == USBRC_SUCCESS)
|
||||
return;
|
||||
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,194 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
/** \addtogroup usbd_composite_cdccdc
|
||||
*@{
|
||||
*/
|
||||
/*---------------------------------------------------------------------------
|
||||
* Headers
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/* GENERAL */
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
/* USB */
|
||||
#include <USBD.h>
|
||||
#include <USBD_HAL.h>
|
||||
#include <USBDDriver.h>
|
||||
|
||||
/* - DUALCDC */
|
||||
#include <DUALCDCDDriver.h>
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Defines
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/** Number of CDC serial ports */
|
||||
#define NUM_PORTS 2
|
||||
|
||||
/** Interface setting spaces (4 byte aligned) */
|
||||
#define NUM_INTERFACES ((DUALCDCDDriverDescriptors_NUMINTERFACE+3)&0xFC)
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Types
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/** Dual-CDC-Serial device driver struct */
|
||||
typedef struct _DualCdcdSerialDriver {
|
||||
/** CDC Serial Port List */
|
||||
CDCDSerialPort cdcdSerialPort[NUM_PORTS];
|
||||
} DualCdcdSerialDriver;
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/** Dual CDC Serial device driver instance */
|
||||
DualCdcdSerialDriver dualcdcdDriver;
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the USB device composite device driver.
|
||||
* \param pDescriptors Pointer to Descriptors list for CDC Serial Device.
|
||||
*/
|
||||
void DUALCDCDDriver_Initialize(const USBDDriverDescriptors *pDescriptors)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
CDCDSerialPort *pCdcd = &dualcdcdDriver.cdcdSerialPort[0];
|
||||
|
||||
TRACE_INFO("DUALCDCDDriver_Initialize\n\r");
|
||||
|
||||
pCdcd = &dualcdcdDriver.cdcdSerialPort[0];
|
||||
CDCDSerialPort_Initialize(pCdcd, pUsbd,
|
||||
0,
|
||||
0,
|
||||
DUALCDCDDriverDescriptors_INTERFACENUM0, 2);
|
||||
|
||||
pCdcd = &dualcdcdDriver.cdcdSerialPort[1];
|
||||
CDCDSerialPort_Initialize(pCdcd, pUsbd,
|
||||
0,
|
||||
0,
|
||||
DUALCDCDDriverDescriptors_INTERFACENUM1, 2);
|
||||
|
||||
/* Initialize the standard USB driver */
|
||||
USBDDriver_Initialize(pUsbd,
|
||||
pDescriptors,
|
||||
0);
|
||||
/* Initialize the USB driver */
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the active configuration of device is changed by the
|
||||
* host.
|
||||
* \param cfgnum Configuration number.
|
||||
*/
|
||||
void DUALCDCDDriver_ConfigurationChangeHandler(uint8_t cfgnum)
|
||||
{
|
||||
CDCDSerialPort *pCdcd = &dualcdcdDriver.cdcdSerialPort[0];
|
||||
USBDDriver *pUsbd = pCdcd->pUsbd;
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
USBGenericDescriptor *pD;
|
||||
uint32_t i, len;
|
||||
|
||||
if (cfgnum > 0) {
|
||||
|
||||
/* Parse endpoints for data & notification */
|
||||
pDesc = USBDDriver_GetCfgDescriptors(pUsbd, cfgnum);
|
||||
|
||||
pD = (USBGenericDescriptor *)pDesc;
|
||||
len = pDesc->wTotalLength;
|
||||
|
||||
for (i = 0; i < NUM_PORTS; i ++) {
|
||||
pCdcd = &dualcdcdDriver.cdcdSerialPort[i];
|
||||
pD = CDCDSerialPort_ParseInterfaces(pCdcd, pD, len);
|
||||
len = pDesc->wTotalLength - ((uint32_t)pD - (uint32_t)pDesc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Handles composite-specific USB requests sent by the host, and forwards
|
||||
* standard ones to the USB device driver.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
void DUALCDCDDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
CDCDSerialPort *pCdcd = 0;
|
||||
USBDDriver *pUsbd = 0;
|
||||
uint32_t rc, i;
|
||||
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
|
||||
for (i = 0; i < NUM_PORTS; i ++) {
|
||||
pCdcd = &dualcdcdDriver.cdcdSerialPort[i];
|
||||
rc = CDCDSerialPort_RequestHandler(pCdcd, request);
|
||||
if (rc == USBRC_SUCCESS)
|
||||
break;
|
||||
}
|
||||
|
||||
/* Not handled by CDC Serial */
|
||||
if (rc != USBRC_SUCCESS) {
|
||||
if (USBGenericRequest_GetType(request) == USBGenericRequest_STANDARD) {
|
||||
pUsbd = pCdcd->pUsbd;
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
else {
|
||||
TRACE_WARNING(
|
||||
"DUALCDCDDriver_RequestHandler: Unsupported request (%d,%d)\n\r",
|
||||
USBGenericRequest_GetType(request),
|
||||
USBGenericRequest_GetRequest(request));
|
||||
USBD_Stall(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Return CDCDSerialPort for serial port operations.
|
||||
* \param port Port number.
|
||||
*/
|
||||
CDCDSerialPort *DUALCDCDDriver_GetSerialPort(uint32_t port)
|
||||
{
|
||||
if (port < NUM_PORTS)
|
||||
return &dualcdcdDriver.cdcdSerialPort[port];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_composite_hidaud
|
||||
*@{
|
||||
*/
|
||||
/*---------------------------------------------------------------------------
|
||||
* Headers
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
#include <HIDAUDDDriver.h>
|
||||
#include <HIDDKeyboard.h>
|
||||
#include <AUDDFunction.h>
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Defines
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Types
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/** Array for storing the current setting of each interface */
|
||||
static uint8_t bAltInterfaces[HIDAUDDDriverDescriptors_NUMINTERFACE];
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the USB device composite device driver.
|
||||
*/
|
||||
void HIDAUDDDriver_Initialize(const USBDDriverDescriptors *pDescriptors)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
/* Initialize the standard USB driver */
|
||||
USBDDriver_Initialize(pUsbd,
|
||||
pDescriptors,
|
||||
bAltInterfaces);
|
||||
|
||||
/* HID */
|
||||
HIDDKeyboard_Initialize(pUsbd, HIDAUDDDriverDescriptors_HID_INTERFACE);
|
||||
/* Audio */
|
||||
AUDDFunction_Initialize(pUsbd, HIDAUDDDriverDescriptors_AUD_INTERFACE);
|
||||
|
||||
/* Initialize the USB driver */
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the configuration value of a device is changed by the host
|
||||
* \param cfgnum Configuration number.
|
||||
*/
|
||||
void HIDAUDDDriver_ConfigurationChangedHandler(uint8_t cfgnum)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
if (cfgnum > 0) {
|
||||
pDesc = USBDDriver_GetCfgDescriptors(pUsbd, cfgnum);
|
||||
/* CDC */
|
||||
HIDDKeyboard_ConfigureFunction((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
/* AUD */
|
||||
AUDDFunction_Configure((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the active setting of an interface is changed by the
|
||||
* host. Changes the status of the third LED accordingly.
|
||||
* \param interface Interface number.
|
||||
* \param setting Newly active setting.
|
||||
*/
|
||||
void HIDAUDDDriver_InterfaceSettingChangedHandler(uint8_t interface,
|
||||
uint8_t setting)
|
||||
{
|
||||
AUDDFunction_InterfaceSettingChangedHandler(interface, setting);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles composite-specific USB requests sent by the host, and forwards
|
||||
* standard ones to the USB device driver.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
void HIDAUDDDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
|
||||
if (HIDDKeyboard_RequestHandler(request) == USBRC_SUCCESS)
|
||||
return;
|
||||
|
||||
if (AUDDFunction_RequestHandler(request) == USBRC_SUCCESS)
|
||||
return;
|
||||
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_composite_hidmsd
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Headers
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
#include <HIDMSDDriver.h>
|
||||
|
||||
#include <HIDDKeyboard.h>
|
||||
#include <MSDFunction.h>
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Defines
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Types
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the USB device HIDMSD device driver.
|
||||
*/
|
||||
void HIDMSDDriver_Initialize(
|
||||
const USBDDriverDescriptors *pDescriptors,
|
||||
MSDLun *pLuns, uint8_t numLuns)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
/* Initialize the standard USB driver */
|
||||
USBDDriver_Initialize(pUsbd,
|
||||
pDescriptors,
|
||||
0);
|
||||
|
||||
/* HID */
|
||||
HIDDKeyboard_Initialize(pUsbd, HIDMSDDriverDescriptors_HID_INTERFACE);
|
||||
|
||||
/* MSD */
|
||||
MSDFunction_Initialize(pUsbd, HIDMSDDriverDescriptors_MSD_INTERFACE,
|
||||
pLuns, numLuns);
|
||||
|
||||
/* Initialize the USB driver */
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked whenever the configuration value of a device is changed by the host
|
||||
* \param cfgnum Configuration number.
|
||||
*/
|
||||
void HIDMSDDriver_ConfigurationChangedHandler(uint8_t cfgnum)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
if (cfgnum > 0) {
|
||||
pDesc = USBDDriver_GetCfgDescriptors(pUsbd, cfgnum);
|
||||
/* HID */
|
||||
HIDDKeyboard_ConfigureFunction((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
/* MSD */
|
||||
MSDFunction_Configure((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles HIDMSD-specific USB requests sent by the host, and forwards
|
||||
* standard ones to the USB device driver.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
void HIDMSDDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
|
||||
if (HIDDKeyboard_RequestHandler(request) == USBRC_SUCCESS)
|
||||
return;
|
||||
|
||||
if (MSDFunction_RequestHandler(request) == USBRC_SUCCESS)
|
||||
return;
|
||||
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a remote wake-up sequence if the host has explicitely enabled it
|
||||
* by sending the appropriate SET_FEATURE request.
|
||||
*/
|
||||
void HIDMSDDriver_RemoteWakeUp(void)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
/* Remote wake-up has been enabled */
|
||||
if (USBDDriver_IsRemoteWakeUpEnabled(pUsbd)) {
|
||||
|
||||
USBD_RemoteWakeUp();
|
||||
}
|
||||
/* Remote wake-up NOT enabled */
|
||||
else {
|
||||
|
||||
TRACE_WARNING("HIDMSDDDriver_RemoteWakeUp: not enabled\n\r");
|
||||
}
|
||||
}
|
||||
/**@}*/
|
||||
|
||||
@@ -1,374 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_hid_key
|
||||
*@{
|
||||
* Implement HID Keyboard Function For USB Device.
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <HIDDKeyboard.h>
|
||||
#include <HIDDFunction.h>
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
#include <USBRequests.h>
|
||||
#include <HIDDescriptors.h>
|
||||
#include <HIDRequests.h>
|
||||
#include <HIDReports.h>
|
||||
#include <HIDUsages.h>
|
||||
|
||||
#include <USBD.h>
|
||||
#include <USBD_HAL.h>
|
||||
#include <USBDDriver.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal types
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Extended struct for an HID Keyboard Input report, for transfer driver to
|
||||
* send reports.
|
||||
*/
|
||||
typedef struct _KBDInputReport {
|
||||
/** 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;
|
||||
/** Input Report Data Block */
|
||||
HIDDKeyboardInputReport sReport;
|
||||
} KBDInputReport;
|
||||
|
||||
/**
|
||||
* Extended struct for an HID Keyboard Output report, for transfer driver to
|
||||
* polling reports.
|
||||
*/
|
||||
typedef struct _KBDOutputReport {
|
||||
/** 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;
|
||||
/** Output Report Data Block */
|
||||
HIDDKeyboardOutputReport sReport;
|
||||
} KBDOutputReport;
|
||||
|
||||
/**
|
||||
* Driver structure for an HID device implementing keyboard functionalities.
|
||||
*/
|
||||
typedef struct _HIDDKeyboard {
|
||||
|
||||
/** USB HID Functionn */
|
||||
HIDDFunction hidDrv;
|
||||
/** Input report list */
|
||||
HIDDReport *inputReports[1];
|
||||
/** Output report list */
|
||||
HIDDReport *outputReports[1];
|
||||
} HIDDKeyboard;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** HIDD Keyboard Input Report Instance */
|
||||
static KBDInputReport inputReport;
|
||||
|
||||
/** HIDD Keyboard Output Report Instance */
|
||||
static KBDOutputReport outputReport;
|
||||
|
||||
/** Static instance of the HIDD keyboard device driver. */
|
||||
static HIDDKeyboard hiddKeyboard;
|
||||
|
||||
/** Report descriptor used by the driver. */
|
||||
const uint8_t hiddKeyboardReportDescriptor[] = {
|
||||
|
||||
HIDReport_GLOBAL_USAGEPAGE + 1, HIDGenericDesktop_PAGEID,
|
||||
HIDReport_LOCAL_USAGE + 1, HIDGenericDesktop_KEYBOARD,
|
||||
HIDReport_COLLECTION + 1, HIDReport_COLLECTION_APPLICATION,
|
||||
|
||||
/* Input report: modifier keys */
|
||||
HIDReport_GLOBAL_REPORTSIZE + 1, 1,
|
||||
HIDReport_GLOBAL_REPORTCOUNT + 1, 8,
|
||||
HIDReport_GLOBAL_USAGEPAGE + 1, HIDKeypad_PAGEID,
|
||||
HIDReport_LOCAL_USAGEMINIMUM + 1,
|
||||
HIDDKeyboardDescriptors_FIRSTMODIFIERKEY,
|
||||
HIDReport_LOCAL_USAGEMAXIMUM + 1,
|
||||
HIDDKeyboardDescriptors_LASTMODIFIERKEY,
|
||||
HIDReport_GLOBAL_LOGICALMINIMUM + 1, 0,
|
||||
HIDReport_GLOBAL_LOGICALMAXIMUM + 1, 1,
|
||||
HIDReport_INPUT + 1, HIDReport_VARIABLE,
|
||||
|
||||
/* Input report: standard keys */
|
||||
HIDReport_GLOBAL_REPORTCOUNT + 1, 3,
|
||||
HIDReport_GLOBAL_REPORTSIZE + 1, 8,
|
||||
HIDReport_GLOBAL_LOGICALMINIMUM + 1,
|
||||
HIDDKeyboardDescriptors_FIRSTSTANDARDKEY,
|
||||
HIDReport_GLOBAL_LOGICALMAXIMUM + 1,
|
||||
HIDDKeyboardDescriptors_LASTSTANDARDKEY,
|
||||
HIDReport_GLOBAL_USAGEPAGE + 1, HIDKeypad_PAGEID,
|
||||
HIDReport_LOCAL_USAGEMINIMUM + 1,
|
||||
HIDDKeyboardDescriptors_FIRSTSTANDARDKEY,
|
||||
HIDReport_LOCAL_USAGEMAXIMUM + 1,
|
||||
HIDDKeyboardDescriptors_LASTSTANDARDKEY,
|
||||
HIDReport_INPUT + 1, 0 /* Data array */,
|
||||
|
||||
/* Output report: LEDs */
|
||||
HIDReport_GLOBAL_REPORTCOUNT + 1, 3,
|
||||
HIDReport_GLOBAL_REPORTSIZE + 1, 1,
|
||||
HIDReport_GLOBAL_USAGEPAGE + 1, HIDLeds_PAGEID,
|
||||
HIDReport_GLOBAL_LOGICALMINIMUM + 1, 0,
|
||||
HIDReport_GLOBAL_LOGICALMAXIMUM + 1, 1,
|
||||
HIDReport_LOCAL_USAGEMINIMUM + 1, HIDLeds_NUMLOCK,
|
||||
HIDReport_LOCAL_USAGEMAXIMUM + 1, HIDLeds_SCROLLLOCK,
|
||||
HIDReport_OUTPUT + 1, HIDReport_VARIABLE,
|
||||
|
||||
/* Output report: padding */
|
||||
HIDReport_GLOBAL_REPORTCOUNT + 1, 1,
|
||||
HIDReport_GLOBAL_REPORTSIZE + 1, 5,
|
||||
HIDReport_OUTPUT + 1, HIDReport_CONSTANT,
|
||||
|
||||
HIDReport_ENDCOLLECTION
|
||||
};
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Callback invoked when an output report has been received from the host.
|
||||
* Forward the new status of the LEDs to the user program via the
|
||||
* HIDDKeyboardCallbacks_LedsChanged callback.
|
||||
*/
|
||||
static void HIDDKeyboard_ReportReceived(void)
|
||||
{
|
||||
HIDDKeyboardOutputReport *pOut = &outputReport.sReport;
|
||||
|
||||
/* Trigger callback */
|
||||
if (HIDDKeyboardCallbacks_LedsChanged) {
|
||||
HIDDKeyboardCallbacks_LedsChanged(
|
||||
pOut->numLockStatus,
|
||||
pOut->capsLockStatus,
|
||||
pOut->scrollLockStatus);
|
||||
}
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the HID keyboard device driver SW.
|
||||
* (Init USBDDriver .., Init function driver .., Init USBD ...)
|
||||
* \param pUsbd Pointer to USBDDriver instance.
|
||||
* \param bInterfaceNb Interface number for the function.
|
||||
*/
|
||||
void HIDDKeyboard_Initialize(USBDDriver* pUsbd, uint8_t bInterfaceNb)
|
||||
{
|
||||
HIDDKeyboard *pKbd = &hiddKeyboard;
|
||||
HIDDFunction *pHidd = &pKbd->hidDrv;
|
||||
|
||||
/* One input report */
|
||||
pKbd->inputReports[0] = (HIDDReport*)&inputReport;
|
||||
HIDDFunction_InitializeReport(pKbd->inputReports[0],
|
||||
sizeof(HIDDKeyboardInputReport),
|
||||
0,
|
||||
0, 0);
|
||||
/* One output report */
|
||||
pKbd->outputReports[0] = (HIDDReport*)&outputReport;
|
||||
HIDDFunction_InitializeReport(
|
||||
pKbd->outputReports[0],
|
||||
sizeof(HIDDKeyboardOutputReport),
|
||||
0,
|
||||
(HIDDReportEventCallback)HIDDKeyboard_ReportReceived, 0);
|
||||
|
||||
/* Function initialize */
|
||||
HIDDFunction_Initialize(pHidd,
|
||||
pUsbd, bInterfaceNb,
|
||||
hiddKeyboardReportDescriptor,
|
||||
pKbd->inputReports, 1,
|
||||
pKbd->outputReports, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Configure function with expected descriptors and start functionality.
|
||||
* Usually invoked when device is configured.
|
||||
* \pDescriptors Pointer to the descriptors for function configure.
|
||||
* \wLength Length of descriptors in number of bytes.
|
||||
*/
|
||||
void HIDDKeyboard_ConfigureFunction(USBGenericDescriptor *pDescriptors,
|
||||
uint16_t wLength)
|
||||
{
|
||||
HIDDKeyboard *pKbd = &hiddKeyboard;
|
||||
HIDDFunction *pHidd = &pKbd->hidDrv;
|
||||
USBGenericDescriptor * pDesc = pDescriptors;
|
||||
|
||||
pDesc = HIDDFunction_ParseInterface(pHidd,
|
||||
pDescriptors,
|
||||
wLength);
|
||||
|
||||
/* Start receiving output reports */
|
||||
HIDDFunction_StartPollingOutputs(pHidd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles HID-specific SETUP request sent by the host.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
* \return USBRC_SUCCESS if request is handled.
|
||||
*/
|
||||
uint32_t HIDDKeyboard_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
HIDDKeyboard *pKbd = &hiddKeyboard;
|
||||
HIDDFunction *pHidd = &pKbd->hidDrv;
|
||||
|
||||
TRACE_INFO_WP("Kbd ");
|
||||
|
||||
/* Process HID requests */
|
||||
return HIDDFunction_RequestHandler(pHidd, 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.
|
||||
*/
|
||||
uint32_t HIDDKeyboard_ChangeKeys(uint8_t *pressedKeys,
|
||||
uint8_t pressedKeysSize,
|
||||
uint8_t *releasedKeys,
|
||||
uint8_t releasedKeysSize)
|
||||
{
|
||||
HIDDKeyboard *pKbd = &hiddKeyboard;
|
||||
HIDDFunction *pHidd = &pKbd->hidDrv;
|
||||
HIDDKeyboardInputReport *pReport =
|
||||
(HIDDKeyboardInputReport *)pKbd->inputReports[0]->bData;
|
||||
|
||||
/* Press keys */
|
||||
while (pressedKeysSize > 0) {
|
||||
|
||||
/* Check if this is a standard or modifier key */
|
||||
if (HIDKeypad_IsModifierKey(*pressedKeys)) {
|
||||
|
||||
/* Set the corresponding bit in the input report */
|
||||
HIDDKeyboardInputReport_PressModifierKey(
|
||||
pReport,
|
||||
*pressedKeys);
|
||||
}
|
||||
else {
|
||||
|
||||
HIDDKeyboardInputReport_PressStandardKey(
|
||||
pReport,
|
||||
*pressedKeys);
|
||||
}
|
||||
|
||||
pressedKeysSize--;
|
||||
pressedKeys++;
|
||||
}
|
||||
|
||||
/* Release keys */
|
||||
while (releasedKeysSize > 0) {
|
||||
|
||||
/* Check if this is a standard or modifier key */
|
||||
if (HIDKeypad_IsModifierKey(*releasedKeys)) {
|
||||
|
||||
/* Set the corresponding bit in the input report */
|
||||
HIDDKeyboardInputReport_ReleaseModifierKey(
|
||||
pReport,
|
||||
*releasedKeys);
|
||||
}
|
||||
else {
|
||||
|
||||
HIDDKeyboardInputReport_ReleaseStandardKey(
|
||||
pReport,
|
||||
*releasedKeys);
|
||||
}
|
||||
|
||||
releasedKeysSize--;
|
||||
releasedKeys++;
|
||||
}
|
||||
|
||||
/* Send input report through the interrupt IN endpoint */
|
||||
return USBD_Write(pHidd->bPipeIN,
|
||||
pReport,
|
||||
sizeof(HIDDKeyboardInputReport),
|
||||
0,
|
||||
0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a remote wake-up sequence if the host has explicitely enabled it
|
||||
* by sending the appropriate SET_FEATURE request.
|
||||
*/
|
||||
void HIDDKeyboard_RemoteWakeUp(void)
|
||||
{
|
||||
HIDDKeyboard *pKbd = &hiddKeyboard;
|
||||
HIDDFunction *pHidd = &pKbd->hidDrv;
|
||||
USBDDriver *pUsbd = pHidd->pUsbd;
|
||||
|
||||
/* Remote wake-up has been enabled */
|
||||
if (USBDDriver_IsRemoteWakeUpEnabled(pUsbd)) {
|
||||
|
||||
USBD_RemoteWakeUp();
|
||||
}
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,66 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_hid_key
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "HIDDKeyboardDriver.h"
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* For HID Keyboard Function.
|
||||
* Indicates that the status of one or more LEDs has been changed by the
|
||||
* host.
|
||||
* \param numLockStatus Indicates the current status of the num. lock key.
|
||||
* \param capsLockStatus Indicates the current status of the caps lock key.
|
||||
* \param scrollLockStatus Indicates the current status of the scroll lock key.
|
||||
*/
|
||||
WEAK void HIDDKeyboardCallbacks_LedsChanged(
|
||||
uint8_t numLockStatus,
|
||||
uint8_t capsLockStatus,
|
||||
uint8_t scrollLockStatus)
|
||||
{
|
||||
TRACE_INFO(
|
||||
"LEDs status: %d, %d, %d\n\r",
|
||||
numLockStatus,
|
||||
capsLockStatus,
|
||||
scrollLockStatus);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,123 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_hid_key
|
||||
*@{
|
||||
* Implement a USB device that only have HID Keyboard Function.
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <HIDDKeyboardDriver.h>
|
||||
#include <HIDDFunction.h>
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
#include <USBRequests.h>
|
||||
#include <HIDDescriptors.h>
|
||||
#include <HIDRequests.h>
|
||||
#include <HIDReports.h>
|
||||
#include <HIDUsages.h>
|
||||
|
||||
#include <USBD.h>
|
||||
#include <USBD_HAL.h>
|
||||
#include <USBDDriver.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal types
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the HID keyboard device driver.
|
||||
*/
|
||||
void HIDDKeyboardDriver_Initialize(const USBDDriverDescriptors *pDescriptors)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
USBDDriver_Initialize(pUsbd, pDescriptors, 0);
|
||||
HIDDKeyboard_Initialize(pUsbd, 0);
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles configureation changed event.
|
||||
* \param cfgnum New configuration number
|
||||
*/
|
||||
void HIDDKeyboardDriver_ConfigurationChangedHandler(uint8_t cfgnum)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
const USBDDriverDescriptors * pDescriptors = pUsbd->pDescriptors;
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
|
||||
if (cfgnum > 0) {
|
||||
if (USBD_HAL_IsHighSpeed() && pDescriptors->pHsConfiguration)
|
||||
pDesc = (USBConfigurationDescriptor*)pDescriptors->pHsConfiguration;
|
||||
else
|
||||
pDesc = (USBConfigurationDescriptor*)pDescriptors->pFsConfiguration[0];
|
||||
HIDDKeyboard_ConfigureFunction((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles HID-specific SETUP request sent by the host.
|
||||
* \param request Pointer to a USBGenericRequest instance.
|
||||
*/
|
||||
void HIDDKeyboardDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
|
||||
/* Process HID requests */
|
||||
if (USBRC_SUCCESS == HIDDKeyboard_RequestHandler(request)) {
|
||||
return;
|
||||
}
|
||||
/* Process STD requests */
|
||||
else {
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,147 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* Implementation of the HIDDKeyboardInputReport class.
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_hid_key
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <HIDDKeyboard.h>
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes a keyboard input report instance.
|
||||
* \param report Pointer to a HIDDKeyboardInputReport instance.
|
||||
*/
|
||||
void HIDDKeyboardInputReport_Initialize(HIDDKeyboardInputReport *report)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
report->bmModifierKeys = 0;
|
||||
for (i = 0; i < HIDDKeyboardInputReport_MAXKEYPRESSES; i++) {
|
||||
|
||||
report->pressedKeys[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports a standard key as being pressed.
|
||||
* \param report Pointer to a HIDDKeyboardInputReport instance.
|
||||
* \param key Key code of the standard key.
|
||||
*/
|
||||
void HIDDKeyboardInputReport_PressStandardKey(HIDDKeyboardInputReport *report,
|
||||
uint8_t key)
|
||||
{
|
||||
/* Find first available slot */
|
||||
uint32_t i = 0;
|
||||
uint8_t found = 0;
|
||||
while ((i < HIDDKeyboardInputReport_MAXKEYPRESSES) && !found) {
|
||||
|
||||
/* Free slot: no key referenced (code = 0) or ErrorRollOver */
|
||||
if ((report->pressedKeys[i] == 0)
|
||||
|| (report->pressedKeys[i] == HIDKeypad_ERRORROLLOVER)) {
|
||||
|
||||
found = 1;
|
||||
report->pressedKeys[i] = key;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
/* Report ErrorRollOver in all fields if too many keys are pressed */
|
||||
if (!found) {
|
||||
|
||||
for (i=0; i < HIDDKeyboardInputReport_MAXKEYPRESSES; i++) {
|
||||
|
||||
report->pressedKeys[i] = HIDKeypad_ERRORROLLOVER;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports a standard key as not being pressed anymore.
|
||||
* \param report Pointer to a HIDDKeyboardInputReport instance.
|
||||
* \param key Key code of the standard key
|
||||
*/
|
||||
void HIDDKeyboardInputReport_ReleaseStandardKey(HIDDKeyboardInputReport *report,
|
||||
uint8_t key)
|
||||
{
|
||||
/* Look for key in array */
|
||||
uint32_t i = 0;
|
||||
uint8_t found = 0;
|
||||
while ((i < HIDDKeyboardInputReport_MAXKEYPRESSES) && !found) {
|
||||
|
||||
if (report->pressedKeys[i] == key) {
|
||||
|
||||
found = 1;
|
||||
report->pressedKeys[i] = 0;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports a modifier key as being currently pressed.
|
||||
* \param report Pointer to a HIDDKeyboardInputReport instance.
|
||||
* \param key Key code of the modifier key.
|
||||
*/
|
||||
void HIDDKeyboardInputReport_PressModifierKey(HIDDKeyboardInputReport *report,
|
||||
uint8_t key)
|
||||
{
|
||||
/* Set corresponding bit */
|
||||
uint8_t bit = key - HIDDKeyboardDescriptors_FIRSTMODIFIERKEY;
|
||||
report->bmModifierKeys |= 1 << bit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports a modifier key as not being pressed anymore.
|
||||
* \param report Pointer to a HIDDKeyboardInputReport instance.
|
||||
* \param key Key code of the modifier key.
|
||||
*/
|
||||
void HIDDKeyboardInputReport_ReleaseModifierKey(HIDDKeyboardInputReport *report,
|
||||
uint8_t key)
|
||||
{
|
||||
/* Clear corresponding bit */
|
||||
uint8_t bit = key - HIDDKeyboardDescriptors_FIRSTMODIFIERKEY;
|
||||
report->bmModifierKeys &= ~(1 << bit);
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,96 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* Implementation of the HIDDKeyboardOutputReport class.
|
||||
*/
|
||||
|
||||
/** \addtogroup usbd_hid_key
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <HIDDKeyboard.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes a keyboard output report.
|
||||
* \param report Pointer to a HIDDKeyboardOutputReport instance.
|
||||
*/
|
||||
void HIDDKeyboardOutputReport_Initialize(HIDDKeyboardOutputReport *report)
|
||||
{
|
||||
report->numLockStatus = 0;
|
||||
report->capsLockStatus = 0;
|
||||
report->scrollLockStatus = 0;
|
||||
report->padding = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates the current status of the num. lock LED according to the
|
||||
* given report.
|
||||
* \param report Pointer to a HIDDKeyboardOutputReport instance.
|
||||
* \return 1 if the num. lock LED is light on; otherwise 0.
|
||||
*/
|
||||
unsigned char HIDDKeyboardOutputReport_GetNumLockStatus(
|
||||
const HIDDKeyboardOutputReport *report)
|
||||
{
|
||||
return report->numLockStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates the current status of the caps lock LED according to the
|
||||
* given report.
|
||||
* \param report Pointer to a HIDDKeyboardOutputReport instance.
|
||||
* \return 1 if the caps lock LED is light on; otherwise 0.
|
||||
*/
|
||||
unsigned char HIDDKeyboardOutputReport_GetCapsLockStatus(
|
||||
const HIDDKeyboardOutputReport *report)
|
||||
{
|
||||
return report->capsLockStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates the current status of the scroll lock LED according to the
|
||||
* given report.
|
||||
* \param report Pointer to a HIDDKeyboardOutputReport instance.
|
||||
* \return 1 if the scroll lock LED is light on; otherwise 0.
|
||||
*/
|
||||
unsigned char HIDDKeyboardOutputReport_GetScrollLockStatus(
|
||||
const HIDDKeyboardOutputReport *report)
|
||||
{
|
||||
return report->scrollLockStatus;
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,277 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_hid_mouse
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <HIDDFunction.h>
|
||||
#include <HIDDMouseDriver.h>
|
||||
|
||||
#include <USBD.h>
|
||||
#include <USBD_HAL.h>
|
||||
#include <USBDDriver.h>
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal Defines
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Tag bit (Always 1) */
|
||||
#define HIDDMouse_TAG (1 << 3)
|
||||
/** Xsign bit */
|
||||
#define HIDDMouse_Xsign (1 << 4)
|
||||
/** Ysign bit */
|
||||
#define HIDDMouse_Ysign (1 << 5)
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal types
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Struct for an HID Mouse report.
|
||||
*/
|
||||
typedef struct _HIDDMouseReport {
|
||||
/** 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 */
|
||||
HIDDMouseInputReport report;
|
||||
} HIDDMouseReport;
|
||||
|
||||
/**
|
||||
* Driver structure for an HID device implementing keyboard functionalities.
|
||||
*/
|
||||
typedef struct _HIDDMouseDriver {
|
||||
|
||||
/** Mouse function instance */
|
||||
HIDDFunction hidDrv;
|
||||
/** Mouse input report */
|
||||
HIDDReport *inputReports[1];
|
||||
} HIDDMouseDriver;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Static instance of the HID mouse device driver. */
|
||||
static HIDDMouseDriver hiddMouseDriver;
|
||||
/** Input report */
|
||||
static HIDDMouseReport hiddInputReport;
|
||||
|
||||
/** Report descriptor used by the driver. */
|
||||
static const uint8_t hiddReportDescriptor[] = {
|
||||
|
||||
/* Global Usage Page */
|
||||
HIDReport_GLOBAL_USAGEPAGE + 1, HIDGenericDesktop_PAGEID,
|
||||
/* Collection: Application */
|
||||
HIDReport_LOCAL_USAGE + 1, HIDGenericDesktop_MOUSE,
|
||||
HIDReport_COLLECTION + 1, HIDReport_COLLECTION_APPLICATION,
|
||||
/* Physical collection: Pointer */
|
||||
HIDReport_LOCAL_USAGE + 1, HIDGenericDesktop_POINTER,
|
||||
HIDReport_COLLECTION + 1, HIDReport_COLLECTION_PHYSICAL,
|
||||
|
||||
/* Input report: buttons */
|
||||
HIDReport_GLOBAL_USAGEPAGE + 1, HIDButton_PAGEID,
|
||||
|
||||
HIDReport_GLOBAL_REPORTCOUNT + 1, 3,
|
||||
HIDReport_GLOBAL_REPORTSIZE + 1, 1,
|
||||
HIDReport_LOCAL_USAGEMINIMUM + 1, 1,
|
||||
HIDReport_LOCAL_USAGEMAXIMUM + 1, 3,
|
||||
HIDReport_GLOBAL_LOGICALMINIMUM + 1, 0,
|
||||
HIDReport_GLOBAL_LOGICALMAXIMUM + 1, 1,
|
||||
HIDReport_INPUT + 1, HIDReport_VARIABLE, /* 3 button bits */
|
||||
|
||||
/* Input report: padding */
|
||||
HIDReport_GLOBAL_REPORTCOUNT + 1, 1,
|
||||
HIDReport_GLOBAL_REPORTSIZE + 1, 5,
|
||||
HIDReport_INPUT + 1, HIDReport_CONSTANT, /* 5 bit padding */
|
||||
|
||||
/* Input report: pointer */
|
||||
HIDReport_GLOBAL_USAGEPAGE + 1, HIDGenericDesktop_PAGEID,
|
||||
HIDReport_GLOBAL_REPORTSIZE + 1, 8,
|
||||
HIDReport_GLOBAL_REPORTCOUNT + 1, 2,
|
||||
HIDReport_LOCAL_USAGE + 1, HIDGenericDesktop_X,
|
||||
HIDReport_LOCAL_USAGE + 1, HIDGenericDesktop_Y,
|
||||
HIDReport_GLOBAL_LOGICALMINIMUM + 1, (uint8_t) -127,
|
||||
HIDReport_GLOBAL_LOGICALMAXIMUM + 1, 127,
|
||||
HIDReport_INPUT + 1, HIDReport_VARIABLE | HIDReport_RELATIVE,
|
||||
|
||||
HIDReport_ENDCOLLECTION,
|
||||
HIDReport_ENDCOLLECTION
|
||||
};
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the HID Mouse %device driver.
|
||||
* \param pDescriptors Pointer to descriptor list for the HID Mouse.
|
||||
*/
|
||||
void HIDDMouseDriver_Initialize(const USBDDriverDescriptors *pDescriptors)
|
||||
{
|
||||
HIDDMouseDriver* pMouse = &hiddMouseDriver;
|
||||
HIDDFunction* pHidd = &pMouse->hidDrv;
|
||||
USBDDriver* pUsbd = USBD_GetDriver();
|
||||
|
||||
/* One input report */
|
||||
pMouse->inputReports[0] = (HIDDReport*)&hiddInputReport;
|
||||
HIDDFunction_InitializeReport(pMouse->inputReports[0],
|
||||
HIDDMouseDriver_REPORTDESCRIPTORSIZE,
|
||||
0,
|
||||
0, 0);
|
||||
|
||||
/* Initialize USBD Driver instance */
|
||||
USBDDriver_Initialize(pUsbd,
|
||||
pDescriptors,
|
||||
0); /* Multiple interface settings not supported */
|
||||
/* Function initialize */
|
||||
HIDDFunction_Initialize(pHidd,
|
||||
pUsbd, 0,
|
||||
hiddReportDescriptor,
|
||||
(HIDDReport**)(&pMouse->inputReports), 1,
|
||||
0, 0);
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles configureation changed event.
|
||||
* \param cfgnum New configuration number
|
||||
*/
|
||||
void HIDDMouseDriver_ConfigurationChangedHandler(uint8_t cfgnum)
|
||||
{
|
||||
HIDDMouseDriver * pMouse = &hiddMouseDriver;
|
||||
HIDDFunction * pHidd = &pMouse->hidDrv;
|
||||
USBDDriver * pUsbd = pHidd->pUsbd;
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
|
||||
if (cfgnum > 0) {
|
||||
|
||||
/* Parse endpoints for reports */
|
||||
pDesc = USBDDriver_GetCfgDescriptors(pUsbd, cfgnum);
|
||||
HIDDFunction_ParseInterface(pHidd,
|
||||
(USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles HID-specific SETUP request sent by the host.
|
||||
* \param request Pointer to a USBGenericRequest instance
|
||||
*/
|
||||
void HIDDMouseDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
HIDDMouseDriver * pMouse = &hiddMouseDriver;
|
||||
HIDDFunction * pHidd = &pMouse->hidDrv;
|
||||
USBDDriver * pUsbd = pHidd->pUsbd;
|
||||
|
||||
TRACE_INFO("NewReq ");
|
||||
|
||||
/* Process HID requests */
|
||||
if (USBRC_SUCCESS == HIDDFunction_RequestHandler(pHidd,
|
||||
request)) {
|
||||
return;
|
||||
}
|
||||
/* Process STD requests */
|
||||
else {
|
||||
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the Mouse button status and location changes via input report
|
||||
* to host
|
||||
* \param bmButtons Bit map of the button status
|
||||
* \param deltaX Movment on X direction
|
||||
* \param deltaY Movment on Y direction
|
||||
*/
|
||||
uint8_t HIDDMouseDriver_ChangePoints(uint8_t bmButtons,
|
||||
int8_t deltaX,
|
||||
int8_t deltaY)
|
||||
{
|
||||
HIDDMouseDriver * pMouse = &hiddMouseDriver;
|
||||
HIDDFunction * pHidd = &pMouse->hidDrv;
|
||||
HIDDMouseInputReport * pReport = &hiddInputReport.report;
|
||||
|
||||
pReport->bmButtons = (bmButtons & 0x07) | HIDDMouse_TAG;
|
||||
pReport->bX = deltaX;
|
||||
pReport->bY = deltaY;
|
||||
|
||||
/* Send input report through the interrupt IN endpoint */
|
||||
return USBD_Write(pHidd->bPipeIN,
|
||||
(void*)pReport,
|
||||
sizeof(HIDDMouseInputReport),
|
||||
0,
|
||||
0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a remote wake-up sequence if the host has explicitely enabled it
|
||||
* by sending the appropriate SET_FEATURE request.
|
||||
*/
|
||||
void HIDDMouseDriver_RemoteWakeUp(void)
|
||||
{
|
||||
HIDDMouseDriver * pMouse = &hiddMouseDriver;
|
||||
HIDDFunction * pHidd = &pMouse->hidDrv;
|
||||
USBDDriver * pUsbd = pHidd->pUsbd;
|
||||
|
||||
/* Remote wake-up has been enabled */
|
||||
if (USBDDriver_IsRemoteWakeUpEnabled(pUsbd)) {
|
||||
|
||||
USBD_RemoteWakeUp();
|
||||
}
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,695 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* Implementation of the HIDDFunction class methods.
|
||||
*/
|
||||
/** \addtogroup usbd_hid
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <HIDDFunction.h>
|
||||
#include <USBDescriptors.h>
|
||||
#include <HIDDescriptors.h>
|
||||
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Definitions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Macros
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Get byte pointer
|
||||
*/
|
||||
#define _PU8(v) ((uint8_t*)&(v))
|
||||
|
||||
/**
|
||||
* Get word from un-aligned value
|
||||
*/
|
||||
#define _Word(a) (_PU8(a)[0] + (_PU8(a)[1] << 8))
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Types
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Parse data extention for descriptor parsing */
|
||||
typedef struct _HIDDParseData {
|
||||
HIDDFunction * pHidd;
|
||||
USBInterfaceDescriptor * pIfDesc;
|
||||
} HIDDParseData;
|
||||
|
||||
/** Parse data extension for HID descriptor */
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Returns the descriptor requested by the host.
|
||||
* \param pHidd Pointer to HIDDFunction instance
|
||||
* \param bType Descriptor type.
|
||||
* \param wLength Maximum number of bytes to send.
|
||||
* \return USBRC_SUCCESS if the request has been handled by this function,
|
||||
* otherwise USBRC_PARAM_ERR.
|
||||
*/
|
||||
static uint32_t HIDDFunction_GetDescriptor(HIDDFunction *pHidd,
|
||||
uint8_t bType,
|
||||
uint32_t wLength)
|
||||
{
|
||||
HIDDescriptor1 *pHidDescriptor = (HIDDescriptor1 *)pHidd->pHidDescriptor;
|
||||
uint16_t wDescriptorLength;
|
||||
|
||||
TRACE_INFO_WP("gDesc{%x) ", bType);
|
||||
|
||||
switch (bType) {
|
||||
|
||||
case HIDGenericDescriptor_REPORT:
|
||||
|
||||
/* Adjust length and send report descriptor */
|
||||
/*
|
||||
wDescriptorLength = pHidDescriptor->bDescriptorLength0[0]
|
||||
+ pHidDescriptor->bDescriptorLength0[1];
|
||||
*/
|
||||
wDescriptorLength = _Word(pHidDescriptor->wDescriptorLength0);
|
||||
if (wLength > wDescriptorLength)
|
||||
wLength = wDescriptorLength;
|
||||
|
||||
TRACE_INFO_WP("Report(%d) ", wLength);
|
||||
|
||||
USBD_Write(0, pHidd->pReportDescriptor, wLength, 0, 0);
|
||||
break;
|
||||
|
||||
case HIDGenericDescriptor_HID:
|
||||
|
||||
/* Adjust length and send HID descriptor */
|
||||
if (wLength > sizeof(HIDDescriptor1))
|
||||
wLength = sizeof(HIDDescriptor1);
|
||||
|
||||
TRACE_INFO_WP("HID(%d) ", wLength);
|
||||
|
||||
USBD_Write(0, pHidDescriptor, wLength, 0, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
return USBRC_PARAM_ERR;
|
||||
}
|
||||
|
||||
return USBRC_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return expected report header pointer.
|
||||
* \param pHidd Pointer to HIDDFunction instance
|
||||
* \param bType Report type.
|
||||
* \param bID Report ID.
|
||||
*/
|
||||
static HIDDReport* HIDDFunction_FindReport(const HIDDFunction *pHidd,
|
||||
uint8_t bType,
|
||||
uint8_t bID)
|
||||
{
|
||||
HIDDReport** pReportList;
|
||||
int32_t listSize, i;
|
||||
switch(bType) {
|
||||
case HIDReportRequest_INPUT:
|
||||
pReportList = pHidd->pInputList;
|
||||
listSize = pHidd->bInputListSize;
|
||||
break;
|
||||
case HIDReportRequest_OUTPUT:
|
||||
pReportList = pHidd->pOutputList;
|
||||
listSize = pHidd->bOutputListSize;
|
||||
break;
|
||||
/* No other reports supported */
|
||||
default:
|
||||
TRACE_INFO("Report %x.%x not support\n\r", bType, bID);
|
||||
return 0;
|
||||
}
|
||||
/* No list */
|
||||
if (pReportList == 0)
|
||||
return 0;
|
||||
/* Find report in the list */
|
||||
for (i = 0; i < listSize; i ++) {
|
||||
if (bID == pReportList[i]->bID)
|
||||
return pReportList[i];
|
||||
}
|
||||
/* Not found */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the current Idle rate of the input report to the host.
|
||||
* \param pHidd Pointer to HIDDFunction instance
|
||||
* \param bID Report ID
|
||||
*/
|
||||
static void HIDDFunction_GetIdle(HIDDFunction *pHidd,
|
||||
uint8_t bID)
|
||||
{
|
||||
HIDDReport *pReport = HIDDFunction_FindReport(pHidd,
|
||||
HIDReportRequest_INPUT,
|
||||
bID);
|
||||
TRACE_INFO_WP("gIdle(%x) ", bID);
|
||||
if (pReport == 0) {
|
||||
USBD_Stall(0);
|
||||
return;
|
||||
}
|
||||
USBD_Write(0, &pReport->bIdleRate, 1, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the new idle rate of the input report from the USB host.
|
||||
* \param pHidd Pointer to HIDDFunction instance
|
||||
* \param bType Report type
|
||||
* \param bID Report ID
|
||||
* \param bIdleRate Report idle rate.
|
||||
*/
|
||||
static void HIDDFunction_SetIdle(HIDDFunction *pHidd,
|
||||
uint8_t bID,
|
||||
uint8_t bIdleRate)
|
||||
{
|
||||
HIDDReport *pReport = HIDDFunction_FindReport(pHidd,
|
||||
HIDReportRequest_INPUT,
|
||||
bID);
|
||||
TRACE_INFO_WP("sIdle(%x<%x) ", bID, bIdleRate);
|
||||
if (pReport == 0) {
|
||||
USBD_Stall(0);
|
||||
return;
|
||||
}
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback function when GetReport request data sent to host
|
||||
* \param pReport Pointer to report information.
|
||||
* \param status Result status
|
||||
* \param transferred Number of bytes transferred
|
||||
* \param remaining Number of bytes that are not transferred yet
|
||||
*/
|
||||
static void _GetReportCallback(HIDDReport *pReport,
|
||||
uint8_t status,
|
||||
uint32_t transferred,
|
||||
uint32_t remaining)
|
||||
{
|
||||
pReport->wTransferred = transferred;
|
||||
if (pReport->fCallback)
|
||||
pReport->fCallback(HIDD_EC_GETREPORT, pReport->pArg);
|
||||
|
||||
USBD_Read(0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends the requested report to the host.
|
||||
* \param pHidd Pointer to HIDDFunction instance
|
||||
* \param bType Report type.
|
||||
* \param bID Report ID.
|
||||
* \param wLength Maximum number of bytes to send.
|
||||
*/
|
||||
static void HIDDFunction_GetReport(HIDDFunction *pHidd,
|
||||
uint8_t bType,
|
||||
uint8_t bID,
|
||||
uint8_t wLength)
|
||||
{
|
||||
HIDDReport *pReport = HIDDFunction_FindReport(pHidd,
|
||||
bType,
|
||||
bID);
|
||||
TRACE_INFO_WP("gReport(%x.%x) ", bType, bID);
|
||||
if (pReport == 0) {
|
||||
USBD_Stall(0);
|
||||
return;
|
||||
}
|
||||
if (wLength >= pReport->wMaxSize) {
|
||||
wLength = pReport->wMaxSize;
|
||||
}
|
||||
USBD_Write(0, pReport->bData, wLength,
|
||||
(TransferCallback)_GetReportCallback, pReport);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback function when GetReport request data sent to host
|
||||
* \param pReport Pointer to report information.
|
||||
* \param status Result status
|
||||
* \param transferred Number of bytes transferred
|
||||
* \param remaining Number of bytes that are not transferred yet
|
||||
*/
|
||||
static void _SetReportCallback(HIDDReport *pReport,
|
||||
uint8_t status,
|
||||
uint32_t transferred,
|
||||
uint32_t remaining)
|
||||
{
|
||||
pReport->wTransferred = transferred;
|
||||
if (pReport->fCallback) {
|
||||
pReport->fCallback(HIDD_EC_SETREPORT, pReport->pArg);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the requested report from the host.
|
||||
* \param pHidd Pointer to HIDDFunction instance
|
||||
* \param bType Report type.
|
||||
* \param bID Report ID.
|
||||
* \param wLength Maximum number of bytes to read.
|
||||
*/
|
||||
static void HIDDFunction_SetReport(HIDDFunction *pHidd,
|
||||
uint8_t bType,
|
||||
uint8_t bID,
|
||||
uint8_t wLength)
|
||||
{
|
||||
HIDDReport *pReport = HIDDFunction_FindReport(pHidd,
|
||||
bType,
|
||||
bID);
|
||||
TRACE_INFO_WP("sReport(%x.%x) ", bType, bID);
|
||||
|
||||
if (pReport == 0) {
|
||||
USBD_Stall(0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (wLength >= pReport->wMaxSize) {
|
||||
wLength = pReport->wMaxSize;
|
||||
}
|
||||
USBD_Read(0, pReport->bData, wLength,
|
||||
(TransferCallback)_SetReportCallback, pReport);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse descriptors: Interface, Interrupt IN/OUT.
|
||||
* \param desc Pointer to descriptor list.
|
||||
* \param arg Argument, pointer to HIDDParseData instance.
|
||||
*/
|
||||
static uint32_t HIDDFunction_Parse(USBGenericDescriptor * pDesc,
|
||||
HIDDParseData * pArg)
|
||||
{
|
||||
/* Find HID Interface */
|
||||
if (pArg->pIfDesc == 0) {
|
||||
if (pDesc->bDescriptorType == USBGenericDescriptor_INTERFACE) {
|
||||
USBInterfaceDescriptor *pIf = (USBInterfaceDescriptor*)pDesc;
|
||||
/* Right interface for HID:
|
||||
HID Class + at least 1 endpoint */
|
||||
if (pIf->bInterfaceClass == HIDInterfaceDescriptor_CLASS
|
||||
&& pIf->bNumEndpoints >= 1) {
|
||||
/* Obtain new interface setting */
|
||||
if (pArg->pHidd->bInterface == 0xFF) {
|
||||
pArg->pHidd->bInterface = pIf->bInterfaceNumber;
|
||||
pArg->pIfDesc = pIf;
|
||||
}
|
||||
/* Find specific interface setting */
|
||||
else if (pArg->pHidd->bInterface == pIf->bInterfaceNumber) {
|
||||
pArg->pIfDesc = pIf;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Interface end */
|
||||
else {
|
||||
/* Start another interface ? */
|
||||
if (pDesc->bDescriptorType == USBGenericDescriptor_INTERFACE) {
|
||||
/* Terminate the parse */
|
||||
return USBRC_PARTIAL_DONE;
|
||||
}
|
||||
/* Parse HID descriptor */
|
||||
else if (pDesc->bDescriptorType == HIDGenericDescriptor_HID) {
|
||||
pArg->pHidd->pHidDescriptor = (HIDDescriptor*)pDesc;
|
||||
}
|
||||
/* Parse endpoints */
|
||||
else if (pDesc->bDescriptorType == USBGenericDescriptor_ENDPOINT) {
|
||||
USBEndpointDescriptor *pEp = (USBEndpointDescriptor*)pDesc;
|
||||
if (pEp->bEndpointAddress & 0x80)
|
||||
pArg->pHidd->bPipeIN = pEp->bEndpointAddress & 0x7F;
|
||||
else
|
||||
pArg->pHidd->bPipeOUT = pEp->bEndpointAddress;
|
||||
}
|
||||
|
||||
/* Check if all data is OK */
|
||||
if (pArg->pHidd->bInterface != 0xFF
|
||||
&& pArg->pHidd->bPipeIN != 0xFF
|
||||
&& pArg->pHidd->bPipeOUT != 0xFF)
|
||||
return USBRC_FINISHED;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback function when interrupt OUT data received from host
|
||||
* \param pHidd Pointer to HIDDFunction instance
|
||||
* \param status Result status
|
||||
* \param transferred Number of bytes transferred
|
||||
* \param remaining Number of bytes that are not transferred yet
|
||||
*/
|
||||
static void HIDDFunction_ReportReceived(HIDDFunction *pHidd,
|
||||
uint8_t status,
|
||||
uint32_t transferred,
|
||||
uint32_t remaining)
|
||||
{
|
||||
HIDDReport *pOut = pHidd->pOutputList[pHidd->bCurrOutput];
|
||||
if (status != USBRC_SUCCESS) {
|
||||
|
||||
TRACE_ERROR("HIDDFun::ReadReport: %x\n\r", status);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Transfered information */
|
||||
pOut->wTransferred = transferred;
|
||||
|
||||
/* Data Change callback */
|
||||
if (pOut->fCallback)
|
||||
pOut->fCallback(HIDD_EC_REPORTCHANGED, pOut->pArg);
|
||||
|
||||
/* Proceed to next output report */
|
||||
pHidd->bCurrOutput ++;
|
||||
if (pHidd->bCurrOutput >= pHidd->bOutputListSize)
|
||||
pHidd->bCurrOutput = 0;
|
||||
|
||||
/* Start reading a report */
|
||||
USBD_Read(pHidd->bPipeOUT,
|
||||
pHidd->pOutputList[pHidd->bCurrOutput]->bData,
|
||||
pHidd->pOutputList[pHidd->bCurrOutput]->wMaxSize,
|
||||
(TransferCallback)HIDDFunction_ReportReceived,
|
||||
(void*)pHidd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback function when interrupt IN data sent to host
|
||||
* \param pHidd Pointer to HIDDFunction instance
|
||||
* \param status Result status
|
||||
* \param transferred Number of bytes transferred
|
||||
* \param remaining Number of bytes that are not transferred yet
|
||||
*/
|
||||
static void HIDDFunction_ReportSent(HIDDFunction *pHidd,
|
||||
uint8_t status,
|
||||
uint32_t transferred,
|
||||
uint32_t remaining)
|
||||
{
|
||||
HIDDReport *pIn = pHidd->pInputList[pHidd->bCurrInput];
|
||||
if (status != USBRC_SUCCESS) {
|
||||
|
||||
TRACE_ERROR("HIDDFun::WriteReport: %x\n\r", status);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Transfered information */
|
||||
pIn->wTransferred = transferred;
|
||||
|
||||
/* Report Sent Callback */
|
||||
if (pIn->fCallback)
|
||||
pIn->fCallback(HIDD_EC_REPORTSENT, pIn->pArg);
|
||||
|
||||
/* Proceed to next output report */
|
||||
pHidd->bCurrInput ++;
|
||||
if (pHidd->bCurrInput >= pHidd->bInputListSize)
|
||||
pHidd->bCurrInput = 0;
|
||||
|
||||
/* Start writing a report */
|
||||
USBD_Write(pHidd->bPipeIN,
|
||||
pHidd->pInputList[pHidd->bCurrInput]->bData,
|
||||
pHidd->pInputList[pHidd->bCurrInput]->wMaxSize,
|
||||
(TransferCallback)HIDDFunction_ReportReceived,
|
||||
(void*)pHidd);
|
||||
}
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initialize the USB Device HID function, for general HID device support.
|
||||
* \param pHidd Pointer to HIDDFunction instance.
|
||||
* \param pUsbd Pointer to USBDDriver instance.
|
||||
* \param bInterfaceNb Interface number,
|
||||
* can be 0xFF to obtain from descriptors.
|
||||
* \param pReportDescriptor Pointer to report descriptor.
|
||||
* \param pInputList Pointer to an HID input report list
|
||||
* \param bInputListSize HID input report list size
|
||||
* \param pOutputList Pointer to an HID output report list
|
||||
* \param bOutputListSize HID output report list size
|
||||
*/
|
||||
void HIDDFunction_Initialize(HIDDFunction * pHidd,
|
||||
USBDDriver * pUsbd, uint8_t bInterfaceNb,
|
||||
const uint8_t * pReportDescriptor,
|
||||
HIDDReport* pInputList[], uint8_t bInputListSize,
|
||||
HIDDReport* pOutputList[], uint8_t bOutputListSize)
|
||||
{
|
||||
TRACE_INFO("HIDDFunction_Initialize\n\r");
|
||||
|
||||
pHidd->pUsbd = pUsbd;
|
||||
pHidd->pReportDescriptor = (uint8_t *)pReportDescriptor;
|
||||
pHidd->pHidDescriptor = 0;
|
||||
|
||||
pHidd->bInterface = bInterfaceNb;
|
||||
pHidd->bPipeIN = 0xFF;
|
||||
pHidd->bPipeOUT = 0xFF;
|
||||
pHidd->bProtocol = HIDProtocol_REPORT; /* Non-boot protocol */
|
||||
|
||||
pHidd->pInputList = pInputList;
|
||||
pHidd->pOutputList = pOutputList;
|
||||
pHidd->bInputListSize = bInputListSize;
|
||||
pHidd->bOutputListSize = bOutputListSize;
|
||||
pHidd->bCurrInput = 0;
|
||||
pHidd->bCurrOutput = 0;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the USB HID Function Interface.
|
||||
* Only first interface and its endpoints parsed.
|
||||
* \param pHidd Pointer to HIDDFunction instance.
|
||||
* \param pDescriptors Pointer to descriptor list.
|
||||
* \param dwLength Descriptor list block length in bytes.
|
||||
* \return Pointer to next descriptor. 0 means no other descriptor.
|
||||
*/
|
||||
USBGenericDescriptor *HIDDFunction_ParseInterface(HIDDFunction * pHidd,
|
||||
USBGenericDescriptor * pDescriptors,
|
||||
uint32_t dwLength)
|
||||
{
|
||||
HIDDParseData data;
|
||||
pHidd->bPipeIN = 0xFF;
|
||||
pHidd->bPipeOUT = 0xFF;
|
||||
data.pHidd = pHidd;
|
||||
data.pIfDesc = 0;
|
||||
return USBGenericDescriptor_Parse(pDescriptors,
|
||||
dwLength,
|
||||
(USBDescriptorParseFunction)HIDDFunction_Parse,
|
||||
(void*)&data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start polling interrupt OUT pipe
|
||||
* (output report, host to device) if there is.
|
||||
* \param pHidd Pointer to HIDDFunction instance.
|
||||
*/
|
||||
uint32_t HIDDFunction_StartPollingOutputs(HIDDFunction * pHidd)
|
||||
{
|
||||
/* No report, do nothing */
|
||||
if (pHidd->bOutputListSize == 0
|
||||
|| pHidd->pOutputList == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
|
||||
/* Start reading a report */
|
||||
return USBD_Read(pHidd->bPipeOUT,
|
||||
pHidd->pOutputList[pHidd->bCurrOutput]->bData,
|
||||
pHidd->pOutputList[pHidd->bCurrOutput]->wMaxSize,
|
||||
(TransferCallback)HIDDFunction_ReportReceived,
|
||||
(void*)pHidd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start sending reports via interrupt IN pipe
|
||||
* (input report, device to host) if there is.
|
||||
* \param pHidd Pointer to HIDDFunction instance.
|
||||
*/
|
||||
uint32_t HIDDFunction_StartSendingInputs(HIDDFunction * pHidd)
|
||||
{
|
||||
/* No report, do nothing */
|
||||
if (pHidd->bInputListSize == 0
|
||||
|| pHidd->pInputList == 0)
|
||||
return USBRC_PARAM_ERR;
|
||||
/* Start sending a report */
|
||||
return USBD_Write(pHidd->bPipeIN,
|
||||
pHidd->pInputList[pHidd->bCurrInput]->bData,
|
||||
pHidd->pInputList[pHidd->bCurrInput]->wMaxSize,
|
||||
(TransferCallback)HIDDFunction_ReportSent,
|
||||
(void*)pHidd);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles HID-specific SETUP request sent by the host.
|
||||
* \param pHidd Pointer to HIDDFunction instance.
|
||||
* \param request Pointer to a USBGenericRequest instance
|
||||
*/
|
||||
uint32_t HIDDFunction_RequestHandler(HIDDFunction *pHidd,
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
uint32_t reqCode = (request->bmRequestType << 8)
|
||||
| (request->bRequest);
|
||||
|
||||
switch (reqCode) {
|
||||
/* Get_Descriptor */
|
||||
case USBGenericRequest_GETDESCRIPTOR|(0x81<<8):
|
||||
return HIDDFunction_GetDescriptor(
|
||||
pHidd,
|
||||
USBGetDescriptorRequest_GetDescriptorType(request),
|
||||
USBGenericRequest_GetLength(request));
|
||||
/* Clear_Feature (EP) */
|
||||
case USBGenericRequest_CLEARFEATURE|(0x02<<8):
|
||||
if (USBFeatureRequest_GetFeatureSelector(request)
|
||||
== USBFeatureRequest_ENDPOINTHALT) {
|
||||
uint8_t ep = USBGenericRequest_GetEndpointNumber(request);
|
||||
if (USBD_IsHalted(ep)) {
|
||||
/* Unhalt EP */
|
||||
USBD_Unhalt(ep);
|
||||
/* Restart Polling OUT */
|
||||
if (ep == pHidd->bPipeOUT) {
|
||||
HIDDFunction_StartPollingOutputs(pHidd);
|
||||
}
|
||||
/* and send a zero-length packet */
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
}
|
||||
break; /* Handled success */
|
||||
}
|
||||
return USBRC_PARAM_ERR;
|
||||
/* Set_Descriptor */
|
||||
case USBGenericRequest_SETDESCRIPTOR|(0x01<<8):
|
||||
/* Optional, not implemented */
|
||||
USBD_Stall(0);
|
||||
break;
|
||||
/* Get_Idle */
|
||||
case (0xa1<<8)|HIDGenericRequest_GETIDLE:
|
||||
HIDDFunction_GetIdle(pHidd,
|
||||
HIDReportRequest_GetReportId(request));
|
||||
break;
|
||||
/* Set_Idle */
|
||||
case (0x21<<8)|HIDGenericRequest_SETIDLE:
|
||||
HIDDFunction_SetIdle(pHidd,
|
||||
HIDReportRequest_GetReportId(request),
|
||||
HIDIdleRequest_GetIdleRate(request));
|
||||
break;
|
||||
/* Get_Report */
|
||||
case (0xa1<<8)|HIDGenericRequest_GETREPORT:
|
||||
HIDDFunction_GetReport(pHidd,
|
||||
HIDReportRequest_GetReportType(request),
|
||||
HIDReportRequest_GetReportId(request),
|
||||
USBGenericRequest_GetLength(request));
|
||||
break;
|
||||
/* Set_Report */
|
||||
case (0x21<<8)|HIDGenericRequest_SETREPORT:
|
||||
HIDDFunction_SetReport(pHidd,
|
||||
HIDReportRequest_GetReportType(request),
|
||||
HIDReportRequest_GetReportId(request),
|
||||
USBGenericRequest_GetLength(request));
|
||||
break;
|
||||
/* Get_Protocol */
|
||||
case (0xa1<<8)|HIDGenericRequest_SETPROTOCOL:
|
||||
pHidd->bProtocol = request->wValue;
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
break;
|
||||
/* Set_Protocol */
|
||||
case (0x21<<8)|HIDGenericRequest_GETPROTOCOL:
|
||||
USBD_Write(0, &pHidd->bProtocol, 1, 0, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
return USBRC_PARAM_ERR;
|
||||
}
|
||||
return USBRC_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read raw data through USB interrupt OUT EP.
|
||||
* \param pHidd Pointer to HIDDFunction instance.
|
||||
* \param pData Pointer to the data buffer.
|
||||
* \param dwLength The data length.
|
||||
* \param fCallback Callback function invoked when transferring done.
|
||||
* \param pArg Pointer to additional arguments.
|
||||
*/
|
||||
uint32_t HIDDFunction_Read(const HIDDFunction *pHidd,
|
||||
void* pData,
|
||||
uint32_t dwLength,
|
||||
TransferCallback fCallback,
|
||||
void* pArg)
|
||||
{
|
||||
return USBD_Read(pHidd->bPipeIN,
|
||||
pData, dwLength,
|
||||
fCallback, pArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write raw data through USB interrupt IN EP.
|
||||
* \param pHidd Pointer to HIDDFunction instance.
|
||||
* \param pData Pointer to the data sent.
|
||||
* \param dwLength The data length.
|
||||
* \param fCallback Callback function invoked when transferring done.
|
||||
* \param pArg Pointer to additional arguments.
|
||||
*/
|
||||
uint32_t HIDDFunction_Write(const HIDDFunction *pHidd,
|
||||
void* pData,
|
||||
uint32_t dwLength,
|
||||
TransferCallback fCallback,
|
||||
void* pArg)
|
||||
{
|
||||
return USBD_Write(pHidd->bPipeIN,
|
||||
pData, dwLength,
|
||||
fCallback, pArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize a report.
|
||||
* \param pReport Pointer to HIDDReport instance.
|
||||
* \param wSize Size of the report data.
|
||||
* \param bID Report ID.
|
||||
* \param fCallback Callback function for report events.
|
||||
* \param pArg Pointer to event handler arguments.
|
||||
*/
|
||||
void HIDDFunction_InitializeReport(HIDDReport* pReport,
|
||||
uint16_t wSize,
|
||||
uint8_t bID,
|
||||
HIDDReportEventCallback fCallback,
|
||||
void* pArg)
|
||||
{
|
||||
pReport->wMaxSize = wSize;
|
||||
pReport->wTransferred = 0;
|
||||
pReport->bIdleRate = 0;
|
||||
pReport->bDelay = 0;
|
||||
pReport->bID = bID;
|
||||
|
||||
pReport->fCallback = fCallback;
|
||||
pReport->pArg = pArg;
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,481 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_hid_tran
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "HIDDTransferDriver.h"
|
||||
#include <USBLib_Trace.h>
|
||||
|
||||
#include <USBRequests.h>
|
||||
#include <HIDDescriptors.h>
|
||||
#include <HIDDFunction.h>
|
||||
|
||||
#include <USBD_HAL.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal types
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Report struct for HID transfer.
|
||||
*/
|
||||
typedef struct _HIDDTransferReport {
|
||||
/** 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 address */
|
||||
uint8_t bData[HIDDTransferDriver_REPORTSIZE];
|
||||
} HIDDTransferReport;
|
||||
|
||||
/**
|
||||
* Driver structure for an HID device implementing simple transfer
|
||||
* functionalities.
|
||||
*/
|
||||
typedef struct _HIDDTransferDriver {
|
||||
|
||||
/** Standard HID function interface. */
|
||||
HIDDFunction hidFunction;
|
||||
|
||||
/** HID Input report list */
|
||||
HIDDReport *inputReports[1];
|
||||
/** HID Output report list */
|
||||
HIDDReport *outputReports[1];
|
||||
|
||||
/* OUT Report - block input for SET_REPORT */
|
||||
/**< Output report block size */
|
||||
uint16_t iReportLen;
|
||||
/**< Output report data buffer */
|
||||
uint8_t iReportBuf[HIDDTransferDriver_REPORTSIZE];
|
||||
|
||||
} HIDDTransferDriver;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Input report buffers */
|
||||
static HIDDTransferReport inputReport;
|
||||
|
||||
/** Output report buffers */
|
||||
static HIDDTransferReport outputReport;
|
||||
|
||||
/** Static instance of the HID Transfer device driver. */
|
||||
static HIDDTransferDriver hiddTransferDriver;
|
||||
|
||||
/** Report descriptor used by the driver. */
|
||||
static const uint8_t hiddTransferReportDescriptor[] = {
|
||||
|
||||
/* Global Usage Page */
|
||||
HIDReport_GLOBAL_USAGEPAGE + 2, 0xFF, 0xFF, /* Vendor-defined */
|
||||
|
||||
/* Collection: Application */
|
||||
HIDReport_LOCAL_USAGE + 1, 0xFF, /* Vendor-defined */
|
||||
HIDReport_COLLECTION + 1, HIDReport_COLLECTION_APPLICATION,
|
||||
|
||||
/* Input report: Vendor-defined */
|
||||
HIDReport_LOCAL_USAGE + 1, 0xFF, /* Vendor-defined usage */
|
||||
HIDReport_GLOBAL_REPORTCOUNT + 1, HIDDTransferDriver_REPORTSIZE,
|
||||
HIDReport_GLOBAL_REPORTSIZE + 1, 8,
|
||||
HIDReport_GLOBAL_LOGICALMINIMUM + 1, (uint8_t) -128,
|
||||
HIDReport_GLOBAL_LOGICALMAXIMUM + 1, (uint8_t) 127,
|
||||
HIDReport_INPUT + 1, 0, /* No Modifiers */
|
||||
|
||||
/* Output report: vendor-defined */
|
||||
HIDReport_LOCAL_USAGE + 1, 0xFF, /* Vendor-defined usage */
|
||||
HIDReport_GLOBAL_REPORTCOUNT + 1, HIDDTransferDriver_REPORTSIZE,
|
||||
HIDReport_GLOBAL_REPORTSIZE + 1, 8,
|
||||
HIDReport_GLOBAL_LOGICALMINIMUM + 1, (uint8_t) -128,
|
||||
HIDReport_GLOBAL_LOGICALMAXIMUM + 1, (uint8_t) 127,
|
||||
HIDReport_OUTPUT + 1, 0, /* No Modifiers */
|
||||
HIDReport_ENDCOLLECTION
|
||||
};
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Returns the descriptor requested by the host.
|
||||
* \param type Descriptor type.
|
||||
* \param length Maximum number of bytes to send.
|
||||
* \return 1 if the request has been handled by this function, otherwise 0.
|
||||
*/
|
||||
static uint8_t HIDDTransferDriver_GetDescriptor(uint8_t type,
|
||||
uint8_t length)
|
||||
{
|
||||
HIDDTransferDriver *pDrv = &hiddTransferDriver;
|
||||
HIDDFunction *pHidd = &pDrv->hidFunction;
|
||||
|
||||
const USBConfigurationDescriptor *pConfiguration;
|
||||
HIDDescriptor *hidDescriptors[2];
|
||||
|
||||
switch (type) {
|
||||
|
||||
case HIDGenericDescriptor_REPORT:
|
||||
TRACE_INFO("Report ");
|
||||
|
||||
/* Adjust length and send report descriptor */
|
||||
if (length > HIDDTransferDriver_REPORTDESCRIPTORSIZE) {
|
||||
|
||||
length = HIDDTransferDriver_REPORTDESCRIPTORSIZE;
|
||||
}
|
||||
USBD_Write(0, &hiddTransferReportDescriptor, length, 0, 0);
|
||||
break;
|
||||
|
||||
case HIDGenericDescriptor_HID:
|
||||
TRACE_INFO("HID ");
|
||||
|
||||
/* Configuration descriptor is different depending on configuration */
|
||||
if (USBD_IsHighSpeed()) {
|
||||
|
||||
pConfiguration =
|
||||
pHidd->pUsbd->pDescriptors->pHsConfiguration;
|
||||
}
|
||||
else {
|
||||
|
||||
pConfiguration =
|
||||
pHidd->pUsbd->pDescriptors->pFsConfiguration[0];
|
||||
}
|
||||
|
||||
/* Parse the device configuration to get the HID descriptor */
|
||||
USBConfigurationDescriptor_Parse(pConfiguration, 0, 0,
|
||||
(USBGenericDescriptor **) hidDescriptors);
|
||||
|
||||
/* Adjust length and send HID descriptor */
|
||||
if (length > sizeof(HIDDescriptor)) {
|
||||
|
||||
length = sizeof(HIDDescriptor);
|
||||
}
|
||||
USBD_Write(0, hidDescriptors[0], length, 0, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback function when SetReport request data received from host
|
||||
* \param pArg Pointer to additional argument struct
|
||||
* \param status Result status
|
||||
* \param transferred Number of bytes transferred
|
||||
* \param remaining Number of bytes that are not transferred yet
|
||||
*/
|
||||
static void HIDDTransferDriver_ReportReceived(void *pArg,
|
||||
uint8_t status,
|
||||
uint32_t transferred,
|
||||
uint32_t remaining)
|
||||
{
|
||||
HIDDTransferDriver *pDrv = &hiddTransferDriver;
|
||||
pDrv->iReportLen = transferred;
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the HID Transfer %device driver.
|
||||
* \param pDescriptors Pointer to USBDDriverDescriptors instance.
|
||||
*/
|
||||
void HIDDTransferDriver_Initialize(const USBDDriverDescriptors * pDescriptors)
|
||||
{
|
||||
HIDDTransferDriver * pDrv = &hiddTransferDriver;
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
/* One input report */
|
||||
pDrv->inputReports[0] = (HIDDReport*)&inputReport;
|
||||
HIDDFunction_InitializeReport((HIDDReport *)pDrv->inputReports[0],
|
||||
HIDDTransferDriver_REPORTSIZE,
|
||||
0,
|
||||
0, 0);
|
||||
/* One output report */
|
||||
pDrv->outputReports[0] = (HIDDReport*)&outputReport;
|
||||
HIDDFunction_InitializeReport((HIDDReport *)pDrv->outputReports[0],
|
||||
HIDDTransferDriver_REPORTSIZE,
|
||||
0,
|
||||
0, 0);
|
||||
|
||||
/* Initialize USBD Driver instance */
|
||||
USBDDriver_Initialize(pUsbd,
|
||||
pDescriptors,
|
||||
0); /* Multiple interface settings not supported */
|
||||
/* Function instance initialize */
|
||||
HIDDFunction_Initialize(&pDrv->hidFunction,
|
||||
pUsbd, 0,
|
||||
hiddTransferReportDescriptor,
|
||||
(HIDDReport **)(&pDrv->inputReports), 1,
|
||||
(HIDDReport **)(&pDrv->outputReports), 1);
|
||||
/* Initialize USBD */
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles configureation changed event.
|
||||
* \param cfgnum New configuration number
|
||||
*/
|
||||
void HIDDTransferDriver_ConfigurationChangedHandler(uint8_t cfgnum)
|
||||
{
|
||||
const USBDDriverDescriptors * pDescriptors = USBD_GetDriver()->pDescriptors;
|
||||
HIDDTransferDriver * pDrv = &hiddTransferDriver;
|
||||
HIDDFunction * pHidd = &pDrv->hidFunction;
|
||||
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
|
||||
if (cfgnum > 0) {
|
||||
|
||||
/* Parse endpoints for reports */
|
||||
if (USBD_HAL_IsHighSpeed() && pDescriptors->pHsConfiguration)
|
||||
pDesc = (USBConfigurationDescriptor*)pDescriptors->pHsConfiguration;
|
||||
else
|
||||
pDesc = (USBConfigurationDescriptor*)pDescriptors->pFsConfiguration[0];
|
||||
HIDDFunction_ParseInterface(pHidd,
|
||||
(USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
|
||||
/* Start polling for Output Reports */
|
||||
HIDDFunction_StartPollingOutputs(pHidd);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles HID-specific SETUP request sent by the host.
|
||||
* \param request Pointer to a USBGenericRequest instance
|
||||
*/
|
||||
void HIDDTransferDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
HIDDTransferDriver *pDrv = &hiddTransferDriver;
|
||||
HIDDFunction *pHidd = &pDrv->hidFunction;
|
||||
|
||||
TRACE_INFO("NewReq ");
|
||||
|
||||
/* Check if this is a standard request */
|
||||
if (USBGenericRequest_GetType(request) == USBGenericRequest_STANDARD) {
|
||||
|
||||
/* This is a standard request */
|
||||
switch (USBGenericRequest_GetRequest(request)) {
|
||||
|
||||
case USBGenericRequest_GETDESCRIPTOR:
|
||||
/* Check if this is a HID descriptor, otherwise forward it to
|
||||
the standard driver */
|
||||
if (!HIDDTransferDriver_GetDescriptor(
|
||||
USBGetDescriptorRequest_GetDescriptorType(request),
|
||||
USBGenericRequest_GetLength(request))) {
|
||||
|
||||
USBDDriver_RequestHandler(pHidd->pUsbd,
|
||||
request);
|
||||
}
|
||||
return; /* Handled, no need to do others */
|
||||
|
||||
case USBGenericRequest_CLEARFEATURE:
|
||||
|
||||
/* Check which is the requested feature */
|
||||
switch (USBFeatureRequest_GetFeatureSelector(request)) {
|
||||
case USBFeatureRequest_ENDPOINTHALT:
|
||||
{ uint8_t ep =
|
||||
USBGenericRequest_GetEndpointNumber(request);
|
||||
if (USBD_IsHalted(ep)) {
|
||||
/* Unhalt endpoint restart OUT EP
|
||||
*/
|
||||
USBD_Unhalt(ep);
|
||||
if (ep == pHidd->bPipeOUT) {
|
||||
HIDDFunction_StartPollingOutputs(pHidd);
|
||||
}
|
||||
}
|
||||
/* and send a zero-length packet */
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
return; /* Handled, no need to do others */
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
/* We use different buffer for SetReport */
|
||||
else if (USBGenericRequest_GetType(request) == USBGenericRequest_CLASS) {
|
||||
|
||||
switch (USBGenericRequest_GetRequest(request)) {
|
||||
|
||||
case HIDGenericRequest_SETREPORT:
|
||||
{
|
||||
uint16_t length = USBGenericRequest_GetLength(request);
|
||||
uint8_t type = HIDReportRequest_GetReportType(request);
|
||||
if (type == HIDReportRequest_OUTPUT) {
|
||||
if (length > HIDDTransferDriver_REPORTSIZE)
|
||||
length = HIDDTransferDriver_REPORTSIZE;
|
||||
USBD_Read(0,
|
||||
pDrv->iReportBuf,
|
||||
length,
|
||||
HIDDTransferDriver_ReportReceived,
|
||||
0); /* No argument to the callback function */
|
||||
}
|
||||
else {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
}
|
||||
return; /* Handled, no need do others */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Process HID requests */
|
||||
if (USBRC_SUCCESS == HIDDFunction_RequestHandler(pHidd,
|
||||
request)) {
|
||||
return;
|
||||
}
|
||||
else
|
||||
USBDDriver_RequestHandler(pHidd->pUsbd, request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to read request buffer of SetReport.
|
||||
* Set pData to 0 to get current data length only.
|
||||
* \param pData Pointer to data buffer
|
||||
* \param dwLength Data buffer length
|
||||
* \return Number of bytes read
|
||||
*/
|
||||
uint16_t HIDDTransferDriver_ReadReport(void *pData,
|
||||
uint32_t dwLength)
|
||||
{
|
||||
HIDDTransferDriver *pDrv = &hiddTransferDriver;
|
||||
|
||||
if (pData == 0) {
|
||||
|
||||
return pDrv->iReportLen;
|
||||
}
|
||||
|
||||
if (dwLength > HIDDTransferDriver_REPORTSIZE) {
|
||||
|
||||
dwLength = HIDDTransferDriver_REPORTSIZE;
|
||||
}
|
||||
if (dwLength > pDrv->iReportLen) {
|
||||
|
||||
dwLength = pDrv->iReportLen;
|
||||
}
|
||||
pDrv->iReportLen = 0;
|
||||
memcpy(pData, pDrv->iReportBuf, dwLength);
|
||||
|
||||
return dwLength;
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to read request buffer of interrupt OUT EP.
|
||||
* Set pData to 0 to get current data length only.
|
||||
* \param pData Pointer to data buffer
|
||||
* \param dLength Data buffer length
|
||||
* \return Number of bytes read
|
||||
*/
|
||||
uint16_t HIDDTransferDriver_Read(void *pData,
|
||||
uint32_t dLength)
|
||||
{
|
||||
HIDDTransferDriver *pDrv = &hiddTransferDriver;
|
||||
if (pData == 0) {
|
||||
|
||||
return pDrv->outputReports[0]->wTransferred;
|
||||
}
|
||||
|
||||
if (dLength > HIDDTransferDriver_REPORTSIZE) {
|
||||
|
||||
dLength = HIDDTransferDriver_REPORTSIZE;
|
||||
}
|
||||
if (dLength > pDrv->outputReports[0]->wTransferred) {
|
||||
|
||||
dLength = pDrv->outputReports[0]->wTransferred;
|
||||
}
|
||||
pDrv->outputReports[0]->wTransferred = 0;
|
||||
memcpy(pData, pDrv->outputReports[0]->bData, dLength);
|
||||
|
||||
return dLength;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write data through USB interrupt IN EP.
|
||||
* \param pData Pointer to the data sent.
|
||||
* \param dLength The data length.
|
||||
* \param fCallback Callback function invoked when transferring done.
|
||||
* \param pArg Pointer to additional arguments.
|
||||
*/
|
||||
uint8_t HIDDTransferDriver_Write(const void *pData,
|
||||
uint32_t dLength,
|
||||
TransferCallback fCallback,
|
||||
void *pArg)
|
||||
{
|
||||
HIDDTransferDriver *pDrv = &hiddTransferDriver;
|
||||
if (dLength != HIDDTransferDriver_REPORTSIZE) {
|
||||
|
||||
dLength = HIDDTransferDriver_REPORTSIZE;
|
||||
}
|
||||
return USBD_Write(pDrv->hidFunction.bPipeIN,
|
||||
pData, dLength,
|
||||
fCallback, pArg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a remote wake-up sequence if the host has explicitely enabled it
|
||||
* by sending the appropriate SET_FEATURE request.
|
||||
*/
|
||||
void HIDDTransferDriver_RemoteWakeUp(void)
|
||||
{
|
||||
HIDDTransferDriver *pDrv = &hiddTransferDriver;
|
||||
|
||||
/* Remote wake-up has been enabled */
|
||||
if (USBDDriver_IsRemoteWakeUpEnabled(pDrv->hidFunction.pUsbd)) {
|
||||
|
||||
USBD_RemoteWakeUp();
|
||||
}
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,637 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_msd
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Includes
|
||||
*-----------------------------------------------------------------------------*/
|
||||
|
||||
#include "SBCMethods.h"
|
||||
#include "MSDDStateMachine.h"
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*-----------------------------------------------------------------------------*/
|
||||
/**
|
||||
* Returns the expected transfer length and direction (IN, OUT or don't care)
|
||||
* from the host point-of-view.
|
||||
* \param cbw Pointer to the CBW to examinate
|
||||
* \param pLength Expected length of command
|
||||
* \param pType Expected direction of command
|
||||
*/
|
||||
static void MSDD_GetCommandInformation(MSCbw *cbw,
|
||||
unsigned int *length,
|
||||
unsigned char *type)
|
||||
{
|
||||
/* Expected host transfer direction and length */
|
||||
(*length) = cbw->dCBWDataTransferLength;
|
||||
|
||||
if (*length == 0) {
|
||||
|
||||
(*type) = MSDD_NO_TRANSFER;
|
||||
}
|
||||
else if ((cbw->bmCBWFlags & MSD_CBW_DEVICE_TO_HOST) != 0) {
|
||||
|
||||
(*type) = MSDD_DEVICE_TO_HOST;
|
||||
}
|
||||
else {
|
||||
|
||||
(*type) = MSDD_HOST_TO_DEVICE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Pre-processes a command by checking the differences between the host and
|
||||
* device expectations in term of transfer type and length.
|
||||
* Once one of the thirteen cases is identified, the actions to do during the
|
||||
* post-processing phase are stored in the dCase variable of the command
|
||||
* state.
|
||||
* \param pMsdDriver Pointer to a MSDDriver instance
|
||||
* \return 1 if the command is supported, false otherwise
|
||||
*/
|
||||
static unsigned char MSDD_PreProcessCommand(MSDDriver *pMsdDriver)
|
||||
{
|
||||
unsigned int hostLength = 0;
|
||||
unsigned int deviceLength = 0;
|
||||
unsigned char hostType;
|
||||
unsigned char deviceType;
|
||||
unsigned char isCommandSupported;
|
||||
MSDCommandState *commandState = &(pMsdDriver->commandState);
|
||||
MSCsw *csw = &(commandState->csw);
|
||||
MSCbw *cbw = &(commandState->cbw);
|
||||
MSDLun *lun = &(pMsdDriver->luns[(unsigned char) cbw->bCBWLUN]);
|
||||
|
||||
/* Get information about the command */
|
||||
/* Host-side */
|
||||
MSDD_GetCommandInformation(cbw, &hostLength, &hostType);
|
||||
|
||||
/* Device-side */
|
||||
isCommandSupported = SBC_GetCommandInformation(cbw->pCommand,
|
||||
&deviceLength,
|
||||
&deviceType,
|
||||
lun);
|
||||
|
||||
/* Initialize data residue and result status */
|
||||
csw->dCSWDataResidue = 0;
|
||||
csw->bCSWStatus = MSD_CSW_COMMAND_PASSED;
|
||||
|
||||
/* Check if the command is supported */
|
||||
if (isCommandSupported) {
|
||||
|
||||
/* Identify the command case */
|
||||
if(hostType == MSDD_NO_TRANSFER) {
|
||||
|
||||
/* Case 1 (Hn = Dn) */
|
||||
if(deviceType == MSDD_NO_TRANSFER) {
|
||||
|
||||
/*TRACE_WARNING("Case 1\n\r"); */
|
||||
commandState->postprocess = 0;
|
||||
commandState->length = 0;
|
||||
}
|
||||
else if(deviceType == MSDD_DEVICE_TO_HOST) {
|
||||
|
||||
/* Case 2 (Hn < Di) */
|
||||
TRACE_WARNING(
|
||||
"MSDD_PreProcessCommand: Case 2\n\r");
|
||||
commandState->postprocess = MSDD_CASE_PHASE_ERROR;
|
||||
commandState->length = 0;
|
||||
}
|
||||
else { /*if(deviceType == MSDD_HOST_TO_DEVICE) { */
|
||||
|
||||
/* Case 3 (Hn < Do) */
|
||||
TRACE_WARNING(
|
||||
"MSDD_PreProcessCommand: Case 3\n\r");
|
||||
commandState->postprocess = MSDD_CASE_PHASE_ERROR;
|
||||
commandState->length = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Case 4 (Hi > Dn) */
|
||||
else if(hostType == MSDD_DEVICE_TO_HOST) {
|
||||
|
||||
if(deviceType == MSDD_NO_TRANSFER) {
|
||||
|
||||
TRACE_WARNING(
|
||||
"MSDD_PreProcessCommand: Case 4\n\r");
|
||||
commandState->postprocess = MSDD_CASE_STALL_IN;
|
||||
commandState->length = 0;
|
||||
csw->dCSWDataResidue = hostLength;
|
||||
}
|
||||
else if(deviceType == MSDD_DEVICE_TO_HOST) {
|
||||
|
||||
if(hostLength > deviceLength) {
|
||||
|
||||
/* Case 5 (Hi > Di) */
|
||||
TRACE_WARNING(
|
||||
"MSDD_PreProcessCommand: Case 5\n\r");
|
||||
commandState->postprocess = MSDD_CASE_STALL_IN;
|
||||
commandState->length = deviceLength;
|
||||
csw->dCSWDataResidue = hostLength - deviceLength;
|
||||
}
|
||||
else if(hostLength == deviceLength) {
|
||||
|
||||
/* Case 6 (Hi = Di) */
|
||||
commandState->postprocess = 0;
|
||||
commandState->length = deviceLength;
|
||||
}
|
||||
else { /*if(hostLength < deviceLength) { */
|
||||
|
||||
/* Case 7 (Hi < Di) */
|
||||
TRACE_WARNING(
|
||||
"MSDD_PreProcessCommand: Case 7\n\r");
|
||||
commandState->postprocess = MSDD_CASE_PHASE_ERROR;
|
||||
commandState->length = hostLength;
|
||||
}
|
||||
}
|
||||
else { /*if(deviceType == MSDD_HOST_TO_DEVICE) { */
|
||||
|
||||
/* Case 8 (Hi <> Do) */
|
||||
TRACE_WARNING(
|
||||
"MSDD_PreProcessCommand: Case 8\n\r");
|
||||
commandState->postprocess =
|
||||
MSDD_CASE_STALL_IN | MSDD_CASE_PHASE_ERROR;
|
||||
commandState->length = 0;
|
||||
}
|
||||
}
|
||||
else if(hostType == MSDD_HOST_TO_DEVICE) {
|
||||
|
||||
if(deviceType == MSDD_NO_TRANSFER) {
|
||||
|
||||
/* Case 9 (Ho > Dn) */
|
||||
TRACE_WARNING(
|
||||
"MSDD_PreProcessCommand: Case 9\n\r");
|
||||
commandState->postprocess = MSDD_CASE_STALL_OUT;
|
||||
commandState->length = 0;
|
||||
csw->dCSWDataResidue = hostLength;
|
||||
}
|
||||
else if(deviceType == MSDD_DEVICE_TO_HOST) {
|
||||
|
||||
/* Case 10 (Ho <> Di) */
|
||||
TRACE_WARNING(
|
||||
"MSDD_PreProcessCommand: Case 10\n\r");
|
||||
commandState->postprocess =
|
||||
MSDD_CASE_STALL_OUT | MSDD_CASE_PHASE_ERROR;
|
||||
commandState->length = 0;
|
||||
}
|
||||
else { /*if(deviceType == MSDD_HOST_TO_DEVICE) { */
|
||||
|
||||
if(hostLength > deviceLength) {
|
||||
|
||||
/* Case 11 (Ho > Do) */
|
||||
TRACE_WARNING(
|
||||
"MSDD_PreProcessCommand: Case 11\n\r");
|
||||
commandState->postprocess = MSDD_CASE_STALL_OUT;
|
||||
/* commandState->length = deviceLength; */
|
||||
/* csw->dCSWDataResidue = hostLength - deviceLength; */
|
||||
commandState->length = 0;
|
||||
csw->dCSWDataResidue = deviceLength;
|
||||
}
|
||||
else if(hostLength == deviceLength) {
|
||||
|
||||
/* Case 12 (Ho = Do) */
|
||||
/*TRACE_WARNING( */
|
||||
/* "MSDD_PreProcessCommand: Case 12\n\r"); */
|
||||
commandState->postprocess = 0;
|
||||
commandState->length = deviceLength;
|
||||
}
|
||||
else { /*if(hostLength < deviceLength) { */
|
||||
|
||||
/* Case 13 (Ho < Do) */
|
||||
TRACE_WARNING(
|
||||
"MSDD_PreProcessCommand: Case 13\n\r");
|
||||
commandState->postprocess = MSDD_CASE_PHASE_ERROR;
|
||||
commandState->length = hostLength;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return isCommandSupported;
|
||||
}
|
||||
|
||||
/**
|
||||
* Post-processes a command given the case identified during the
|
||||
* pre-processing step.
|
||||
* Depending on the case, one of the following actions can be done:
|
||||
* - Bulk IN endpoint is stalled
|
||||
* - Bulk OUT endpoint is stalled
|
||||
* - CSW status set to phase error
|
||||
* \param pMsdDriver Pointer to a MSDDriver instance
|
||||
* \return If the device is halted
|
||||
*/
|
||||
static unsigned char MSDD_PostProcessCommand(MSDDriver *pMsdDriver)
|
||||
{
|
||||
MSDCommandState *commandState = &(pMsdDriver->commandState);
|
||||
MSCsw *csw = &(commandState->csw);
|
||||
unsigned char haltStatus = 0;
|
||||
|
||||
/* STALL Bulk IN endpoint ? */
|
||||
if ((commandState->postprocess & MSDD_CASE_STALL_IN) != 0) {
|
||||
|
||||
TRACE_INFO_WP("StallIn ");
|
||||
//MSDD_Halt(MSDD_CASE_STALL_IN);
|
||||
USBD_Halt(commandState->pipeIN);
|
||||
haltStatus = 1;
|
||||
}
|
||||
|
||||
/* STALL Bulk OUT endpoint ? */
|
||||
if ((commandState->postprocess & MSDD_CASE_STALL_OUT) != 0) {
|
||||
|
||||
TRACE_INFO_WP("StallOut ");
|
||||
//MSDD_Halt(MSDD_CASE_STALL_OUT);
|
||||
USBD_Halt(commandState->pipeOUT);
|
||||
haltStatus = 1;
|
||||
}
|
||||
|
||||
/* Set CSW status code to phase error ? */
|
||||
if ((commandState->postprocess & MSDD_CASE_PHASE_ERROR) != 0) {
|
||||
|
||||
TRACE_INFO_WP("PhaseErr ");
|
||||
csw->bCSWStatus = MSD_CSW_PHASE_ERROR;
|
||||
}
|
||||
|
||||
return haltStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes the latest command received by the %device.
|
||||
* \param pMsdDriver Pointer to a MSDDriver instance
|
||||
* \return 1 if the command has been completed, false otherwise.
|
||||
*/
|
||||
static unsigned char MSDD_ProcessCommand(MSDDriver * pMsdDriver)
|
||||
{
|
||||
unsigned char status;
|
||||
MSDCommandState *commandState = &(pMsdDriver->commandState);
|
||||
MSCbw *cbw = &(commandState->cbw);
|
||||
MSCsw *csw = &(commandState->csw);
|
||||
MSDLun *lun = &(pMsdDriver->luns[(unsigned char) cbw->bCBWLUN]);
|
||||
unsigned char isCommandComplete = 0;
|
||||
|
||||
/* Check if LUN is valid */
|
||||
if (cbw->bCBWLUN > pMsdDriver->maxLun) {
|
||||
|
||||
TRACE_WARNING(
|
||||
"MSDD_ProcessCommand: LUN %d not exist\n\r", cbw->bCBWLUN);
|
||||
status = MSDD_STATUS_ERROR;
|
||||
}
|
||||
else {
|
||||
|
||||
/* Process command */
|
||||
if (pMsdDriver->maxLun > 0) {
|
||||
|
||||
TRACE_INFO_WP("LUN%d ", cbw->bCBWLUN);
|
||||
}
|
||||
|
||||
status = SBC_ProcessCommand(lun, commandState);
|
||||
}
|
||||
|
||||
/* Check command result code */
|
||||
if (status == MSDD_STATUS_PARAMETER) {
|
||||
|
||||
TRACE_WARNING(
|
||||
"MSDD_ProcessCommand: Unknown cmd 0x%02X\n\r",
|
||||
cbw->pCommand[0]);
|
||||
|
||||
/* Update sense data */
|
||||
SBC_UpdateSenseData(&(lun->requestSenseData),
|
||||
SBC_SENSE_KEY_ILLEGAL_REQUEST,
|
||||
SBC_ASC_INVALID_FIELD_IN_CDB,
|
||||
0);
|
||||
|
||||
/* Result codes */
|
||||
csw->bCSWStatus = MSD_CSW_COMMAND_FAILED;
|
||||
isCommandComplete = 1;
|
||||
|
||||
/* stall the request, IN or OUT */
|
||||
if (((cbw->bmCBWFlags & MSD_CBW_DEVICE_TO_HOST) == 0)
|
||||
&& (cbw->dCBWDataTransferLength > 0)) {
|
||||
|
||||
/* Stall the OUT endpoint : host to device */
|
||||
/* MSDD_Halt(MSDD_CASE_STALL_OUT); */
|
||||
commandState->postprocess = MSDD_CASE_STALL_OUT;
|
||||
TRACE_INFO_WP("StaOUT ");
|
||||
}
|
||||
else {
|
||||
|
||||
/* Stall the IN endpoint : device to host */
|
||||
/* MSDD_Halt(MSDD_CASE_STALL_IN); */
|
||||
commandState->postprocess = MSDD_CASE_STALL_IN;
|
||||
TRACE_INFO_WP("StaIN ");
|
||||
}
|
||||
}
|
||||
else if (status == MSDD_STATUS_ERROR) {
|
||||
|
||||
TRACE_WARNING("MSD_ProcessCommand: Cmd %x fail\n\r",
|
||||
((SBCCommand*)commandState->cbw.pCommand)->bOperationCode);
|
||||
|
||||
/* Update sense data */
|
||||
SBC_UpdateSenseData(&(lun->requestSenseData),
|
||||
SBC_SENSE_KEY_MEDIUM_ERROR,
|
||||
SBC_ASC_INVALID_FIELD_IN_CDB,
|
||||
0);
|
||||
|
||||
/* Result codes */
|
||||
csw->bCSWStatus = MSD_CSW_COMMAND_FAILED;
|
||||
isCommandComplete = 1;
|
||||
}
|
||||
else if (status == MSDD_STATUS_RW) {
|
||||
|
||||
csw->bCSWStatus = MSD_CSW_COMMAND_FAILED;
|
||||
isCommandComplete = 1;
|
||||
}
|
||||
else {
|
||||
|
||||
/* Update sense data */
|
||||
SBC_UpdateSenseData(&(lun->requestSenseData),
|
||||
SBC_SENSE_KEY_NO_SENSE,
|
||||
0,
|
||||
0);
|
||||
|
||||
/* Is command complete ? */
|
||||
if (status == MSDD_STATUS_SUCCESS) {
|
||||
|
||||
isCommandComplete = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if command has been completed */
|
||||
if (isCommandComplete) {
|
||||
|
||||
TRACE_INFO_WP("Cplt ");
|
||||
|
||||
/* Adjust data residue */
|
||||
if (commandState->length != 0) {
|
||||
|
||||
csw->dCSWDataResidue += commandState->length;
|
||||
|
||||
/* STALL the endpoint waiting for data */
|
||||
if ((cbw->bmCBWFlags & MSD_CBW_DEVICE_TO_HOST) == 0) {
|
||||
|
||||
/* Stall the OUT endpoint : host to device */
|
||||
/* MSDD_Halt(MSDD_CASE_STALL_OUT); */
|
||||
commandState->postprocess = MSDD_CASE_STALL_OUT;
|
||||
TRACE_INFO_WP("StaOUT ");
|
||||
}
|
||||
else {
|
||||
|
||||
/* Stall the IN endpoint : device to host */
|
||||
/* MSDD_Halt(MSDD_CASE_STALL_IN); */
|
||||
commandState->postprocess = MSDD_CASE_STALL_IN;
|
||||
TRACE_INFO_WP("StaIN ");
|
||||
}
|
||||
}
|
||||
|
||||
/* Reset command state */
|
||||
commandState->state = 0;
|
||||
}
|
||||
|
||||
return isCommandComplete;
|
||||
}
|
||||
|
||||
/**
|
||||
* State machine for the MSD %device driver
|
||||
* \param pMsdDriver Pointer to a MSDDriver instance
|
||||
*/
|
||||
void MSDD_StateMachine(MSDDriver * pMsdDriver)
|
||||
{
|
||||
MSDCommandState *commandState = &(pMsdDriver->commandState);
|
||||
MSCbw *cbw = &(commandState->cbw);
|
||||
MSCsw *csw = &(commandState->csw);
|
||||
MSDTransfer *transfer = &(commandState->transfer);
|
||||
unsigned char status;
|
||||
|
||||
/* Identify current driver state */
|
||||
switch (pMsdDriver->state) {
|
||||
/*---------------------- */
|
||||
case MSDD_STATE_READ_CBW:
|
||||
/*---------------------- */
|
||||
/* Start the CBW read operation */
|
||||
transfer->semaphore = 0;
|
||||
#if 1
|
||||
status = USBD_Read(commandState->pipeOUT,
|
||||
cbw,
|
||||
MSD_CBW_SIZE,
|
||||
(TransferCallback) MSDDriver_Callback,
|
||||
(void *) transfer);
|
||||
#else
|
||||
status = MSDD_Read(cbw,
|
||||
MSD_CBW_SIZE,
|
||||
(TransferCallback) MSDDriver_Callback,
|
||||
(void *) transfer);
|
||||
#endif
|
||||
|
||||
/* Check operation result code */
|
||||
if (status == USBD_STATUS_SUCCESS) {
|
||||
|
||||
/* If the command was successful, wait for transfer */
|
||||
pMsdDriver->state = MSDD_STATE_WAIT_CBW;
|
||||
}
|
||||
break;
|
||||
|
||||
/*---------------------- */
|
||||
case MSDD_STATE_WAIT_CBW:
|
||||
/*---------------------- */
|
||||
/* Check transfer semaphore */
|
||||
if (transfer->semaphore > 0) {
|
||||
|
||||
/* Take semaphore and terminate transfer */
|
||||
transfer->semaphore--;
|
||||
|
||||
/* Check if transfer was successful */
|
||||
if (transfer->status == USBD_STATUS_SUCCESS) {
|
||||
|
||||
TRACE_INFO_WP("------------------------------\n\r");
|
||||
|
||||
/* Process received command */
|
||||
pMsdDriver->state = MSDD_STATE_PROCESS_CBW;
|
||||
}
|
||||
else if (transfer->status == USBD_STATUS_RESET) {
|
||||
|
||||
TRACE_INFO("MSDD_StateMachine: EP resetted\n\r");
|
||||
pMsdDriver->state = MSDD_STATE_READ_CBW;
|
||||
}
|
||||
else {
|
||||
|
||||
TRACE_WARNING(
|
||||
"MSDD_StateMachine: Failed to read CBW\n\r");
|
||||
pMsdDriver->state = MSDD_STATE_READ_CBW;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/*------------------------- */
|
||||
case MSDD_STATE_PROCESS_CBW:
|
||||
/*------------------------- */
|
||||
/* Check if this is a new command */
|
||||
if (commandState->state == 0) {
|
||||
|
||||
/* Copy the CBW tag */
|
||||
csw->dCSWTag = cbw->dCBWTag;
|
||||
|
||||
/* Check that the CBW is 31 bytes long */
|
||||
if ((transfer->transferred != MSD_CBW_SIZE) ||
|
||||
(transfer->remaining != 0)) {
|
||||
|
||||
TRACE_WARNING(
|
||||
"MSDD_StateMachine: Invalid CBW (len %d)\n\r",
|
||||
(int)transfer->transferred);
|
||||
|
||||
/* Wait for a reset recovery */
|
||||
pMsdDriver->waitResetRecovery = 1;
|
||||
|
||||
/* Halt the Bulk-IN and Bulk-OUT pipes */
|
||||
//MSDD_Halt(MSDD_CASE_STALL_OUT | MSDD_CASE_STALL_IN);
|
||||
USBD_Halt(commandState->pipeIN);
|
||||
USBD_Halt(commandState->pipeOUT);
|
||||
|
||||
csw->bCSWStatus = MSD_CSW_COMMAND_FAILED;
|
||||
pMsdDriver->state = MSDD_STATE_READ_CBW;
|
||||
|
||||
}
|
||||
/* Check the CBW Signature */
|
||||
else if (cbw->dCBWSignature != MSD_CBW_SIGNATURE) {
|
||||
|
||||
TRACE_WARNING(
|
||||
"MSD_BOTStateMachine: Invalid CBW (Bad signature)\n\r");
|
||||
|
||||
/* Wait for a reset recovery */
|
||||
pMsdDriver->waitResetRecovery = 1;
|
||||
|
||||
/* Halt the Bulk-IN and Bulk-OUT pipes */
|
||||
//MSDD_Halt(MSDD_CASE_STALL_OUT | MSDD_CASE_STALL_IN);
|
||||
USBD_Halt(commandState->pipeIN);
|
||||
USBD_Halt(commandState->pipeOUT);
|
||||
|
||||
csw->bCSWStatus = MSD_CSW_COMMAND_FAILED;
|
||||
pMsdDriver->state = MSDD_STATE_READ_CBW;
|
||||
}
|
||||
else {
|
||||
|
||||
/* Pre-process command */
|
||||
MSDD_PreProcessCommand(pMsdDriver);
|
||||
}
|
||||
}
|
||||
|
||||
/* Process command */
|
||||
if (csw->bCSWStatus == MSDD_STATUS_SUCCESS) {
|
||||
|
||||
if (MSDD_ProcessCommand(pMsdDriver)) {
|
||||
|
||||
/* Post-process command if it is finished */
|
||||
if (MSDD_PostProcessCommand(pMsdDriver)) {
|
||||
|
||||
TRACE_INFO_WP("WaitHALT ");
|
||||
pMsdDriver->state = MSDD_STATE_WAIT_HALT;
|
||||
}
|
||||
else {
|
||||
|
||||
pMsdDriver->state = MSDD_STATE_SEND_CSW;
|
||||
}
|
||||
}
|
||||
TRACE_INFO_WP("\n\r");
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
/*---------------------- */
|
||||
case MSDD_STATE_SEND_CSW:
|
||||
/*---------------------- */
|
||||
/* Set signature */
|
||||
csw->dCSWSignature = MSD_CSW_SIGNATURE;
|
||||
|
||||
/* Start the CSW write operation */
|
||||
#if 1
|
||||
status = USBD_Write(commandState->pipeIN,
|
||||
csw,
|
||||
MSD_CSW_SIZE,
|
||||
(TransferCallback) MSDDriver_Callback,
|
||||
(void *) transfer);
|
||||
#else
|
||||
status = MSDD_Write(csw,
|
||||
MSD_CSW_SIZE,
|
||||
(TransferCallback) MSDDriver_Callback,
|
||||
(void *) transfer);
|
||||
#endif
|
||||
|
||||
/* Check operation result code */
|
||||
if (status == USBD_STATUS_SUCCESS) {
|
||||
|
||||
TRACE_INFO_WP("SendCSW ");
|
||||
|
||||
/* Wait for end of transfer */
|
||||
pMsdDriver->state = MSDD_STATE_WAIT_CSW;
|
||||
}
|
||||
break;
|
||||
|
||||
/*---------------------- */
|
||||
case MSDD_STATE_WAIT_CSW:
|
||||
/*---------------------- */
|
||||
/* Check transfer semaphore */
|
||||
if (transfer->semaphore > 0) {
|
||||
|
||||
/* Take semaphore and terminate transfer */
|
||||
transfer->semaphore--;
|
||||
|
||||
/* Check if transfer was successful */
|
||||
if (transfer->status == USBD_STATUS_RESET) {
|
||||
|
||||
TRACE_INFO("MSDD_StateMachine: EP resetted\n\r");
|
||||
}
|
||||
else if (transfer->status == USBD_STATUS_ABORTED) {
|
||||
|
||||
TRACE_WARNING(
|
||||
"MSDD_StateMachine: Failed to send CSW\n\r");
|
||||
}
|
||||
else {
|
||||
|
||||
TRACE_INFO_WP("ok");
|
||||
}
|
||||
|
||||
/* Read new CBW */
|
||||
pMsdDriver->state = MSDD_STATE_READ_CBW;
|
||||
}
|
||||
break;
|
||||
|
||||
/*---------------------- */
|
||||
case MSDD_STATE_WAIT_HALT:
|
||||
/*---------------------- */
|
||||
//if (MSDD_IsHalted() == 0) {
|
||||
if (!USBD_IsHalted(commandState->pipeIN)) {
|
||||
|
||||
pMsdDriver->state = MSDD_STATE_SEND_CSW;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,113 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_msd
|
||||
*@{
|
||||
* Implement a single interface device with single MS function in.
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Includes
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <MSDDriver.h>
|
||||
#include <MSDFunction.h>
|
||||
#include <USBLib_Trace.h>
|
||||
#include <USBD.h>
|
||||
#include <USBD_HAL.h>
|
||||
#include <USBDDriver.h>
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*-----------------------------------------------------------------------------*/
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*-----------------------------------------------------------------------------*/
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*-----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the MSD driver and the associated USB driver.
|
||||
* \param pDescriptors Pointer to Descriptors list for MSD Device.
|
||||
* \param pLuns Pointer to a list of LUNs
|
||||
* \param numLuns Number of LUN in list
|
||||
* \see MSDLun
|
||||
*/
|
||||
void MSDDriver_Initialize(
|
||||
const USBDDriverDescriptors *pDescriptors,
|
||||
MSDLun *pLuns, unsigned char numLuns)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
USBDDriver_Initialize(pUsbd, pDescriptors, 0);
|
||||
MSDFunction_Initialize(pUsbd, 0, pLuns, numLuns);
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked when the configuration of the device changes. Resets the mass
|
||||
* storage driver.
|
||||
* \param pMsdDriver Pointer to MSDDriver instance.
|
||||
* \param cfgnum New configuration number.
|
||||
*/
|
||||
void MSDDriver_ConfigurationChangeHandler(
|
||||
uint8_t cfgnum)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
USBConfigurationDescriptor *pDesc;
|
||||
if (cfgnum) {
|
||||
pDesc = USBDDriver_GetCfgDescriptors(pUsbd, cfgnum);
|
||||
MSDFunction_Configure((USBGenericDescriptor*)pDesc,
|
||||
pDesc->wTotalLength);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for incoming SETUP requests on default Control endpoint 0.
|
||||
*
|
||||
* Standard requests are forwarded to the USBDDriver_RequestHandler
|
||||
* method.
|
||||
* \param pMsdDriver Pointer to MSDDriver instance.
|
||||
* \param request Pointer to a USBGenericRequest instance
|
||||
*/
|
||||
void MSDDriver_RequestHandler(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
if (MSDFunction_RequestHandler(request)) {
|
||||
USBDDriver_RequestHandler(pUsbd, request);
|
||||
}
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,311 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_msd
|
||||
*@{
|
||||
* Implements Massstorage Function for USB device.
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Includes
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include <MSDescriptors.h>
|
||||
|
||||
#include <MSDDriver.h>
|
||||
#include <USBLib_Trace.h>
|
||||
#include <USBD.h>
|
||||
#include <USBD_HAL.h>
|
||||
#include <USBDDriver.h>
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Internal Types
|
||||
*-----------------------------------------------------------------------------*/
|
||||
|
||||
/** Parse data extension */
|
||||
typedef struct _MSDParseData {
|
||||
/** Pointer to driver instance */
|
||||
MSDDriver *pMsdd;
|
||||
/** Pointer to currently processed interface descriptor */
|
||||
USBInterfaceDescriptor *pIf;
|
||||
} MSDParseData;
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*-----------------------------------------------------------------------------*/
|
||||
|
||||
/** MSD Driver instance for device function */
|
||||
static MSDDriver msdFunction;
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*-----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Parse descriptors: Bulk EP IN/OUT.
|
||||
* \param desc Pointer to current processed descriptor.
|
||||
* \param arg Pointer to data extention struct for parsing.
|
||||
*/
|
||||
static uint8_t MSDFunction_Parse(USBGenericDescriptor* desc, MSDParseData* arg)
|
||||
{
|
||||
MSDDriver *pMsdd = arg->pMsdd;
|
||||
USBInterfaceDescriptor *pIf;
|
||||
|
||||
/* Not a valid descriptor */
|
||||
if (desc->bLength == 0) {
|
||||
return USBD_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
/* Find interface descriptor */
|
||||
if (desc->bDescriptorType == USBGenericDescriptor_INTERFACE) {
|
||||
pIf = (USBInterfaceDescriptor*)desc;
|
||||
if (pIf->bInterfaceClass == MSInterfaceDescriptor_CLASS) {
|
||||
/* First found IF */
|
||||
if (pMsdd->interfaceNb == 0xFF) {
|
||||
pMsdd->interfaceNb = pIf->bInterfaceNumber;
|
||||
arg->pIf = pIf;
|
||||
}
|
||||
/* Specific IF */
|
||||
else if (pMsdd->interfaceNb == pIf->bInterfaceNumber) {
|
||||
arg->pIf = pIf;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
/* Start parse endpoints */
|
||||
if (arg->pIf) {
|
||||
if (desc->bDescriptorType == USBGenericDescriptor_ENDPOINT) {
|
||||
USBEndpointDescriptor *pEP = (USBEndpointDescriptor*)desc;
|
||||
if (pEP->bmAttributes == USBEndpointDescriptor_BULK) {
|
||||
if (pEP->bEndpointAddress & 0x80)
|
||||
pMsdd->commandState.pipeIN = pEP->bEndpointAddress & 0x7F;
|
||||
else
|
||||
pMsdd->commandState.pipeOUT = pEP->bEndpointAddress;
|
||||
}
|
||||
}
|
||||
|
||||
/* Finish when found all pipes */
|
||||
if (pMsdd->commandState.pipeIN != 0
|
||||
&& pMsdd->commandState.pipeOUT != 0) {
|
||||
return USBRC_FINISHED;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the state of the MSD driver
|
||||
*/
|
||||
static void MSDFunction_Reset(void)
|
||||
{
|
||||
MSDDriver *pMsdd = &msdFunction;
|
||||
|
||||
TRACE_INFO_WP("MSDReset ");
|
||||
|
||||
pMsdd->state = MSDD_STATE_READ_CBW;
|
||||
pMsdd->waitResetRecovery = 0;
|
||||
pMsdd->commandState.state = 0;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*-----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the MSD driver and the associated USB driver.
|
||||
* \param pUsbd Pointer to USBDDriver instance.
|
||||
* \param bInterfaceNb Interface number for the function.
|
||||
* \param pLuns Pointer to a list of LUNs
|
||||
* \param numLuns Number of LUN in list
|
||||
* \see MSDLun
|
||||
*/
|
||||
void MSDFunction_Initialize(
|
||||
USBDDriver *pUsbd, uint8_t bInterfaceNb,
|
||||
MSDLun *pLuns, uint8_t numLuns)
|
||||
{
|
||||
MSDDriver *pMsdDriver = &msdFunction;
|
||||
|
||||
TRACE_INFO("MSDFun init\n\r");
|
||||
|
||||
/* Driver instance */
|
||||
pMsdDriver->pUsbd = pUsbd;
|
||||
pMsdDriver->interfaceNb = bInterfaceNb;
|
||||
|
||||
/* Command state initialization */
|
||||
pMsdDriver->commandState.state = 0;
|
||||
pMsdDriver->commandState.postprocess = 0;
|
||||
pMsdDriver->commandState.length = 0;
|
||||
pMsdDriver->commandState.transfer.semaphore = 0;
|
||||
|
||||
/* LUNs */
|
||||
pMsdDriver->luns = pLuns;
|
||||
pMsdDriver->maxLun = (uint8_t) (numLuns - 1);
|
||||
|
||||
/* Reset BOT driver */
|
||||
MSDFunction_Reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoked when the configuration of the device changes.
|
||||
* Pass endpoints and resets the mass storage function.
|
||||
* \pDescriptors Pointer to the descriptors for function configure.
|
||||
* \wLength Length of descriptors in number of bytes.
|
||||
*/
|
||||
void MSDFunction_Configure(USBGenericDescriptor *pDescriptors,
|
||||
uint16_t wLength)
|
||||
{
|
||||
MSDDriver *pMsdDriver = &msdFunction;
|
||||
MSDParseData parseData;
|
||||
|
||||
TRACE_INFO_WP("MSDFunCfg ");
|
||||
|
||||
pMsdDriver->state = MSDD_STATE_READ_CBW;
|
||||
pMsdDriver->waitResetRecovery = 0;
|
||||
pMsdDriver->commandState.state = 0;
|
||||
|
||||
parseData.pIf = 0;
|
||||
parseData.pMsdd = pMsdDriver;
|
||||
USBGenericDescriptor_Parse((USBGenericDescriptor*)pDescriptors, wLength,
|
||||
(USBDescriptorParseFunction)MSDFunction_Parse, &parseData);
|
||||
|
||||
MSDFunction_Reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for incoming SETUP requests on default Control endpoint 0.
|
||||
*
|
||||
* Standard requests are forwarded to the USBDDriver_RequestHandler
|
||||
* method.
|
||||
* \param pMsdDriver Pointer to MSDDriver instance.
|
||||
* \param request Pointer to a USBGenericRequest instance
|
||||
*/
|
||||
uint32_t MSDFunction_RequestHandler(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
MSDDriver *pMsdDriver = &msdFunction;
|
||||
uint32_t reqCode = (USBGenericRequest_GetType(request) << 8)
|
||||
| (USBGenericRequest_GetRequest(request));
|
||||
|
||||
TRACE_INFO_WP("Msdf ");
|
||||
|
||||
/* Handle requests */
|
||||
switch (reqCode) {
|
||||
/*--------------------- */
|
||||
case USBGenericRequest_CLEARFEATURE:
|
||||
/*--------------------- */
|
||||
TRACE_INFO_WP("ClrFeat ");
|
||||
|
||||
switch (USBFeatureRequest_GetFeatureSelector(request)) {
|
||||
|
||||
/*--------------------- */
|
||||
case USBFeatureRequest_ENDPOINTHALT:
|
||||
/*--------------------- */
|
||||
TRACE_INFO_WP("Hlt ");
|
||||
|
||||
/* Do not clear the endpoint halt status if the device is waiting */
|
||||
/* for a reset recovery sequence */
|
||||
if (!pMsdDriver->waitResetRecovery) {
|
||||
|
||||
/* Forward the request to the standard handler */
|
||||
USBDDriver_RequestHandler(USBD_GetDriver(), request);
|
||||
}
|
||||
else {
|
||||
|
||||
TRACE_INFO_WP("No ");
|
||||
}
|
||||
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
|
||||
return USBRC_SUCCESS; /* Handled */
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
/*------------------- */
|
||||
case (USBGenericRequest_CLASS<<8)|MSD_GET_MAX_LUN:
|
||||
/*------------------- */
|
||||
TRACE_INFO_WP("gMaxLun ");
|
||||
|
||||
/* Check request parameters */
|
||||
if ((request->wValue == 0)
|
||||
&& (request->wIndex == pMsdDriver->interfaceNb)
|
||||
&& (request->wLength == 1)) {
|
||||
|
||||
USBD_Write(0, &(pMsdDriver->maxLun), 1, 0, 0);
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
TRACE_WARNING(
|
||||
"MSDDriver_RequestHandler: GetMaxLUN(%d,%d,%d)\n\r",
|
||||
request->wValue, request->wIndex, request->wLength);
|
||||
USBD_Stall(0);
|
||||
}
|
||||
return USBRC_SUCCESS; /* Handled */
|
||||
|
||||
/*----------------------- */
|
||||
case (USBGenericRequest_CLASS<<8)|MSD_BULK_ONLY_RESET:
|
||||
/*----------------------- */
|
||||
TRACE_INFO_WP("Rst ");
|
||||
|
||||
/* Check parameters */
|
||||
if ((request->wValue == 0)
|
||||
&& (request->wIndex == pMsdDriver->interfaceNb)
|
||||
&& (request->wLength == 0)) {
|
||||
|
||||
/* Reset the MSD driver */
|
||||
MSDFunction_Reset();
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
}
|
||||
else {
|
||||
|
||||
TRACE_WARNING(
|
||||
"MSDDriver_RequestHandler: Reset(%d,%d,%d)\n\r",
|
||||
request->wValue, request->wIndex, request->wLength);
|
||||
USBD_Stall(0);
|
||||
}
|
||||
return USBRC_SUCCESS; /* Handled */
|
||||
}
|
||||
|
||||
return USBRC_PARAM_ERR;
|
||||
}
|
||||
|
||||
/**
|
||||
* State machine for the MSD driver
|
||||
*/
|
||||
void MSDFunction_StateMachine(void)
|
||||
{
|
||||
if (USBD_GetState() < USBD_STATE_CONFIGURED){}
|
||||
else MSDD_StateMachine(&msdFunction);
|
||||
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_msd
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "MSDIOFifo.h"
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \brief Initializes a MSDIOFifo instance.
|
||||
* \param pFifo Pointer to the MSDIOFifo instance to initialize
|
||||
* \param pBuffer Pointer to a buffer used for read/write operation and
|
||||
* which must be blockSize bytes aligned.
|
||||
* \param bufferSize Total size of the buffer in bytes
|
||||
*/
|
||||
void MSDIOFifo_Init(MSDIOFifo *pFifo,
|
||||
void * pBuffer, unsigned short bufferSize)
|
||||
{
|
||||
pFifo->pBuffer = pBuffer;
|
||||
pFifo->bufferSize = bufferSize;
|
||||
|
||||
pFifo->inputNdx = 0;
|
||||
pFifo->outputNdx = 0;
|
||||
pFifo->inputTotal = 0;
|
||||
pFifo->outputTotal = 0;
|
||||
|
||||
pFifo->inputState = MSDIO_IDLE;
|
||||
pFifo->outputState = MSDIO_IDLE;
|
||||
|
||||
pFifo->fullCnt = 0;
|
||||
pFifo->nullCnt = 0;
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
@@ -1,389 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
* \addtogroup usbd_msd
|
||||
*@{
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#include "MSDLun.h"
|
||||
#include <USBLib_Trace.h>
|
||||
#include <USBD.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Constants
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Default LUN block size in bytes */
|
||||
#define DEFAULT_LUN_BLOCK_SIZE 512
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Inquiry data to return to the host for the Lun. */
|
||||
static SBCInquiryData inquiryData = {
|
||||
|
||||
SBC_DIRECT_ACCESS_BLOCK_DEVICE, /* Direct-access block device */
|
||||
SBC_PERIPHERAL_DEVICE_CONNECTED,/* Peripheral device is connected */
|
||||
0x00, /* Reserved bits */
|
||||
0x01, /* Media is removable */
|
||||
SBC_SPC_VERSION_4, /* SPC-4 supported */
|
||||
0x2, /* Response data format, must be 0x2 */
|
||||
0, /* Hierarchical addressing not supported */
|
||||
0, /* ACA not supported */
|
||||
0x0, /* Obsolete bits */
|
||||
sizeof(SBCInquiryData) - 5, /* Additional length */
|
||||
0, /* No embedded SCC */
|
||||
0, /* No access control coordinator */
|
||||
SBC_TPGS_NONE, /* No target port support group */
|
||||
0, /* Third-party copy not supported */
|
||||
0x0, /* Reserved bits */
|
||||
0, /* Protection information not supported */
|
||||
0x0, /* Obsolete bit */
|
||||
0, /* No embedded enclosure service component */
|
||||
0x0, /* ??? */
|
||||
0, /* Device is not multi-port */
|
||||
0x0, /* Obsolete bits */
|
||||
0x0, /* Unused feature */
|
||||
0x0, /* Unused features */
|
||||
0, /* Task management model not supported */
|
||||
0x0, /* ??? */
|
||||
{'A','T','M','E','L',' ',' ',' '},
|
||||
{'M','a','s','s',' ',
|
||||
'S','t','o','r','a','g','e',' ',
|
||||
'M','S','D'},
|
||||
{'0','.','0','1'},
|
||||
{'M','a','s','s',' ',
|
||||
'S','t','o','r','a','g','e',' ',
|
||||
'E','x','a','m','p','l','e'},
|
||||
0x00, /* Unused features */
|
||||
0x00, /* Reserved bits */
|
||||
{SBC_VERSION_DESCRIPTOR_SBC_3}, /* SBC-3 compliant device */
|
||||
{0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0,
|
||||
0, 0} /* Reserved */
|
||||
};
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \brief Initializes a LUN instance. Must be invoked at least once even no
|
||||
* Media is linked.
|
||||
* \param lun Pointer to the MSDLun instance to initialize
|
||||
* \param media Media on which the LUN is constructed, set to 0 to
|
||||
* disconnect the Media or initialize an ejected LUN.
|
||||
* \param ioBuffer Pointer to a buffer used for read/write operation and
|
||||
* which must be blockSize bytes long.
|
||||
* \param ioBufferSize Size of the allocated IO buffer.
|
||||
* \param baseAddress Base address of the LUN in number of media blocks
|
||||
* \param size Total size of the LUN in number of media blocks
|
||||
* \param blockSize One block of the LUN in number of media blocks
|
||||
* \param protected The LUN area is forced to readonly even the media
|
||||
* is writable
|
||||
* \param dataMonitor Pointer to a Monitor Function to analyze the flow of
|
||||
* this LUN.
|
||||
*/
|
||||
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))
|
||||
{
|
||||
uint32_t logicalBlockAddress;
|
||||
TRACE_INFO("LUN init\n\r");
|
||||
|
||||
/* Initialize inquiry data */
|
||||
|
||||
lun->inquiryData = &inquiryData;
|
||||
|
||||
/* Initialize request sense data */
|
||||
|
||||
lun->requestSenseData.bResponseCode = SBC_SENSE_DATA_FIXED_CURRENT;
|
||||
lun->requestSenseData.isValid = 1;
|
||||
lun->requestSenseData.bObsolete1 = 0;
|
||||
lun->requestSenseData.bSenseKey = SBC_SENSE_KEY_NO_SENSE;
|
||||
lun->requestSenseData.bReserved1 = 0;
|
||||
lun->requestSenseData.isILI = 0;
|
||||
lun->requestSenseData.isEOM = 0;
|
||||
lun->requestSenseData.isFilemark = 0;
|
||||
lun->requestSenseData.pInformation[0] = 0;
|
||||
lun->requestSenseData.pInformation[1] = 0;
|
||||
lun->requestSenseData.pInformation[2] = 0;
|
||||
lun->requestSenseData.pInformation[3] = 0;
|
||||
lun->requestSenseData.bAdditionalSenseLength
|
||||
= sizeof(SBCRequestSenseData) - 8;
|
||||
lun->requestSenseData.bAdditionalSenseCode = 0;
|
||||
lun->requestSenseData.bAdditionalSenseCodeQualifier = 0;
|
||||
lun->requestSenseData.bFieldReplaceableUnitCode = 0;
|
||||
lun->requestSenseData.bSenseKeySpecific = 0;
|
||||
lun->requestSenseData.pSenseKeySpecific[0] = 0;
|
||||
lun->requestSenseData.pSenseKeySpecific[0] = 0;
|
||||
lun->requestSenseData.isSKSV = 0;
|
||||
|
||||
STORE_DWORDB(0, lun->readCapacityData.pLogicalBlockAddress);
|
||||
STORE_DWORDB(0, lun->readCapacityData.pLogicalBlockLength);
|
||||
|
||||
/* Initialize LUN */
|
||||
|
||||
lun->media = media;
|
||||
if (media == 0) {
|
||||
lun->status = LUN_NOT_PRESENT;
|
||||
return;
|
||||
}
|
||||
|
||||
lun->baseAddress = baseAddress;
|
||||
|
||||
/* Customized block size */
|
||||
|
||||
if (blockSize) {
|
||||
lun->blockSize = blockSize;
|
||||
}
|
||||
else {
|
||||
if (media->blockSize < DEFAULT_LUN_BLOCK_SIZE)
|
||||
lun->blockSize = DEFAULT_LUN_BLOCK_SIZE / media->blockSize;
|
||||
else
|
||||
lun->blockSize = 1;
|
||||
}
|
||||
|
||||
if (size) {
|
||||
lun->size = size;
|
||||
}
|
||||
else {
|
||||
lun->size = media->size;
|
||||
/*if (blockSize) */
|
||||
|
||||
/* lun->size = media->size / blockSize; */
|
||||
|
||||
/*else { */
|
||||
|
||||
/* if (media->blockSize < DEFAULT_LUN_BLOCK_SIZE) */
|
||||
|
||||
/* lun->size = media->size / lun->blockSize; */
|
||||
|
||||
/* else */
|
||||
|
||||
/* lun->size = media->size; */
|
||||
|
||||
/*} */
|
||||
|
||||
}
|
||||
|
||||
TRACE_INFO("LUN: blkSize %d, size %d\n\r", (int)lun->blockSize, (int)lun->size);
|
||||
if (protected) lun->protected = 1;
|
||||
else lun->protected = media->protected;
|
||||
|
||||
lun->ioFifo.pBuffer = ioBuffer;
|
||||
lun->ioFifo.bufferSize = ioBufferSize;
|
||||
|
||||
lun->dataMonitor = dataMonitor;
|
||||
|
||||
/* Initialize read capacity data */
|
||||
|
||||
logicalBlockAddress = lun->size / lun->blockSize - 1;
|
||||
STORE_DWORDB(logicalBlockAddress,
|
||||
lun->readCapacityData.pLogicalBlockAddress);
|
||||
STORE_DWORDB(lun->blockSize * media->blockSize,
|
||||
lun->readCapacityData.pLogicalBlockLength);
|
||||
|
||||
/* Indicate media change */
|
||||
|
||||
lun->status = LUN_CHANGED;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Eject the media from a LUN
|
||||
* \param lun Pointer to the MSDLun instance to initialize
|
||||
* \return Operation result code
|
||||
*/
|
||||
uint32_t LUN_Eject(MSDLun *lun)
|
||||
{
|
||||
if (lun->media) {
|
||||
|
||||
/* Avoid any LUN R/W in progress */
|
||||
if (lun->media->state == MED_STATE_BUSY) {
|
||||
|
||||
return USBD_STATUS_LOCKED;
|
||||
}
|
||||
|
||||
/* Remove the link of the media */
|
||||
lun->media = 0;
|
||||
}
|
||||
/* LUN is removed */
|
||||
lun->status = LUN_NOT_PRESENT;
|
||||
|
||||
return USBD_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Writes data on the a LUN starting at the specified block address.
|
||||
* \param lun Pointer to a MSDLun instance
|
||||
* \param blockAddress First block address to write
|
||||
* \param data Pointer to the data to write
|
||||
* \param length Number of blocks to write
|
||||
* \param callback Optional callback to invoke when the write finishes
|
||||
* \param argument Optional callback argument.
|
||||
* \return Operation result code
|
||||
*/
|
||||
uint32_t LUN_Write(MSDLun *lun,
|
||||
uint32_t blockAddress,
|
||||
void *data,
|
||||
uint32_t length,
|
||||
TransferCallback callback,
|
||||
void *argument)
|
||||
{
|
||||
uint32_t medBlk, medLen;
|
||||
uint8_t status;
|
||||
|
||||
TRACE_INFO_WP("LUNWrite(%u) ", blockAddress);
|
||||
|
||||
/* Check that the data is not too big */
|
||||
if ((length + blockAddress) * lun->blockSize > lun->size) {
|
||||
|
||||
TRACE_WARNING("LUN_Write: Data too big\n\r");
|
||||
status = USBD_STATUS_ABORTED;
|
||||
}
|
||||
else if (lun->media == 0 || lun->status != LUN_READY) {
|
||||
|
||||
TRACE_WARNING("LUN_Write: Media not ready\n\r");
|
||||
status = USBD_STATUS_ABORTED;
|
||||
}
|
||||
else if (lun->protected) {
|
||||
TRACE_WARNING("LUN_Write: LUN is readonly\n\r");
|
||||
status = USBD_STATUS_ABORTED;
|
||||
}
|
||||
else {
|
||||
|
||||
/* Compute write start address */
|
||||
medBlk = lun->baseAddress + blockAddress * lun->blockSize;
|
||||
medLen = length * lun->blockSize;
|
||||
|
||||
/* Start write operation */
|
||||
status = MED_Write(lun->media,
|
||||
medBlk,
|
||||
data,
|
||||
medLen,
|
||||
(MediaCallback) callback,
|
||||
argument);
|
||||
|
||||
/* Check operation result code */
|
||||
if (status == MED_STATUS_SUCCESS) {
|
||||
|
||||
status = USBD_STATUS_SUCCESS;
|
||||
}
|
||||
else {
|
||||
|
||||
TRACE_WARNING("LUN_Write: Cannot write media\n\r");
|
||||
status = USBD_STATUS_ABORTED;
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Reads data from a LUN, starting at the specified block address.
|
||||
* \param lun Pointer to a MSDLun instance
|
||||
* \param blockAddress First block address to read
|
||||
* \param data Pointer to a data buffer in which to store the data
|
||||
* \param length Number of blocks to read
|
||||
* \param callback Optional callback to invoke when the read finishes
|
||||
* \param argument Optional callback argument.
|
||||
* \return Operation result code
|
||||
*/
|
||||
uint32_t LUN_Read(MSDLun *lun,
|
||||
uint32_t blockAddress,
|
||||
void *data,
|
||||
uint32_t length,
|
||||
TransferCallback callback,
|
||||
void *argument)
|
||||
{
|
||||
uint32_t medBlk, medLen;
|
||||
uint8_t status;
|
||||
|
||||
/* Check that the data is not too big */
|
||||
if ((length + blockAddress) * lun->blockSize > lun->size) {
|
||||
|
||||
TRACE_WARNING("LUN_Read: Area: (%d + %d)*%d > %d\n\r",
|
||||
(int)length, (int)blockAddress, (int)lun->blockSize, (int)lun->size);
|
||||
status = USBD_STATUS_ABORTED;
|
||||
}
|
||||
else if (lun->media == 0 || lun->status != LUN_READY) {
|
||||
|
||||
TRACE_WARNING("LUN_Read: Media not present\n\r");
|
||||
status = USBD_STATUS_ABORTED;
|
||||
}
|
||||
else {
|
||||
|
||||
TRACE_INFO_WP("LUNRead(%u) ", blockAddress);
|
||||
|
||||
/* Compute read start address */
|
||||
medBlk = lun->baseAddress + (blockAddress * lun->blockSize);
|
||||
medLen = length * lun->blockSize;
|
||||
|
||||
/* Start write operation */
|
||||
status = MED_Read(lun->media,
|
||||
medBlk,
|
||||
data,
|
||||
medLen,
|
||||
(MediaCallback) callback,
|
||||
argument);
|
||||
|
||||
/* Check result code */
|
||||
if (status == MED_STATUS_SUCCESS) {
|
||||
|
||||
status = USBD_STATUS_SUCCESS;
|
||||
}
|
||||
else {
|
||||
|
||||
TRACE_WARNING("LUN_Read: Cannot read media\n\r");
|
||||
status = USBD_STATUS_ABORTED;
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/**@}*/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,109 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
|
||||
@@ -1,256 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
|
||||
@@ -1,156 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
|
||||
@@ -1,311 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
@@ -1,149 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
|
||||
@@ -1,546 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
@@ -1,123 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
@@ -1,307 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
|
||||
@@ -1,106 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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*/
|
||||
|
||||
@@ -1,245 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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*/
|
||||
|
||||
@@ -1,167 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
@@ -1,275 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
|
||||
@@ -1,152 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
|
||||
@@ -1,155 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
@@ -1,111 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
|
||||
@@ -1,182 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
|
||||
@@ -1,157 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
@@ -1,191 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
|
||||
@@ -1,210 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
|
||||
@@ -1,216 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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*/
|
||||
|
||||
@@ -1,125 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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*/
|
||||
|
||||
@@ -1,151 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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*/
|
||||
|
||||
@@ -1,229 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
|
||||
@@ -1,140 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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
|
||||
|
||||
@@ -1,299 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
|
||||
@@ -1,154 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
@@ -1,393 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
|
||||
@@ -1,245 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
@@ -1,256 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
@@ -1,145 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
|
||||
@@ -1,176 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
@@ -1,109 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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_ */
|
||||
|
||||
@@ -1,678 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
@@ -1,118 +0,0 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user