268 lines
12 KiB
C
268 lines
12 KiB
C
![]() |
/***********************************************************************
|
||
|
* $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"
|
||
|
#include "tusb_cfg.h"
|
||
|
|
||
|
/** \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__ */
|