/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ---------------------------------------------------------------------------- * Copyright (c) 2008, Atmel Corporation * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the disclaimer below. * * Atmel's name may not be used to endorse or promote products derived from * this software without specific prior written permission. * * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ---------------------------------------------------------------------------- */ /** \file * \section Purpose * * Definitions, structs, functions required by a Mass Storage device driver * state machine.. * * \section Usage * * - For a USB device: * -# MSDD_StateMachine is invoked to run the MSD state machine. * *-----------------------------------------------------------------------------*/ #ifndef MSDDSTATEMACHINE_H #define MSDDSTATEMACHINE_H /** \addtogroup usbd_msd *@{ */ /*----------------------------------------------------------------------------- * Headers *-----------------------------------------------------------------------------*/ #include "MSD.h" #include "MSDLun.h" #include #include /*----------------------------------------------------------------------------- * Definitions *-----------------------------------------------------------------------------*/ /** \addtogroup usbd_msd_driver_possible_states MSD Driver Possible states * @{ * * - MSDD_STATE_READ_CBW * - MSDD_STATE_WAIT_CBW * - MSDD_STATE_PROCESS_CBW * - MSDD_STATE_WAIT_HALT * - MSDD_STATE_SEND_CSW * - MSDD_STATE_WAIT_CSW * - MSDD_STATE_WAIT_RESET */ /** \brief Driver is expecting a command block wrapper */ #define MSDD_STATE_READ_CBW (1 << 0) /** \brief Driver is waiting for the transfer to finish */ #define MSDD_STATE_WAIT_CBW (1 << 1) /** \brief Driver is processing the received command */ #define MSDD_STATE_PROCESS_CBW (1 << 2) /** \brief Driver is halted because pipe halt or wait reset */ #define MSDD_STATE_WAIT_HALT (1 << 3) /** \brief Driver is starting the transmission of a command status wrapper */ #define MSDD_STATE_SEND_CSW (1 << 4) /** \brief Driver is waiting for the CSW transmission to finish */ #define MSDD_STATE_WAIT_CSW (1 << 5) /** \brief Driver is waiting for the MassStorageReset */ #define MSDD_STATE_WAIT_RESET (1 << 6) /** @}*/ /** \addtogroup usbd_msd_driver_result_codes MSD Driver Result Codes * @{ * This page lists result codes for MSD functions. * * \section Codes * - MSDD_STATUS_SUCCESS * - MSDD_STATUS_ERROR * - MSDD_STATUS_INCOMPLETE * - MSDD_STATUS_PARAMETER * - MSDD_STATUS_RW */ /** \brief Method was successful */ #define MSDD_STATUS_SUCCESS 0x00 /** \brief There was an error when trying to perform a method */ #define MSDD_STATUS_ERROR 0x01 /** \brief No error was encountered but the application should call the method again to continue the operation */ #define MSDD_STATUS_INCOMPLETE 0x02 /** \brief A wrong parameter has been passed to the method */ #define MSDD_STATUS_PARAMETER 0x03 /** \brief An error when reading/writing disk (protected or not present) */ #define MSDD_STATUS_RW 0x04 /** @}*/ /** \addtogroup usbd_msd_driver_action_cases MSD Driver Action Cases * @{ * This page lists actions to perform during the post-processing phase of a * command. * * \section Actions * - MSDD_CASE_PHASE_ERROR * - MSDD_CASE_STALL_IN * - MSDD_CASE_STALL_OUT */ /** \brief Indicates that the CSW should report a phase error */ #define MSDD_CASE_PHASE_ERROR (1 << 0) /** \brief The driver should halt the Bulk IN pipe after the transfer */ #define MSDD_CASE_STALL_IN (1 << 1) /** \brief The driver should halt the Bulk OUT pipe after the transfer */ #define MSDD_CASE_STALL_OUT (1 << 2) /** @}*/ /*------------------------------------------------------------------------------ */ /** \addtogroup usbd_msd_driver_xfr_directions MSD Driver Xfr Directions * @{ * This page lists possible direction values for a data transfer * - MSDD_DEVICE_TO_HOST * - MSDD_HOST_TO_DEVICE * - MSDD_NO_TRANSFER */ /** Data transfer from device to host (READ) */ #define MSDD_DEVICE_TO_HOST 0 /** Data transfer from host to device (WRITE) */ #define MSDD_HOST_TO_DEVICE 1 /** No data transfer */ #define MSDD_NO_TRANSFER 2 /** @}*/ /*----------------------------------------------------------------------------- * Types *-----------------------------------------------------------------------------*/ /** * \typedef MSDTransfer * \brief Structure for holding the result of a USB transfer * \see MSDDriver_Callback */ typedef struct _MSDTransfer { uint32_t transferred; /** Number of bytes transferred */ uint32_t remaining; /** Number of bytes not transferred */ volatile uint16_t semaphore; /** Semaphore to indicate transfer completion */ uint16_t status; /** Operation result code */ } MSDTransfer; /** * \typedef MSDCommandState * \brief Status of an executing command * \see MSDCbw * \see MSDCsw * \see MSDTransfer *------------------------------------------------------------------------------*/ typedef struct _MSDCommandState { MSDTransfer transfer; /**< Current transfer status (USB) */ MSDTransfer disktransfer;/**< Current transfer status (Disk) */ uint32_t length; /**< Remaining length of command */ MSCbw cbw; /**< Received CBW (31 bytes) */ uint8_t state; /**< Current command state */ MSCsw csw; /**< CSW to send (13 bytes) */ uint8_t postprocess; /**< Actions to perform when command is complete */ uint8_t pipeIN; /**< Pipe ID for input */ uint8_t pipeOUT; /**< Pipe ID for output */ } MSDCommandState; /** * \typedef MSDDriver * \brief MSD driver state variables * \see MSDCommandState * \see MSDLun */ typedef struct _MSDDriver { /** USB Driver for the %device. */ USBDDriver *pUsbd; /** LUN list for the %device. */ MSDLun *luns; /** State of the currently executing command */ MSDCommandState commandState; /** Associated interface number */ uint8_t interfaceNb; /** Maximum LUN index */ uint8_t maxLun; /** Current state of the driver */ uint8_t state; /** Indicates if the driver is waiting for a reset recovery */ uint8_t waitResetRecovery; } MSDDriver; /*----------------------------------------------------------------------------- * Inline functions *-----------------------------------------------------------------------------*/ /** * This function is to be used as a callback for USB or LUN transfers. * \param transfer Pointer to the transfer structure to update * \param status Operation result code * \param transferred Number of bytes transferred by the command * \param remaining Number of bytes not transferred */ static inline void MSDDriver_Callback(MSDTransfer *transfer, uint8_t status, uint32_t transferred, uint32_t remaining) { TRACE_DEBUG( "Cbk " ) ; transfer->semaphore++; transfer->status = status; transfer->transferred = transferred; transfer->remaining = remaining; } /*----------------------------------------------------------------------------- * Exported functions *-----------------------------------------------------------------------------*/ extern void MSDD_StateMachine(MSDDriver * pMsdDriver); /**@}*/ #endif /* #define MSDDSTATEMACHINE_H */