mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-17 21:58:33 +03:00
257 lines
8.8 KiB
C
257 lines
8.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.
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
/** \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 */
|
|
|