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