257 lines
12 KiB
C
Executable File
257 lines
12 KiB
C
Executable File
/**
|
|
Header file for USB MSDC Task APIs
|
|
|
|
This is the public header file for the USB Mass-Storage-Device-Class task.
|
|
Before using these APIs in the header file, the user must use Msdc_InstallID()
|
|
to retrieve the system task ID and the flag ID for MSDC Task usage to keep the task normal working.
|
|
|
|
@file UMSDC.h
|
|
@ingroup mILibUsbMSDC
|
|
@note Nothing
|
|
|
|
Copyright Novatek Microelectronics Corp. 2018. All rights reserved.
|
|
*/
|
|
|
|
#ifndef _UMSD_H
|
|
#define _UMSD_H
|
|
|
|
#include "kwrap/type.h"
|
|
#include "usb_desc.h"
|
|
#include "usb_define.h"
|
|
#include "strg_def.h"
|
|
|
|
/**
|
|
@addtogroup mILibUsbMSDC
|
|
*/
|
|
//@{
|
|
|
|
|
|
/**
|
|
The Minimum required DRAM buffer size for the MSDC Task
|
|
*/
|
|
//@{
|
|
#define MSDC_MIN_BUFFER_SIZE 0x044040 ///< [USB2/3]: Minimunm required buffer size is (256K+64) Bytes + 16KB for USB3.
|
|
#define MSDC_GOOD_BUFFER_SIZE 0x084040 ///< [USB3]: Buffer size to make MSDC get good performance
|
|
#define MSDC_MAX_BUFFER_SIZE 0x104040 ///< [USB3]: Maximum Buffer size to make MSDC get good performance
|
|
|
|
#define MSDC_WCACHE_MIN_BUFFER_SIZE 0x100000 ///< [USB2/3]: Minimum Write Cache Buffer Size.
|
|
///< [USB3]: This size can up to 4MB ot 8MB to make every SDCARD get very good write speed for USB3 controller.
|
|
///< [USB2]: For USB2.0 controller, use MSDC_WCACHE_MIN_BUFFER_SIZE is enough.
|
|
//@}
|
|
|
|
|
|
/**
|
|
The Maximum supported LUN number of the MSDC Task
|
|
*/
|
|
//@{
|
|
#define MAX_LUN 6 ///< MSDC Task maximum Logical-Unit-Number supported
|
|
//@}
|
|
|
|
/**
|
|
Structure used for MSDC Vendor Command Callback API
|
|
|
|
This structure is used in the callback prototype MSDC_Vendor_CB to specify the needed parameters for vendor command processing.
|
|
*/
|
|
typedef struct {
|
|
UINT32 OutDataBufLen; ///< Data Buffer Length for "Host to MSDC-task" transaction.
|
|
|
|
UINT32 InDataBuf; ///< Data Buffer Address for "MSDC-task to Host" transaction. MSDC-task would prepare this buffer for callback function.
|
|
UINT32 InDataBufLen; ///< Host assigned "MSDC-task to Host" transaction length in byte count.
|
|
|
|
UINT32 VendorCmdBuf; ///< Vendor CBW buffer that device will receive from host for CBW buffer. Fixed 31 bytes.
|
|
UINT32 VendorCSWBuf; ///< Vendor CSW buffer that device will return to host for CSW buffer, MSDC task should prepare this buffer for callback function, Fixed 13 bytes.
|
|
} MSDCVendorParam, *PMSDCVendorParam;
|
|
|
|
/**
|
|
Callback functions prototype that MSDC task used
|
|
|
|
These definitions are used in the structure USB_MSDC_INFO and would be used during Msdc_Open() to specify the
|
|
MSDC_Task needed information.
|
|
*/
|
|
//@{
|
|
typedef void (*MSDC_Vendor_CB)(PMSDCVendorParam pBuf); ///< Callback for Vendor Command processing
|
|
typedef BOOL (*MSDC_Verify_CB)(UINT32 pCmdBuf, UINT32 *pDataBuf); ///< Callback for verify the Vendor Command is supported or not
|
|
typedef BOOL (*MSDC_StorageDet_CB)(void); ///< Callback for detecting the storage card is plugging or not.
|
|
typedef BOOL (*MSDC_StrgLockDet_CB)(void); ///< Callback for detecting the storage card lock status.
|
|
typedef void (*MSDC_Led_CB)(void); ///< Callback for flashing the LED when MSDC under R/W function.
|
|
//@}
|
|
|
|
/**
|
|
MSDC Task Current Status Flag
|
|
|
|
These definitions are used as the return value identification for API Msdc_GetStatus().
|
|
*/
|
|
typedef enum {
|
|
MSDC_COMMANDOK, ///< Previous command that MSDC task processed is done and OK.
|
|
MSDC_CLOSED_STATE, ///< MSDC task has not opened yet.
|
|
MSDC_USBRESETED, ///< MSDC task got the RESET signaling from Host.
|
|
MSDC_PHASEERROR, ///< MSDC commands handshake phase error.
|
|
MSDC_READ_BUSY_STATE, ///< MSDC is still reading data from storage.
|
|
MSDC_WRITE_BUSY_STATE, ///< MSDC is still writing data to storage.
|
|
|
|
ENUM_DUMMY4WORD(MSDC_TASK_STS)
|
|
} MSDC_TASK_STS;
|
|
|
|
/**
|
|
Mass Storage Logical Unit Type
|
|
|
|
This definition is used USB_MSDC_INFO to specify each the MSDC LUN would behave as STORAGE or CDROM during Msdc_Open().
|
|
*/
|
|
typedef enum {
|
|
MSDC_STRG = 0, ///< Set the specified LUN as storage device.
|
|
MSDC_CDROM, ///< Set the specified LUN as CDROM read only device.
|
|
|
|
ENUM_DUMMY4WORD(MSDC_TYPE)
|
|
} MSDC_TYPE;
|
|
|
|
/**
|
|
MSDC Device Power Source
|
|
|
|
This definition is used in Msdc_SetConfig(USBMSDC_CONFIG_ID_SELECT_POWER) to select the MSDC Device power source.
|
|
This feature is used to change the descriptors only to notify the MSDC Host the power source of the device.
|
|
*/
|
|
typedef enum {
|
|
USBMSDC_POW_SELFPOWER, ///< USB Device is Self-Powered.
|
|
USBMSDC_POW_BUSPOWER, ///< USB Device is Bus-Powered.
|
|
|
|
ENUM_DUMMY4WORD(USBMSDC_POWER)
|
|
} USBMSDC_POWER;
|
|
|
|
/**
|
|
MSDC Configuration identifier
|
|
|
|
This definition is used in Msdc_SetConfig() to assgin new configuration to specified ID function.
|
|
*/
|
|
typedef enum {
|
|
USBMSDC_CONFIG_ID_COMPOSITE, ///< Select composite device support
|
|
///< Context can be ORed of:
|
|
///< - @b FALSE (Defalut value): disable composite device support
|
|
///< - @b TRUE: enable composite device support
|
|
USBMSDC_CONFIG_ID_CHGVENINBUGADDR, ///< Change Vendor command IN data buffer address
|
|
USBMSDC_CONFIG_ID_SELECT_POWER, ///< Selct Device Power Source from USBMSDC_POW_SELFPOWER or USBMSDC_POW_BUSPOWER.
|
|
///< The Default value is Self-Powered (USBMSDC_POW_SELFPOWER).
|
|
USBMSDC_CONFIG_ID_SERIALNO_STRING_EN, ///< Set serial number string descriptor enable/disable. Default value is enable.
|
|
USBMSDC_CONFIG_ID_RC_DISABLESTALL, ///< When non of card inserted, this can send dummy capacity data without STALL
|
|
///< EP for the ReadCapacity command.
|
|
USBMSDC_CONFIG_ID_SPEED, ///< Specified USB highest Speed for MSDC operation. Please use U3DEV_SPEED as input parameter.
|
|
USBMSDC_CONFIG_ID_WCACHE_ADDR, ///< Assign Write Cache buffer Address. Default is NULL
|
|
USBMSDC_CONFIG_ID_WCACHE_SIZE, ///< Assign Write Cache buffer Size. Default is 0. Minimum size is MSDC_WCACHE_MIN_BUFFER_SIZE.
|
|
USBMSDC_CONFIG_ID_WCACHE_SLICE, ///< Default is 128. Lower value can make MSDC write speed better in small size write. But induce more interrupts.
|
|
|
|
USBMSDC_CONFIG_ID_RESERVED, // Novatek internal usage. Change EP number mapping.
|
|
USBMSDC_CONFIG_ID_EVT_CB,
|
|
USBMSDC_CONFIG_ID_CLASS_CB,
|
|
USBMSDC_CONFIG_ID_INTERFACE_IDX,
|
|
|
|
ENUM_DUMMY4WORD(USBMSDC_CONFIG_ID)
|
|
} USBMSDC_CONFIG_ID;
|
|
|
|
/**
|
|
MSDC Logical Unit Configuration identifier
|
|
|
|
This definition is used in Msdc_SetLunConfig() to assgin new configuration to specified ID function.
|
|
*/
|
|
typedef enum {
|
|
USBMSDC_LUN_CONFIG_ID_FORCE_EJECT, ///< Force LUN to eject. TURE: Force Eject. FALSE: NOT forcing eject.
|
|
USBMSDC_LUN_CONFIG_ID_WRITEPROTECT, ///< Force LUN WriteProtect. TRUE: Force WriteProtect. FALSE: NOT forcing WriteProtect.
|
|
|
|
ENUM_DUMMY4WORD(USBMSDC_LUN_CONFIG_ID)
|
|
} USBMSDC_LUN_CONFIG_ID;
|
|
|
|
/**
|
|
MSDC Storgae Information
|
|
|
|
MSDC Storgae Information including storage object, storage detect/lock callback and also the sd info callback if the
|
|
storage is the SD card. This API is used in Msdc_ChgStrgObject() to allow the user change the storage device dynamically.
|
|
|
|
*/
|
|
typedef struct {
|
|
PSTRG_TAB StrgHandle; ///< Pointer of each LUN's Dx storage handle.
|
|
MSDC_StorageDet_CB msdc_storage_detCB; ///< Callback function to detect storage plug status. If there is none, please set to NULL
|
|
MSDC_StrgLockDet_CB msdc_strgLock_detCB; ///< Callback function to detect storage lock status. If there is none, please set to NULL
|
|
|
|
} USB_MSDC_STRG_INFO, *PUSB_MSDC_STRG_INFO;
|
|
|
|
|
|
/**
|
|
Information needed for USB MSDC Task
|
|
|
|
This structure is used in Msdc_Open() to specify the msdc task needed information for normal working
|
|
and user customization callback, including task working buffer address/size and logical unit number and type.
|
|
*/
|
|
typedef struct {
|
|
MSDC_TYPE msdc_type[MAX_LUN]; ///< Select specified LUN act as STORAGE or CDROM device.
|
|
|
|
UINT32 uiMsdcBufAddr_va; ///< Buffer address for MSDC-Task operation.
|
|
UINT32 uiMsdcBufAddr_pa; ///< Buffer address for MSDC-Task operation.
|
|
UINT32 uiMsdcBufSize; ///< Buffer size for MSDC-Task operation. The minimum requirement is 0x40040 Bytes.
|
|
|
|
USB_STRING_DESC *pManuStringDesc; ///< USB Manufacturer String Descriptor pointer.
|
|
USB_STRING_DESC *pProdStringDesc; ///< USB Product String Descriptor pointer.
|
|
USB_STRING_DESC *pSerialStringDesc; ///< USB Serial Number String Descriptor pointer.
|
|
UINT8 *pInquiryData; ///< SCSI Inquire data
|
|
UINT16 VID; ///< Customized USB Vendor ID
|
|
UINT16 PID; ///< Customized USB Product ID
|
|
|
|
MSDC_Verify_CB msdc_check_cb; ///< Callback function to check if the command is a supported vendor command.
|
|
MSDC_Vendor_CB msdc_vendor_cb; ///< Vendor command processing callback function
|
|
|
|
UINT8 LUNs; ///< Number of LUNs supported by MSDC Task.
|
|
|
|
PSTRG_TAB pStrgHandle[MAX_LUN]; ///< Pointer of each LUN's Dx storage Handle.
|
|
MSDC_StorageDet_CB msdc_storage_detCB[MAX_LUN]; ///< Callback function to detect storage plug status. If there is none, please set to NULL
|
|
MSDC_StrgLockDet_CB msdc_strgLock_detCB[MAX_LUN]; ///< Callback function to detect storage lock status. If there is none, please set to NULL
|
|
|
|
// Add Customization backward compatible
|
|
MSDC_Led_CB msdc_RW_Led_CB; ///< Callback when RW storage is running.
|
|
MSDC_Led_CB msdc_StopUnit_Led_CB; ///< Callback when host issue StopUnit cmd.
|
|
MSDC_Led_CB msdc_UsbSuspend_Led_CB; ///< Callback when host issue usb suspend.
|
|
|
|
} USB_MSDC_INFO, *PUSB_MSDC_INFO;
|
|
|
|
|
|
|
|
/**
|
|
MSDC Object ID
|
|
|
|
This is used by the MSDC Get Object API MSDC_getObject() to get the specific MSDC control object.
|
|
*/
|
|
typedef enum {
|
|
MSDC_ID_USB20, ///< USB 2.0 Port MSDC Object
|
|
|
|
MSDC_ID_MAX,
|
|
ENUM_DUMMY4WORD(MSDC_ID)
|
|
} MSDC_ID;
|
|
|
|
|
|
|
|
|
|
/**
|
|
Mass Storage Object Definitions
|
|
*/
|
|
typedef struct {
|
|
MSDC_ID MsdcID;
|
|
|
|
ER (*Open)(PUSB_MSDC_INFO pClassInfo);
|
|
void (*Close)(void);
|
|
ER (*SetConfig)(USBMSDC_CONFIG_ID ConfigID, UINT32 uiCfgValue);
|
|
UINT32 (*GetConfig)(USBMSDC_CONFIG_ID ConfigID);
|
|
ER (*SetLunConfig)(UINT32 uiLun, USBMSDC_LUN_CONFIG_ID ConfigID, UINT32 uiCfgValue);
|
|
UINT32 (*GetLunConfig)(UINT32 uiLun, USBMSDC_LUN_CONFIG_ID ConfigID);
|
|
void (*ChgStrgObject)(UINT32 uiLun, PUSB_MSDC_STRG_INFO pStrgInfo);
|
|
MSDC_TASK_STS (*GetStatus)(void);
|
|
BOOL (*CheckIdle)(void);
|
|
|
|
} MSDC_OBJ, *PMSDC_OBJ;
|
|
|
|
|
|
//
|
|
// I2C Object APIs
|
|
//
|
|
extern PMSDC_OBJ Msdc_getObject(MSDC_ID MsdcID);
|
|
|
|
|
|
//@}
|
|
|
|
#endif
|