00001 /* ---------------------------------------------------------------------------- 00002 * SAM Software Package License 00003 * ---------------------------------------------------------------------------- 00004 * Copyright (c) 2014, Atmel Corporation 00005 * 00006 * All rights reserved. 00007 * 00008 * Redistribution and use in source and binary forms, with or without 00009 * modification, are permitted provided that the following conditions are met: 00010 * 00011 * - Redistributions of source code must retain the above copyright notice, 00012 * this list of conditions and the disclaimer below. 00013 * 00014 * Atmel's name may not be used to endorse or promote products derived from 00015 * this software without specific prior written permission. 00016 * 00017 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR 00018 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 00019 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE 00020 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, 00021 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 00022 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 00023 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00024 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00025 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 00026 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00027 * ---------------------------------------------------------------------------- 00028 */ 00029 00030 /** \file 00031 * \section Purpose 00032 * 00033 * Mass storage %device driver implementation. 00034 * 00035 * \section Usage 00036 * 00037 * -# Enable and setup USB related pins (see pio & board.h). 00038 * -# Configure the memory interfaces used for Mass Storage LUNs 00039 * (see memories, MSDLun.h). 00040 * -# Instance the USB device configure descriptor as 00041 * MSDConfigurationDescriptors or MSDConfigurationDescriptorsOTG defined. 00042 * Interface number should be 0. 00043 * -# Configure the USB MSD %driver using MSDDriver_Initialize. 00044 * -# Invoke MSDDriver_StateMachine in main loop to handle all Mass Storage 00045 * operations. 00046 */ 00047 00048 #ifndef MSDDRIVER_H 00049 #define MSDDRIVER_H 00050 00051 /** \addtogroup usbd_msd 00052 *@{ 00053 */ 00054 00055 /*------------------------------------------------------------------------------ 00056 * Headers 00057 *------------------------------------------------------------------------------*/ 00058 00059 #include <stdint.h> 00060 00061 #include <MSDLun.h> 00062 #include <MSD.h> 00063 #include <MSDDStateMachine.h> 00064 #include <MSDFunction.h> 00065 00066 /*------------------------------------------------------------------------------ 00067 * Types 00068 *------------------------------------------------------------------------------*/ 00069 #pragma pack(1) 00070 #if defined ( __CC_ARM ) /* Keil ¦̀Vision 4 */ 00071 #elif defined ( __ICCARM__ ) /* IAR Ewarm */ 00072 #define __attribute__(...) 00073 #define __packed__ packed 00074 #elif defined ( __GNUC__ ) /* GCC CS3 */ 00075 #define __packed__ aligned(1) 00076 #endif 00077 /** 00078 * \typedef MSDConfigurationDescriptors 00079 * \brief List of configuration descriptors used by a Mass Storage device driver. 00080 */ 00081 typedef struct _MSDConfigurationDescriptors { 00082 00083 /** Standard configuration descriptor. */ 00084 USBConfigurationDescriptor configuration; 00085 /** Mass storage interface descriptor. */ 00086 USBInterfaceDescriptor interface; 00087 /** Bulk-out endpoint descriptor. */ 00088 USBEndpointDescriptor bulkOut; 00089 /** Bulk-in endpoint descriptor. */ 00090 USBEndpointDescriptor bulkIn; 00091 00092 } __attribute__ ((__packed__)) MSDConfigurationDescriptors; 00093 00094 /** 00095 * \typedef MSDConfigurationDescriptorsOTG 00096 * \brief List of configuration descriptors used by a 00097 * Mass Storage device driver, with OTG support. 00098 */ 00099 typedef struct _MSDConfigurationDescriptorsOTG { 00100 00101 /** Standard configuration descriptor. */ 00102 USBConfigurationDescriptor configuration; 00103 /* OTG descriptor */ 00104 USBOtgDescriptor otgDescriptor; 00105 /** Mass storage interface descriptor. */ 00106 USBInterfaceDescriptor interface; 00107 /** Bulk-out endpoint descriptor. */ 00108 USBEndpointDescriptor bulkOut; 00109 /** Bulk-in endpoint descriptor. */ 00110 USBEndpointDescriptor bulkIn; 00111 00112 } __attribute__ ((__packed__)) MSDConfigurationDescriptorsOTG; 00113 00114 #pragma pack() 00115 00116 /*------------------------------------------------------------------------------ 00117 * Global functions 00118 *------------------------------------------------------------------------------*/ 00119 00120 extern void MSDDriver_Initialize( 00121 const USBDDriverDescriptors *pDescriptors, 00122 MSDLun *luns, uint8_t numLuns); 00123 00124 extern void MSDDriver_RequestHandler( 00125 const USBGenericRequest *request); 00126 00127 extern void MSDDriver_ConfigurationChangeHandler( 00128 uint8_t cfgnum); 00129 00130 /** 00131 * State machine for the MSD driver 00132 * \param pMsdDriver Pointer to MSDDriver instance. 00133 */ 00134 static inline void MSDDriver_StateMachine(void) { 00135 MSDFunction_StateMachine(); 00136 } 00137 00138 /**@}*/ 00139 00140 #endif /* #ifndef MSDDRIVER_H */ 00141