265 lines
9.8 KiB
C
265 lines
9.8 KiB
C
/* ----------------------------------------------------------------------------
|
|
* 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
|
|
|