blob: d92576d846b41932b0fd918d6b133e8dc21bf755 [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
*
* SCSI commands implementation.
*
* section Usage
*
* -# After a CBW is received from host, use SBC_GetCommandInformation to check
* if the command is supported, and get the command length and type
* information before processing it.
* -# Then SBC_ProcessCommand can be used to handle a valid command, to
* perform the command operations.
* -# SBC_UpdateSenseData is used to update the sense data that will be sent
* to host.
*/
#ifndef SBCMETHODS_H
#define SBCMETHODS_H
/** \addtogroup usbd_msd
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
#include "SBC.h"
#include "MSDLun.h"
#include "MSDDStateMachine.h"
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** \addtogroup usbd_sbc_command_state SBC Command States
* @{
* This page lists the possible states of a SBC command.
*
* \section States
* - SBC_STATE_READ
* - SBC_STATE_WAIT_READ
* - SBC_STATE_WRITE
* - SBC_STATE_WAIT_WRITE
* - SBC_STATE_NEXT_BLOCK
*/
/** Start of reading bulk data */
#define SBC_STATE_READ 0x01
/** Waiting for the bulk data reading complete */
#define SBC_STATE_WAIT_READ 0x02
/** Read error state */
#define SBC_STATE_READ_ERROR 0x03
/** Start next read block */
#define SBC_STATE_NEXT_READ 0x04
/** Start writing bulk data to host */
#define SBC_STATE_WRITE 0x05
/** Waiting for the bulk data sending complete */
#define SBC_STATE_WAIT_WRITE 0x06
/** Write error state */
#define SBC_STATE_WRITE_ERROR 0x07
/** Start next write block */
#define SBC_STATE_NEXT_WRITE 0x08
/** Start next command block */
#define SBC_STATE_NEXT_BLOCK 0x09
/** @}*/
/*------------------------------------------------------------------------------
* Exported functions
*------------------------------------------------------------------------------*/
void SBC_UpdateSenseData(SBCRequestSenseData *requestSenseData,
unsigned char senseKey,
unsigned char additionalSenseCode,
unsigned char additionalSenseCodeQualifier);
unsigned char SBC_GetCommandInformation(void *command,
unsigned int *length,
unsigned char *type,
MSDLun *lun);
unsigned char SBC_ProcessCommand(MSDLun *lun,
MSDCommandState *commandState);
/**@}*/
#endif /*#ifndef SBCMETHODS_H */