| /* ---------------------------------------------------------------------------- |
| * 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 */ |
| |
| |