/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the disclaimer below. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \file * \section Purpose * * Mass Storage class definitions. * * See * - * USB Mass Storage Class Spec. Overview * - * USB Mass Storage Class Bulk-Only Transport * * \section Usage * * -# Uses "MSD Requests" to check incoming requests from USB Host. * -# Uses "MSD Subclass Codes" and "MSD Protocol Codes" to fill %device * interface descriptors for a MSD %device. * -# Handle the incoming Bulk data with "MSD CBW Definitions" and MSCbw * structure. * -# Prepare the outgoing Bulk data with "MSD CSW Definitions" and MSCsw * structure. */ #ifndef MSD_H #define MSD_H /** \addtogroup usbd_msd *@{ */ /*------------------------------------------------------------------------------ * Includes *------------------------------------------------------------------------------*/ #include /*------------------------------------------------------------------------------ * Definitions *------------------------------------------------------------------------------*/ /* * MSD Requests * This section lists MSD-specific requests ( Actually for Bulk-only protocol ). * * \section Requests * - MSD_BULK_ONLY_RESET * - MSD_GET_MAX_LUN */ /** Reset the mass storage %device and its associated interface. */ #define MSD_BULK_ONLY_RESET 0xFF /** Return the maximum LUN number supported by the %device. */ #define MSD_GET_MAX_LUN 0xFE /** \addtogroup usbd_msd_subclass MSD Subclass Codes * @{ * This page lists the Subclass Codes for bInterfaceSubClass field. * (Table 2.1, USB Mass Storage Class Spec. Overview) * * \section SubClasses * - MSD_SUBCLASS_RBC * - MSD_SUBCLASS_SFF_MCC * - MSD_SUBCLASS_QIC * - MSD_SUBCLASS_UFI * - MSD_SUBCLASS_SFF * - MSD_SUBCLASS_SCSI */ /** Reduced Block Commands (RBC) T10 */ #define MSD_SUBCLASS_RBC 0x01 /** C/DVD devices */ #define MSD_SUBCLASS_SFF_MCC 0x02 /** Tape device */ #define MSD_SUBCLASS_QIC 0x03 /** Floppy disk drive (FDD) device */ #define MSD_SUBCLASS_UFI 0x04 /** Floppy disk drive (FDD) device */ #define MSD_SUBCLASS_SFF 0x05 /** SCSI transparent command set */ #define MSD_SUBCLASS_SCSI 0x06 /** @} */ /** \addtogroup usbd_msd_protocol_codes MSD Protocol Codes * @{ * This page lists the Transport Protocol codes for MSD. * (Table 3.1, USB Mass Storage Class Spec. Overview) * * \section Protocols * - MSD_PROTOCOL_CBI_COMPLETION * - MSD_PROTOCOL_CBI * - MSD_PROTOCOL_BULK_ONLY */ /** Control/Bulk/Interrupt (CBI) Transport (with command complete interrupt) */ #define MSD_PROTOCOL_CBI_COMPLETION 0x00 /** Control/Bulk/Interrupt (CBI) Transport (no command complete interrupt) */ #define MSD_PROTOCOL_CBI 0x01 /** Bulk-Only Transport */ #define MSD_PROTOCOL_BULK_ONLY 0x50 /** @}*/ /** \addtogroup usbd_msd_cbw_def MSD CBW Definitions * @{ * This page lists the Command Block Wrapper (CBW) definitions. * * \section Constants * - MSD_CBW_SIZE * - MSD_CBW_SIGNATURE * * \section Fields * - MSD_CBW_DEVICE_TO_HOST */ /** Command Block Wrapper Size */ #define MSD_CBW_SIZE 31 /** 'USBC' 0x43425355 */ #define MSD_CBW_SIGNATURE 0x43425355 /** CBW bmCBWFlags field */ #define MSD_CBW_DEVICE_TO_HOST (1 << 7) /** @}*/ /** \addtogroup usbd_msd_csw_def MSD CSW Definitions * @{ * This page lists the Command Status Wrapper (CSW) definitions. * * \section Constants * - MSD_CSW_SIZE * - MSD_CSW_SIGNATURE * * \section Command Block Status Values * (Table 5.3 , USB Mass Storage Class Bulk-Only Transport) * - MSD_CSW_COMMAND_PASSED * - MSD_CSW_COMMAND_FAILED * - MSD_CSW_PHASE_ERROR */ /** Command Status Wrapper Size */ #define MSD_CSW_SIZE 13 /** 'USBS' 0x53425355 */ #define MSD_CSW_SIGNATURE 0x53425355 /** Command Passed (good status) */ #define MSD_CSW_COMMAND_PASSED 0 /** Command Failed */ #define MSD_CSW_COMMAND_FAILED 1 /** Phase Error */ #define MSD_CSW_PHASE_ERROR 2 /** @}*/ /*------------------------------------------------------------------------------ * Structures *------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------ * Command Block Wrapper (CBW), * See Table 5.1, USB Mass Storage Class Bulk-Only Transport. * * The CBW shall start on a packet boundary and shall end as a * short packet with exactly 31 (1Fh) bytes transferred. *------------------------------------------------------------------------------*/ typedef struct { /** 'USBC' 0x43425355 (little endian) */ uint32_t dCBWSignature; /** Must be the same as dCSWTag */ uint32_t dCBWTag; /** Number of bytes transfer */ uint32_t dCBWDataTransferLength; /** Indicates the directin of the transfer: * - 0x80=IN=device-to-host; * - 0x00=OUT=host-to-device */ uint8_t bmCBWFlags; /** bits 0->3: bCBWLUN */ uint8_t bCBWLUN :4, bReserved1:4; /** reserved */ /** bits 0->4: bCBWCBLength */ uint8_t bCBWCBLength:5, bReserved2 :3; /** reserved */ /** Command block */ uint8_t pCommand[16]; } MSCbw; /*------------------------------------------------------------------------------ * Command Status Wrapper (CSW), * See Table 5.2, USB Mass Storage Class Bulk-Only Transport. *------------------------------------------------------------------------------*/ typedef struct { /** 'USBS' 0x53425355 (little endian) */ uint32_t dCSWSignature; /** Must be the same as dCBWTag */ uint32_t dCSWTag; /** * For Data-Out the device shall report in the dCSWDataResidue the * difference between the amount of data expected as stated in the * dCBWDataTransferLength, and the actual amount of data processed by * the device. For Data-In the device shall report in the dCSWDataResidue * the difference between the amount of data expected as stated in the * dCBWDataTransferLength and the actual amount of relevant data sent by * the device. The dCSWDataResidue shall not exceed the value sent in the * dCBWDataTransferLength. */ uint32_t dCSWDataResidue; /** Indicates the success or failure of the command. */ uint8_t bCSWStatus; } MSCsw; /**@}*/ #endif /*#ifndef MSD_H */