| 
									
										
										
										
											2012-11-27 15:21:47 +07:00
										 |  |  | /***********************************************************************
 | 
					
						
							|  |  |  | * $Id:: mw_usbd_mscuser.h 202 2011-06-12 21:50:01Z usb06052                   $ | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * Project: USB device ROM Stack | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * Description: | 
					
						
							|  |  |  | *     Mass Storage Class Custom User Module definitions. | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | *********************************************************************** | 
					
						
							|  |  |  | *   Copyright(C) 2011, NXP Semiconductor | 
					
						
							|  |  |  | *   All rights reserved. | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * Software that is described herein is for illustrative purposes only | 
					
						
							|  |  |  | * which provides customers with programming information regarding the | 
					
						
							|  |  |  | * products. This software is supplied "AS IS" without any warranties. | 
					
						
							|  |  |  | * NXP Semiconductors assumes no responsibility or liability for the | 
					
						
							|  |  |  | * use of the software, conveys no license or title under any patent, | 
					
						
							|  |  |  | * copyright, or mask work right to the product. NXP Semiconductors | 
					
						
							|  |  |  | * reserves the right to make changes in the software without | 
					
						
							|  |  |  | * notification. NXP Semiconductors also make no representation or | 
					
						
							|  |  |  | * warranty that such application will be suitable for the specified | 
					
						
							|  |  |  | * use without further testing or modification. | 
					
						
							|  |  |  | **********************************************************************/ | 
					
						
							|  |  |  | #ifndef __MSCUSER_H__
 | 
					
						
							|  |  |  | #define __MSCUSER_H__
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "error.h"
 | 
					
						
							|  |  |  | #include "mw_usbd.h"
 | 
					
						
							|  |  |  | #include "mw_usbd_msc.h"
 | 
					
						
							|  |  |  | #include "mw_usbd_core.h"
 | 
					
						
							| 
									
										
										
										
											2013-01-11 16:55:47 +07:00
										 |  |  | #include "tusb_option.h"
 | 
					
						
							| 
									
										
										
										
											2012-11-27 15:21:47 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** \file
 | 
					
						
							|  |  |  |  *  \brief Mass Storage Class (MSC) API structures and function prototypes. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  Definition of functions exported by ROM based MSC function driver. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** \ingroup Group_USBD
 | 
					
						
							|  |  |  |  *  @defgroup USBD_MSC Mass Storage Class (MSC) Function Driver | 
					
						
							|  |  |  |  *  \section Sec_MSCModDescription Module Description | 
					
						
							|  |  |  |  *  MSC Class Function Driver module. This module contains an internal implementation of the USB MSC Class. | 
					
						
							|  |  |  |  *  User applications can use this class driver instead of implementing the MSC class manually | 
					
						
							|  |  |  |  *  via the low-level USBD_HW and USBD_Core APIs. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  This module is designed to simplify the user code by exposing only the required interface needed to interface with | 
					
						
							|  |  |  |  *  Devices using the USB MSC Class. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** \brief Mass Storage class function driver initilization parameter data structure.
 | 
					
						
							|  |  |  |  *  \ingroup USBD_MSC | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  \details  This data structure is used to pass initialization parameters to the  | 
					
						
							|  |  |  |  *  Mass Storage class function driver's init function. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef struct USBD_MSC_INIT_PARAM | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /* memory allocation params */ | 
					
						
							|  |  |  |   uint32_t mem_base;  /**< Base memory location from where the stack can allocate
 | 
					
						
							|  |  |  |                       data and buffers. \note The memory address set in this field | 
					
						
							|  |  |  |                       should be accessible by USB DMA controller. Also this value | 
					
						
							|  |  |  |                       should be aligned on 4 byte boundary. | 
					
						
							|  |  |  |                       */ | 
					
						
							|  |  |  |   uint32_t mem_size;  /**< The size of memory buffer which stack can use. 
 | 
					
						
							|  |  |  |                       \note The \em mem_size should be greater than the size  | 
					
						
							|  |  |  |                       returned by USBD_MSC_API::GetMemSize() routine.*/ | 
					
						
							|  |  |  |   /* mass storage paramas */ | 
					
						
							|  |  |  |   uint8_t*  InquiryStr; /**< Pointer to the 28 character string. This string is 
 | 
					
						
							|  |  |  |                         sent in response to the SCSI Inquiry command. \note The data  | 
					
						
							|  |  |  |                         pointed by the pointer should be of global scope.  | 
					
						
							|  |  |  |                         */ | 
					
						
							|  |  |  |   uint32_t  BlockCount; /**< Number of blocks present in the mass storage device */ | 
					
						
							|  |  |  |   uint32_t  BlockSize; /**< Block size in number of bytes */ | 
					
						
							|  |  |  |   uint32_t  MemorySize; /**< Memory size in number of bytes */ | 
					
						
							|  |  |  |   /** Pointer to the interface descriptor within the descriptor
 | 
					
						
							|  |  |  |   * array (\em high_speed_desc) passed to Init() through \ref USB_CORE_DESCS_T  | 
					
						
							|  |  |  |   * structure. The stack assumes both HS and FS use same BULK endpoints.  | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |   uint8_t* intf_desc; | 
					
						
							|  |  |  |   /* user defined functions */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  /** 
 | 
					
						
							|  |  |  |   *  MSC Write callback function. | 
					
						
							|  |  |  |   * | 
					
						
							|  |  |  |   *  This function is provided by the application software. This function gets called  | 
					
						
							|  |  |  |   *  when host sends a write command. | 
					
						
							|  |  |  |   *   | 
					
						
							|  |  |  |   *  \param[in] offset Destination start address.  | 
					
						
							|  |  |  |   *  \param[in, out] src  Pointer to a pointer to the source of data. Pointer-to-pointer | 
					
						
							|  |  |  |   *                       is used to implement zero-copy buffers. See \ref USBD_ZeroCopy | 
					
						
							|  |  |  |   *                       for more details on zero-copy concept. | 
					
						
							|  |  |  |   *  \param[in] length  Number of bytes to be written. | 
					
						
							|  |  |  |   *  \return Nothing.  | 
					
						
							|  |  |  |   *                                              | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |   void (*MSC_Write)( uint32_t offset, uint8_t** src, uint32_t length);  | 
					
						
							|  |  |  |  /** 
 | 
					
						
							|  |  |  |   *  MSC Read callback function. | 
					
						
							|  |  |  |   * | 
					
						
							|  |  |  |   *  This function is provided by the application software. This function gets called  | 
					
						
							|  |  |  |   *  when host sends a read command. | 
					
						
							|  |  |  |   *   | 
					
						
							|  |  |  |   *  \param[in] offset Source start address.  | 
					
						
							|  |  |  |   *  \param[in, out] dst  Pointer to a pointer to the source of data. The MSC function drivers  | 
					
						
							|  |  |  |   *         implemented in stack are written with zero-copy model. Meaning the stack doesn't make an  | 
					
						
							|  |  |  |   *          extra copy of buffer before writing/reading data from USB hardware FIFO. Hence the  | 
					
						
							|  |  |  |   *          parameter is pointer to a pointer containing address buffer (<em>uint8_t** dst</em>).  | 
					
						
							|  |  |  |   *          So that the user application can update the buffer pointer instead of copying data to  | 
					
						
							|  |  |  |   *          address pointed by the parameter. /note The updated buffer address should be accessable  | 
					
						
							|  |  |  |   *          by USB DMA master. If user doesn't want to use zero-copy model, then the user should copy | 
					
						
							|  |  |  |   *          data to the address pointed by the passed buffer pointer parameter and shouldn't change  | 
					
						
							|  |  |  |   *          the address value. See \ref USBD_ZeroCopy for more details on zero-copy concept. | 
					
						
							|  |  |  |   *  \param[in] length  Number of bytes to be read. | 
					
						
							|  |  |  |   *  \return Nothing.  | 
					
						
							|  |  |  |   *                                              | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |   void (*MSC_Read)( uint32_t offset, uint8_t** dst, uint32_t length); | 
					
						
							|  |  |  |  /** 
 | 
					
						
							|  |  |  |   *  MSC Verify callback function. | 
					
						
							|  |  |  |   * | 
					
						
							|  |  |  |   *  This function is provided by the application software. This function gets called  | 
					
						
							|  |  |  |   *  when host sends a verify command. The callback function should compare the buffer | 
					
						
							|  |  |  |   *  with the destination memory at the requested offset and  | 
					
						
							|  |  |  |   *   | 
					
						
							|  |  |  |   *  \param[in] offset Destination start address.  | 
					
						
							|  |  |  |   *  \param[in] buf  Buffer containing the data sent by the host. | 
					
						
							|  |  |  |   *  \param[in] length  Number of bytes to verify. | 
					
						
							|  |  |  |   *  \return Returns \ref ErrorCode_t type to indicate success or error condition. | 
					
						
							|  |  |  |   *          \retval LPC_OK If data in the buffer matches the data at destination | 
					
						
							|  |  |  |   *          \retval ERR_FAILED  Atleast one byte is different.  | 
					
						
							|  |  |  |   *                                              | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |   ErrorCode_t (*MSC_Verify)( uint32_t offset, uint8_t buf[], uint32_t length); | 
					
						
							|  |  |  |   /** 
 | 
					
						
							|  |  |  |   *  Optional callback function to optimize MSC_Write buffer transfer. | 
					
						
							|  |  |  |   * | 
					
						
							|  |  |  |   *  This function is provided by the application software. This function gets called  | 
					
						
							|  |  |  |   *  when host sends SCSI_WRITE10/SCSI_WRITE12 command. The callback function should  | 
					
						
							|  |  |  |   *  update the \em buff_adr pointer so that the stack transfers the data directly | 
					
						
							|  |  |  |   *  to the target buffer. /note The updated buffer address should be accessable  | 
					
						
							|  |  |  |   *  by USB DMA master. If user doesn't want to use zero-copy model, then the user  | 
					
						
							|  |  |  |   *  should not update the buffer pointer. See \ref USBD_ZeroCopy for more details | 
					
						
							|  |  |  |   *  on zero-copy concept. | 
					
						
							|  |  |  |   *   | 
					
						
							|  |  |  |   *  \param[in] offset Destination start address.  | 
					
						
							|  |  |  |   *  \param[in,out] buf  Buffer containing the data sent by the host. | 
					
						
							|  |  |  |   *  \param[in] length  Number of bytes to write. | 
					
						
							|  |  |  |   *  \return Nothing.  | 
					
						
							|  |  |  |   *                                              | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |   void (*MSC_GetWriteBuf)( uint32_t offset, uint8_t** buff_adr, uint32_t length);  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** 
 | 
					
						
							|  |  |  |   *  Optional user overridable function to replace the default MSC class handler. | 
					
						
							|  |  |  |   * | 
					
						
							|  |  |  |   *  The application software could override the default EP0 class handler with their | 
					
						
							|  |  |  |   *  own by providing the handler function address as this data member of the parameter | 
					
						
							|  |  |  |   *  structure. Application which like the default handler should set this data member | 
					
						
							|  |  |  |   *  to zero before calling the USBD_MSC_API::Init(). | 
					
						
							|  |  |  |   *  \n | 
					
						
							|  |  |  |   *  \note  | 
					
						
							|  |  |  |   *   | 
					
						
							|  |  |  |   *  \param[in] hUsb Handle to the USB device stack.  | 
					
						
							|  |  |  |   *  \param[in] data Pointer to the data which will be passed when callback function is called by the stack.  | 
					
						
							|  |  |  |   *  \param[in] event  Type of endpoint event. See \ref USBD_EVENT_T for more details. | 
					
						
							|  |  |  |   *  \return The call back should returns \ref ErrorCode_t type to indicate success or error condition. | 
					
						
							|  |  |  |   *          \retval LPC_OK On success. | 
					
						
							|  |  |  |   *          \retval ERR_USBD_UNHANDLED  Event is not handled hence pass the event to next in line.  | 
					
						
							|  |  |  |   *          \retval ERR_USBD_xxx  For other error conditions.  | 
					
						
							|  |  |  |   *                                              | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |   ErrorCode_t (*MSC_Ep0_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } USBD_MSC_INIT_PARAM_T; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** \brief MSC class API functions structure.
 | 
					
						
							|  |  |  |  *  \ingroup USBD_MSC | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  This module exposes functions which interact directly with USB device controller hardware. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | typedef struct USBD_MSC_API | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /** \fn uint32_t GetMemSize(USBD_MSC_INIT_PARAM_T* param)
 | 
					
						
							|  |  |  |    *  Function to determine the memory required by the MSC function driver module. | 
					
						
							|  |  |  |    *  | 
					
						
							|  |  |  |    *  This function is called by application layer before calling pUsbApi->msc->Init(), to allocate memory used  | 
					
						
							|  |  |  |    *  by MSC function driver module. The application should allocate the memory which is accessible by USB | 
					
						
							|  |  |  |    *  controller/DMA controller.  | 
					
						
							|  |  |  |    *  \note Some memory areas are not accessible by all bus masters. | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |    *  \param[in] param Structure containing MSC function driver module initialization parameters. | 
					
						
							|  |  |  |    *  \return Returns the required memory size in bytes. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   uint32_t (*GetMemSize)(USBD_MSC_INIT_PARAM_T* param); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   /** \fn ErrorCode_t init(USBD_HANDLE_T hUsb, USBD_MSC_INIT_PARAM_T* param)
 | 
					
						
							|  |  |  |    *  Function to initialize MSC function driver module. | 
					
						
							|  |  |  |    *  | 
					
						
							|  |  |  |    *  This fuction is called by application layer to initialize MSC function driver module.  | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |    *  \param[in] hUsb Handle to the USB device stack.  | 
					
						
							|  |  |  |    *  \param[in, out] param Structure containing MSC function driver module initialization parameters. | 
					
						
							|  |  |  |    *  \return Returns \ref ErrorCode_t type to indicate success or error condition. | 
					
						
							|  |  |  |    *          \retval LPC_OK On success | 
					
						
							|  |  |  |    *          \retval ERR_USBD_BAD_MEM_BUF  Memory buffer passed is not 4-byte  | 
					
						
							|  |  |  |    *              aligned or smaller than required.  | 
					
						
							|  |  |  |    *          \retval ERR_API_INVALID_PARAM2 Either MSC_Write() or MSC_Read() or | 
					
						
							|  |  |  |    *              MSC_Verify() callbacks are not defined.  | 
					
						
							|  |  |  |    *          \retval ERR_USBD_BAD_INTF_DESC  Wrong interface descriptor is passed.  | 
					
						
							|  |  |  |    *          \retval ERR_USBD_BAD_EP_DESC  Wrong endpoint descriptor is passed.  | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   ErrorCode_t (*init)(USBD_HANDLE_T hUsb, USBD_MSC_INIT_PARAM_T* param); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } USBD_MSC_API_T; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*-----------------------------------------------------------------------------
 | 
					
						
							|  |  |  |  *  Private functions & structures prototypes | 
					
						
							|  |  |  |  *-----------------------------------------------------------------------------*/ | 
					
						
							|  |  |  | /** @cond  ADVANCED_API */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _MSC_CTRL_T | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   /* If it's a USB HS, the max packet is 512, if it's USB FS,
 | 
					
						
							|  |  |  |   the max packet is 64. Use 512 for both HS and FS. */ | 
					
						
							|  |  |  |   /*ALIGNED(4)*/ uint8_t  BulkBuf[USB_HS_MAX_BULK_PACKET]; /* Bulk In/Out Buffer */ | 
					
						
							|  |  |  |   /*ALIGNED(4)*/MSC_CBW CBW;                   /* Command Block Wrapper */ | 
					
						
							|  |  |  |   /*ALIGNED(4)*/MSC_CSW CSW;                   /* Command Status Wrapper */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   USB_CORE_CTRL_T*  pUsbCtrl; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   uint32_t Offset;                  /* R/W Offset */ | 
					
						
							|  |  |  |   uint32_t Length;                  /* R/W Length */ | 
					
						
							|  |  |  |   uint32_t BulkLen;                 /* Bulk In/Out Length */ | 
					
						
							|  |  |  |   uint8_t* rx_buf; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   uint8_t BulkStage;               /* Bulk Stage */ | 
					
						
							|  |  |  |   uint8_t if_num;                  /* interface number */ | 
					
						
							|  |  |  |   uint8_t epin_num;                /* BULK IN endpoint number */ | 
					
						
							|  |  |  |   uint8_t epout_num;               /* BULK OUT endpoint number */ | 
					
						
							|  |  |  |   uint32_t MemOK;                  /* Memory OK */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   uint8_t*  InquiryStr; | 
					
						
							|  |  |  |   uint32_t  BlockCount; | 
					
						
							|  |  |  |   uint32_t  BlockSize; | 
					
						
							|  |  |  |   uint32_t  MemorySize; | 
					
						
							|  |  |  |   /* user defined functions */ | 
					
						
							|  |  |  |   void (*MSC_Write)( uint32_t offset, uint8_t** src, uint32_t length);  | 
					
						
							|  |  |  |   void (*MSC_Read)( uint32_t offset, uint8_t** dst, uint32_t length); | 
					
						
							|  |  |  |   ErrorCode_t (*MSC_Verify)( uint32_t offset, uint8_t src[], uint32_t length); | 
					
						
							|  |  |  |   /* optional call back for MSC_Write optimization */ | 
					
						
							|  |  |  |   void (*MSC_GetWriteBuf)( uint32_t offset, uint8_t** buff_adr, uint32_t length);  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }USB_MSC_CTRL_T; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @cond  DIRECT_API */ | 
					
						
							|  |  |  | extern uint32_t mwMSC_GetMemSize(USBD_MSC_INIT_PARAM_T* param); | 
					
						
							|  |  |  | extern ErrorCode_t mwMSC_init(USBD_HANDLE_T hUsb, USBD_MSC_INIT_PARAM_T* param); | 
					
						
							|  |  |  | /** @endcond */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @endcond */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif  /* __MSCUSER_H__ */
 |