summaryrefslogtreecommitdiff
path: root/usb/device/massstorage/MSDIOFifo.h
diff options
context:
space:
mode:
Diffstat (limited to 'usb/device/massstorage/MSDIOFifo.h')
-rw-r--r--usb/device/massstorage/MSDIOFifo.h133
1 files changed, 133 insertions, 0 deletions
diff --git a/usb/device/massstorage/MSDIOFifo.h b/usb/device/massstorage/MSDIOFifo.h
new file mode 100644
index 0000000..efe204d
--- /dev/null
+++ b/usb/device/massstorage/MSDIOFifo.h
@@ -0,0 +1,133 @@
+/* ----------------------------------------------------------------------------
+ * 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
+
+//------------------------------------------------------------------------------
+// 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)
+#define MSDIO_READ10_CHUNK_SIZE (4*512)
+#define MSDIO_WRITE10_CHUNK_SIZE (4*512)
+
+//------------------------------------------------------------------------------
+// Types
+//------------------------------------------------------------------------------
+
+/// 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
+
personal git repositories of Harald Welte. Your mileage may vary