mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-17 13:48:32 +03:00
atmel_softpack_libraries usb dir
This commit is contained in:
@@ -0,0 +1,256 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* 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 */
|
||||
|
||||
Reference in New Issue
Block a user