761 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			761 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /**
 | |
|     Header file for USB device
 | |
| 
 | |
|     This file is the header file for USB device module driver
 | |
| 
 | |
|     @file       usb.h
 | |
|     @ingroup    mIDrvUSB_Device
 | |
|     @note       Nothing
 | |
| 
 | |
|     Copyright   Novatek Microelectronics Corp. 2019.  All rights reserved.
 | |
| */
 | |
| 
 | |
| #ifndef _USB2DEV_H
 | |
| #define _USB2DEV_H
 | |
| 
 | |
| #include <kwrap/type.h>
 | |
| 
 | |
| 
 | |
| #include "usb_desc.h"
 | |
| #include "usb_define.h"
 | |
| 
 | |
| #ifndef DRV_CB
 | |
| typedef void (*DRV_CB)(UINT32 event);
 | |
| #endif
 | |
| 
 | |
| /**
 | |
|     @addtogroup mIDrvUSB_Device
 | |
| */
 | |
| //@{
 | |
| 
 | |
| /**
 | |
|     USB physical max DMA length
 | |
| */
 | |
| //@{
 | |
| #define USB_MAX_DMA_LENGTH      0x7fffff         ///< Max DMA length: 8MB-1
 | |
| //@}
 | |
| 
 | |
| /**
 | |
|     USB controller mode
 | |
| */
 | |
| typedef enum {
 | |
| 	USB_CTRL_MODE_DEVICE,                       ///< USB device mode
 | |
| 	USB_CTRL_MODE_HOST,                         ///< USB host mode
 | |
| 
 | |
| 	ENUM_DUMMY4WORD(USB_CTRL_MODE)
 | |
| } USB_CTRL_MODE;
 | |
| 
 | |
| 
 | |
| /**
 | |
|     Endpoint Block number used
 | |
| 
 | |
|     Describe endpoint receive/transmit data with manner of single/ping-pong/tripple buffer
 | |
| 
 | |
|     @note For blk_num of USB_ENP_CONFIG
 | |
| */
 | |
| typedef enum {
 | |
| 	BLKNUM_NOT_USE,                             ///< block not used
 | |
| 	BLKNUM_SINGLE,                              ///< use single block
 | |
| 	BLKNUM_DOUBLE,                              ///< use double block
 | |
| 	BLKNUM_TRIPLE,                              ///< use triple block
 | |
| 	ENUM_DUMMY4WORD(USB_EP_BLKNUM)
 | |
| } USB_EP_BLKNUM;
 | |
| 
 | |
| /**
 | |
|     Endpoint direction
 | |
| 
 | |
|     @note For Direction of USB_ENP_CONFIG
 | |
| */
 | |
| typedef enum {
 | |
| 	EP_DIR_NOT_USE,                             ///< Endpoint direction not set
 | |
| 	EP_DIR_IN,                                  ///< Endpoint direction is IN
 | |
| 	EP_DIR_OUT,                                 ///< Endpoint direction is OUT
 | |
| 	ENUM_DUMMY4WORD(USB_EP_DIR)
 | |
| } USB_EP_DIR;
 | |
| 
 | |
| /**
 | |
|     Endpoint transfer type
 | |
| 
 | |
|     @note For trnsfer_type of USB_ENP_CONFIG
 | |
| */
 | |
| typedef enum {
 | |
| 	EP_TYPE_NOT_USE,                            ///< Endpoint transfer type not set
 | |
| 	EP_TYPE_ISOCHRONOUS,                        ///< Endpoint transfer type is isochronous
 | |
| 	EP_TYPE_BULK,                               ///< Endpoint transfer type is bulk
 | |
| 	EP_TYPE_INTERRUPT,                          ///< Endpoint transfer type is interrupt
 | |
| 	ENUM_DUMMY4WORD(USB_EP_TYPE)
 | |
| } USB_EP_TYPE;
 | |
| 
 | |
| /**
 | |
|     transaction number for high bandwidth endpoint
 | |
| 
 | |
|     @note For high_bandwidth of USB_ENP_CONFIG
 | |
| */
 | |
| typedef enum {
 | |
| 	HBW_NOT,                                    ///< not high bandwidth
 | |
| 	HBW_1,                                      ///< one transaction
 | |
| 	HBW_2,                                      ///< two transaction
 | |
| 	HBW_3,                                      ///< three transaction
 | |
| 	ENUM_DUMMY4WORD(USB_EP_HBW)
 | |
| } USB_EP_HBW;
 | |
| 
 | |
| /**
 | |
|     USB controller state
 | |
| 
 | |
|     @note For usb_setControllerState(), usb2dev_get_controller_state()
 | |
| */
 | |
| typedef enum {
 | |
| 	USB_CONTROLLER_STATE_NONE,                  ///< USB controller state is none
 | |
| 	USB_CONTROLLER_STATE_RESET,                 ///< USB controller state is reset
 | |
| 	USB_CONTROLLER_STATE_SUSPEND,               ///< USB controller state is suspend
 | |
| 	ENUM_DUMMY4WORD(USB_CONTROLLER_STATE)
 | |
| } USB_CONTROLLER_STATE;
 | |
| 
 | |
| /**
 | |
|     Endpoint configuration
 | |
| 
 | |
|     @note For ep_config_hs and ep_config_fs of USB_MNG
 | |
| */
 | |
| typedef  struct Endpoint_Config {
 | |
| 	BOOL           enable;                      ///< enable this endpoint or not
 | |
| 												///< - @b TRUE: this endpoint descriptor is enabled
 | |
| 												///< - @b FALSE: this endpoint descriptor is disabled
 | |
| 	UINT32         blk_size;                     ///< block size : inform usb controller allocate 512/1024 bytes block for this endpoint
 | |
| 												///< - @b 512: max_pkt_size <= 512 bytes
 | |
| 												///< - @b 1024: max_pkt_size > 512 bytes
 | |
| 	USB_EP_BLKNUM  blk_num;                      ///< block number : single/double/triple
 | |
| 	USB_EP_DIR     direction;                   ///< IN or OUT drection
 | |
| 	USB_EP_TYPE    trnsfer_type;                 ///< bulk/interrupt/isochronous
 | |
| 	UINT32         max_pkt_size;                  ///< max packet size (unit: byte)
 | |
| 	USB_EP_HBW     high_bandwidth;               ///< transzction number for high bandwidth endpoint
 | |
| } USB_ENP_CONFIG;
 | |
| 
 | |
| 
 | |
| /**
 | |
|     USB Management Infomation Table
 | |
| 
 | |
|     This is used in usb2dev_init_management() / usb2dev_set_management() to apply usb configurations before usb2dev_open().
 | |
| */
 | |
| typedef struct {
 | |
| 	UINT32           magic_no;                      ///< No not modify. this value is assigned by usb2dev_init_management().
 | |
| 	USB_DEV_TYPE     usb_type;                      ///< USB_MSD, USB_SIDC, USB_PCC
 | |
| 
 | |
| 	USB_DEVICE_DESC  *p_dev_desc;                   ///< USB Device Descriptor ptr
 | |
| 	USB_CONFIG_DESC  *p_config_desc;                  ///< USB Config Descriptor ptr
 | |
| 	USB_CONFIG_DESC  *p_config_others_desc;            ///< USB Config Descriptor ptr
 | |
| 	USB_CONFIG_DESC  *p_config_desc_hs;                ///< USB HighSpeed Descriptor
 | |
| 	USB_CONFIG_DESC  *p_config_desc_fs;                ///< USB FullSpeed Descriptor
 | |
| 	USB_CONFIG_DESC  *p_config_desc_fs_other;           ///< USB HighSpeed Descriptor
 | |
| 	USB_CONFIG_DESC  *p_config_desc_hs_other;           ///< USB FullSpeed Descriptor
 | |
| 	USB_ENP_CONFIG   ep_config_hs[15];              ///< set Highspeed endpoint configuration
 | |
| 	USB_ENP_CONFIG   ep_config_fs[15];              ///< set Fullspeed endpoint configuration
 | |
| 	USB_STRING_DESC  *p_string_desc[8];               ///< USB String Descriptor ptr
 | |
| 	USB_DEVICE_DESC  *p_dev_quali_desc;                ///< USB Qualifier ptr; High speed vs low speed.
 | |
| 	UINT16           num_of_configurations;            ///< configuration number
 | |
| 	UINT16           num_of_strings;                   ///< string number
 | |
| 
 | |
| 	void (*fp_open_needed_fifo)(void);               ///< callback function to enable/disable FIFO
 | |
| 	void (*fp_event_callback)(UINT32 event);              ///< ISR callback function
 | |
| 	FP               fp_usb_suspend;               ///< callback function pointer for suspend
 | |
| 
 | |
| } USB_MNG;
 | |
| 
 | |
| 
 | |
| /**
 | |
|     control transfer
 | |
| 
 | |
|     @note For global variable usb2dev_control_data which pass control transfer information between usb driver and class library
 | |
| */
 | |
| typedef struct {
 | |
| 	UINT8               *p_data;                  ///< data pointer to CX IN data
 | |
| 	USB_DEVICE_REQUEST  device_request;           ///< device request
 | |
| 	UINT16              w_length;                 ///< length
 | |
| 	UINT16              reserved;                ///< reserved
 | |
| } CONTROL_XFER;
 | |
| 
 | |
| /**
 | |
|     USB configuration identifier
 | |
| 
 | |
|     @note For usb2dev_set_config(), usb2dev_get_config()
 | |
| */
 | |
| typedef enum {
 | |
| 	USB_CONFIG_ID_STANDARD_CHARGER,             ///< Select standard charger support
 | |
| 												///<   Context can be:
 | |
| 												///<   - @b TRUE: USB standard charger (Default value)
 | |
| 												///<   - @b FALSE: non-standard charger
 | |
| 
 | |
| 	USB_CONFIG_ID_SQUELCH_LEVEL,                ///< Get squelch level.
 | |
| 	USB_CONFIG_ID_HS_SWING,                     ///< Get high speed TX Swing
 | |
| 	USB_CONFIG_ID_REF_CURRENT,                  ///< Get reference current
 | |
| 
 | |
| 	USB_CONFIG_ID_USE_SHARE_FIFO,               ///< Allow the USB Endpoint use the Bi-Directional share FIFO or not.
 | |
| 												///<   Context can be:
 | |
| 												///<   - @b TRUE:  Allow to use share FIFO for IN/OUT endpoints.
 | |
| 												///<   - @b FALSE: Always use independent FIFO for all endpoints (Default value)
 | |
| 	USB_CONFIG_ID_FIFOMAP_4FIRST,				///< Configure internal 8 fifo to endpoint map is from fifo0 or fifo4 first.
 | |
| 												///<   Context can be:
 | |
| 												///<   - @b TRUE:  FIFO4 first. (default)
 | |
| 												///<   - @b FALSE: By USB_CONFIG_ID_FIFO_START_OFS settings value.
 | |
| 	USB_CONFIG_ID_FIFO_START_OFS,               ///< Select FIFO Mapping Start Offset. Default is 0(FIFO0). Valid setting range is 0-7.
 | |
| 	USB_CONFIG_ID_AUTO_FIFO_CLR,				///< Select Endpoint number for auto fifo clear. Please use USB_EP as input.
 | |
| 	USB_CONFIG_ID_CHECK_CXOUT,					///< Get CX OUT is ready or not. 0: Not Ready. 1: Ready.
 | |
| 
 | |
| 	ENUM_DUMMY4WORD(USB_CONFIG_ID)
 | |
| } USB_CONFIG_ID;
 | |
| 
 | |
| /**
 | |
|     USB call back list
 | |
| 
 | |
|     @note For usb2dev_set_callback()
 | |
| */
 | |
| typedef enum {
 | |
| 	USB_CALLBACK_CHARGING_EVENT,            ///< usb charging event call back (Designed for project layer)
 | |
| 											///< (SUGGESTED to be invoked in system init phase)
 | |
| 											///< The installed call back can receive following event:
 | |
| 											///< - @b USB_CHARGE_EVENT_2P5MA
 | |
| 											///< - @b USB_CHARGE_EVENT_100MA
 | |
| 											///< - @b USB_CHARGE_EVENT_500MA
 | |
| 											///< - @b USB_CHARGE_EVENT_5A
 | |
| 	USB_CALLBACK_CX_CLASS_REQUEST,          ///< usb control pipe class request call back (Designed for usb class)
 | |
| 											///< The installed call back doesn't need to receive parameter
 | |
| 	USB_CALLBACK_SET_INTERFACE,             ///< usb set interface call back (Designed for project/class layer)
 | |
| 											///< (SUGGESTED to be invoked in class init phase)
 | |
| 											///< The installed call back can receive USB_SETINTERFACE_EVENT
 | |
| 	USB_CALLBACK_CX_VENDOR_REQUEST,         ///< usb control pipe vendor request call back (Designed for usb class)
 | |
| 											///< The installed call back should process usb2dev_control_data by itself
 | |
| 											///< The installed call back will be invoked when vendor request is received
 | |
| 	USB_CALLBACK_READ_QUEUE_DONE,
 | |
| 	USB_CALLBACK_STD_UNKNOWN_REQ,			///< usb std request with unknown request type event callback. prototype as USB_GENERIC_CB.
 | |
| 
 | |
| 	ENUM_DUMMY4WORD(USB_CALLBACK)
 | |
| } USB_CALLBACK;
 | |
| 
 | |
| 
 | |
| /**
 | |
|     USB Endpoint Configuration Select ID
 | |
| 
 | |
|     This is used in usb2dev_set_ep_config()/usb2dev_get_ep_config() to select which Endpoint Config is chosen to assign new configuration.
 | |
| */
 | |
| typedef enum {
 | |
| 	USB_EPCFG_ID_AUTOHDR_EN,            ///< Set Auto-Header function Enable/Disable. TRUE is enable and FALSE is disable.
 | |
| 	USB_EPCFG_ID_AUTOHDR_LEN,           ///< Set Auto-Header Length. The configuration value must be 2 or 12. Others are not supported.
 | |
| 
 | |
| 	USB_EPCFG_ID_AUTOHDR_START,         ///< If setting START to TRUE/ENABLE, the next DMA Trigger start would toggle FID bit in the header field.
 | |
| 										///< If setting START to FALSE/DISABLE, the next DMA Trigger start would keep current FID bit in the header field.
 | |
| 	USB_EPCFG_ID_AUTOHDR_STOP,          ///< If setting STOP to TRUE/ENABLE, the controller would set EOF to 1 in the header field at the next DMA ending SOF slice.
 | |
| 	USB_EPCFG_ID_AUTOHDR_RSTCOUNTER,    ///< Set TRUE to reset internal 32bits counter value to 0 for PTS[31:0] and SCR[31:0].
 | |
| 
 | |
| 	/* Get Only */
 | |
| 	USB_EPCFG_ID_AUTOHDR_FID_VAL,       ///< Get current FID bit value in the auto header field.
 | |
| 	USB_EPCFG_ID_AUTOHDR_EOF_VAL,       ///< Get current EOF bit value in the auto header field.
 | |
| 	USB_EPCFG_ID_AUTOHDR_PTS_VAL,       ///< Get current PTS[31:0] value in the auto header field.
 | |
| 	USB_EPCFG_ID_AUTOHDR_SCRLSB_VAL,    ///< Get current SCR[31:0] value in the auto header field.
 | |
| 	USB_EPCFG_ID_AUTOHDR_SCRMSB_VAL,    ///< Get current SCR[47:32] value in the auto header field.
 | |
| 
 | |
| 
 | |
| 	/* Below Config IDs are reserved for internal usage only */
 | |
| 	USB_EPCFG_ID_AUTOHDR_HWFID_EN,      // Novatek internal usage only
 | |
| 	USB_EPCFG_ID_AUTOHDR_SWFID,         // Novatek internal usage only
 | |
| 	USB_EPCFG_ID_AUTOHDR_HWPTS_EN,      // Novatek internal usage only
 | |
| 	USB_EPCFG_ID_AUTOHDR_SWPTS,         // Novatek internal usage only
 | |
| 
 | |
| 	ENUM_DUMMY4WORD(USB_EPCFG_ID)
 | |
| } USB_EPCFG_ID;
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| /**
 | |
|     usb2dev_control_data
 | |
| 
 | |
|     Control Transfer information
 | |
| 
 | |
|     - If SETUP token is received, usb driver may pass usb2dev_control_data to class library for vendor control transfer
 | |
|     - If class library needs return CX_IN data, it should fill usb2dev_control_data then invoke usb2dev_reture_setup_data()
 | |
| */
 | |
| extern CONTROL_XFER usb2dev_control_data;
 | |
| 
 | |
| 
 | |
| //
 | |
| // Normal USB Driver API
 | |
| //
 | |
| 
 | |
| /**
 | |
|     Initialize USB Management Infomation Table Data Structure
 | |
| 
 | |
|     Initialize USB Management Infomation Table Data Structure.
 | |
|     User can allocate local parameter of USB_MNG and apply usb2dev_init_management to it.
 | |
|     And then start configure the management table.
 | |
| 
 | |
|     @param[in] pMng USB Management Infomation Table pointer
 | |
| 
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_init_management(USB_MNG *p_management);
 | |
| 
 | |
| /**
 | |
|     Apply USB Management Infomation Table
 | |
| 
 | |
|     Apply USB Management Infomation Table to USB Driver.
 | |
| 
 | |
|     @param[in] pMng USB Management Infomation Table pointer
 | |
| 
 | |
|     @return
 | |
|      - @b E_OK:  Apply management info success.
 | |
|      - @b E_PAR: Input parameter is NULL pointer.
 | |
|      - @b E_CTX: No Init. Please apply usb2dev_init_management() to pMng first.
 | |
| */
 | |
| extern ER                   usb2dev_set_management(USB_MNG *p_management);
 | |
| 
 | |
| /**
 | |
|     Get Current USB Management Infomation Table
 | |
| 
 | |
|     Get Current  USB Management Infomation Table to USB Driver.
 | |
| 
 | |
|     @param[out] pMng USB Management Infomation Table pointer
 | |
| 
 | |
|     @return
 | |
|      - @b E_OK:  Apply management info success.
 | |
|      - @b E_PAR: Input parameter is NULL pointer.
 | |
|      - @b E_CTX: No Init. Please apply usb2dev_init_management() to pMng first.
 | |
| */
 | |
| extern ER                   usb2dev_get_management(USB_MNG *p_management);
 | |
| 
 | |
| /**
 | |
|     Open USB driver
 | |
| 
 | |
|     Initialize USB module and enable interrupt, start running
 | |
|     control & setup task for ISR etc...
 | |
| 
 | |
|     @return
 | |
|         - @b E_OK: open success
 | |
|         - @b E_OACV: USB driver is already opened
 | |
|         - @b E_ID: Outside semaphore ID number range
 | |
|         - @b E_NOEXS: Semaphore does not yet exist
 | |
|         - @b E_SYS: USB has been unplug, so ignore this request...
 | |
| */
 | |
| extern ER                   usb2dev_open(void);
 | |
| 
 | |
| /**
 | |
|     Check usb charger
 | |
| 
 | |
|     Check if connect with a usb charger
 | |
| 
 | |
|     @param[in] debounce       debounce time to detect usb charger, unit: 10ms
 | |
| 
 | |
|     @return
 | |
|         - @b USB_CHARGER_STS_NONE: PC or not charger detected
 | |
|         - @b USB_CHARGER_STS_CHARGING_DOWNSTREAM_PORT: charging downstream port
 | |
|         - @b USB_CHARGER_STS_CHARGER: charger detected
 | |
| */
 | |
| extern USB_CHARGER_STS      usb2dev_check_charger(UINT32 debounce);
 | |
| 
 | |
| /**
 | |
|     USB Power on initialization.
 | |
| 
 | |
|     @note This API SHOULD be invoked in system init phase. Else USB may be malfunctioned.
 | |
| 
 | |
|     @param[in] highspeed   set USB in high/full speed mode
 | |
|                             - @b TRUE: high speed mode
 | |
|                             - @b FALSE: full speed mode
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_power_on_init(BOOL highspeed);
 | |
| 
 | |
| /**
 | |
|     USB Change state
 | |
| 
 | |
|     Calling this function to get the current plug status.
 | |
|     Application should remember the plug/unplug state to avoid calling
 | |
|     open/close function multiple!
 | |
| 
 | |
|     @return
 | |
|         - @b FALSE: Unplug State.
 | |
|         - @b TRUE: Plug State.
 | |
| */
 | |
| extern BOOL                 usb2dev_state_change(void);
 | |
| 
 | |
| /**
 | |
|     Close USB device driver access.
 | |
| 
 | |
|     This function will stop USB DMA, terminate control and setup task,
 | |
|     disable interrupt and USB clock etc...
 | |
| 
 | |
|     @return
 | |
|         - @b E_OK: open success
 | |
|         - @b E_OACV: USB driver is not opened
 | |
|         - @b E_ID: Outside semaphore ID number range
 | |
|         - @b E_NOEXS: Semaphore does not yet exist
 | |
|         - @b E_QOVR: Semaphore's counter error, maximum counter < counter
 | |
| */
 | |
| extern ER                   usb2dev_close(void);
 | |
| 
 | |
| /**
 | |
|     Set VBUSI state
 | |
| 
 | |
|     Force VBUSI state for USB controller
 | |
|     This API should be invoked when upper layer want to force USB connect without usb2dev_state_change()
 | |
| 
 | |
|     @param[in] plug    state of current VBUSI
 | |
|                         - @b TRUE: VBUSI is HIGH
 | |
|                         - @b FALSE: VBUSI is LOW
 | |
| 
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_set_vbusi(BOOL plug);
 | |
| 
 | |
| /**
 | |
|     Set the callback function when wakeup from standby mode
 | |
| 
 | |
|     User can use this API to register call back when system is waked up from power down/standby mode.
 | |
|     The installed call back will be invoked if system is waked up by USB (resume/reset).
 | |
| 
 | |
|     @param[in] fp_isr    User defined ISR for wakeup interrupt
 | |
| 
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_set_standby_wakeup(DRV_CB fp_isr);
 | |
| 
 | |
| /**
 | |
|     get USB controller state.
 | |
| 
 | |
|     @return    USB controller state
 | |
|         - @b USB_CONTROLLER_STATE_NONE: USB is not used
 | |
|         - @b USB_CONTROLLER_STATE_RESET: USB is in reset state
 | |
|         - @b USB_CONTROLLER_STATE_SUSPEND: USB is in suspend state
 | |
| */
 | |
| extern USB_CONTROLLER_STATE usb2dev_get_controller_state(void);
 | |
| 
 | |
| /**
 | |
|     Check set configuration result
 | |
| 
 | |
|     This API is provided to upper layer to check if USB is under set configuration state.
 | |
| 
 | |
|     @return
 | |
|         - @b TRUE: under set configuration
 | |
|         - @b FALSE: not under set configuration
 | |
| */
 | |
| extern BOOL                 usb2dev_check_configured(void);
 | |
| 
 | |
| /**
 | |
|     Set USB controller configuration
 | |
| 
 | |
|     @param[in] config_id         configuration identifier
 | |
|     @param[in] config_context    configuration context for config_id
 | |
| 
 | |
|     @return
 | |
|         - @b E_OK: set configuration success
 | |
|         - @b E_NOSPT: config_id is not supported
 | |
| */
 | |
| extern ER                   usb2dev_set_config(USB_CONFIG_ID config_id, UINT32 config_context);
 | |
| 
 | |
| /**
 | |
|     Get USB controller configuration
 | |
| 
 | |
|     @param[in] config_id         configuration identifier
 | |
| 
 | |
|     @return configuration context for config_id
 | |
| */
 | |
| extern UINT32               usb2dev_get_config(USB_CONFIG_ID config_id);
 | |
| 
 | |
| /**
 | |
|     Set usb call back routine
 | |
| 
 | |
|     This function provides a facility for upper layer to install callback routine.
 | |
| 
 | |
|     @param[in] callback_id   callback routine identifier
 | |
|     @param[in] p_callback    callback routine to be installed
 | |
| 
 | |
|     @return
 | |
|         - @b E_OK: install callback success
 | |
|         - @b E_NOSPT: callback_id is not valid
 | |
| */
 | |
| extern ER                   usb2dev_set_callback(USB_CALLBACK callback_id, USB_GENERIC_CB p_callback);
 | |
| 
 | |
| /**
 | |
|     Get the current setting of USB speed mode.
 | |
| 
 | |
|     @return
 | |
|         - @b TRUE: device is in High speed
 | |
|         - @b FALSE: device is in full speed
 | |
| */
 | |
| extern BOOL                 usb2dev_is_highspeed_enabled(void);
 | |
| 
 | |
| //
 | |
| // USB read /write functions
 | |
| //
 | |
| 
 | |
| /**
 | |
|     Return setup data to host.
 | |
| 
 | |
|     Class library can use this API to return CX IN data after receive a setup packet.
 | |
| 
 | |
|     @note Before invoke this API, usb2dev_control_data.p_data should point to return data\n
 | |
|             and usb2dev_control_data.w_length should be filled with length of return data.
 | |
| 
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_reture_setup_data(void);
 | |
| 
 | |
| /**
 | |
|     Read the buffer content from FIFO
 | |
| 
 | |
|     This function is blocking mode. It will return until DMA done or
 | |
|     some error occured. Check the return ER and p_dma_length for actual
 | |
|     transfered length.
 | |
| 
 | |
|     @param[in] epn          endpoint number (USB_EP0~USB_EP15)
 | |
|     @param[in] p_buffer      buffer pointer
 | |
|     @param[in,out] p_dma_length  input length to read, output actual transfered length
 | |
| 
 | |
|     @return
 | |
|         - @b E_OACV: USB driver is not opened
 | |
|         - @b E_PAR: input DMA length or EP number incorrect
 | |
|         - @b E_OBJ: FIFO is busy
 | |
|         - @b E_SYS: USB is SUSPENDED
 | |
|         - @b E_OK: read done (maybe aborted, check return p_dma_length)
 | |
| */
 | |
| extern ER                   usb2dev_read_endpoint(USB_EP epn, UINT8 *p_buffer, UINT32 *p_dma_length);
 | |
| extern ER 					usb2dev_read_endpoint_timeout(USB_EP EPn, UINT8 *pBuffer, UINT32 *pDMALen, UINT32 timeout_ms);
 | |
| 
 | |
| /**
 | |
|     Write the buffer content to FIFO
 | |
| 
 | |
|     This function is blocking mode. It will return until DMA done or
 | |
|     some error occured. Check the return ER and p_dma_length for actual
 | |
|     transfered length.
 | |
| 
 | |
|     @param[in] epn          endpoint number (USB_EP0~USB_EP15)
 | |
|     @param[in] p_buffer      buffer pointer
 | |
|     @param[in,out] p_dma_length  input length to write, output actual transfered length
 | |
| 
 | |
|     @return
 | |
|         - @b E_OACV: USB driver is not opened
 | |
|         - @b E_PAR: input DMA length or EP number incorrect
 | |
|         - @b E_OBJ: FIFO is busy
 | |
|         - @b E_SYS: USB is SUSPENDED
 | |
|         - @b E_OK: read done (maybe aborted, check return p_dma_length)
 | |
| */
 | |
| extern ER                   usb2dev_write_endpoint(USB_EP epn, UINT8 *p_buffer, UINT32 *p_dma_length);
 | |
| extern ER 					usb2dev_write_endpoint_timeout(USB_EP EPn, UINT8 *pBuffer, UINT32 *pDMALen, UINT32 timeout_ms);
 | |
| 
 | |
| /**
 | |
|     Abort the endpoint transfer
 | |
| 
 | |
|     @param[in] epn  endpoint number (1~15)
 | |
| 
 | |
|     @return
 | |
|         - @b E_OK: abort success
 | |
|         - @b Else: abort fail
 | |
| */
 | |
| extern ER                   usb2dev_abort_endpoint(USB_EP epn);
 | |
| 
 | |
| /**
 | |
|     Read the buffer content from FIFO
 | |
| 
 | |
|     This function is non-blocking mode and will return immediately.
 | |
|     Used with usb2dev_wait_ep_done() to wait for DMA complete.
 | |
| 
 | |
|     @param[in] epn      endpoint number (USB_EP0~USB_EP15)
 | |
|     @param[in] p_buffer  buffer pointer
 | |
|     @param[in] p_dma_length  DMA length to be read.
 | |
|                         Valid length 0x1 to 0x40 for EP0.
 | |
|                         Valid length 0x1 to 0x7fffff for EP1~EP15.
 | |
| 
 | |
|     @return
 | |
|         - @b E_OACV: USB driver is not opened
 | |
|         - @b E_PAR: input DMA length or EP number incorrect
 | |
|         - @b E_OBJ: FIFO is busy
 | |
|         - @b E_SYS: USB is SUSPENDED
 | |
|         - @b E_OK: start to transfer
 | |
| */
 | |
| extern ER                   usb2dev_set_ep_read(USB_EP epn, UINT8 *p_buffer, UINT32 *p_dma_length);
 | |
| 
 | |
| extern UINT32				usb2dev_set_ep_read_queue(USB_EP epn, UINT8 *p_buffer, UINT32 *p_dma_length);
 | |
| 
 | |
| /**
 | |
|     Write the buffer content to FIFO
 | |
| 
 | |
|     This function is non-blocking mode and will return immediately.
 | |
|     Used with usb2dev_wait_ep_done() to wait for DMA complete.
 | |
| 
 | |
|     @param[in] epn      endpoint number (USB_EP0~USB_EP15)
 | |
|     @param[in] p_buffer  buffer pointer
 | |
|     @param[in] p_dma_length  DMA length to be written.
 | |
|                         Valid length 0x1 to 0x40 for EP0.
 | |
|                         Valid length 0x1 to 0x7fffff for EP1~EP15.
 | |
| 
 | |
|     @return
 | |
|         - @b E_OACV: USB driver is not opened
 | |
|         - @b E_PAR: input DMA length or EP number incorrect
 | |
|         - @b E_OBJ: FIFO is busy
 | |
|         - @b E_SYS: USB is SUSPENDED
 | |
|         - @b E_OK: start to transfer
 | |
| */
 | |
| extern ER                   usb2dev_set_ep_write(USB_EP epn, UINT8 *p_buffer, UINT32 *p_dma_length);
 | |
| 
 | |
| /**
 | |
|     Wait for endpoint DMA done
 | |
| 
 | |
|     This function is used with usb2dev_set_ep_read() or usb2dev_set_ep_write().
 | |
|     It will Wait until DMA done and return actual transfered length
 | |
| 
 | |
|     @param[in] epn          endpoint number (USB_EP0~USB_EP8)
 | |
|     @param[in,out] p_dma_length  input DMA length (1~0x7fffff), output actual transfered length
 | |
| 
 | |
|     @return
 | |
|         - @b E_OACV: USB driver is not opened
 | |
|         - @b E_OK: DMA done (maybe aborted, check return p_dma_length)
 | |
| */
 | |
| extern ER                   usb2dev_wait_ep_done(USB_EP epn, UINT32 *p_dma_length);
 | |
| 
 | |
| //
 | |
| // USB endpoint and FIFO setting functions
 | |
| //
 | |
| 
 | |
| /**
 | |
|     Set Configuration value to dedicate Endpoint
 | |
| 
 | |
|     Set Configuration value to dedicate Endpoint
 | |
| 
 | |
|     @param[in] epn          Endpoint number.
 | |
|     @param[in] config_id        Configuration Select ID.
 | |
|     @param[in] config_value   Configuration value.
 | |
| 
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_set_ep_config(USB_EP epn, USB_EPCFG_ID config_id, UINT32 config_value);
 | |
| 
 | |
| /**
 | |
|     Get Configuration value from dedicate Endpoint
 | |
| 
 | |
|     Get Configuration value from dedicate Endpoint
 | |
| 
 | |
|     @param[in] epn      Endpoint number.
 | |
|     @param[in] config_id    Configuration Select ID.
 | |
| 
 | |
|     @return Configuration value
 | |
| */
 | |
| extern UINT32               usb2dev_get_ep_config(USB_EP epn, USB_EPCFG_ID config_id);
 | |
| 
 | |
| /**
 | |
|     Mask(Disable) the endpoint interrupt
 | |
| 
 | |
|     @param[in] epn  endpoint number (USB_EP0~USB_EP8)
 | |
| 
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_mask_ep_interrupt(USB_EP epn);
 | |
| 
 | |
| /**
 | |
|     Unmask(Enable) the endpoint interrupt
 | |
| 
 | |
|     @param[in] epn  endpoint number (USB_EP0~USB_EP8)
 | |
| 
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_unmask_ep_interrupt(USB_EP epn);
 | |
| 
 | |
| /**
 | |
|     Set endpoint0 CX_DONE
 | |
| 
 | |
|     When class library completes transfers of CX IN/OUT, it should invoke this API to enter status stage.
 | |
| 
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_set_ep0_done(void);
 | |
| 
 | |
| /**
 | |
|     Set endpoint stall
 | |
| 
 | |
|     When class library finds somethins wrong, it can use this API to make a function stall for this endpoint.
 | |
| 
 | |
|     @param[in] epn  endpoint number (USB_EP0~USB_EP15)
 | |
| 
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_set_ep_stall(USB_EP epn);
 | |
| 
 | |
| /**
 | |
|     Clear Endpoint FIFO
 | |
| 
 | |
|     Clear endpoint related FIFO.
 | |
| 
 | |
|     @param[in] epn  endpoint number (USB_EP0~USB_EP15)
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_clear_ep_fifo(USB_EP epn);
 | |
| 
 | |
| /**
 | |
|     clear FIFO
 | |
| 
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_clear_fifo(void);
 | |
| 
 | |
| /**
 | |
|     Set the endpoint to send a 0 byte data
 | |
| 
 | |
|     @param[in] epn      endpoint number (USB_EP1~USB_EP15)
 | |
| 
 | |
|     @return void
 | |
| */
 | |
| extern void                 usb2dev_set_tx0byte(USB_EP epn);
 | |
| 
 | |
| /**
 | |
|     Get endpoint byte count.
 | |
| 
 | |
|     Some application may not know the exactly transfering size at
 | |
|     the beginning. Use this function to get the FIFO byte counts.
 | |
|     This API should be used after OUT interrupt issued.
 | |
| 
 | |
|     @param[in] epn      endpoint number (USB_EP0~USB_EP15)
 | |
| 
 | |
|     @return endpoint byte count
 | |
| */
 | |
| extern UINT32               usb2dev_get_ep_bytecount(USB_EP epn);
 | |
| 
 | |
| /**
 | |
|     Check endpoint FIFO empty
 | |
| 
 | |
|     @param[in] epn      endpoint number (USB_EP1~USB_EP8)
 | |
| 
 | |
|     @return
 | |
|         - @b TRUE: FIFO for this endpoint is empty
 | |
|         - @b FALSE: FIFO for this endpoint is NOT empty
 | |
| */
 | |
| extern BOOL                 usb2dev_check_ep_empty(USB_EP epn);
 | |
| 
 | |
| /**
 | |
|     Check endpoint is Busy or not.
 | |
| 
 | |
|     @param[in] epn      endpoint number (USB_EP1~USB_EP15)
 | |
| 
 | |
|     @return
 | |
|         - @b FALSE:      FIFO for this endpoint is empty and DMA is not working.
 | |
|         - @b TRUE:     FIFO for this endpoint is busy.
 | |
| */
 | |
| extern BOOL                 usb2dev_check_ep_busy(USB_EP epn);
 | |
| 
 | |
| /**
 | |
|     Get SOF
 | |
| 
 | |
|     Return current SOF 11bits value
 | |
| 
 | |
|     @return SOF value
 | |
| */
 | |
| extern UINT32               usb2dev_get_sof_number(void);
 | |
| 
 | |
| extern void usb2dev_init(void);
 | |
| extern void usb2dev_uninit(void);
 | |
| 
 | |
| //@}
 | |
| #endif // _USB_H
 | 
