blob: 4ed70fc5ff8258664a45f033acc2c56b45bac99a [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.
* ----------------------------------------------------------------------------
*/
#ifndef _MSDIOFIFO_H
#define _MSDIOFIFO_H
/** \file
* \addtogroup usbd_msd
*@{
*/
/*------------------------------------------------------------------------------
* Headers
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Definitions
*------------------------------------------------------------------------------*/
/** Idle state, do nothing */
#define MSDIO_IDLE 0
/** Start, to start IO operation */
#define MSDIO_START 1
/** Wait, waiting for IO operation done */
#define MSDIO_WAIT 2
/** Next, to check if the next block can be performed */
#define MSDIO_NEXT 3
/** Pause, to pause the process for buffer full or null */
#define MSDIO_PAUSE 4
/** Abort, to abort the process */
#define MSDIO_ABORT 5
/** Done, finish without error */
#define MSDIO_DONE 6
/** Error, any error happens */
#define MSDIO_ERROR 7
/** FIFO offset before USB transmit start */
/*#define MSDIO_FIFO_OFFSET (4*512) */
/** FIFO trunk size (in each transfer, large amount of data) */
#if !defined(MSD_OP_BUFFER)
#define MSDIO_READ10_CHUNK_SIZE (4*512)
#define MSDIO_WRITE10_CHUNK_SIZE (4*512)
#endif
/*------------------------------------------------------------------------------
* Types
*------------------------------------------------------------------------------*/
/** \brief FIFO buffer for READ/WRITE (disk) operation of a mass storage device */
typedef struct _MSDIOFifo {
/** Pointer to the ring buffer allocated for read/write */
unsigned char * pBuffer;
/** The size of the buffer allocated */
unsigned int bufferSize;
#ifdef MSDIO_FIFO_OFFSET
/** The offset to start USB transfer (READ10) */
unsigned int bufferOffset;
#endif
/** The index of input data (loaded to fifo buffer) */
unsigned int inputNdx;
/** The total size of the loaded data */
unsigned int inputTotal;
/** The index of output data (sent from the fifo buffer) */
unsigned int outputNdx;
/** The total size of the output data */
unsigned int outputTotal;
/** The total size of the data */
unsigned int dataTotal;
/** The size of the block in bytes */
unsigned short blockSize;
#if defined(MSDIO_READ10_CHUNK_SIZE) || defined(MSDIO_WRITE10_CHUNK_SIZE)
/** The size of one chunk */
/** (1 block, or several blocks for large amount data R/W) */
unsigned int chunkSize;
#endif
/** State of input & output */
unsigned char inputState;
unsigned char outputState;
/*- Statistics */
/** Times when fifo has no data to send */
unsigned short nullCnt;
/** Times when fifo can not load more input data */
unsigned short fullCnt;
} MSDIOFifo, *PMSDIOFifo;
/*------------------------------------------------------------------------------
* MACROS
*------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
* Increase the index, by defined block size, in the ring buffer
* \param ndx The index to be increased
* \param sectSize The defined block size
* \param bufSize The ring buffer size
*------------------------------------------------------------------------------*/
#define MSDIOFifo_IncNdx(ndx, sectSize, bufSize) \
if ((ndx) >= (bufSize) - (sectSize)) (ndx) = 0; \
else (ndx) += (sectSize)
/*------------------------------------------------------------------------------
* Exported Functions
*------------------------------------------------------------------------------*/
extern void MSDIOFifo_Init(MSDIOFifo *pFifo,
void * pBuffer, unsigned short bufferSize);
/**@}*/
#endif /* _MSDIOFIFO_H */