Sky9x files removed for now
This commit is contained in:
@@ -125,6 +125,28 @@ const uint8_t chout_ar[] = { //First number is 0..23 -> template setup, Second
|
||||
#define BC_BIT_REA (0x80)
|
||||
#define BC_BIT_REB (0x100)
|
||||
|
||||
// TODO remove this enum!
|
||||
enum EnumKeys {
|
||||
KEY_MENU,
|
||||
KEY_EXIT,
|
||||
#if defined(PCBACT)
|
||||
KEY_CLR,
|
||||
KEY_PAGE,
|
||||
KEY_PLUS, /* Fake, used for rotary encoder */
|
||||
KEY_MINUS, /* Fake, used for rotary encoder */
|
||||
#elif defined(PCBX9D)
|
||||
KEY_ENTER,
|
||||
KEY_PAGE,
|
||||
KEY_PLUS,
|
||||
KEY_MINUS,
|
||||
#else
|
||||
KEY_DOWN,
|
||||
KEY_UP,
|
||||
KEY_RIGHT,
|
||||
KEY_LEFT,
|
||||
#endif
|
||||
};
|
||||
|
||||
#define CHAR_FOR_NAMES " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-."
|
||||
#define CHAR_FOR_NAMES_REGEX "[ A-Za-z0-9_.-,]*"
|
||||
|
||||
|
||||
@@ -1,162 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
Title: USBConfigurationDescriptor implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of the USBConfigurationDescriptor class.
|
||||
*/
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Headers
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "USBConfigurationDescriptor.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Returns the total length of a configuration, i.e. including the
|
||||
/// descriptors following it.
|
||||
/// \param configuration Pointer to a USBConfigurationDescriptor instance.
|
||||
/// \return Total length (in bytes) of the configuration.
|
||||
//-----------------------------------------------------------------------------
|
||||
unsigned int USBConfigurationDescriptor_GetTotalLength(
|
||||
const USBConfigurationDescriptor *configuration)
|
||||
{
|
||||
return configuration->wTotalLength;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Returns the number of interfaces in a configuration.
|
||||
/// \param configuration Pointer to a USBConfigurationDescriptor instance.
|
||||
/// \return Number of interfaces in configuration.
|
||||
//-----------------------------------------------------------------------------
|
||||
unsigned char USBConfigurationDescriptor_GetNumInterfaces(
|
||||
const USBConfigurationDescriptor *configuration)
|
||||
{
|
||||
return configuration->bNumInterfaces;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Indicates if the device is self-powered when in a given configuration.
|
||||
/// \param configuration Pointer to a USBConfigurationDescriptor instance.
|
||||
/// \return 1 if the device is self-powered when in the given configuration;
|
||||
/// otherwise 0.
|
||||
//-----------------------------------------------------------------------------
|
||||
unsigned char USBConfigurationDescriptor_IsSelfPowered(
|
||||
const USBConfigurationDescriptor *configuration)
|
||||
{
|
||||
if ((configuration->bmAttributes & (1 << 6)) != 0) {
|
||||
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Parses the given Configuration descriptor (followed by relevant
|
||||
/// interface, endpoint and class-specific descriptors) into three arrays.
|
||||
/// *Each array must have its size equal or greater to the number of
|
||||
/// descriptors it stores plus one*. A null-value is inserted after the last
|
||||
/// descriptor of each type to indicate the array end.
|
||||
///
|
||||
/// Note that if the pointer to an array is null (0), nothing is stored in
|
||||
/// it.
|
||||
/// \param configuration Pointer to the start of the whole Configuration
|
||||
/// descriptor.
|
||||
/// \param interfaces Pointer to the Interface descriptor array.
|
||||
/// \param endpoints Pointer to the Endpoint descriptor array.
|
||||
/// \param others Pointer to the class-specific descriptor array.
|
||||
//-----------------------------------------------------------------------------
|
||||
void USBConfigurationDescriptor_Parse(
|
||||
const USBConfigurationDescriptor *configuration,
|
||||
USBInterfaceDescriptor **interfaces,
|
||||
USBEndpointDescriptor **endpoints,
|
||||
USBGenericDescriptor **others)
|
||||
{
|
||||
// Get size of configuration to parse
|
||||
int size = USBConfigurationDescriptor_GetTotalLength(configuration);
|
||||
size -= sizeof(USBConfigurationDescriptor);
|
||||
|
||||
// Start parsing descriptors
|
||||
USBGenericDescriptor *descriptor = (USBGenericDescriptor *) configuration;
|
||||
while (size > 0) {
|
||||
|
||||
// Get next descriptor
|
||||
descriptor = USBGenericDescriptor_GetNextDescriptor(descriptor);
|
||||
size -= USBGenericDescriptor_GetLength(descriptor);
|
||||
|
||||
// Store descriptor in correponding array
|
||||
if (USBGenericDescriptor_GetType(descriptor)
|
||||
== USBGenericDescriptor_INTERFACE) {
|
||||
|
||||
if (interfaces) {
|
||||
|
||||
*interfaces = (USBInterfaceDescriptor *) descriptor;
|
||||
interfaces++;
|
||||
}
|
||||
}
|
||||
else if (USBGenericDescriptor_GetType(descriptor)
|
||||
== USBGenericDescriptor_ENDPOINT) {
|
||||
|
||||
if (endpoints) {
|
||||
|
||||
*endpoints = (USBEndpointDescriptor *) descriptor;
|
||||
endpoints++;
|
||||
}
|
||||
}
|
||||
else if (others) {
|
||||
|
||||
*others = descriptor;
|
||||
others++;
|
||||
}
|
||||
}
|
||||
|
||||
// Null-terminate arrays
|
||||
if (interfaces) {
|
||||
|
||||
*interfaces = 0;
|
||||
}
|
||||
if (endpoints) {
|
||||
|
||||
*endpoints = 0;
|
||||
}
|
||||
if (others) {
|
||||
|
||||
*others = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,150 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
!!!Purpose
|
||||
|
||||
Definitions and methods for USB configuration descriptor structures
|
||||
described by the USB specification.
|
||||
|
||||
!!!Usage
|
||||
|
||||
-# Declare USBConfigurationDescriptor instance as a part
|
||||
of the configuration descriptors of a USB device.
|
||||
-# To get useful information (field values) from the defined USB device
|
||||
configuration descriptor, use
|
||||
- USBConfigurationDescriptor_GetTotalLength
|
||||
- USBConfigurationDescriptor_GetNumInterfaces
|
||||
- USBConfigurationDescriptor_IsSelfPowered
|
||||
-# To pase the defined USB device configuration descriptor, use
|
||||
- USBConfigurationDescriptor_Parse
|
||||
*/
|
||||
|
||||
#ifndef USBCONFIGURATIONDESCRIPTOR_H
|
||||
#define USBCONFIGURATIONDESCRIPTOR_H
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Headers
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "USBGenericDescriptor.h"
|
||||
#include "USBInterfaceDescriptor.h"
|
||||
#include "USBEndpointDescriptor.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// \page "USB device Attributes"
|
||||
///
|
||||
/// This page lists the codes of the usb attributes.
|
||||
///
|
||||
/// !Attributes
|
||||
/// - USBConfigurationDescriptor_BUSPOWERED_NORWAKEUP
|
||||
/// - USBConfigurationDescriptor_SELFPOWERED_NORWAKEUP
|
||||
/// - USBConfigurationDescriptor_BUSPOWERED_RWAKEUP
|
||||
/// - USBConfigurationDescriptor_SELFPOWERED_RWAKEUP
|
||||
/// - USBConfigurationDescriptor_POWER
|
||||
|
||||
/// Device is bus-powered and not support remote wake-up.
|
||||
#define USBConfigurationDescriptor_BUSPOWERED_NORWAKEUP 0x80
|
||||
/// Device is self-powered and not support remote wake-up.
|
||||
#define USBConfigurationDescriptor_SELFPOWERED_NORWAKEUP 0xC0
|
||||
/// Device is bus-powered and supports remote wake-up.
|
||||
#define USBConfigurationDescriptor_BUSPOWERED_RWAKEUP 0xA0
|
||||
/// Device is self-powered and supports remote wake-up.
|
||||
#define USBConfigurationDescriptor_SELFPOWERED_RWAKEUP 0xE0
|
||||
|
||||
/// Calculates the value of the power consumption field given the value in mA.
|
||||
/// \param power The power consumption value in mA
|
||||
/// \return The value that should be set to the field in descriptor
|
||||
#define USBConfigurationDescriptor_POWER(power) (power / 2)
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Types
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack(1) // IAR
|
||||
#define __attribute__(...) // IAR
|
||||
#endif // IAR
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// USB standard configuration descriptor structure.
|
||||
//-----------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
/// Size of the descriptor in bytes.
|
||||
unsigned char bLength;
|
||||
/// Descriptor type (USBDESC_CONFIGURATION of "USB Descriptor types").
|
||||
unsigned char bDescriptorType;
|
||||
/// Length of all descriptors returned along with this configuration
|
||||
/// descriptor.
|
||||
unsigned short wTotalLength;
|
||||
/// Number of interfaces in this configuration.
|
||||
unsigned char bNumInterfaces;
|
||||
/// Value for selecting this configuration.
|
||||
unsigned char bConfigurationValue;
|
||||
/// Index of the configuration string descriptor.
|
||||
unsigned char iConfiguration;
|
||||
/// Configuration characteristics.
|
||||
unsigned char bmAttributes;
|
||||
/// Maximum power consumption of the device when in this configuration.
|
||||
unsigned char bMaxPower;
|
||||
|
||||
} __attribute__ ((packed)) USBConfigurationDescriptor; // GCC
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack() // IAR
|
||||
#endif // IAR
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
extern unsigned int USBConfigurationDescriptor_GetTotalLength(
|
||||
const USBConfigurationDescriptor *configuration);
|
||||
|
||||
extern unsigned char USBConfigurationDescriptor_GetNumInterfaces(
|
||||
const USBConfigurationDescriptor *configuration);
|
||||
|
||||
extern unsigned char USBConfigurationDescriptor_IsSelfPowered(
|
||||
const USBConfigurationDescriptor *configuration);
|
||||
|
||||
extern void USBConfigurationDescriptor_Parse(
|
||||
const USBConfigurationDescriptor *configuration,
|
||||
USBInterfaceDescriptor **interfaces,
|
||||
USBEndpointDescriptor **endpoints,
|
||||
USBGenericDescriptor **others);
|
||||
|
||||
#endif //#ifndef USBCONFIGURATIONDESCRIPTOR_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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
!!!Purpose
|
||||
|
||||
Class for manipulating USB device descriptors.
|
||||
|
||||
!!!Usage
|
||||
|
||||
- Declare a USBDeviceDescriptor instance as the device descriptor of a
|
||||
USB device.
|
||||
*/
|
||||
|
||||
#ifndef USBDEVICEDESCRIPTOR_H
|
||||
#define USBDEVICEDESCRIPTOR_H
|
||||
|
||||
#include <board.h>
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB release numbers"
|
||||
///
|
||||
/// This page lists the codes of USB release numbers.
|
||||
///
|
||||
/// !Code
|
||||
/// - USBDeviceDescriptor_USB2_00
|
||||
|
||||
/// The device supports USB 2.00.
|
||||
#define USBDeviceDescriptor_USB2_00 0x0200
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack(1) // IAR
|
||||
#define __attribute__(...) // IAR
|
||||
#endif // IAR
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// USB standard device descriptor structure.
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
/// Size of this descriptor in bytes.
|
||||
unsigned char bLength;
|
||||
/// Descriptor type (USBGenericDescriptor_DEVICE).
|
||||
unsigned char bDescriptorType;
|
||||
/// USB specification release number in BCD format.
|
||||
unsigned short bcdUSB;
|
||||
/// Device class code.
|
||||
unsigned char bDeviceClass;
|
||||
/// Device subclass code.
|
||||
unsigned char bDeviceSubClass;
|
||||
/// Device protocol code.
|
||||
unsigned char bDeviceProtocol;
|
||||
/// Maximum packet size of endpoint 0 (in bytes).
|
||||
unsigned char bMaxPacketSize0;
|
||||
/// Vendor ID.
|
||||
unsigned short idVendor;
|
||||
/// Product ID.
|
||||
unsigned short idProduct;
|
||||
/// Device release number in BCD format.
|
||||
unsigned short bcdDevice;
|
||||
/// Index of the manufacturer string descriptor.
|
||||
unsigned char iManufacturer;
|
||||
/// Index of the product string descriptor.
|
||||
unsigned char iProduct;
|
||||
/// Index of the serial number string descriptor.
|
||||
unsigned char iSerialNumber;
|
||||
/// Number of possible configurations for the device.
|
||||
unsigned char bNumConfigurations;
|
||||
|
||||
} __attribute__ ((packed)) USBDeviceDescriptor; // GCC
|
||||
|
||||
#if defined(CHIP_USB_OTGHS)
|
||||
typedef struct {
|
||||
|
||||
/// Size of this descriptor in bytes.
|
||||
unsigned char bLength;
|
||||
/// Descriptor type (USBGenericDescriptor_OTG).
|
||||
unsigned char bDescriptorType;
|
||||
/// Attribute Fields D7…2: Reserved D1: HNP support D0: SRP support
|
||||
unsigned char bmAttributes;
|
||||
|
||||
} __attribute__ ((packed)) USBOtgDescriptor; // GCC
|
||||
#endif
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack() // IAR
|
||||
#endif // IAR
|
||||
|
||||
#endif //#ifndef USBDEVICEDESCRIPTOR_H
|
||||
|
||||
@@ -1,89 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Class for manipulating USB device qualifier descriptors.
|
||||
|
||||
!!!Usage
|
||||
|
||||
- Declare a USBDeviceQualifierDescriptor instance as the device qualifier
|
||||
descriptor of a USB device.
|
||||
*/
|
||||
|
||||
#ifndef USBDEVICEQUALIFIERDESCRIPTOR_H
|
||||
#define USBDEVICEQUALIFIERDESCRIPTOR_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack(1) // IAR
|
||||
#define __attribute__(...) // IAR
|
||||
#endif // IAR
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Alternate device descriptor indicating the capabilities of the device
|
||||
/// in full-speed, if currently in high-speed; or in high-speed, if it is
|
||||
/// currently in full-speed. Only relevant for devices supporting the
|
||||
/// high-speed mode.
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
/// Size of the descriptor in bytes.
|
||||
unsigned char bLength;
|
||||
/// Descriptor type (USBDESC_DEVICE_QUALIFIER or "USB device types").
|
||||
unsigned char bDescriptorType;
|
||||
/// USB specification release number (in BCD format).
|
||||
unsigned short bcdUSB;
|
||||
/// Device class code.
|
||||
unsigned char bDeviceClass;
|
||||
/// Device subclass code.
|
||||
unsigned char bDeviceSubClass;
|
||||
/// Device protocol code.
|
||||
unsigned char bDeviceProtocol;
|
||||
/// Maximum packet size of endpoint 0.
|
||||
unsigned char bMaxPacketSize0;
|
||||
/// Number of possible configurations for the device.
|
||||
unsigned char bNumConfigurations;
|
||||
/// Reserved.
|
||||
unsigned char bReserved;
|
||||
|
||||
} __attribute__ ((packed)) USBDeviceQualifierDescriptor; // GCC
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack() // IAR
|
||||
#endif // IAR
|
||||
|
||||
#endif //#ifndef USBDEVICEQUALIFIERDESCRIPTOR_H
|
||||
|
||||
@@ -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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
Title: USBEndpointDescriptor implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of the USBEndpointDescriptor class.
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBEndpointDescriptor.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the number of an endpoint given its descriptor.
|
||||
/// \param endpoint Pointer to a USBEndpointDescriptor instance.
|
||||
/// \return Endpoint number.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBEndpointDescriptor_GetNumber(
|
||||
const USBEndpointDescriptor *endpoint)
|
||||
{
|
||||
return endpoint->bEndpointAddress & 0xF;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the direction of an endpoint given its descriptor.
|
||||
/// \param endpoint Pointer to a USBEndpointDescriptor instance.
|
||||
/// \return Endpoint direction (see <Endpoint directions>).
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBEndpointDescriptor_GetDirection(
|
||||
const USBEndpointDescriptor *endpoint)
|
||||
{
|
||||
if ((endpoint->bEndpointAddress & 0x80) != 0) {
|
||||
|
||||
return USBEndpointDescriptor_IN;
|
||||
}
|
||||
else {
|
||||
|
||||
return USBEndpointDescriptor_OUT;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the type of an endpoint given its descriptor.
|
||||
/// \param endpoint Pointer to a USBEndpointDescriptor instance.
|
||||
/// \return Endpoint type (see <Endpoint types>).
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBEndpointDescriptor_GetType(
|
||||
const USBEndpointDescriptor *endpoint)
|
||||
{
|
||||
return endpoint->bmAttributes & 0x3;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the maximum size of a packet (in bytes) on an endpoint given
|
||||
/// its descriptor.
|
||||
/// \param endpoint - Pointer to a USBEndpointDescriptor instance.
|
||||
/// \return Maximum packet size of endpoint.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned short USBEndpointDescriptor_GetMaxPacketSize(
|
||||
const USBEndpointDescriptor *endpoint)
|
||||
{
|
||||
return endpoint->wMaxPacketSize;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the polling interval on an endpoint given its descriptor.
|
||||
/// \param endpoint - Pointer to a USBEndpointDescriptor instance.
|
||||
/// \return Polling interval of endpoint.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBEndpointDescriptor_GetInterval(
|
||||
const USBEndpointDescriptor *endpoint)
|
||||
{
|
||||
return endpoint->bInterval;
|
||||
}
|
||||
|
||||
@@ -1,224 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Definition of a class for handling USB endpoint descriptors.
|
||||
|
||||
!!!Usage
|
||||
|
||||
-# Declare USBEndpointDescriptor instance as a part of the
|
||||
configuration descriptors of a USB device.
|
||||
-# To get useful information (field values) from the defined USB device
|
||||
endpoint descriptor (to configure hardware for endpoints, etc), use
|
||||
- USBEndpointDescriptor_GetNumber
|
||||
- USBEndpointDescriptor_GetDirection
|
||||
- USBEndpointDescriptor_GetType
|
||||
- USBEndpointDescriptor_GetMaxPacketSize
|
||||
*/
|
||||
|
||||
#ifndef USBENDPOINTDESCRIPTOR_H
|
||||
#define USBENDPOINTDESCRIPTOR_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Endpoint definitions"
|
||||
///
|
||||
/// This page lists definitions and macro for endpoint descriptors.
|
||||
///
|
||||
/// - USB Endpoint directions
|
||||
/// - USBEndpointDescriptor_OUT
|
||||
/// - USBEndpointDescriptor_IN
|
||||
///
|
||||
/// - USB Endpoint types
|
||||
/// - USBEndpointDescriptor_CONTROL
|
||||
/// - USBEndpointDescriptor_ISOCHRONOUS
|
||||
/// - USBEndpointDescriptor_BULK
|
||||
/// - USBEndpointDescriptor_INTERRUPT
|
||||
///
|
||||
/// - USB Endpoint maximun sizes
|
||||
/// - USBEndpointDescriptor_MAXCTRLSIZE_FS
|
||||
/// - USBEndpointDescriptor_MAXCTRLSIZE_HS
|
||||
/// - USBEndpointDescriptor_MAXBULKSIZE_FS
|
||||
/// - USBEndpointDescriptor_MAXBULKSIZE_HS
|
||||
/// - USBEndpointDescriptor_MAXINTERRUPTSIZE_FS
|
||||
/// - USBEndpointDescriptor_MAXINTERRUPTSIZE_HS
|
||||
/// - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS
|
||||
/// - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS
|
||||
///
|
||||
/// - USB Endpoint address define
|
||||
/// - USBEndpointDescriptor_ADDRESS
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Endpoint directions"
|
||||
///
|
||||
/// This page lists definitions of USB endpoint directions.
|
||||
///
|
||||
/// !Directions
|
||||
/// - USBEndpointDescriptor_OUT
|
||||
/// - USBEndpointDescriptor_IN
|
||||
|
||||
/// Endpoint receives data from the host.
|
||||
#define USBEndpointDescriptor_OUT 0
|
||||
/// Endpoint sends data to the host.
|
||||
#define USBEndpointDescriptor_IN 1
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Endpoint types"
|
||||
///
|
||||
/// This page lists definitions of USB endpoint types.
|
||||
///
|
||||
/// !Types
|
||||
/// - USBEndpointDescriptor_CONTROL
|
||||
/// - USBEndpointDescriptor_ISOCHRONOUS
|
||||
/// - USBEndpointDescriptor_BULK
|
||||
/// - USBEndpointDescriptor_INTERRUPT
|
||||
|
||||
/// Control endpoint type.
|
||||
#define USBEndpointDescriptor_CONTROL 0
|
||||
/// Isochronous endpoint type.
|
||||
#define USBEndpointDescriptor_ISOCHRONOUS 1
|
||||
/// Bulk endpoint type.
|
||||
#define USBEndpointDescriptor_BULK 2
|
||||
/// Interrupt endpoint type.
|
||||
#define USBEndpointDescriptor_INTERRUPT 3
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Endpoint maximun sizes"
|
||||
///
|
||||
/// This page lists definitions of USB endpoint maximun sizes.
|
||||
///
|
||||
/// !Sizes
|
||||
/// - USBEndpointDescriptor_MAXCTRLSIZE_FS
|
||||
/// - USBEndpointDescriptor_MAXCTRLSIZE_HS
|
||||
/// - USBEndpointDescriptor_MAXBULKSIZE_FS
|
||||
/// - USBEndpointDescriptor_MAXBULKSIZE_HS
|
||||
/// - USBEndpointDescriptor_MAXINTERRUPTSIZE_FS
|
||||
/// - USBEndpointDescriptor_MAXINTERRUPTSIZE_HS
|
||||
/// - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS
|
||||
/// - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS
|
||||
|
||||
/// Maximum size for a full-speed control endpoint.
|
||||
#define USBEndpointDescriptor_MAXCTRLSIZE_FS 64
|
||||
/// Maximum size for a high-speed control endpoint.
|
||||
#define USBEndpointDescriptor_MAXCTRLSIZE_HS 64
|
||||
/// Maximum size for a full-speed bulk endpoint.
|
||||
#define USBEndpointDescriptor_MAXBULKSIZE_FS 64
|
||||
/// Maximum size for a high-speed bulk endpoint.
|
||||
#define USBEndpointDescriptor_MAXBULKSIZE_HS 512
|
||||
/// Maximum size for a full-speed interrupt endpoint.
|
||||
#define USBEndpointDescriptor_MAXINTERRUPTSIZE_FS 64
|
||||
/// Maximum size for a high-speed interrupt endpoint.
|
||||
#define USBEndpointDescriptor_MAXINTERRUPTSIZE_HS 1024
|
||||
/// Maximum size for a full-speed isochronous endpoint.
|
||||
#define USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS 1023
|
||||
/// Maximum size for a high-speed isochronous endpoint.
|
||||
#define USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS 1024
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Endpoint address define"
|
||||
///
|
||||
/// This page lists macro for USB endpoint address definition.
|
||||
///
|
||||
/// !Macro
|
||||
/// - USBEndpointDescriptor_ADDRESS
|
||||
|
||||
/// Calculates the address of an endpoint given its number and direction
|
||||
/// \param direction USB endpoint direction definition
|
||||
/// \param number USB endpoint number
|
||||
/// \return The value used to set the endpoint descriptor based on input number
|
||||
/// and direction
|
||||
#define USBEndpointDescriptor_ADDRESS(direction, number) \
|
||||
(((direction & 0x01) << 7) | (number & 0xF))
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack(1) // IAR
|
||||
#define __attribute__(...) // IAR
|
||||
#endif // IAR
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// USB standard endpoint descriptor structure.
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
/// Size of the descriptor in bytes.
|
||||
unsigned char bLength;
|
||||
/// Descriptor type (<USBGenericDescriptor_ENDPOINT>).
|
||||
unsigned char bDescriptorType;
|
||||
/// Address and direction of the endpoint.
|
||||
unsigned char bEndpointAddress;
|
||||
/// Endpoint type and additional characteristics (for isochronous endpoints).
|
||||
unsigned char bmAttributes;
|
||||
/// Maximum packet size (in bytes) of the endpoint.
|
||||
unsigned short wMaxPacketSize;
|
||||
/// Polling rate of the endpoint.
|
||||
unsigned char bInterval;
|
||||
|
||||
} __attribute__ ((packed)) USBEndpointDescriptor; // GCC
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack() // IAR
|
||||
#endif // IAR
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern unsigned char USBEndpointDescriptor_GetNumber(
|
||||
const USBEndpointDescriptor *endpoint);
|
||||
|
||||
extern unsigned char USBEndpointDescriptor_GetDirection(
|
||||
const USBEndpointDescriptor *endpoint);
|
||||
|
||||
extern unsigned char USBEndpointDescriptor_GetType(
|
||||
const USBEndpointDescriptor *endpoint);
|
||||
|
||||
extern unsigned short USBEndpointDescriptor_GetMaxPacketSize(
|
||||
const USBEndpointDescriptor *endpoint);
|
||||
|
||||
extern unsigned char USBEndpointDescriptor_GetInterval(
|
||||
const USBEndpointDescriptor *endpoint);
|
||||
|
||||
#endif //#ifndef USBENDPOINTDESCRIPTOR_H
|
||||
|
||||
@@ -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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
Title: USBFeatureRequest implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of the USBFeatureRequest class.
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBFeatureRequest.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the feature selector of a given CLEAR_FEATURE or SET_FEATURE
|
||||
/// request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return Feature selector.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBFeatureRequest_GetFeatureSelector(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
return USBGenericRequest_GetValue(request);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Indicates the test that the device must undertake following a
|
||||
/// SET_FEATURE request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return Test selector.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBFeatureRequest_GetTestSelector(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
return (USBGenericRequest_GetIndex(request) >> 8) & 0xFF;
|
||||
}
|
||||
|
||||
@@ -1,146 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Definition of a class for manipulating CLEAR_FEATURE and SET_FEATURE
|
||||
requests.
|
||||
|
||||
!!!Usage
|
||||
|
||||
- To get USB feature request information (field values) from the
|
||||
USBGenericRequest instance, use
|
||||
- USBFeatureRequest_GetFeatureSelector
|
||||
- USBFeatureRequest_GetTestSelector
|
||||
*/
|
||||
|
||||
#ifndef USBFEATUREREQUEST_H
|
||||
#define USBFEATUREREQUEST_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBGenericRequest.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Feature Request definitions"
|
||||
///
|
||||
/// This page lists codes of USB Feature Request
|
||||
///
|
||||
/// - USB Feature selectors
|
||||
/// - USBFeatureRequest_ENDPOINTHALT
|
||||
/// - USBFeatureRequest_DEVICEREMOTEWAKEUP
|
||||
/// - USBFeatureRequest_TESTMODE
|
||||
///
|
||||
/// - USB Test mode selectors
|
||||
/// - USBFeatureRequest_TESTJ
|
||||
/// - USBFeatureRequest_TESTK
|
||||
/// - USBFeatureRequest_TESTSE0NAK
|
||||
/// - USBFeatureRequest_TESTPACKET
|
||||
/// - USBFeatureRequest_TESTFORCEENABLE
|
||||
/// - USBFeatureRequest_TESTSENDZLP
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Feature selectors"
|
||||
///
|
||||
/// This page lists codes of USB feature selectors.
|
||||
///
|
||||
/// !Selectors
|
||||
/// - USBFeatureRequest_ENDPOINTHALT
|
||||
/// - USBFeatureRequest_DEVICEREMOTEWAKEUP
|
||||
/// - USBFeatureRequest_TESTMODE
|
||||
|
||||
/// Halt feature of an endpoint.
|
||||
#define USBFeatureRequest_ENDPOINTHALT 0
|
||||
/// Remote wake-up feature of the device.
|
||||
#define USBFeatureRequest_DEVICEREMOTEWAKEUP 1
|
||||
/// Test mode of the device.
|
||||
#define USBFeatureRequest_TESTMODE 2
|
||||
/// OTG set feature
|
||||
#define USBFeatureRequest_OTG 0x0B
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/// On The Go Feature Selectors
|
||||
/// b_hnp_enable 3
|
||||
/// a_hnp_support 4
|
||||
/// a_alt_hnp_support 5
|
||||
#define USBFeatureRequest_OTG_B_HNP_ENABLE 3
|
||||
#define USBFeatureRequest_OTG_A_HNP_SUPPORT 4
|
||||
#define USBFeatureRequest_OTG_A_ALT_HNP_SUPPORT 5
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Test mode selectors"
|
||||
///
|
||||
/// This page lists codes of USB high speed test mode selectors.
|
||||
///
|
||||
/// !Selectors
|
||||
/// - USBFeatureRequest_TESTJ
|
||||
/// - USBFeatureRequest_TESTK
|
||||
/// - USBFeatureRequest_TESTSE0NAK
|
||||
/// - USBFeatureRequest_TESTPACKET
|
||||
/// - USBFeatureRequest_TESTFORCEENABLE
|
||||
/// - USBFeatureRequest_TESTSENDZLP
|
||||
|
||||
/// Tests the high-output drive level on the D+ line.
|
||||
#define USBFeatureRequest_TESTJ 1
|
||||
/// Tests the high-output drive level on the D- line.
|
||||
#define USBFeatureRequest_TESTK 2
|
||||
/// Tests the output impedance, low-level output voltage and loading
|
||||
/// characteristics.
|
||||
#define USBFeatureRequest_TESTSE0NAK 3
|
||||
/// Tests rise and fall times, eye patterns and jitter.
|
||||
#define USBFeatureRequest_TESTPACKET 4
|
||||
/// Tests the hub disconnect detection.
|
||||
#define USBFeatureRequest_TESTFORCEENABLE 5
|
||||
/// Send a ZLP in Test Mode.
|
||||
#define USBFeatureRequest_TESTSENDZLP 6
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern unsigned char USBFeatureRequest_GetFeatureSelector(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
|
||||
extern unsigned char USBFeatureRequest_GetTestSelector(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
#endif //#ifndef USBFEATUREREQUEST_H
|
||||
|
||||
@@ -1,80 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
Title: USBGenericDescriptor implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of the USBGenericDescriptor class.
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBGenericDescriptor.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the length of a descriptor.
|
||||
/// \param descriptor Pointer to a USBGenericDescriptor instance.
|
||||
/// \return Length of descriptor in bytes.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned int USBGenericDescriptor_GetLength(
|
||||
const USBGenericDescriptor *descriptor)
|
||||
{
|
||||
return descriptor->bLength;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the type of a descriptor.
|
||||
/// \param descriptor Pointer to a USBGenericDescriptor instance.
|
||||
/// \return Type of descriptor.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBGenericDescriptor_GetType(
|
||||
const USBGenericDescriptor *descriptor)
|
||||
{
|
||||
return descriptor->bDescriptorType;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns a pointer to the descriptor right after the given one, when
|
||||
/// parsing a Configuration descriptor.
|
||||
/// \param descriptor - Pointer to a USBGenericDescriptor instance.
|
||||
/// \return Pointer to the next descriptor.
|
||||
//------------------------------------------------------------------------------
|
||||
USBGenericDescriptor *USBGenericDescriptor_GetNextDescriptor(
|
||||
const USBGenericDescriptor *descriptor)
|
||||
{
|
||||
return (USBGenericDescriptor *)
|
||||
(((char *) descriptor) + USBGenericDescriptor_GetLength(descriptor));
|
||||
}
|
||||
@@ -1,133 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
///
|
||||
/// !!!Purpose
|
||||
///
|
||||
/// Definition of a generic USB descriptor class.
|
||||
///
|
||||
/// !!!Usage
|
||||
///
|
||||
/// -# Declare or access USB descriptors by USBGenericDescriptor instance.
|
||||
/// -# To get usful information (field values) from the USB descriptors, use
|
||||
/// - USBGenericDescriptor_GetLength
|
||||
/// - USBGenericDescriptor_GetType
|
||||
/// -# To scan the descriptors, use
|
||||
/// - USBGenericDescriptor_GetNextDescriptor
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifndef USBGENERICDESCRIPTOR_H
|
||||
#define USBGENERICDESCRIPTOR_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Descriptor types"
|
||||
///
|
||||
/// This page lists the codes of the usb descriptor types
|
||||
///
|
||||
/// !Types
|
||||
/// - USBGenericDescriptor_DEVICE
|
||||
/// - USBGenericDescriptor_CONFIGURATION
|
||||
/// - USBGenericDescriptor_STRING
|
||||
/// - USBGenericDescriptor_INTERFACE
|
||||
/// - USBGenericDescriptor_ENDPOINT
|
||||
/// - USBGenericDescriptor_DEVICEQUALIFIER
|
||||
/// - USBGenericDescriptor_OTHERSPEEDCONFIGURATION
|
||||
/// - USBGenericDescriptor_INTERFACEPOWER
|
||||
/// - USBGenericDescriptor_OTG
|
||||
/// - USBGenericDescriptor_DEBUG
|
||||
/// - USBGenericDescriptor_INTERFACEASSOCIATION
|
||||
|
||||
/// Device descriptor type.
|
||||
#define USBGenericDescriptor_DEVICE 1
|
||||
/// Configuration descriptor type.
|
||||
#define USBGenericDescriptor_CONFIGURATION 2
|
||||
/// String descriptor type.
|
||||
#define USBGenericDescriptor_STRING 3
|
||||
/// Interface descriptor type.
|
||||
#define USBGenericDescriptor_INTERFACE 4
|
||||
/// Endpoint descriptor type.
|
||||
#define USBGenericDescriptor_ENDPOINT 5
|
||||
/// Device qualifier descriptor type.
|
||||
#define USBGenericDescriptor_DEVICEQUALIFIER 6
|
||||
/// Other speed configuration descriptor type.
|
||||
#define USBGenericDescriptor_OTHERSPEEDCONFIGURATION 7
|
||||
/// Interface power descriptor type.
|
||||
#define USBGenericDescriptor_INTERFACEPOWER 8
|
||||
/// On-The-Go descriptor type.
|
||||
#define USBGenericDescriptor_OTG 9
|
||||
/// Debug descriptor type.
|
||||
#define USBGenericDescriptor_DEBUG 10
|
||||
/// Interface association descriptor type.
|
||||
#define USBGenericDescriptor_INTERFACEASSOCIATION 11
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack(1) // IAR
|
||||
#define __attribute__(...) // IAR
|
||||
#endif // IAR
|
||||
|
||||
/// Holds the few fields shared by all USB descriptors.
|
||||
typedef struct {
|
||||
|
||||
/// Length of the descriptor in bytes.
|
||||
unsigned char bLength;
|
||||
/// Descriptor type.
|
||||
unsigned char bDescriptorType;
|
||||
|
||||
} __attribute__ ((packed)) USBGenericDescriptor; // GCC
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack() // IAR
|
||||
#endif // IAR
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern unsigned int USBGenericDescriptor_GetLength(
|
||||
const USBGenericDescriptor *descriptor);
|
||||
|
||||
extern unsigned char USBGenericDescriptor_GetType(
|
||||
const USBGenericDescriptor *descriptor);
|
||||
|
||||
extern USBGenericDescriptor *USBGenericDescriptor_GetNextDescriptor(
|
||||
const USBGenericDescriptor *descriptor);
|
||||
|
||||
#endif //#ifndef USBGENERICDESCRIPTOR_H
|
||||
|
||||
@@ -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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
Title: USBGenericRequest implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of the USBGenericRequest class.
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBGenericRequest.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the type of the given request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return "USB Request Types"
|
||||
//------------------------------------------------------------------------------
|
||||
extern unsigned char USBGenericRequest_GetType(const USBGenericRequest *request)
|
||||
{
|
||||
return ((request->bmRequestType >> 5) & 0x3);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the request code of the given request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return Request code.
|
||||
/// \sa "USB Request Codes"
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBGenericRequest_GetRequest(const USBGenericRequest *request)
|
||||
{
|
||||
return request->bRequest;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the wValue field of the given request.
|
||||
/// \param request - Pointer to a USBGenericRequest instance.
|
||||
/// \return Request value.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned short USBGenericRequest_GetValue(const USBGenericRequest *request)
|
||||
{
|
||||
return request->wValue;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the wIndex field of the given request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return Request index;
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned short USBGenericRequest_GetIndex(const USBGenericRequest *request)
|
||||
{
|
||||
return request->wIndex;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the expected length of the data phase following a request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return Length of data phase.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned short USBGenericRequest_GetLength(const USBGenericRequest *request)
|
||||
{
|
||||
return request->wLength;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the endpoint number targetted by a given request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return Endpoint number.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBGenericRequest_GetEndpointNumber(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
return USBGenericRequest_GetIndex(request) & 0xF;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the intended recipient of a given request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return Request recipient.
|
||||
/// \sa "USB Request Recipients"
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBGenericRequest_GetRecipient(const USBGenericRequest *request)
|
||||
{
|
||||
// Recipient is in bits [0..4] of the bmRequestType field
|
||||
return request->bmRequestType & 0xF;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the direction of the data transfer following the given request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return Transfer direction.
|
||||
/// \sa "USB Request Directions"
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBGenericRequest_GetDirection(const USBGenericRequest *request)
|
||||
{
|
||||
// Transfer direction is located in bit D7 of the bmRequestType field
|
||||
if ((request->bmRequestType & 0x80) != 0) {
|
||||
|
||||
return USBGenericRequest_IN;
|
||||
}
|
||||
else {
|
||||
|
||||
return USBGenericRequest_OUT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,244 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Definition of the USBGenericRequest class and its methods.
|
||||
|
||||
!!!Usage
|
||||
|
||||
-# Declare or access USB requests by USBGenericRequest instance.
|
||||
-# To get usful information (field values) from the USB requests, use
|
||||
- USBGenericRequest_GetType
|
||||
- USBGenericRequest_GetRequest
|
||||
- USBGenericRequest_GetValue
|
||||
- USBGenericRequest_GetIndex
|
||||
- USBGenericRequest_GetLength
|
||||
- USBGenericRequest_GetEndpointNumber
|
||||
- USBGenericRequest_GetRecipient
|
||||
- USBGenericRequest_GetDirection
|
||||
*/
|
||||
|
||||
#ifndef USBGENERICREQUEST_H
|
||||
#define USBGENERICREQUEST_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Generic Request definitions"
|
||||
///
|
||||
/// This page lists the codes of USB generic request.
|
||||
///
|
||||
/// - USB Request codes
|
||||
/// - USBGenericRequest_GETSTATUS
|
||||
/// - USBGenericRequest_CLEARFEATURE
|
||||
/// - USBGenericRequest_SETFEATURE
|
||||
/// - USBGenericRequest_SETADDRESS
|
||||
/// - USBGenericRequest_GETDESCRIPTOR
|
||||
/// - USBGenericRequest_SETDESCRIPTOR
|
||||
/// - USBGenericRequest_GETCONFIGURATION
|
||||
/// - USBGenericRequest_SETCONFIGURATION
|
||||
/// - USBGenericRequest_GETINTERFACE
|
||||
/// - USBGenericRequest_SETINTERFACE
|
||||
/// - USBGenericRequest_SYNCHFRAME
|
||||
///
|
||||
/// - USB Request Recipients
|
||||
/// - USBGenericRequest_DEVICE
|
||||
/// - USBGenericRequest_INTERFACE
|
||||
/// - USBGenericRequest_ENDPOINT
|
||||
/// - USBGenericRequest_OTHER
|
||||
///
|
||||
/// - USB Request Types
|
||||
/// - USBGenericRequest_STANDARD
|
||||
/// - USBGenericRequest_CLASS
|
||||
/// - USBGenericRequest_VENDOR
|
||||
///
|
||||
/// - USB Request Directions
|
||||
/// - USBGenericRequest_IN
|
||||
/// - USBGenericRequest_OUT
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Request codes"
|
||||
///
|
||||
/// This page lists the USB generic request codes.
|
||||
///
|
||||
/// !Codes
|
||||
/// - USBGenericRequest_GETSTATUS
|
||||
/// - USBGenericRequest_CLEARFEATURE
|
||||
/// - USBGenericRequest_SETFEATURE
|
||||
/// - USBGenericRequest_SETADDRESS
|
||||
/// - USBGenericRequest_GETDESCRIPTOR
|
||||
/// - USBGenericRequest_SETDESCRIPTOR
|
||||
/// - USBGenericRequest_GETCONFIGURATION
|
||||
/// - USBGenericRequest_SETCONFIGURATION
|
||||
/// - USBGenericRequest_GETINTERFACE
|
||||
/// - USBGenericRequest_SETINTERFACE
|
||||
/// - USBGenericRequest_SYNCHFRAME
|
||||
|
||||
/// GET_STATUS request code.
|
||||
#define USBGenericRequest_GETSTATUS 0
|
||||
/// CLEAR_FEATURE request code.
|
||||
#define USBGenericRequest_CLEARFEATURE 1
|
||||
/// SET_FEATURE request code.
|
||||
#define USBGenericRequest_SETFEATURE 3
|
||||
/// SET_ADDRESS request code.
|
||||
#define USBGenericRequest_SETADDRESS 5
|
||||
/// GET_DESCRIPTOR request code.
|
||||
#define USBGenericRequest_GETDESCRIPTOR 6
|
||||
/// SET_DESCRIPTOR request code.
|
||||
#define USBGenericRequest_SETDESCRIPTOR 7
|
||||
/// GET_CONFIGURATION request code.
|
||||
#define USBGenericRequest_GETCONFIGURATION 8
|
||||
/// SET_CONFIGURATION request code.
|
||||
#define USBGenericRequest_SETCONFIGURATION 9
|
||||
/// GET_INTERFACE request code.
|
||||
#define USBGenericRequest_GETINTERFACE 10
|
||||
/// SET_INTERFACE request code.
|
||||
#define USBGenericRequest_SETINTERFACE 11
|
||||
/// SYNCH_FRAME request code.
|
||||
#define USBGenericRequest_SYNCHFRAME 12
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Request Recipients"
|
||||
///
|
||||
/// This page lists codes of USB request recipients.
|
||||
///
|
||||
/// !Recipients
|
||||
/// - USBGenericRequest_DEVICE
|
||||
/// - USBGenericRequest_INTERFACE
|
||||
/// - USBGenericRequest_ENDPOINT
|
||||
/// - USBGenericRequest_OTHER
|
||||
|
||||
/// Recipient is the whole device.
|
||||
#define USBGenericRequest_DEVICE 0
|
||||
/// Recipient is an interface.
|
||||
#define USBGenericRequest_INTERFACE 1
|
||||
/// Recipient is an endpoint.
|
||||
#define USBGenericRequest_ENDPOINT 2
|
||||
/// Recipient is another entity.
|
||||
#define USBGenericRequest_OTHER 3
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Request Types"
|
||||
///
|
||||
/// This page lists codes of USB request types.
|
||||
///
|
||||
/// !Types
|
||||
/// - USBGenericRequest_STANDARD
|
||||
/// - USBGenericRequest_CLASS
|
||||
/// - USBGenericRequest_VENDOR
|
||||
|
||||
/// Request is standard.
|
||||
#define USBGenericRequest_STANDARD 0
|
||||
/// Request is class-specific.
|
||||
#define USBGenericRequest_CLASS 1
|
||||
/// Request is vendor-specific.
|
||||
#define USBGenericRequest_VENDOR 2
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB Request Directions"
|
||||
///
|
||||
/// This page lists codes of USB request directions.
|
||||
///
|
||||
/// !Directions
|
||||
/// - USBGenericRequest_IN
|
||||
/// - USBGenericRequest_OUT
|
||||
|
||||
/// Transfer occurs from device to the host.
|
||||
#define USBGenericRequest_OUT 0
|
||||
/// Transfer occurs from the host to the device.
|
||||
#define USBGenericRequest_IN 1
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Generic USB SETUP request sent over Control endpoints.
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
/// Type of request
|
||||
/// \sa "USB Request Recipients"
|
||||
/// \sa "USB Request Types"
|
||||
/// \sa "USB Request Directions"
|
||||
unsigned char bmRequestType:8;
|
||||
/// Request code
|
||||
/// \sa "USB Request Codes"
|
||||
unsigned char bRequest:8;
|
||||
/// Request-specific value parameter.
|
||||
unsigned short wValue:16;
|
||||
/// Request-specific index parameter.
|
||||
unsigned short wIndex:16;
|
||||
/// Expected length (in bytes) of the data phase.
|
||||
unsigned short wLength:16;
|
||||
|
||||
} USBGenericRequest;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern unsigned char USBGenericRequest_GetType(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
|
||||
extern unsigned char USBGenericRequest_GetRequest(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
extern unsigned short USBGenericRequest_GetValue(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
extern unsigned short USBGenericRequest_GetIndex(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
extern unsigned short USBGenericRequest_GetLength(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
extern unsigned char USBGenericRequest_GetEndpointNumber(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
extern unsigned char USBGenericRequest_GetRecipient(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
extern unsigned char USBGenericRequest_GetDirection(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
#endif //#ifndef USBGENERICREQUEST_H
|
||||
|
||||
@@ -1,72 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
Title: USBGetDescriptorRequest implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of the USBGetDescriptorRequest class.
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBGetDescriptorRequest.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the type of the descriptor requested by the host given the
|
||||
/// corresponding GET_DESCRIPTOR request.
|
||||
/// \param request Pointer to a USBGenericDescriptor instance.
|
||||
/// \return Type of the requested descriptor.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBGetDescriptorRequest_GetDescriptorType(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
// Requested descriptor type is in the high-byte of the wValue field
|
||||
return (USBGenericRequest_GetValue(request) >> 8) & 0xFF;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the index of the requested descriptor, given the corresponding
|
||||
/// GET_DESCRIPTOR request.
|
||||
/// \param request Pointer to a USBGenericDescriptor instance.
|
||||
/// \return Index of the requested descriptor.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBGetDescriptorRequest_GetDescriptorIndex(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
// Requested descriptor index if in the low byte of the wValue field
|
||||
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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Definition of the USBGetDescriptorRequest class.
|
||||
|
||||
!!!Usage
|
||||
|
||||
- After a GET_DESCRIPTOR request has been received, retrive the useful
|
||||
values with following functions:
|
||||
- USBGetDescriptorRequest_GetDescriptorType: the descriptor type
|
||||
- USBGetDescriptorRequest_GetDescriptorIndex: the index of the requested
|
||||
descriptor
|
||||
|
||||
*/
|
||||
|
||||
#ifndef USBGETDESCRIPTORREQUEST_H
|
||||
#define USBGETDESCRIPTORREQUEST_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBGenericRequest.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern unsigned char USBGetDescriptorRequest_GetDescriptorType(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
extern unsigned char USBGetDescriptorRequest_GetDescriptorIndex(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
#endif //#ifndef USBGETDESCRIPTORREQUEST_H
|
||||
|
||||
@@ -1,86 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* \page USBInterfaceAssociateDescriptor
|
||||
* !!!Purpose
|
||||
*
|
||||
* Class for manipulating USB IAD descriptors.
|
||||
*
|
||||
* !!!Usage
|
||||
*
|
||||
* -# Test
|
||||
*/
|
||||
|
||||
#ifndef USBDIADDESCRIPTOR_H
|
||||
#define USBDIADDESCRIPTOR_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack(1) // IAR
|
||||
#define __attribute__(...) // IAR
|
||||
#endif // IAR
|
||||
|
||||
/*
|
||||
Type: USBDeviceDescriptor
|
||||
USB standard device descriptor structure.
|
||||
|
||||
Variables:
|
||||
bLength - Size of this descriptor in bytes.
|
||||
bDescriptorType - Descriptor type (<USBGenericDescriptor_IAD>).
|
||||
bFirstInterface - Interface number of the first interface that is
|
||||
associated with this function.
|
||||
bInterfaceCount - Number of contiguous interfaces that are
|
||||
associated with this function.
|
||||
bFunctionClass - Class code (assigned by USB-IF).
|
||||
bFunctionSubClass - Subclass code (assigned by USB-IF).
|
||||
bFunctionProtocol - Protocol code (assigned by USB-IF)
|
||||
iFunction - Index of string descriptor describing this function.
|
||||
*/
|
||||
typedef struct {
|
||||
|
||||
unsigned char bLength;
|
||||
unsigned char bDescriptorType;
|
||||
unsigned char bFirstInterface;
|
||||
unsigned char bInterfaceCount;
|
||||
unsigned char bFunctionClass;
|
||||
unsigned char bFunctionSubClass;
|
||||
unsigned char bFunctionProtocol;
|
||||
unsigned char iFunction;
|
||||
} __attribute__ ((packed)) USBInterfaceAssociationDescriptor; // GCC
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack() // IAR
|
||||
#endif // IAR
|
||||
|
||||
#endif //#ifndef USBDIADDESCRIPTOR_H
|
||||
|
||||
@@ -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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Definition of a class for manipulating USB interface descriptors.
|
||||
|
||||
!!!Usage
|
||||
|
||||
- Declare USBInterfaceDescriptor instance as a part of the configuration
|
||||
descriptors of a USB device.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef USBINTERFACEDESCRIPTOR_H
|
||||
#define USBINTERFACEDESCRIPTOR_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack(1) // IAR
|
||||
#define __attribute__(...) // IAR
|
||||
#endif // IAR
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// USB standard interface descriptor structure.
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
/// Size of the descriptor in bytes.
|
||||
unsigned char bLength;
|
||||
/// Descriptor type (USBGenericDescriptor_INTERFACE).
|
||||
unsigned char bDescriptorType;
|
||||
/// Number of the interface in its configuration.
|
||||
unsigned char bInterfaceNumber;
|
||||
/// Value to select this alternate interface setting.
|
||||
unsigned char bAlternateSetting;
|
||||
/// Number of endpoints used by the inteface (excluding endpoint 0).
|
||||
unsigned char bNumEndpoints;
|
||||
/// Interface class code.
|
||||
unsigned char bInterfaceClass;
|
||||
/// Interface subclass code.
|
||||
unsigned char bInterfaceSubClass;
|
||||
/// Interface protocol code.
|
||||
unsigned char bInterfaceProtocol;
|
||||
/// Index of the interface string descriptor.
|
||||
unsigned char iInterface;
|
||||
|
||||
} __attribute__ ((packed)) USBInterfaceDescriptor; // GCC
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack() // IAR
|
||||
#endif // IAR
|
||||
|
||||
#endif //#ifndef USBINTERFACEDESCRIPTOR_H
|
||||
|
||||
@@ -1,69 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
Title: USBInterfaceRequest
|
||||
|
||||
About: Purpose
|
||||
Implementation of USBInterfaceRequest class methods.
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBInterfaceRequest.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Indicates which interface is targetted by a GET_INTERFACE or
|
||||
/// SET_INTERFACE request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return Interface number.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBInterfaceRequest_GetInterface(const USBGenericRequest *request)
|
||||
{
|
||||
return (USBGenericRequest_GetIndex(request) & 0xFF);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Indicates the new alternate setting that the interface targetted by a
|
||||
/// SET_INTERFACE request should use.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return New active setting for the interface.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBInterfaceRequest_GetAlternateSetting(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
return (USBGenericRequest_GetValue(request) & 0xFF);
|
||||
}
|
||||
|
||||
@@ -1,68 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Definitions for manipulating SET_INTERFACE and GET_INTERFACE request.
|
||||
|
||||
!!!Usage
|
||||
|
||||
-# After a SET_INTERFACE request has been received, retrieve the
|
||||
target interface using USBInterfaceRequest_GetInterface and its
|
||||
new alternate setting with USBInterfaceRequest_GetAlternateSetting.
|
||||
-# After a GET_INTERFACE request has been received, retrieve the target
|
||||
interface using USBInterfaceRequest_GetInterface.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef USBINTERFACEREQUEST_H
|
||||
#define USBINTERFACEREQUEST_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBGenericRequest.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern unsigned char USBInterfaceRequest_GetInterface(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
|
||||
extern unsigned char USBInterfaceRequest_GetAlternateSetting(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
#endif //#ifndef USBINTERFACEREQUEST_H
|
||||
|
||||
@@ -1,62 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
Title: USBIrqHandler implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of the USB Interrupt Handler.
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
#include <board.h>
|
||||
#include <usb/device/core/USBD.h>
|
||||
|
||||
#include <exceptions.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
/// Call Arbitrer, device and host interrupt handler.
|
||||
/// The IRQ functions are defined with weak and can be surcharged if needed.
|
||||
//------------------------------------------------------------------------------
|
||||
void USB_IrqHandler( void )
|
||||
{
|
||||
// Most arbitrer interrupt
|
||||
usb_general_interrupt();
|
||||
// Device interrupt
|
||||
USBD_IrqHandler();
|
||||
// Host interrupt
|
||||
usb_pipe_interrupt();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,52 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Implementation of the USB Interrupt Handler.
|
||||
|
||||
!!!Usage
|
||||
|
||||
-# The IRQ functions are defined with weak and can be surcharged if needed.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef USBIRQHANDLER_H
|
||||
#define USBIRQHANDLER_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
extern void USB_IrqHandler( void );
|
||||
|
||||
#endif //#ifndef USBIRQHANDLER_H
|
||||
|
||||
@@ -1,56 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
Title: USBSetAddressRequest implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of the USBSetAddressRequest class.
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBSetAddressRequest.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the address that the device must take in response to a
|
||||
/// SET_ADDRESS request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return New device address.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBSetAddressRequest_GetAddress(const USBGenericRequest *request)
|
||||
{
|
||||
return USBGenericRequest_GetValue(request) & 0x7F;
|
||||
}
|
||||
|
||||
@@ -1,60 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Definition of a class for manipulating SET_ADDRESS USB requests.
|
||||
|
||||
!!!Usage
|
||||
|
||||
- After a SET_ADDRESS request has been received, retrive the new address
|
||||
value with USBSetAddressRequest_GetAddress.
|
||||
*/
|
||||
|
||||
#ifndef USBSETADDRESSREQUEST_H
|
||||
#define USBSETADDRESSREQUEST_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBGenericRequest.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern unsigned char USBSetAddressRequest_GetAddress(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
#endif //#ifndef USBSETADDRESSREQUEST_H
|
||||
|
||||
@@ -1,58 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
Title: USBSetConfigurationRequest implementation
|
||||
|
||||
About: Purpose
|
||||
Implementation of the USBSetConfigurationRequest class.
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBSetConfigurationRequest.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Returns the number of the configuration that should be set in response
|
||||
/// to the given SET_CONFIGURATION request.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
/// \return Number of the requested configuration.
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBSetConfigurationRequest_GetConfiguration(
|
||||
const USBGenericRequest *request)
|
||||
{
|
||||
return USBGenericRequest_GetValue(request);
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Definition of a class for the Set Configuration request.
|
||||
|
||||
!!!Usage
|
||||
|
||||
- After a SET_CONFIGURATION request has been received, retrive the new
|
||||
configuration value with USBSetConfigurationRequest_GetConfiguration.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef USBSETCONFIGURATIONREQUEST_H
|
||||
#define USBSETCONFIGURATIONREQUEST_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBGenericRequest.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern unsigned char USBSetConfigurationRequest_GetConfiguration(
|
||||
const USBGenericRequest *request);
|
||||
|
||||
#endif //#ifndef USBSETCONFIGURATIONREQUEST_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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
///
|
||||
/// !!!Purpose
|
||||
///
|
||||
/// Definition of a class for manipulating String descriptors.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifndef USBSTRINGDESCRIPTOR_H
|
||||
#define USBSTRINGDESCRIPTOR_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB String Descriptor definitions"
|
||||
///
|
||||
/// This page lists the codes and macros for USB string descriptor definition.
|
||||
///
|
||||
/// !Language IDs
|
||||
/// - USBStringDescriptor_ENGLISH_US
|
||||
///
|
||||
/// !String Descriptor Length
|
||||
/// - USBStringDescriptor_LENGTH
|
||||
///
|
||||
/// !ASCII to UNICODE convertion
|
||||
/// - USBStringDescriptor_UNICODE
|
||||
|
||||
/// Language ID for US english.
|
||||
#define USBStringDescriptor_ENGLISH_US 0x09, 0x04
|
||||
|
||||
/// Calculates the length of a string descriptor given the number of ascii
|
||||
/// characters/language IDs in it.
|
||||
/// \param length The ascii format string length.
|
||||
/// \return The actual data length in bytes.
|
||||
#define USBStringDescriptor_LENGTH(length) ((length) * 2 + 2)
|
||||
/// Converts an ascii character to its unicode representation.
|
||||
/// \param ascii The ASCII character to convert
|
||||
/// \return A 2-byte-array for the UNICODE based on given ASCII
|
||||
#define USBStringDescriptor_UNICODE(ascii) (ascii), 0
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#endif //#ifndef USBSTRINGDESCRIPTOR_H
|
||||
|
||||
@@ -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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
/// !Purpose
|
||||
///
|
||||
/// Declaration of constants for using Device Descriptors with a Mass Storage
|
||||
/// driver.
|
||||
///
|
||||
/// !Usage
|
||||
///
|
||||
/// - For a USB device:
|
||||
/// -# When declaring a USBDeviceDescriptor instance, use the Mass Storage
|
||||
/// codes defined in this file (see "MS device codes").
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifndef MSDEVICEDESCRIPTOR_H
|
||||
#define MSDEVICEDESCRIPTOR_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MS device codes"
|
||||
/// This page lists the class, subclass & protocol codes used by a device with
|
||||
/// a Mass Storage driver.
|
||||
///
|
||||
/// !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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#endif //#ifndef MSDEVICEDESCRIPTOR_H
|
||||
|
||||
@@ -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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
/// !Purpose
|
||||
///
|
||||
/// Definition of several constants used when manipulating Mass Storage interface
|
||||
/// descriptors.
|
||||
///
|
||||
/// !Usage
|
||||
///
|
||||
/// - 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 MSINTERFACEDESCRIPTOR_H
|
||||
#define MSINTERFACEDESCRIPTOR_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MS interface codes"
|
||||
/// This page lists the available class, subclass & protocol codes for a Mass
|
||||
/// Storage interface.
|
||||
///
|
||||
/// !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 MSINTERFACEDESCRIPTOR_H
|
||||
|
||||
@@ -1,275 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
///
|
||||
/// !!!Purpose
|
||||
///
|
||||
/// Collection of methods for using the USB device controller on AT91
|
||||
/// microcontrollers.
|
||||
///
|
||||
/// !!!Usage
|
||||
///
|
||||
/// Please refer to the corresponding application note.
|
||||
/// - "AT91 USB device framework"
|
||||
/// - "USBD API" . "USBD API Methods"
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifndef USBD_H
|
||||
#define USBD_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
// #include <board.h>
|
||||
#include <usb/common/core/USBEndpointDescriptor.h>
|
||||
#include <usb/common/core/USBGenericRequest.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Compile Options
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/// Compile option for HS or OTG, use DMA. Remove this define for not use DMA.
|
||||
#if defined(CHIP_USB_OTGHS) || defined(CHIP_USB_UDPHS)
|
||||
#define DMA
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB device API return values"
|
||||
///
|
||||
/// This page lists the return values of the USB %device driver API
|
||||
///
|
||||
/// !Return codes
|
||||
/// - USBD_STATUS_SUCCESS
|
||||
/// - USBD_STATUS_LOCKED
|
||||
/// - USBD_STATUS_ABORTED
|
||||
/// - USBD_STATUS_RESET
|
||||
|
||||
/// Indicates the operation was successful.
|
||||
#define USBD_STATUS_SUCCESS 0
|
||||
/// Endpoint/device is already busy.
|
||||
#define USBD_STATUS_LOCKED 1
|
||||
/// Operation has been aborted.
|
||||
#define USBD_STATUS_ABORTED 2
|
||||
/// Operation has been aborted because the device has been reset.
|
||||
#define USBD_STATUS_RESET 3
|
||||
/// Part ot operation successfully done.
|
||||
#define USBD_STATUS_PARTIAL_DONE 4
|
||||
/// Operation failed because parameter error
|
||||
#define USBD_STATUS_INVALID_PARAMETER 5
|
||||
/// Operation failed because in unexpected state
|
||||
#define USBD_STATUS_WRONG_STATE 6
|
||||
/// Operation failed because HW not supported
|
||||
#define USBD_STATUS_HW_NOT_SUPPORTED 0xFE
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB device states"
|
||||
///
|
||||
/// This page lists the %device states of the USB %device driver.
|
||||
///
|
||||
/// !States
|
||||
/// - USBD_STATE_SUSPENDED
|
||||
/// - USBD_STATE_ATTACHED
|
||||
/// - USBD_STATE_POWERED
|
||||
/// - USBD_STATE_DEFAULT
|
||||
/// - USBD_STATE_ADDRESS
|
||||
/// - USBD_STATE_CONFIGURED
|
||||
|
||||
/// The device is currently suspended.
|
||||
#define USBD_STATE_SUSPENDED 0
|
||||
/// USB cable is plugged into the device.
|
||||
#define USBD_STATE_ATTACHED 1
|
||||
/// Host is providing +5V through the USB cable.
|
||||
#define USBD_STATE_POWERED 2
|
||||
/// Device has been reset.
|
||||
#define USBD_STATE_DEFAULT 3
|
||||
/// The device has been given an address on the bus.
|
||||
#define USBD_STATE_ADDRESS 4
|
||||
/// A valid configuration has been selected.
|
||||
#define USBD_STATE_CONFIGURED 5
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "USB device LEDs"
|
||||
///
|
||||
/// This page lists the LEDs used in the USB %device driver.
|
||||
///
|
||||
/// !LEDs
|
||||
/// - USBD_LEDPOWER
|
||||
/// - USBD_LEDUSB
|
||||
/// - USBD_LEDOTHER
|
||||
|
||||
/// LED for indicating that the device is powered.
|
||||
#define USBD_LEDPOWER 0
|
||||
/// LED for indicating USB activity.
|
||||
#define USBD_LEDUSB 1
|
||||
/// LED for custom usage.
|
||||
#define USBD_LEDOTHER 2
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Buffer struct used for multi-buffer-listed transfer.
|
||||
/// The driver can process 255 bytes of buffers or buffer list window.
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct _USBDTransferBuffer {
|
||||
/// Pointer to frame buffer
|
||||
unsigned char * pBuffer;
|
||||
/// Size of the frame (up to 64K-1)
|
||||
unsigned short size;
|
||||
/// Bytes transferred
|
||||
unsigned short transferred;
|
||||
/// Bytes in FIFO
|
||||
unsigned short buffered;
|
||||
/// Bytes remaining
|
||||
unsigned short remaining;
|
||||
} USBDTransferBuffer;
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#define __attribute__(...) // IAR
|
||||
#endif // IAR
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Struct used for USBD DMA Link List Transfer Descriptor, must be 16-bytes
|
||||
/// aligned.
|
||||
/// (For USB, DMA transfer is linked to EPs and FIFO address is EP defined)
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct _USBDDmaDescriptor {
|
||||
/// Pointer to Next Descriptor
|
||||
void* pNxtDesc;
|
||||
/// Pointer to data buffer address
|
||||
void* pDataAddr;
|
||||
/// DMA Control setting register value
|
||||
unsigned int ctrlSettings:8, /// Control settings
|
||||
reserved:8, /// Not used
|
||||
bufferLength:16; /// Length of buffer
|
||||
/// Loaded to DMA register, OK to modify
|
||||
unsigned int used;
|
||||
} __attribute__((aligned(16))) USBDDmaDescriptor;
|
||||
|
||||
#ifdef __ICCARM__ // IAR
|
||||
#pragma pack() // IAR
|
||||
#endif // IAR
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Callback used by transfer functions (USBD_Read & USBD_Write) to notify
|
||||
/// that a transaction is complete.
|
||||
//------------------------------------------------------------------------------
|
||||
typedef void (*TransferCallback)(void *pArg,
|
||||
unsigned char status,
|
||||
unsigned int transferred,
|
||||
unsigned int remaining);
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Callback used by MBL transfer functions (USBD_Read & USBD_Write) to notify
|
||||
/// that a transaction is complete.
|
||||
/// \param pArg Pointer to callback arguments.
|
||||
/// \param status USBD status.
|
||||
/// \param nbFreed Number of buffers that is freed since last callback.
|
||||
//------------------------------------------------------------------------------
|
||||
typedef void (*MblTransferCallback)(void *pArg,
|
||||
unsigned char status,
|
||||
unsigned int nbFreed);
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern void USBD_IrqHandler(void);
|
||||
|
||||
extern void USBD_Init(void);
|
||||
|
||||
extern void USBD_ConfigureSpeed(unsigned char forceFS);
|
||||
|
||||
extern void USBD_Connect(void);
|
||||
|
||||
extern void USBD_Disconnect(void);
|
||||
|
||||
extern char USBD_Write(
|
||||
unsigned char bEndpoint,
|
||||
const void *pData,
|
||||
unsigned int size,
|
||||
TransferCallback callback,
|
||||
void *pArg);
|
||||
|
||||
extern char USBD_MblWrite(
|
||||
unsigned char bEndpoint,
|
||||
void * pMbl,
|
||||
unsigned short wListSize,
|
||||
unsigned char bCircList,
|
||||
unsigned short wStartNdx,
|
||||
MblTransferCallback fCallback,
|
||||
void * pArgument);
|
||||
|
||||
extern char USBD_MblReuse(
|
||||
unsigned char bEndpoint,
|
||||
unsigned char * pNewBuffer,
|
||||
unsigned short wNewSize);
|
||||
|
||||
extern char USBD_Read(
|
||||
unsigned char bEndpoint,
|
||||
void *pData,
|
||||
unsigned int dLength,
|
||||
TransferCallback fCallback,
|
||||
void *pArg);
|
||||
|
||||
extern unsigned char USBD_Stall(unsigned char bEndpoint);
|
||||
|
||||
extern void USBD_Halt(unsigned char bEndpoint);
|
||||
|
||||
extern void USBD_Unhalt(unsigned char bEndpoint);
|
||||
|
||||
extern void USBD_ConfigureEndpoint(const USBEndpointDescriptor *pDescriptor);
|
||||
|
||||
extern unsigned char USBD_IsHalted(unsigned char bEndpoint);
|
||||
|
||||
extern void USBD_RemoteWakeUp(void);
|
||||
|
||||
extern void USBD_SetAddress(unsigned char address);
|
||||
|
||||
extern void USBD_SetConfiguration(unsigned char cfgnum);
|
||||
|
||||
extern unsigned char USBD_GetState(void);
|
||||
|
||||
extern unsigned char USBD_IsHighSpeed(void);
|
||||
|
||||
extern void USBD_Test(unsigned char bIndex);
|
||||
|
||||
#endif //#ifndef USBD_H
|
||||
|
||||
@@ -1,81 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBDCallbacks.h"
|
||||
#include "USBD.h"
|
||||
#include <board.h>
|
||||
#include <core_cm3.h>
|
||||
#include "debug.h"
|
||||
|
||||
void USBDCallbacks_Initialized(void)
|
||||
{
|
||||
UDP->UDP_ICR = 0x00000200 ; // CLear RXRSM flag
|
||||
NVIC_EnableIRQ(UDP_IRQn);
|
||||
}
|
||||
|
||||
#if 0
|
||||
void USBDCallbacks_RequestReceived(const USBGenericRequest *pRequest)
|
||||
{
|
||||
// Does nothing
|
||||
}
|
||||
#endif
|
||||
|
||||
void USBDCallbacks_Reset(void)
|
||||
{
|
||||
// Does nothing
|
||||
}
|
||||
|
||||
void USBDCallbacks_Resumed(void)
|
||||
{
|
||||
// Does nothing
|
||||
}
|
||||
|
||||
void USBDCallbacks_Suspended(void)
|
||||
{
|
||||
// Does nothing
|
||||
}
|
||||
|
||||
#if 0
|
||||
void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum)
|
||||
{
|
||||
TRACE_INFO_WP("ConfigurationChanged ");
|
||||
}
|
||||
#endif
|
||||
|
||||
void USBDDriverCallbacks_InterfaceSettingChanged(
|
||||
unsigned char interface,
|
||||
unsigned char setting)
|
||||
{
|
||||
// TRACE_INFO_WP("InterfaceSettingChanged ");
|
||||
}
|
||||
|
||||
@@ -1,65 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Definitions of callbacks used by the USBD API to notify the user
|
||||
application of incoming events. These functions are declared as 'weak',
|
||||
so they can be re-implemented elsewhere in the application in a
|
||||
transparent way.
|
||||
*/
|
||||
|
||||
#ifndef USBDCALLBACKS_H
|
||||
#define USBDCALLBACKS_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include <usb/common/core/USBGenericRequest.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern void USBDCallbacks_Initialized(void);
|
||||
|
||||
extern void USBDCallbacks_Reset(void);
|
||||
|
||||
extern void USBDCallbacks_Suspended(void);
|
||||
|
||||
extern void USBDCallbacks_Resumed(void);
|
||||
|
||||
extern void USBDCallbacks_RequestReceived(const USBGenericRequest *request);
|
||||
|
||||
#endif //#ifndef USBDCALLBACKS_H
|
||||
|
||||
@@ -1,753 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBDDriver.h"
|
||||
#include "USBDDriverCallbacks.h"
|
||||
#include "USBD.h"
|
||||
#include <board.h>
|
||||
#include "debug.h"
|
||||
#include <usb/common/core/USBGenericDescriptor.h>
|
||||
#include <usb/common/core/USBDeviceDescriptor.h>
|
||||
#include <usb/common/core/USBConfigurationDescriptor.h>
|
||||
#include <usb/common/core/USBDeviceQualifierDescriptor.h>
|
||||
#include <usb/common/core/USBEndpointDescriptor.h>
|
||||
#include <usb/common/core/USBFeatureRequest.h>
|
||||
#include <usb/common/core/USBSetAddressRequest.h>
|
||||
#include <usb/common/core/USBGetDescriptorRequest.h>
|
||||
#include <usb/common/core/USBSetConfigurationRequest.h>
|
||||
#include <usb/common/core/USBInterfaceRequest.h>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Local functions
|
||||
//------------------------------------------------------------------------------
|
||||
#if defined(CHIP_USB_OTGHS)
|
||||
static unsigned char otg_features_supported = 0;
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Send a NULL packet
|
||||
//------------------------------------------------------------------------------
|
||||
static void TerminateCtrlInWithNull(void *pArg,
|
||||
unsigned char status,
|
||||
unsigned int transferred,
|
||||
unsigned int remaining)
|
||||
{
|
||||
USBD_Write(0, // Endpoint #0
|
||||
0, // No data buffer
|
||||
0, // No data buffer
|
||||
(TransferCallback) 0,
|
||||
(void *) 0);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Configures the device by setting it into the Configured state and
|
||||
/// initializing all endpoints.
|
||||
/// \param pDriver Pointer to a USBDDriver instance.
|
||||
/// \param cfgnum Configuration number to set.
|
||||
//------------------------------------------------------------------------------
|
||||
static void SetConfiguration(USBDDriver *pDriver, unsigned char cfgnum)
|
||||
{
|
||||
USBEndpointDescriptor *pEndpoints[CHIP_USB_NUMENDPOINTS+1];
|
||||
const USBConfigurationDescriptor *pConfiguration;
|
||||
|
||||
// Use different descriptor depending on device speed
|
||||
if (USBD_IsHighSpeed()) {
|
||||
|
||||
pConfiguration = pDriver->pDescriptors->pHsConfiguration;
|
||||
}
|
||||
else {
|
||||
|
||||
pConfiguration = pDriver->pDescriptors->pFsConfiguration;
|
||||
}
|
||||
|
||||
// Set & save the desired configuration
|
||||
USBD_SetConfiguration(cfgnum);
|
||||
pDriver->cfgnum = cfgnum;
|
||||
|
||||
// If the configuration is not 0, configure endpoints
|
||||
if (cfgnum != 0) {
|
||||
|
||||
// Parse configuration to get endpoint descriptors
|
||||
USBConfigurationDescriptor_Parse(pConfiguration, 0, pEndpoints, 0);
|
||||
|
||||
// Configure endpoints
|
||||
int i = 0;
|
||||
while (pEndpoints[i] != 0) {
|
||||
|
||||
USBD_ConfigureEndpoint(pEndpoints[i]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
// Should be done before send the ZLP
|
||||
USBDDriverCallbacks_ConfigurationChanged(cfgnum);
|
||||
|
||||
// Acknowledge the request
|
||||
USBD_Write(0, // Endpoint #0
|
||||
0, // No data buffer
|
||||
0, // No data buffer
|
||||
(TransferCallback) 0,
|
||||
(void *) 0);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Sends the current configuration number to the host.
|
||||
/// \param pDriver Pointer to a USBDDriver instance.
|
||||
//------------------------------------------------------------------------------
|
||||
static void GetConfiguration(const USBDDriver *pDriver)
|
||||
{
|
||||
USBD_Write(0, &(pDriver->cfgnum), 1, 0, 0);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Sends the current status of the device to the host.
|
||||
/// \param pDriver Pointer to a USBDDriver instance.
|
||||
//------------------------------------------------------------------------------
|
||||
static void GetDeviceStatus(const USBDDriver *pDriver)
|
||||
{
|
||||
static unsigned short data;
|
||||
const USBConfigurationDescriptor *pConfiguration;
|
||||
|
||||
data = 0;
|
||||
// Use different configuration depending on device speed
|
||||
if (USBD_IsHighSpeed()) {
|
||||
|
||||
pConfiguration = pDriver->pDescriptors->pHsConfiguration;
|
||||
}
|
||||
else {
|
||||
|
||||
pConfiguration = pDriver->pDescriptors->pFsConfiguration;
|
||||
}
|
||||
|
||||
// Check current configuration for power mode (if device is configured)
|
||||
if (pDriver->cfgnum != 0) {
|
||||
|
||||
if (USBConfigurationDescriptor_IsSelfPowered(pConfiguration)) {
|
||||
|
||||
data |= 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if remote wake-up is enabled
|
||||
if (pDriver->isRemoteWakeUpEnabled) {
|
||||
|
||||
data |= 2;
|
||||
}
|
||||
|
||||
// Send the device status
|
||||
USBD_Write(0, &data, 2, 0, 0);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Sends the current status of an endpoints to the USB host.
|
||||
/// \param bEndpoint Endpoint number.
|
||||
//------------------------------------------------------------------------------
|
||||
static void GetEndpointStatus(unsigned char bEndpoint)
|
||||
{
|
||||
static unsigned short data;
|
||||
|
||||
data = 0;
|
||||
// Check if the endpoint exists
|
||||
if (bEndpoint > CHIP_USB_NUMENDPOINTS) {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
else {
|
||||
|
||||
// Check if the endpoint if currently halted
|
||||
if (USBD_IsHalted(bEndpoint)) {
|
||||
|
||||
data = 1;
|
||||
}
|
||||
|
||||
// Send the endpoint status
|
||||
USBD_Write(0, &data, 2, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Sends the requested USB descriptor to the host if available, or STALLs the
|
||||
/// request.
|
||||
/// \param pDriver Pointer to a USBDDriver instance.
|
||||
/// \param type Type of the requested descriptor
|
||||
/// \param index Index of the requested descriptor.
|
||||
/// \param length Maximum number of bytes to return.
|
||||
//------------------------------------------------------------------------------
|
||||
static void GetDescriptor(
|
||||
const USBDDriver *pDriver,
|
||||
unsigned char type,
|
||||
unsigned char indexRDesc,
|
||||
unsigned int length)
|
||||
{
|
||||
const USBDeviceDescriptor *pDevice;
|
||||
const USBConfigurationDescriptor *pConfiguration;
|
||||
const USBDeviceQualifierDescriptor *pQualifier;
|
||||
const USBConfigurationDescriptor *pOtherSpeed;
|
||||
const USBGenericDescriptor **pStrings =
|
||||
(const USBGenericDescriptor **) pDriver->pDescriptors->pStrings;
|
||||
const USBGenericDescriptor *pString;
|
||||
unsigned char numStrings = pDriver->pDescriptors->numStrings;
|
||||
unsigned char terminateWithNull = 0;
|
||||
|
||||
// Use different set of descriptors depending on device speed
|
||||
if (USBD_IsHighSpeed()) {
|
||||
|
||||
TRACE_DEBUG("HS ");
|
||||
pDevice = pDriver->pDescriptors->pHsDevice;
|
||||
pConfiguration = pDriver->pDescriptors->pHsConfiguration;
|
||||
pQualifier = pDriver->pDescriptors->pHsQualifier;
|
||||
pOtherSpeed = pDriver->pDescriptors->pHsOtherSpeed;
|
||||
}
|
||||
else {
|
||||
|
||||
TRACE_DEBUG("FS ");
|
||||
pDevice = pDriver->pDescriptors->pFsDevice;
|
||||
pConfiguration = pDriver->pDescriptors->pFsConfiguration;
|
||||
pQualifier = pDriver->pDescriptors->pFsQualifier;
|
||||
pOtherSpeed = pDriver->pDescriptors->pFsOtherSpeed;
|
||||
}
|
||||
|
||||
// Check the descriptor type
|
||||
switch (type) {
|
||||
|
||||
case USBGenericDescriptor_DEVICE:
|
||||
TRACE_INFO_WP("Dev ");
|
||||
|
||||
// Adjust length and send descriptor
|
||||
if (length > USBGenericDescriptor_GetLength((USBGenericDescriptor *) pDevice)) {
|
||||
|
||||
length = USBGenericDescriptor_GetLength((USBGenericDescriptor *) pDevice);
|
||||
}
|
||||
USBD_Write(0, pDevice, length, 0, 0);
|
||||
break;
|
||||
|
||||
case USBGenericDescriptor_CONFIGURATION:
|
||||
TRACE_INFO_WP("Cfg ");
|
||||
|
||||
// Adjust length and send descriptor
|
||||
if (length > USBConfigurationDescriptor_GetTotalLength(pConfiguration)) {
|
||||
|
||||
length = USBConfigurationDescriptor_GetTotalLength(pConfiguration);
|
||||
terminateWithNull = ((length % pDevice->bMaxPacketSize0) == 0);
|
||||
}
|
||||
USBD_Write(0,
|
||||
pConfiguration,
|
||||
length,
|
||||
terminateWithNull ? TerminateCtrlInWithNull : 0,
|
||||
0);
|
||||
break;
|
||||
|
||||
case USBGenericDescriptor_DEVICEQUALIFIER:
|
||||
TRACE_INFO_WP("Qua ");
|
||||
|
||||
// Check if descriptor exists
|
||||
if (!pQualifier) {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
else {
|
||||
|
||||
// Adjust length and send descriptor
|
||||
if (length > USBGenericDescriptor_GetLength((USBGenericDescriptor *) pQualifier)) {
|
||||
|
||||
length = USBGenericDescriptor_GetLength((USBGenericDescriptor *) pQualifier);
|
||||
}
|
||||
USBD_Write(0, pQualifier, length, 0, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case USBGenericDescriptor_OTHERSPEEDCONFIGURATION:
|
||||
TRACE_INFO_WP("OSC ");
|
||||
|
||||
// Check if descriptor exists
|
||||
if (!pOtherSpeed) {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
else {
|
||||
|
||||
// Adjust length and send descriptor
|
||||
if (length > USBConfigurationDescriptor_GetTotalLength(pOtherSpeed)) {
|
||||
|
||||
length = USBConfigurationDescriptor_GetTotalLength(pOtherSpeed);
|
||||
terminateWithNull = ((length % pDevice->bMaxPacketSize0) == 0);
|
||||
}
|
||||
USBD_Write(0,
|
||||
pOtherSpeed,
|
||||
length,
|
||||
terminateWithNull ? TerminateCtrlInWithNull : 0,
|
||||
0);
|
||||
}
|
||||
break;
|
||||
|
||||
case USBGenericDescriptor_STRING:
|
||||
TRACE_INFO_WP("Str%d ", indexRDesc);
|
||||
|
||||
// Check if descriptor exists
|
||||
if (indexRDesc > numStrings) {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
else {
|
||||
|
||||
pString = pStrings[indexRDesc];
|
||||
|
||||
// Adjust length and send descriptor
|
||||
if (length > USBGenericDescriptor_GetLength(pString)) {
|
||||
|
||||
length = USBGenericDescriptor_GetLength(pString);
|
||||
terminateWithNull = ((length % pDevice->bMaxPacketSize0) == 0);
|
||||
}
|
||||
USBD_Write(0,
|
||||
pString,
|
||||
length,
|
||||
terminateWithNull ? TerminateCtrlInWithNull : 0,
|
||||
0);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
TRACE_WARNING(
|
||||
"USBDDriver_GetDescriptor: Unknown descriptor type (%d)\n\r",
|
||||
type);
|
||||
USBD_Stall(0);
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Sets the active setting of the given interface if the configuration supports
|
||||
/// it; otherwise, the control pipe is STALLed. If the setting of an interface
|
||||
/// changes.
|
||||
/// \parma pDriver Pointer to a USBDDriver instance.
|
||||
/// \parma infnum Interface number.
|
||||
/// \parma setting New active setting for the interface.
|
||||
//------------------------------------------------------------------------------
|
||||
static void SetInterface(
|
||||
USBDDriver *pDriver,
|
||||
unsigned char infnum,
|
||||
unsigned char setting)
|
||||
{
|
||||
// Make sure alternate settings are supported
|
||||
if (!pDriver->pInterfaces) {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
else {
|
||||
|
||||
// Change the current setting of the interface and trigger the callback
|
||||
// if necessary
|
||||
if (pDriver->pInterfaces[infnum] != setting) {
|
||||
|
||||
pDriver->pInterfaces[infnum] = setting;
|
||||
USBDDriverCallbacks_InterfaceSettingChanged(infnum, setting);
|
||||
}
|
||||
|
||||
// Acknowledge the request
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Sends the currently active setting of the given interface to the USB
|
||||
/// host. If alternate settings are not supported, this function STALLs the
|
||||
/// control pipe.
|
||||
/// \param pDriver Pointer to a USBDDriver instance.
|
||||
/// \param infnum Interface number.
|
||||
//------------------------------------------------------------------------------
|
||||
static void GetInterface(
|
||||
const USBDDriver *pDriver,
|
||||
unsigned char infnum)
|
||||
{
|
||||
// Make sure alternate settings are supported, or STALL the control pipe
|
||||
if (!pDriver->pInterfaces) {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
else {
|
||||
|
||||
// Sends the current interface setting to the host
|
||||
USBD_Write(0, &(pDriver->pInterfaces[infnum]), 1, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CHIP_USB_UDPHS) || defined(CHIP_USB_OTGHS)
|
||||
//------------------------------------------------------------------------------
|
||||
// Performs the selected test on the USB device (high-speed only).
|
||||
// \param test Test selector value.
|
||||
//------------------------------------------------------------------------------
|
||||
static void USBDDriver_Test(unsigned char test)
|
||||
{
|
||||
TRACE_DEBUG("UDPHS_Test\n\r");
|
||||
|
||||
// the lower byte of wIndex must be zero
|
||||
// the most significant byte of wIndex is used to specify the specific test mode
|
||||
switch (test) {
|
||||
case USBFeatureRequest_TESTPACKET:
|
||||
//Test mode Test_Packet:
|
||||
//Upon command, a port must repetitively transmit the following test packet until
|
||||
//the exit action is taken. This enables the testing of rise and fall times, eye
|
||||
//patterns, jitter, and any other dynamic waveform specifications.
|
||||
//The test packet is made up by concatenating the following strings.
|
||||
//(Note: For J/K NRZI data, and for NRZ data, the bit on the left is the first one
|
||||
//transmitted. “S” indicates that a bit stuff occurs, which inserts an “extra” NRZI data bit.
|
||||
//“* N” is used to indicate N occurrences of a string of bits or symbols.)
|
||||
//A port in Test_Packet mode must send this packet repetitively. The inter-packet timing
|
||||
//must be no less than the minimum allowable inter-packet gap as defined in Section 7.1.18 and
|
||||
//no greater than 125 us.
|
||||
// Send ZLP
|
||||
USBD_Test(USBFeatureRequest_TESTSENDZLP);
|
||||
// Tst PACKET
|
||||
USBD_Test(USBFeatureRequest_TESTPACKET);
|
||||
while (1);
|
||||
//break; not reached
|
||||
|
||||
case USBFeatureRequest_TESTJ:
|
||||
//Test mode Test_J:
|
||||
//Upon command, a port’s transceiver must enter the high-speed J state and remain in that
|
||||
//state until the exit action is taken. This enables the testing of the high output drive
|
||||
//level on the D+ line.
|
||||
// Send ZLP
|
||||
USBD_Test(USBFeatureRequest_TESTSENDZLP);
|
||||
// Tst J
|
||||
USBD_Test(USBFeatureRequest_TESTJ);
|
||||
while (1);
|
||||
//break; not reached
|
||||
|
||||
case USBFeatureRequest_TESTK:
|
||||
//Test mode Test_K:
|
||||
//Upon command, a port’s transceiver must enter the high-speed K state and remain in
|
||||
//that state until the exit action is taken. This enables the testing of the high output drive
|
||||
//level on the D- line.
|
||||
// Send a ZLP
|
||||
USBD_Test(USBFeatureRequest_TESTSENDZLP);
|
||||
USBD_Test(USBFeatureRequest_TESTK);
|
||||
while (1);
|
||||
//break; not reached
|
||||
|
||||
case USBFeatureRequest_TESTSE0NAK:
|
||||
//Test mode Test_SE0_NAK:
|
||||
//Upon command, a port’s transceiver must enter the high-speed receive mode
|
||||
//and remain in that mode until the exit action is taken. This enables the testing
|
||||
//of output impedance, low level output voltage, and loading characteristics.
|
||||
//In addition, while in this mode, upstream facing ports (and only upstream facing ports)
|
||||
//must respond to any IN token packet with a NAK handshake (only if the packet CRC is
|
||||
//determined to be correct) within the normal allowed device response time. This enables testing of
|
||||
//the device squelch level circuitry and, additionally, provides a general purpose stimulus/response
|
||||
//test for basic functional testing.
|
||||
// Send a ZLP
|
||||
USBD_Test(USBFeatureRequest_TESTSENDZLP);
|
||||
// Test SE0_NAK
|
||||
USBD_Test(USBFeatureRequest_TESTSE0NAK);
|
||||
while (1);
|
||||
//break; not reached
|
||||
|
||||
default:
|
||||
USBD_Stall(0);
|
||||
break;
|
||||
|
||||
}
|
||||
// The exit action is to power cycle the device.
|
||||
// The device must be disconnected from the host
|
||||
}
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Initializes a USBDDriver instance with a list of descriptors. If
|
||||
/// interfaces can have multiple alternate settings, an array to store the
|
||||
/// current setting for each interface must be provided.
|
||||
/// \param pDriver Pointer to a USBDDriver instance.
|
||||
/// \param pDescriptors Pointer to a USBDDriverDescriptors instance.
|
||||
/// \param pInterfaces Pointer to an array for storing the current alternate
|
||||
/// setting of each interface (optional).
|
||||
//------------------------------------------------------------------------------
|
||||
void USBDDriver_Initialize(
|
||||
USBDDriver *pDriver,
|
||||
const USBDDriverDescriptors *pDescriptors,
|
||||
unsigned char *pInterfaces)
|
||||
{
|
||||
|
||||
pDriver->cfgnum = 0;
|
||||
#if (BOARD_USB_BMATTRIBUTES == USBConfigurationDescriptor_SELFPOWERED_RWAKEUP) \
|
||||
|| (BOARD_USB_BMATTRIBUTES == USBConfigurationDescriptor_BUSPOWERED_RWAKEUP)
|
||||
pDriver->isRemoteWakeUpEnabled = 1;
|
||||
#else
|
||||
pDriver->isRemoteWakeUpEnabled = 0;
|
||||
#endif
|
||||
|
||||
pDriver->pDescriptors = pDescriptors;
|
||||
pDriver->pInterfaces = pInterfaces;
|
||||
|
||||
// Initialize interfaces array if not null
|
||||
if (pInterfaces != 0) {
|
||||
|
||||
memset(pInterfaces, sizeof(pInterfaces), 0);
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Handles the given request if it is standard, otherwise STALLs it.
|
||||
/// \param pDriver Pointer to a USBDDriver instance.
|
||||
/// \param pRequest Pointer to a USBGenericRequest instance.
|
||||
//------------------------------------------------------------------------------
|
||||
void USBDDriver_RequestHandler(
|
||||
USBDDriver *pDriver,
|
||||
const USBGenericRequest *pRequest)
|
||||
{
|
||||
unsigned char cfgnum;
|
||||
unsigned char infnum;
|
||||
unsigned char eptnum;
|
||||
unsigned char setting;
|
||||
unsigned char type;
|
||||
unsigned char indexDesc;
|
||||
unsigned int length;
|
||||
unsigned int address;
|
||||
|
||||
TRACE_INFO_WP("Std ");
|
||||
|
||||
// Check request code
|
||||
switch (USBGenericRequest_GetRequest(pRequest)) {
|
||||
|
||||
case USBGenericRequest_GETDESCRIPTOR:
|
||||
TRACE_INFO_WP("gDesc ");
|
||||
|
||||
// Send the requested descriptor
|
||||
type = USBGetDescriptorRequest_GetDescriptorType(pRequest);
|
||||
indexDesc = USBGetDescriptorRequest_GetDescriptorIndex(pRequest);
|
||||
length = USBGenericRequest_GetLength(pRequest);
|
||||
GetDescriptor(pDriver, type, indexDesc, length);
|
||||
break;
|
||||
|
||||
case USBGenericRequest_SETADDRESS:
|
||||
TRACE_INFO_WP("sAddr ");
|
||||
|
||||
// Sends a zero-length packet and then set the device address
|
||||
address = USBSetAddressRequest_GetAddress(pRequest);
|
||||
USBD_Write(0, 0, 0, (TransferCallback) USBD_SetAddress, (void *) address);
|
||||
break;
|
||||
|
||||
case USBGenericRequest_SETCONFIGURATION:
|
||||
TRACE_INFO_WP("sCfg ");
|
||||
|
||||
// Set the requested configuration
|
||||
cfgnum = USBSetConfigurationRequest_GetConfiguration(pRequest);
|
||||
SetConfiguration(pDriver, cfgnum);
|
||||
break;
|
||||
|
||||
case USBGenericRequest_GETCONFIGURATION:
|
||||
TRACE_INFO_WP("gCfg ");
|
||||
|
||||
// Send the current configuration number
|
||||
GetConfiguration(pDriver);
|
||||
break;
|
||||
|
||||
case USBGenericRequest_GETSTATUS:
|
||||
TRACE_INFO_WP("gSta ");
|
||||
|
||||
// Check who is the recipient
|
||||
switch (USBGenericRequest_GetRecipient(pRequest)) {
|
||||
|
||||
case USBGenericRequest_DEVICE:
|
||||
TRACE_INFO_WP("Dev ");
|
||||
|
||||
// Send the device status
|
||||
GetDeviceStatus(pDriver);
|
||||
break;
|
||||
|
||||
case USBGenericRequest_ENDPOINT:
|
||||
TRACE_INFO_WP("Ept ");
|
||||
|
||||
// Send the endpoint status
|
||||
eptnum = USBGenericRequest_GetEndpointNumber(pRequest);
|
||||
GetEndpointStatus(eptnum);
|
||||
break;
|
||||
|
||||
default:
|
||||
TRACE_WARNING(
|
||||
"USBDDriver_RequestHandler: Unknown recipient (%d)\n\r",
|
||||
USBGenericRequest_GetRecipient(pRequest));
|
||||
USBD_Stall(0);
|
||||
}
|
||||
break;
|
||||
|
||||
case USBGenericRequest_CLEARFEATURE:
|
||||
TRACE_INFO_WP("cFeat ");
|
||||
|
||||
// Check which is the requested feature
|
||||
switch (USBFeatureRequest_GetFeatureSelector(pRequest)) {
|
||||
|
||||
case USBFeatureRequest_ENDPOINTHALT:
|
||||
TRACE_INFO_WP("Hlt ");
|
||||
|
||||
// Unhalt endpoint and send a zero-length packet
|
||||
USBD_Unhalt(USBGenericRequest_GetEndpointNumber(pRequest));
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case USBFeatureRequest_DEVICEREMOTEWAKEUP:
|
||||
TRACE_INFO_WP("RmWU ");
|
||||
|
||||
// Disable remote wake-up and send a zero-length packet
|
||||
pDriver->isRemoteWakeUpEnabled = 0;
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
TRACE_WARNING(
|
||||
"USBDDriver_RequestHandler: Unknown feature selector (%d)\n\r",
|
||||
USBFeatureRequest_GetFeatureSelector(pRequest));
|
||||
USBD_Stall(0);
|
||||
}
|
||||
break;
|
||||
|
||||
case USBGenericRequest_SETFEATURE:
|
||||
TRACE_INFO_WP("sFeat ");
|
||||
|
||||
// Check which is the selected feature
|
||||
switch (USBFeatureRequest_GetFeatureSelector(pRequest)) {
|
||||
|
||||
case USBFeatureRequest_DEVICEREMOTEWAKEUP:
|
||||
TRACE_INFO_WP("RmWU ");
|
||||
|
||||
// Enable remote wake-up and send a ZLP
|
||||
pDriver->isRemoteWakeUpEnabled = 1;
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
break;
|
||||
|
||||
case USBFeatureRequest_ENDPOINTHALT:
|
||||
TRACE_INFO_WP("Halt ");
|
||||
// Halt endpoint
|
||||
USBD_Halt(USBGenericRequest_GetEndpointNumber(pRequest));
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
break;
|
||||
|
||||
#if defined(CHIP_USB_UDPHS) || defined(CHIP_USB_OTGHS)
|
||||
|
||||
case USBFeatureRequest_TESTMODE:
|
||||
// 7.1.20 Test Mode Support
|
||||
if ((USBGenericRequest_GetType(pRequest) == USBGenericRequest_DEVICE)
|
||||
&& ((USBGenericRequest_GetIndex(pRequest) & 0x000F) == 0)) {
|
||||
|
||||
// Handle test request
|
||||
USBDDriver_Test(USBFeatureRequest_GetTestSelector(pRequest));
|
||||
}
|
||||
else {
|
||||
|
||||
USBD_Stall(0);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#if defined(CHIP_USB_OTGHS)
|
||||
case USBFeatureRequest_OTG_B_HNP_ENABLE:
|
||||
TRACE_INFO_WP("OTG_B_HNP_ENABLE ");
|
||||
otg_features_supported |= 1<<USBFeatureRequest_OTG_B_HNP_ENABLE;
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
break;
|
||||
case USBFeatureRequest_OTG_A_HNP_SUPPORT:
|
||||
TRACE_INFO_WP("OTG_A_HNP_SUPPORT ");
|
||||
otg_features_supported |= 1<<USBFeatureRequest_OTG_A_HNP_SUPPORT;
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
break;
|
||||
case USBFeatureRequest_OTG_A_ALT_HNP_SUPPORT:
|
||||
TRACE_INFO_WP("OTG_A_ALT_HNP_SUPPORT ");
|
||||
otg_features_supported |= 1<<USBFeatureRequest_OTG_A_ALT_HNP_SUPPORT;
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
TRACE_WARNING(
|
||||
"USBDDriver_RequestHandler: Unknown feature selector (%d)\n\r",
|
||||
USBFeatureRequest_GetFeatureSelector(pRequest));
|
||||
USBD_Stall(0);
|
||||
}
|
||||
break;
|
||||
|
||||
case USBGenericRequest_SETINTERFACE:
|
||||
TRACE_INFO_WP("sInterface ");
|
||||
|
||||
infnum = USBInterfaceRequest_GetInterface(pRequest);
|
||||
setting = USBInterfaceRequest_GetAlternateSetting(pRequest);
|
||||
SetInterface(pDriver, infnum, setting);
|
||||
break;
|
||||
|
||||
case USBGenericRequest_GETINTERFACE:
|
||||
TRACE_INFO_WP("gInterface ");
|
||||
|
||||
infnum = USBInterfaceRequest_GetInterface(pRequest);
|
||||
GetInterface(pDriver, infnum);
|
||||
break;
|
||||
|
||||
default:
|
||||
TRACE_WARNING(
|
||||
"USBDDriver_RequestHandler: Unknown request code (%d)\n\r",
|
||||
USBGenericRequest_GetRequest(pRequest));
|
||||
USBD_Stall(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Test if RemoteWakeUP feature is enabled
|
||||
/// \param pDriver Pointer to an USBDDriver instance.
|
||||
/// \return 1 if remote wake up has been enabled by the host; otherwise, returns
|
||||
/// 0
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBDDriver_IsRemoteWakeUpEnabled(const USBDDriver *pDriver)
|
||||
{
|
||||
return pDriver->isRemoteWakeUpEnabled;
|
||||
}
|
||||
|
||||
#if defined(CHIP_USB_OTGHS)
|
||||
//------------------------------------------------------------------------------
|
||||
/// Return OTG features supported
|
||||
/// \return the OTG features
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char USBDDriver_returnOTGFeatures(void)
|
||||
{
|
||||
return otg_features_supported;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Clear OTG features supported
|
||||
/// \return none
|
||||
//------------------------------------------------------------------------------
|
||||
void USBDDriver_clearOTGFeatures(void)
|
||||
{
|
||||
otg_features_supported = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,101 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
USB Device Driver class definition.
|
||||
|
||||
!!!Usage
|
||||
|
||||
-# Instanciate a USBDDriver object and initialize it using
|
||||
USBDDriver_Initialize.
|
||||
-# When a USB SETUP request is received, forward it to the standard
|
||||
driver using USBDDriver_RequestHandler.
|
||||
-# Check the Remote Wakeup setting via USBDDriver_IsRemoteWakeUpEnabled.
|
||||
*/
|
||||
|
||||
#ifndef USBDDRIVER_H
|
||||
#define USBDDRIVER_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "USBDDriverDescriptors.h"
|
||||
#include <usb/common/core/USBGenericRequest.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// USB device driver structure, holding a list of descriptors identifying
|
||||
/// the device as well as the driver current state.
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
/// List of descriptors used by the device.
|
||||
const USBDDriverDescriptors *pDescriptors;
|
||||
/// Current setting for each interface.
|
||||
unsigned char *pInterfaces;
|
||||
/// Current configuration number (0 -> device is not configured).
|
||||
unsigned char cfgnum;
|
||||
/// Indicates if remote wake up has been enabled by the host.
|
||||
unsigned char isRemoteWakeUpEnabled;
|
||||
#if defined(CHIP_USB_OTGHS)
|
||||
/// Features supported by OTG
|
||||
unsigned char otg_features_supported;
|
||||
#endif
|
||||
} USBDDriver;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern void USBDDriver_Initialize(
|
||||
USBDDriver *pDriver,
|
||||
const USBDDriverDescriptors *pDescriptors,
|
||||
unsigned char *pInterfaces);
|
||||
|
||||
extern void USBDDriver_RequestHandler(
|
||||
USBDDriver *pDriver,
|
||||
const USBGenericRequest *pRequest);
|
||||
|
||||
extern unsigned char USBDDriver_IsRemoteWakeUpEnabled(const USBDDriver *pDriver);
|
||||
|
||||
#if defined(CHIP_USB_OTGHS)
|
||||
extern unsigned char USBDDriver_returnOTGFeatures(void);
|
||||
extern void USBDDriver_clearOTGFeatures(void);
|
||||
#endif
|
||||
|
||||
#endif //#ifndef USBDDRIVER_H
|
||||
|
||||
@@ -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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Definition of several callbacks which are triggered by the USB software
|
||||
driver after receiving specific requests.
|
||||
|
||||
!!!Usage
|
||||
|
||||
-# Re-implement the USBDDriverCallbacks_ConfigurationChanged
|
||||
callback to know when the hosts changes the active configuration of
|
||||
the device.
|
||||
-# Re-implement the USBDDriverCallbacks_InterfaceSettingChanged
|
||||
callback to get notified whenever the active setting of an interface
|
||||
is changed by the host.
|
||||
*/
|
||||
|
||||
#ifndef USBDDRIVERCALLBACKS_H
|
||||
#define USBDDRIVERCALLBACKS_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum);
|
||||
|
||||
extern void USBDDriverCallbacks_InterfaceSettingChanged(unsigned char interface,
|
||||
unsigned char setting);
|
||||
|
||||
#endif //#ifndef USBDDRIVERCALLBACKS_H
|
||||
|
||||
@@ -1,86 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
\unit
|
||||
|
||||
!!!Purpose
|
||||
|
||||
Definition of a class for declaring USB descriptors required by the
|
||||
device driver.
|
||||
*/
|
||||
|
||||
#ifndef USBDDRIVERDESCRIPTORS_H
|
||||
#define USBDDRIVERDESCRIPTORS_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include <usb/common/core/USBDeviceDescriptor.h>
|
||||
#include <usb/common/core/USBConfigurationDescriptor.h>
|
||||
#include <usb/common/core/USBDeviceQualifierDescriptor.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// List of all descriptors used by a USB device driver. Each descriptor can
|
||||
/// be provided in two versions: full-speed and high-speed. Devices which are
|
||||
/// not high-speed capable do not need to provided high-speed descriptors and
|
||||
/// the full-speed qualifier & other speed descriptors.
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
/// Pointer to the full-speed device descriptor.
|
||||
const USBDeviceDescriptor *pFsDevice;
|
||||
/// Pointer to the full-speed configuration descriptor.
|
||||
const USBConfigurationDescriptor *pFsConfiguration;
|
||||
/// Pointer to the full-speed qualifier descriptor.
|
||||
const USBDeviceQualifierDescriptor *pFsQualifier;
|
||||
/// Pointer to the full-speed other speed configuration descriptor.
|
||||
const USBConfigurationDescriptor *pFsOtherSpeed;
|
||||
/// Pointer to the high-speed device descriptor.
|
||||
const USBDeviceDescriptor *pHsDevice;
|
||||
/// Pointer to the high-speed configuration descriptor.
|
||||
const USBConfigurationDescriptor *pHsConfiguration;
|
||||
/// Pointer to the high-speed qualifier descriptor.
|
||||
const USBDeviceQualifierDescriptor *pHsQualifier;
|
||||
/// Pointer to the high-speed other speed configuration descriptor.
|
||||
const USBConfigurationDescriptor *pHsOtherSpeed;
|
||||
/// Pointer to the list of string descriptors.
|
||||
const unsigned char **pStrings;
|
||||
/// Number of string descriptors in list.
|
||||
unsigned char numStrings;
|
||||
|
||||
} USBDDriverDescriptors;
|
||||
|
||||
#endif //#ifndef USBDDRIVERDESCRIPTORS_H
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,233 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
/// !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>
|
||||
///
|
||||
/// !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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD Requests"
|
||||
/// This page lists MSD-specific requests ( Actually for Bulk-only protocol ).
|
||||
///
|
||||
/// !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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD Subclass Codes"
|
||||
/// This page lists the Subclass Codes for bInterfaceSubClass field.
|
||||
/// (Table 2.1, USB Mass Storage Class Spec. Overview)
|
||||
///
|
||||
/// !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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD Protocol Codes"
|
||||
/// This page lists the Transport Protocol codes for MSD.
|
||||
/// (Table 3.1, USB Mass Storage Class Spec. Overview)
|
||||
///
|
||||
/// !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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/// Test unit control:
|
||||
#define CTRL_NOT_READY 0x00
|
||||
#define CTRL_GOOD 0x01
|
||||
#define CTRL_BUSY 0x02
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD CBW Definitions"
|
||||
/// This page lists the Command Block Wrapper (CBW) definitions.
|
||||
///
|
||||
/// !Constants
|
||||
/// - MSD_CBW_SIZE
|
||||
/// - MSD_CBW_SIGNATURE
|
||||
///
|
||||
/// !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)
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD CSW Definitions"
|
||||
/// This page lists the Command Status Wrapper (CSW) definitions.
|
||||
///
|
||||
/// !Constants
|
||||
/// - MSD_CSW_SIZE
|
||||
/// - MSD_CSW_SIGNATURE
|
||||
///
|
||||
/// !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)
|
||||
unsigned int dCBWSignature;
|
||||
/// Must be the same as dCSWTag
|
||||
unsigned int dCBWTag;
|
||||
/// Number of bytes transfer
|
||||
unsigned int dCBWDataTransferLength;
|
||||
/// Indicates the directin of the transfer:
|
||||
/// 0x80=IN=device-to-host,
|
||||
/// 0x00=OUT=host-to-device
|
||||
unsigned char bmCBWFlags;
|
||||
/// bits 0->3: bCBWLUN
|
||||
unsigned char bCBWLUN :4,
|
||||
bReserved1:4; /// reserved
|
||||
/// bits 0->4: bCBWCBLength
|
||||
unsigned char bCBWCBLength:5,
|
||||
bReserved2 :3; /// reserved
|
||||
/// Command block
|
||||
unsigned char pCommand[16];
|
||||
|
||||
} MSCbw;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// Command Status Wrapper (CSW),
|
||||
/// See Table 5.2, USB Mass Storage Class Bulk-Only Transport.
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct
|
||||
{
|
||||
/// 'USBS' 0x53425355 (little endian)
|
||||
unsigned int dCSWSignature;
|
||||
/// Must be the same as dCBWTag
|
||||
unsigned int 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.
|
||||
unsigned int dCSWDataResidue;
|
||||
/// Indicates the success or failure of the command.
|
||||
unsigned char bCSWStatus;
|
||||
|
||||
} MSCsw;
|
||||
|
||||
#endif //#ifndef MSD_H
|
||||
|
||||
@@ -1,609 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// 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) {
|
||||
|
||||
TRACE_ERROR("cmd=0x%0x h=%d d=%d", cbw->pCommand[0], hostLength, deviceLength);
|
||||
|
||||
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);
|
||||
haltStatus = 1;
|
||||
}
|
||||
|
||||
// STALL Bulk OUT endpoint ?
|
||||
if ((commandState->postprocess & MSDD_CASE_STALL_OUT) != 0) {
|
||||
|
||||
TRACE_INFO_WP("StallOut ");
|
||||
MSDD_Halt(MSDD_CASE_STALL_OUT);
|
||||
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;
|
||||
status = MSDD_Read(cbw,
|
||||
MSD_CBW_SIZE,
|
||||
(TransferCallback) MSDDriver_Callback,
|
||||
(void *) transfer);
|
||||
|
||||
// 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);
|
||||
|
||||
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);
|
||||
|
||||
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
|
||||
status = MSDD_Write(csw,
|
||||
MSD_CSW_SIZE,
|
||||
(TransferCallback) MSDDriver_Callback,
|
||||
(void *) transfer);
|
||||
|
||||
// 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) {
|
||||
|
||||
pMsdDriver->state = MSDD_STATE_SEND_CSW;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1,264 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// \unit
|
||||
/// !Purpose
|
||||
///
|
||||
/// Definitions, structs, functions required by a Mass Storage device driver
|
||||
/// state machine..
|
||||
///
|
||||
/// !Usage
|
||||
///
|
||||
/// - For a USB device:
|
||||
/// -# MSDD_Write, MSDD_Read, MSDD_Halt should be defined for
|
||||
/// usage in the state machine procedure.
|
||||
///
|
||||
/// -# MSDD_StateMachine is invoked to run the MSD state machine.
|
||||
///
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef MSDDSTATEMACHINE_H
|
||||
#define MSDDSTATEMACHINE_H
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Headers
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "MSD.h"
|
||||
#include "MSDLun.h"
|
||||
#include "debug.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD Driver Possible states"
|
||||
/// ...
|
||||
///
|
||||
/// !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)
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD Driver Result Codes"
|
||||
/// This page lists result codes for MSD functions.
|
||||
///
|
||||
/// !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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD Driver Action Cases"
|
||||
/// This page lists actions to perform during the post-processing phase of a
|
||||
/// command.
|
||||
///
|
||||
/// !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)
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD Driver Xfr Directions"
|
||||
/// This page lists possible direction values for a data transfer
|
||||
///
|
||||
/// !Directions
|
||||
/// - MSDD_DEVICE_TO_HOST
|
||||
/// - MSDD_HOST_TO_DEVICE
|
||||
/// - MSDD_NO_TRANSFER
|
||||
|
||||
#define MSDD_DEVICE_TO_HOST 0
|
||||
#define MSDD_HOST_TO_DEVICE 1
|
||||
#define MSDD_NO_TRANSFER 2
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Types
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
//! \brief Structure for holding the result of a USB transfer
|
||||
//! \see MSDDriver_Callback
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
volatile unsigned int transferred; /// Number of bytes transferred
|
||||
volatile unsigned int remaining; /// Number of bytes not transferred
|
||||
volatile unsigned short semaphore; /// Semaphore to indicate transfer completion
|
||||
volatile unsigned short status; /// Operation result code
|
||||
|
||||
} MSDTransfer;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
//! \brief Status of an executing command
|
||||
//! \see MSDCbw
|
||||
//! \see MSDCsw
|
||||
//! \see MSDTransfer
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
MSDTransfer transfer; /// Current transfer status (USB)
|
||||
MSDTransfer disktransfer;/// Current transfer status (Disk)
|
||||
unsigned int length; /// Remaining length of command
|
||||
MSCbw cbw; /// Received CBW (31 bytes)
|
||||
unsigned char state; /// Current command state
|
||||
MSCsw csw; /// CSW to send (13 bytes)
|
||||
unsigned char postprocess; /// Actions to perform when command is complete
|
||||
|
||||
} MSDCommandState;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief MSD driver state variables
|
||||
/// \see MSDCommandState
|
||||
/// \see MSDLun
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
/// LUN list for the %device.
|
||||
MSDLun *luns;
|
||||
/// State of the currently executing command
|
||||
MSDCommandState commandState;
|
||||
/// Maximum LUN index
|
||||
unsigned char maxLun;
|
||||
/// Current state of the driver
|
||||
unsigned char state;
|
||||
/// Indicates if the driver is waiting for a reset recovery
|
||||
unsigned char 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,
|
||||
unsigned char status,
|
||||
unsigned int transferred,
|
||||
unsigned int remaining)
|
||||
{
|
||||
TRACE_DEBUG("Cbk ");
|
||||
transfer->semaphore++;
|
||||
transfer->status = status;
|
||||
transfer->transferred = transferred;
|
||||
transfer->remaining = remaining;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Driver functions
|
||||
//-----------------------------------------------------------------------------
|
||||
//- MSD General support function
|
||||
extern char MSDD_Read(
|
||||
void* pData,
|
||||
unsigned int dLength,
|
||||
TransferCallback fCallback,
|
||||
void* pArgument);
|
||||
|
||||
extern char MSDD_Write(
|
||||
void* pData,
|
||||
unsigned int dLength,
|
||||
TransferCallback fCallback,
|
||||
void* pArgument);
|
||||
|
||||
extern void MSDD_Halt(unsigned int stallCase);
|
||||
|
||||
extern unsigned int MSDD_IsHalted(void);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
extern void MSDD_StateMachine(MSDDriver * pMsdDriver);
|
||||
|
||||
#endif // #define MSDDSTATEMACHINE_H
|
||||
|
||||
@@ -1,343 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Includes
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include <Media.h>
|
||||
#include "MSDDriver.h"
|
||||
#include "MSDDriverDescriptors.h"
|
||||
#include "SBCMethods.h"
|
||||
#include "debug.h"
|
||||
#include <usb/common/core/USBGenericRequest.h>
|
||||
#include <usb/common/core/USBFeatureRequest.h>
|
||||
#include <usb/device/core/USBD.h>
|
||||
#include <usb/device/core/USBDCallbacks.h>
|
||||
#include <usb/device/core/USBDDriver.h>
|
||||
#include <usb/device/core/USBDDriverCallbacks.h>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Internal variables
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
/// Mass storage device driver instance.
|
||||
static MSDDriver msdDriver;
|
||||
|
||||
/// Standard device driver instance.
|
||||
static USBDDriver usbdDriver;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Internal functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Resets the state of the MSD driver
|
||||
//-----------------------------------------------------------------------------
|
||||
static void MSDDriver_Reset(void)
|
||||
{
|
||||
TRACE_INFO_WP("MSDReset ");
|
||||
|
||||
msdDriver.state = MSDD_STATE_READ_CBW;
|
||||
msdDriver.waitResetRecovery = 0;
|
||||
msdDriver.commandState.state = 0;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Callback re-implementation
|
||||
//-----------------------------------------------------------------------------
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Invoked when a new SETUP request is received from the host. Forwards the
|
||||
/// request to the Mass Storage device driver handler function.
|
||||
/// \param request Pointer to a USBGenericRequest instance.
|
||||
//-----------------------------------------------------------------------------
|
||||
void USBDCallbacks_RequestReceived(const USBGenericRequest *request)
|
||||
{
|
||||
MSDDriver_RequestHandler(request);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Invoked when the configuration of the device changes. Resets the mass
|
||||
/// storage driver.
|
||||
/// \param cfgnum New configuration number.
|
||||
//-----------------------------------------------------------------------------
|
||||
void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum)
|
||||
{
|
||||
if (cfgnum > 0) {
|
||||
|
||||
MSDDriver_Reset();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Driver functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Reads from host through MSD defined bulk OUT pipe. Act as USBD_Read but by
|
||||
/// a fixed OUT endpoint.
|
||||
/// \param data Pointer to the data buffer that contains data read from host.
|
||||
/// \param size The number of bytes should be read (buffer size).
|
||||
/// \param callback Pointer to the function invoked on end of reading.
|
||||
/// \param argument Pointer to additional argument data struct.
|
||||
//-----------------------------------------------------------------------------
|
||||
char MSDD_Read(void *data,
|
||||
unsigned int size,
|
||||
TransferCallback callback,
|
||||
void *argument)
|
||||
|
||||
{
|
||||
return USBD_Read(MSDDriverDescriptors_BULKOUT,
|
||||
data,
|
||||
size,
|
||||
callback,
|
||||
argument);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Writes to host through MSD defined bulk IN pipe. Act as USBD_Write but by
|
||||
/// a fixed IN endpoint.
|
||||
/// \param data Pointer to the data that writes to the host.
|
||||
/// \param size The number of bytes should be write.
|
||||
/// \param callback Pointer to the function invoked on end of writing.
|
||||
/// \param argument Pointer to additional argument data struct.
|
||||
//-----------------------------------------------------------------------------
|
||||
char MSDD_Write(void *data,
|
||||
unsigned int size,
|
||||
TransferCallback callback,
|
||||
void *argument)
|
||||
{
|
||||
return USBD_Write(MSDDriverDescriptors_BULKIN,
|
||||
data,
|
||||
size,
|
||||
callback,
|
||||
argument);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// HALT Specified USB pipe.
|
||||
/// \param stallCASE Case of the stall condition (Bulk In/Out/Both).
|
||||
//-----------------------------------------------------------------------------
|
||||
void MSDD_Halt(unsigned int stallCASE)
|
||||
{
|
||||
if (stallCASE & MSDD_CASE_STALL_OUT) {
|
||||
|
||||
USBD_Halt(MSDDriverDescriptors_BULKOUT);
|
||||
}
|
||||
|
||||
if (stallCASE & MSDD_CASE_STALL_IN) {
|
||||
|
||||
USBD_Halt(MSDDriverDescriptors_BULKIN);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Return halted status
|
||||
/// \return stallCASE bitmap, case of the stall condition
|
||||
/// (bit: MSDD_CASE_STALL_OUT or MSDD_CASE_STALL_IN)
|
||||
//-----------------------------------------------------------------------------
|
||||
unsigned int MSDD_IsHalted(void)
|
||||
{
|
||||
unsigned int stallCASE = 0;
|
||||
if (USBD_IsHalted(MSDDriverDescriptors_BULKOUT)) {
|
||||
|
||||
stallCASE |= MSDD_CASE_STALL_OUT;
|
||||
}
|
||||
if (USBD_IsHalted(MSDDriverDescriptors_BULKIN)) {
|
||||
|
||||
stallCASE |= MSDD_CASE_STALL_IN;
|
||||
}
|
||||
return stallCASE;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Initializes the MSD driver and the associated USB driver.
|
||||
/// \param luns Pointer to a list of LUNs
|
||||
/// \param numLuns Number of LUN in list
|
||||
/// \see MSDLun
|
||||
//-----------------------------------------------------------------------------
|
||||
void MSDDriver_Initialize(MSDLun *defLuns, unsigned char numLuns)
|
||||
{
|
||||
|
||||
TRACE_INFO("MSD init\n\r");
|
||||
|
||||
// Command state initialization
|
||||
msdDriver.commandState.state = 0;
|
||||
msdDriver.commandState.postprocess = 0;
|
||||
msdDriver.commandState.length = 0;
|
||||
msdDriver.commandState.transfer.semaphore = 0;
|
||||
|
||||
// LUNs
|
||||
msdDriver.luns = defLuns;
|
||||
msdDriver.maxLun = (unsigned char) (numLuns - 1);
|
||||
|
||||
// Reset BOT driver
|
||||
MSDDriver_Reset();
|
||||
|
||||
// Init the USB driver
|
||||
USBDDriver_Initialize(&usbdDriver, &msdDriverDescriptors, 0);
|
||||
USBD_Init();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Handler for incoming SETUP requests on default Control endpoint 0.
|
||||
///
|
||||
/// Standard requests are forwarded to the USBDDriver_RequestHandler
|
||||
/// method.
|
||||
/// \param request Pointer to a USBGenericRequest instance
|
||||
//-----------------------------------------------------------------------------
|
||||
void MSDDriver_RequestHandler(const USBGenericRequest *request)
|
||||
{
|
||||
TRACE_INFO_WP("NewReq ");
|
||||
|
||||
// Handle requests
|
||||
switch (USBGenericRequest_GetRequest(request)) {
|
||||
//---------------------
|
||||
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 (!msdDriver.waitResetRecovery) {
|
||||
|
||||
// Forward the request to the standard handler
|
||||
USBDDriver_RequestHandler(&usbdDriver, request);
|
||||
}
|
||||
else {
|
||||
|
||||
TRACE_INFO_WP("No ");
|
||||
}
|
||||
|
||||
USBD_Write(0, 0, 0, 0, 0);
|
||||
break;
|
||||
|
||||
//------
|
||||
default:
|
||||
//------
|
||||
// Forward the request to the standard handler
|
||||
USBDDriver_RequestHandler(&usbdDriver, request);
|
||||
}
|
||||
break;
|
||||
|
||||
//-------------------
|
||||
case MSD_GET_MAX_LUN:
|
||||
//-------------------
|
||||
TRACE_INFO_WP("gMaxLun ");
|
||||
|
||||
// Check request parameters
|
||||
if ((request->wValue == 0)
|
||||
&& (request->wIndex == 0)
|
||||
&& (request->wLength == 1)) {
|
||||
|
||||
USBD_Write(0, &(msdDriver.maxLun), 1, 0, 0);
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
TRACE_WARNING(
|
||||
"MSDDriver_RequestHandler: GetMaxLUN(%d,%d,%d)\n\r",
|
||||
request->wValue, request->wIndex, request->wLength);
|
||||
USBD_Stall(0);
|
||||
}
|
||||
break;
|
||||
|
||||
//-----------------------
|
||||
case MSD_BULK_ONLY_RESET:
|
||||
//-----------------------
|
||||
TRACE_INFO_WP("Rst ");
|
||||
|
||||
// Check parameters
|
||||
if ((request->wValue == 0)
|
||||
&& (request->wIndex == 0)
|
||||
&& (request->wLength == 0)) {
|
||||
|
||||
// Reset the MSD driver
|
||||
MSDDriver_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);
|
||||
}
|
||||
break;
|
||||
|
||||
//------
|
||||
default:
|
||||
//------
|
||||
// Forward request to standard handler
|
||||
USBDDriver_RequestHandler(&usbdDriver, request);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// State machine for the MSD driver
|
||||
//-----------------------------------------------------------------------------
|
||||
void MSDDriver_StateMachine(void)
|
||||
{
|
||||
if (USBD_GetState() < USBD_STATE_CONFIGURED){}
|
||||
else MSDD_StateMachine(&msdDriver);
|
||||
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// Starts a remote wake-up sequence if the host has explicitely enabled it
|
||||
/// by sending the appropriate SET_FEATURE request.
|
||||
//-----------------------------------------------------------------------------
|
||||
void MSDDriver_RemoteWakeUp(void)
|
||||
{
|
||||
// Remote wake-up has been enabled
|
||||
if (USBDDriver_IsRemoteWakeUpEnabled(&usbdDriver)) {
|
||||
|
||||
USBD_RemoteWakeUp();
|
||||
}
|
||||
// Remote wake-up NOT enabled
|
||||
else {
|
||||
|
||||
TRACE_WARNING(
|
||||
"MSD..RemoteWakeUp: Host has not enabled remote wake-up\n\r");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
/// !Purpose
|
||||
///
|
||||
/// Mass storage %device driver implementation.
|
||||
///
|
||||
/// !Usage
|
||||
///
|
||||
/// -# Enable and setup USB related pins (see pio & board.h).
|
||||
/// -# Configure the memory interfaces used for Mass Storage LUNs
|
||||
/// (see memories, MSDLun.h).
|
||||
/// -# 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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "MSD.h"
|
||||
#include "MSDLun.h"
|
||||
// #include <utility/trace.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Global functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern void MSDDriver_Initialize(MSDLun *luns, unsigned char numLuns);
|
||||
|
||||
extern void MSDDriver_RequestHandler(const USBGenericRequest *request);
|
||||
|
||||
extern void MSDDriver_StateMachine(void);
|
||||
|
||||
extern void MSDDriver_RemoteWakeUp(void);
|
||||
|
||||
extern void MSDDriver_DataCallback(unsigned char isRead,
|
||||
unsigned int dataLength,
|
||||
unsigned int nullCnt,
|
||||
unsigned int fullCnt);
|
||||
|
||||
#endif // #ifndef MSDDRIVER_H
|
||||
|
||||
@@ -1,395 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "MSDDriverDescriptors.h"
|
||||
#include <board.h>
|
||||
#include <usb/common/core/USBGenericDescriptor.h>
|
||||
#include <usb/common/core/USBDeviceDescriptor.h>
|
||||
#include <usb/common/core/USBConfigurationDescriptor.h>
|
||||
#include <usb/common/core/USBInterfaceDescriptor.h>
|
||||
#include <usb/common/core/USBEndpointDescriptor.h>
|
||||
#include <usb/common/core/USBStringDescriptor.h>
|
||||
#include <usb/common/massstorage/MSDeviceDescriptor.h>
|
||||
#include <usb/common/massstorage/MSInterfaceDescriptor.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Internal definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD Device Descriptor IDs"
|
||||
/// ...
|
||||
/// !IDs
|
||||
/// - MSDDriverDescriptors_VENDORID
|
||||
/// - MSDDriverDescriptors_PRODUCTID
|
||||
/// - MSDDriverDescriptors_RELEASE
|
||||
|
||||
/// Vendor ID for the Mass Storage device driver.
|
||||
#define MSDDriverDescriptors_VENDORID 0x03EB
|
||||
/// Product ID for the Mass Storage device driver.
|
||||
#ifdef HID
|
||||
#define HIDMSDDDriverDescriptors_PRODUCTID 0x6135
|
||||
#else
|
||||
#define MSDDriverDescriptors_PRODUCTID 0x6129
|
||||
#endif
|
||||
/// Device release number for the Mass Storage device driver.
|
||||
#define MSDDriverDescriptors_RELEASE 0x0100
|
||||
|
||||
#ifdef HID
|
||||
/** Address of the HID interrupt IN endpoint. */
|
||||
#define HIDD_Descriptors_INTERRUPTIN 1
|
||||
/** Address of the HID interrupt OUT endpoint. */
|
||||
#define HIDD_Descriptors_INTERRUPTOUT 2
|
||||
/** Address of the Mass Storage bulk-out endpoint. */
|
||||
#define MSDD_Descriptors_BULKOUT 4
|
||||
/** Address of the Mass Storage bulk-in endpoint. */
|
||||
#define MSDD_Descriptors_BULKIN 5
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Macros
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/// Returns the minimum between two values.
|
||||
#define MIN(a, b) ((a < b) ? a : b)
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Internal types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// List of configuration descriptors used by a Mass Storage device driver.
|
||||
//------------------------------------------------------------------------------
|
||||
#ifndef HID
|
||||
typedef struct {
|
||||
|
||||
/// 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;
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Local variables
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifdef HID
|
||||
/** Standard USB device descriptor for the composite device driver */
|
||||
static const USBDeviceDescriptor deviceDescriptor =
|
||||
{
|
||||
|
||||
sizeof(USBDeviceDescriptor),
|
||||
USBGenericDescriptor_DEVICE,
|
||||
USBDeviceDescriptor_USB2_00,
|
||||
0x00,
|
||||
0x00,
|
||||
0x00,
|
||||
CHIP_USB_ENDPOINTS_MAXPACKETSIZE(0),
|
||||
HIDMSDDDriverDescriptors_VENDORID,
|
||||
HIDMSDDDriverDescriptors_PRODUCTID,
|
||||
HIDMSDDDriverDescriptors_RELEASE,
|
||||
// 0, /* No string descriptor for manufacturer */
|
||||
// 1, /* Index of product string descriptor is #1 */
|
||||
// 0, /* No string descriptor for serial number */
|
||||
1, // Manufacturer string descriptor index.
|
||||
2, // Product string descriptor index.
|
||||
3, // Serial number string descriptor index.
|
||||
1 /* Device has 1 possible configuration */
|
||||
};
|
||||
#else
|
||||
/// Mass storage driver device descriptor.
|
||||
static const USBDeviceDescriptor deviceDescriptor = {
|
||||
|
||||
sizeof(USBDeviceDescriptor),
|
||||
USBGenericDescriptor_DEVICE,
|
||||
USBDeviceDescriptor_USB2_00,
|
||||
MSDeviceDescriptor_CLASS,
|
||||
MSDeviceDescriptor_SUBCLASS,
|
||||
MSDeviceDescriptor_PROTOCOL,
|
||||
CHIP_USB_ENDPOINTS_MAXPACKETSIZE(0),
|
||||
MSDDriverDescriptors_VENDORID,
|
||||
MSDDriverDescriptors_PRODUCTID,
|
||||
MSDDriverDescriptors_RELEASE,
|
||||
1, // Manufacturer string descriptor index.
|
||||
2, // Product string descriptor index.
|
||||
3, // Serial number string descriptor index.
|
||||
1 // Device has one possible configuration.
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef HID
|
||||
/** USB FS configuration descriptors for the composite device driver */
|
||||
static const HidMsdDriverConfigurationDescriptors configurationDescriptorsFS =
|
||||
{
|
||||
|
||||
/* Standard configuration descriptor */
|
||||
{
|
||||
sizeof(USBConfigurationDescriptor),
|
||||
USBGenericDescriptor_CONFIGURATION,
|
||||
sizeof(HidMsdDriverConfigurationDescriptors),
|
||||
HIDMSDDriverDescriptors_NUMINTERFACE,
|
||||
1, /* This is configuration #1 */
|
||||
0, /* No string descriptor for this configuration */
|
||||
BOARD_USB_BMATTRIBUTES,
|
||||
USBConfigurationDescriptor_POWER(100)
|
||||
},
|
||||
|
||||
/* Interface descriptor */
|
||||
{
|
||||
sizeof(USBInterfaceDescriptor),
|
||||
USBGenericDescriptor_INTERFACE,
|
||||
HIDMSDDriverDescriptors_HID_INTERFACE,
|
||||
0, /* This is alternate setting #0 */
|
||||
2, /* Two endpoints used */
|
||||
HIDInterfaceDescriptor_CLASS,
|
||||
HIDInterfaceDescriptor_SUBCLASS_NONE,
|
||||
HIDInterfaceDescriptor_PROTOCOL_NONE,
|
||||
0 /* No associated string descriptor */
|
||||
},
|
||||
/* HID descriptor */
|
||||
{
|
||||
sizeof(HIDDescriptor1),
|
||||
HIDGenericDescriptor_HID,
|
||||
HIDDescriptor_HID1_11,
|
||||
0, /* Device is not localized, no country code */
|
||||
1, /* One HID-specific descriptor (apart from this one) */
|
||||
HIDGenericDescriptor_REPORT,
|
||||
HIDDKeyboard_REPORTDESCRIPTORSIZE
|
||||
},
|
||||
/* Interrupt IN endpoint descriptor */
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS(
|
||||
USBEndpointDescriptor_IN,
|
||||
HIDD_Descriptors_INTERRUPTIN),
|
||||
USBEndpointDescriptor_INTERRUPT,
|
||||
sizeof(HIDDKeyboardInputReport),
|
||||
HIDDKeyboardDescriptors_INTERRUPTIN_POLLING_FS
|
||||
},
|
||||
/* Interrupt OUT endpoint descriptor */
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS(
|
||||
USBEndpointDescriptor_OUT,
|
||||
HIDD_Descriptors_INTERRUPTOUT),
|
||||
USBEndpointDescriptor_INTERRUPT,
|
||||
sizeof(HIDDKeyboardOutputReport),
|
||||
HIDDKeyboardDescriptors_INTERRUPTIN_POLLING_FS
|
||||
},
|
||||
|
||||
/* Mass Storage interface descriptor. */
|
||||
{
|
||||
sizeof(USBInterfaceDescriptor),
|
||||
USBGenericDescriptor_INTERFACE,
|
||||
HIDMSDDriverDescriptors_MSD_INTERFACE,
|
||||
0, /* This is alternate setting #0. */
|
||||
2, /* Interface uses two endpoints. */
|
||||
MSInterfaceDescriptor_CLASS,
|
||||
MSInterfaceDescriptor_SCSI,
|
||||
MSInterfaceDescriptor_BULKONLY,
|
||||
0 /* No string descriptor for interface. */
|
||||
},
|
||||
/* Bulk-OUT endpoint descriptor */
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS(
|
||||
USBEndpointDescriptor_OUT,
|
||||
MSDD_Descriptors_BULKOUT), //MSDDriverDescriptors_BULKOUT
|
||||
USBEndpointDescriptor_BULK,
|
||||
MIN(CHIP_USB_ENDPOINTS_MAXPACKETSIZE(MSDD_Descriptors_BULKOUT),//MSDDriverDescriptors_BULKOUT
|
||||
USBEndpointDescriptor_MAXBULKSIZE_FS),
|
||||
0 /* No string descriptor for endpoint. */
|
||||
},
|
||||
/* Bulk-IN endpoint descriptor */
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS(
|
||||
USBEndpointDescriptor_IN,
|
||||
MSDD_Descriptors_BULKIN), //MSDDriverDescriptors_BULKIN
|
||||
USBEndpointDescriptor_BULK,
|
||||
MIN(CHIP_USB_ENDPOINTS_MAXPACKETSIZE(MSDD_Descriptors_BULKIN),//MSDDriverDescriptors_BULKIN
|
||||
USBEndpointDescriptor_MAXBULKSIZE_FS),
|
||||
0 /* No string descriptor for endpoint. */
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#else
|
||||
/// Full-speed configuration descriptor.
|
||||
static const MSDConfigurationDescriptors configurationDescriptorsFS = {
|
||||
|
||||
// Standard configuration descriptor.
|
||||
{
|
||||
sizeof(USBConfigurationDescriptor),
|
||||
USBGenericDescriptor_CONFIGURATION,
|
||||
sizeof(MSDConfigurationDescriptors),
|
||||
1, // Configuration has one interface.
|
||||
1, // This is configuration #1.
|
||||
0, // No string descriptor for configuration.
|
||||
BOARD_USB_BMATTRIBUTES,
|
||||
USBConfigurationDescriptor_POWER(100)
|
||||
},
|
||||
// Mass Storage interface descriptor.
|
||||
{
|
||||
sizeof(USBInterfaceDescriptor),
|
||||
USBGenericDescriptor_INTERFACE,
|
||||
0, // This is interface #0.
|
||||
0, // This is alternate setting #0.
|
||||
2, // Interface uses two endpoints.
|
||||
MSInterfaceDescriptor_CLASS,
|
||||
MSInterfaceDescriptor_SCSI,
|
||||
MSInterfaceDescriptor_BULKONLY,
|
||||
0 // No string descriptor for interface.
|
||||
},
|
||||
// Bulk-OUT endpoint descriptor
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS(
|
||||
USBEndpointDescriptor_OUT,
|
||||
MSDDriverDescriptors_BULKOUT),
|
||||
USBEndpointDescriptor_BULK,
|
||||
MIN(CHIP_USB_ENDPOINTS_MAXPACKETSIZE(MSDDriverDescriptors_BULKOUT),
|
||||
USBEndpointDescriptor_MAXBULKSIZE_FS),
|
||||
0 // Must be 0 for full-speed Bulk endpoints.
|
||||
},
|
||||
// Bulk-IN endpoint descriptor
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS(
|
||||
USBEndpointDescriptor_IN,
|
||||
MSDDriverDescriptors_BULKIN),
|
||||
USBEndpointDescriptor_BULK,
|
||||
MIN(CHIP_USB_ENDPOINTS_MAXPACKETSIZE(MSDDriverDescriptors_BULKIN),
|
||||
USBEndpointDescriptor_MAXBULKSIZE_FS),
|
||||
0 // Must be 0 for full-speed Bulk endpoints.
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
/// Language ID string descriptor.
|
||||
static const unsigned char languageIdDescriptor[] = {
|
||||
|
||||
USBStringDescriptor_LENGTH(1),
|
||||
USBGenericDescriptor_STRING,
|
||||
USBStringDescriptor_ENGLISH_US
|
||||
};
|
||||
|
||||
/// Manufacturer string descriptor.
|
||||
static const unsigned char manufacturerDescriptor[] = {
|
||||
|
||||
USBStringDescriptor_LENGTH(7),
|
||||
USBGenericDescriptor_STRING,
|
||||
USBStringDescriptor_UNICODE('9'),
|
||||
USBStringDescriptor_UNICODE('X'),
|
||||
USBStringDescriptor_UNICODE(' '),
|
||||
USBStringDescriptor_UNICODE('T'),
|
||||
USBStringDescriptor_UNICODE('E'),
|
||||
USBStringDescriptor_UNICODE('A'),
|
||||
USBStringDescriptor_UNICODE('M'),
|
||||
};
|
||||
|
||||
/// Product string descriptor.
|
||||
static const unsigned char productDescriptor[] = {
|
||||
|
||||
USBStringDescriptor_LENGTH(5),
|
||||
USBGenericDescriptor_STRING,
|
||||
USBStringDescriptor_UNICODE('S'),
|
||||
USBStringDescriptor_UNICODE('K'),
|
||||
USBStringDescriptor_UNICODE('Y'),
|
||||
USBStringDescriptor_UNICODE('9'),
|
||||
USBStringDescriptor_UNICODE('X'),
|
||||
};
|
||||
|
||||
/// Serial number string descriptor. The serial number must be at least 12
|
||||
/// characters long and made up of only letters & numbers to be compliant with
|
||||
/// the MSD specification.
|
||||
static const unsigned char serialNumberDescriptor[] = {
|
||||
|
||||
USBStringDescriptor_LENGTH(12),
|
||||
USBGenericDescriptor_STRING,
|
||||
USBStringDescriptor_UNICODE('0'),
|
||||
USBStringDescriptor_UNICODE('1'),
|
||||
USBStringDescriptor_UNICODE('2'),
|
||||
USBStringDescriptor_UNICODE('3'),
|
||||
USBStringDescriptor_UNICODE('4'),
|
||||
USBStringDescriptor_UNICODE('5'),
|
||||
USBStringDescriptor_UNICODE('6'),
|
||||
USBStringDescriptor_UNICODE('7'),
|
||||
USBStringDescriptor_UNICODE('8'),
|
||||
USBStringDescriptor_UNICODE('9'),
|
||||
USBStringDescriptor_UNICODE('A'),
|
||||
USBStringDescriptor_UNICODE('B')
|
||||
};
|
||||
|
||||
/// List of all string descriptors used.
|
||||
static const unsigned char *stringDescriptors[] = {
|
||||
|
||||
languageIdDescriptor,
|
||||
manufacturerDescriptor,
|
||||
productDescriptor,
|
||||
serialNumberDescriptor
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Global variables
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/// List of the standard descriptors used by the Mass Storage driver.
|
||||
const USBDDriverDescriptors msdDriverDescriptors = {
|
||||
|
||||
&deviceDescriptor,
|
||||
(USBConfigurationDescriptor *) &configurationDescriptorsFS,
|
||||
0, // No full-speed device qualifier descriptor
|
||||
0, // No full-speed other speed configuration
|
||||
0, // No high-speed device descriptor
|
||||
0, // No high-speed configuration descriptor
|
||||
0, // No high-speed device qualifier descriptor
|
||||
0, // No high-speed other speed configuration descriptor
|
||||
stringDescriptors,
|
||||
4 // Four string descriptors in array
|
||||
};
|
||||
|
||||
@@ -1,83 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
/// !Purpose
|
||||
///
|
||||
/// Definitions of the descriptors required by a Mass Storage device driver.
|
||||
///
|
||||
/// !Usage
|
||||
///
|
||||
/// - For a USB %device:
|
||||
/// -# When initializing a USBDDriver instance, use msdDriverDescriptors as
|
||||
/// the list of standard descriptors.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifndef MSDDRIVERDESCRIPTORS_H
|
||||
#define MSDDRIVERDESCRIPTORS_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include <usb/device/core/USBDDriverDescriptors.h>
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD endpoint addresses"
|
||||
/// This page lists the addresses used by the Mass Storage driver %endpoints.
|
||||
///
|
||||
/// !Addresses
|
||||
///
|
||||
/// - MSDDriverDescriptors_BULKOUT
|
||||
/// - MSDDriverDescriptors_BULKIN
|
||||
|
||||
/// Address of the Mass Storage bulk-out endpoint.
|
||||
#define MSDDriverDescriptors_BULKOUT 1
|
||||
|
||||
/// Address of the Mass Storage bulk-in endpoint.
|
||||
#if defined(at91sam9m10)
|
||||
#define MSDDriverDescriptors_BULKIN 6
|
||||
#else
|
||||
#define MSDDriverDescriptors_BULKIN 2
|
||||
#endif
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported variables
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern const USBDDriverDescriptors msdDriverDescriptors;
|
||||
|
||||
#endif //#ifndef MSDDRIVERDESCRIPTORS_H
|
||||
|
||||
@@ -1,135 +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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// 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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/// 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,368 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "MSDLun.h"
|
||||
#include "debug.h"
|
||||
#include <usb/device/core/USBD.h>
|
||||
|
||||
#include "usb/device/massstorage/MSDDriver.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, // ???
|
||||
{'E','R','S','K','Y','9','X',' '},
|
||||
{'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,
|
||||
unsigned char *ioBuffer,
|
||||
unsigned int ioBufferSize,
|
||||
unsigned int baseAddress,
|
||||
unsigned int size,
|
||||
unsigned short blockSize,
|
||||
unsigned char protected,
|
||||
void (*dataMonitor)(unsigned char flowDirection,
|
||||
unsigned int dataLength,
|
||||
unsigned int fifoNullCount,
|
||||
unsigned int fifoFullCount))
|
||||
{
|
||||
unsigned int 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
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char 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
|
||||
//! \return Operation result code
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char LUN_Write(MSDLun *lun,
|
||||
unsigned int blockAddress,
|
||||
void *data,
|
||||
unsigned int length,
|
||||
TransferCallback callback,
|
||||
void *argument)
|
||||
{
|
||||
unsigned int medBlk, medLen;
|
||||
unsigned char 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
|
||||
//! \return Operation result code
|
||||
//------------------------------------------------------------------------------
|
||||
unsigned char LUN_Read(MSDLun *lun,
|
||||
unsigned int blockAddress,
|
||||
void *data,
|
||||
unsigned int length,
|
||||
TransferCallback callback,
|
||||
void *argument)
|
||||
{
|
||||
unsigned int medBlk, medLen;
|
||||
unsigned char 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;
|
||||
}
|
||||
@@ -1,161 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
/// !Purpose
|
||||
///
|
||||
/// Logical Unit Number (LUN) used by the Mass Storage driver and the SCSI
|
||||
/// protocol. Represents a logical hard-drive.
|
||||
///
|
||||
/// !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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "SBC.h"
|
||||
#include <Media.h>
|
||||
#include <usb/device/massstorage/MSDIOFifo.h>
|
||||
#include <usb/device/core/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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Structures
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/// 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)(unsigned char flowDirection,
|
||||
unsigned int dataLength,
|
||||
unsigned int fifoNullCount,
|
||||
unsigned int fifoFullCount);
|
||||
/// The start position of the media (blocks) allocated to the LUN.
|
||||
unsigned int baseAddress;
|
||||
/// The size of the media (blocks) allocated to the LUN.
|
||||
unsigned int size;
|
||||
/// Sector size of the media in number of media blocks
|
||||
unsigned short blockSize;
|
||||
/// The LUN can be readonly even the media is writable
|
||||
#ifdef __cplusplus
|
||||
unsigned char protectd;
|
||||
#else
|
||||
unsigned char protected;
|
||||
#endif
|
||||
|
||||
/// The LUN status (Ejected/Changed/)
|
||||
unsigned char 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,
|
||||
unsigned char *ioBuffer,
|
||||
unsigned int ioBufferSize,
|
||||
unsigned int baseAddress,
|
||||
unsigned int size,
|
||||
unsigned short blockSize,
|
||||
#ifdef __cplusplus
|
||||
unsigned char protectd,
|
||||
#else
|
||||
unsigned char protected,
|
||||
#endif
|
||||
void (*dataMonitor)(unsigned char flowDirection,
|
||||
unsigned int dataLength,
|
||||
unsigned int fifoNullCount,
|
||||
unsigned int fifoFullCount));
|
||||
|
||||
extern unsigned char LUN_Eject(MSDLun *lun);
|
||||
|
||||
extern unsigned char LUN_Write(MSDLun *lun,
|
||||
unsigned int blockAddress,
|
||||
void *data,
|
||||
unsigned int length,
|
||||
TransferCallback callback,
|
||||
void *argument);
|
||||
|
||||
extern unsigned char LUN_Read(MSDLun *lun,
|
||||
unsigned int blockAddress,
|
||||
void *data,
|
||||
unsigned int length,
|
||||
TransferCallback callback,
|
||||
void *argument);
|
||||
|
||||
#endif //#ifndef MSDLUN_H
|
||||
|
||||
@@ -1,653 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
/// !Purpose
|
||||
///
|
||||
/// SCSI definitions.
|
||||
///
|
||||
/// !Usage
|
||||
///
|
||||
/// -# After command block received, Access and decode the SCSI command block
|
||||
/// with SBCCommand structure.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifndef SBC_H
|
||||
#define SBC_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "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
|
||||
///
|
||||
/// !Codes
|
||||
/// - SBC_INQUIRY
|
||||
/// - SBC_READ_10
|
||||
/// - SBC_READ_CAPACITY_10
|
||||
/// - SBC_REQUEST_SENSE
|
||||
/// - SBC_TEST_UNIT_READY
|
||||
/// - SBC_WRITE_10
|
||||
///
|
||||
/// !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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "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
|
||||
///
|
||||
/// !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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "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
|
||||
///
|
||||
/// !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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "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
|
||||
///
|
||||
/// !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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "SBC Sense Keys"
|
||||
/// This page lists sense key values returned in the REQUEST SENSE data
|
||||
/// \see spc4r06.pdf - Section 4.5.6 - Table 27
|
||||
///
|
||||
/// !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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "SBC Sense Additionals"
|
||||
/// This page lists additional sense code values returned in REQUEST SENSE data
|
||||
/// \see spc4r06.pdf - Section 4.5.6 - Table 28
|
||||
///
|
||||
/// !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
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "MSD Endian Macros"
|
||||
/// This page lists the macros for endianness conversion.
|
||||
///
|
||||
/// !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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief Structure for the INQUIRY command
|
||||
/// \see spc4r06.pdf - Section 6.4.1 - Table 81
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief Standard INQUIRY data format returned by the device
|
||||
/// \see spc4r06.pdf - Section 6.4.2 - Table 82
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief Data structure for the READ (10) command
|
||||
/// \see sbc3r07.pdf - Section 5.7 - Table 34
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief Structure for the READ CAPACITY (10) command
|
||||
/// \see sbc3r07.pdf - Section 5.11.1 - Table 40
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
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
|
||||
|
||||
} __attribute__ ((packed)) 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
|
||||
|
||||
} __attribute__ ((packed)) 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
|
||||
|
||||
} __attribute__ ((packed)) 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
|
||||
|
||||
} __attribute__ ((packed)) SBCRequestSenseData;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief Data structure for the TEST UNIT READY command
|
||||
/// \see spc4r06.pdf - Section 6.34 - Table 192
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
unsigned char bOperationCode; //!< 0x00 : SBC_TEST_UNIT_READY
|
||||
unsigned char pReserved1[4]; //!< Reserved bits
|
||||
unsigned char bControl; //!< 0x00
|
||||
|
||||
} __attribute__ ((packed)) SBCTestUnitReady; // GCC
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief Structure for the WRITE (10) command
|
||||
/// \see sbc3r07.pdf - Section 5.26 - Table 70
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
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
|
||||
|
||||
} __attribute__ ((packed)) SBCWrite10;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief Structure for the PREVENT/ALLOW MEDIUM REMOVAL command
|
||||
/// \see sbc3r07.pdf - Section 5.5 - Table 30
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief Structure for the MODE SENSE (6) command
|
||||
/// \see spc4r06 - Section 6.9.1 - Table 98
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief Header for the data returned after a MODE SENSE (6) command
|
||||
/// \see spc4r06.pdf - Section 7.4.3 - Table 268
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief Informational exceptions control mode page
|
||||
/// \see spc4r06.pdf - Section 7.4.11 - Table 285
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \brief Read/write error recovery mode page
|
||||
/// \see sbc3r07.pdf - Section 6.3.5 - Table 122
|
||||
//------------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
|
||||
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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \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 {
|
||||
|
||||
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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,111 +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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
/// !Purpose
|
||||
///
|
||||
/// SCSI commands implementation.
|
||||
///
|
||||
/// !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
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Headers
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include "SBC.h"
|
||||
// #include <nand/MSDLun.h>
|
||||
#include "MSDDStateMachine.h"
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \page "SBC Command States"
|
||||
/// This page lists the possible states of a SBC command.
|
||||
///
|
||||
/// !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