418 lines
13 KiB
C
418 lines
13 KiB
C
/**
|
|
******************************************************************************
|
|
* @file usb_core.h
|
|
* @author MCD Application Team
|
|
* @version V2.1.0
|
|
* @date 19-March-2012
|
|
* @brief Header of the Core Layer
|
|
******************************************************************************
|
|
* @attention
|
|
*
|
|
* <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>
|
|
*
|
|
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
|
|
* You may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.st.com/software_license_agreement_liberty_v2
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
#ifndef __USB_CORE_H__
|
|
#define __USB_CORE_H__
|
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
#include "usb_conf.h"
|
|
#include "usb_regs.h"
|
|
#include "usb_defines.h"
|
|
|
|
|
|
/** @addtogroup USB_OTG_DRIVER
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup USB_CORE
|
|
* @brief usb otg driver core layer
|
|
* @{
|
|
*/
|
|
|
|
|
|
/** @defgroup USB_CORE_Exported_Defines
|
|
* @{
|
|
*/
|
|
|
|
#define USB_OTG_EP0_IDLE 0
|
|
#define USB_OTG_EP0_SETUP 1
|
|
#define USB_OTG_EP0_DATA_IN 2
|
|
#define USB_OTG_EP0_DATA_OUT 3
|
|
#define USB_OTG_EP0_STATUS_IN 4
|
|
#define USB_OTG_EP0_STATUS_OUT 5
|
|
#define USB_OTG_EP0_STALL 6
|
|
|
|
#define USB_OTG_EP_TX_DIS 0x0000
|
|
#define USB_OTG_EP_TX_STALL 0x0010
|
|
#define USB_OTG_EP_TX_NAK 0x0020
|
|
#define USB_OTG_EP_TX_VALID 0x0030
|
|
|
|
#define USB_OTG_EP_RX_DIS 0x0000
|
|
#define USB_OTG_EP_RX_STALL 0x1000
|
|
#define USB_OTG_EP_RX_NAK 0x2000
|
|
#define USB_OTG_EP_RX_VALID 0x3000
|
|
/**
|
|
* @}
|
|
*/
|
|
#define MAX_DATA_LENGTH 0x200
|
|
|
|
/** @defgroup USB_CORE_Exported_Types
|
|
* @{
|
|
*/
|
|
|
|
|
|
typedef enum {
|
|
USB_OTG_OK = 0,
|
|
USB_OTG_FAIL
|
|
}USB_OTG_STS;
|
|
|
|
typedef enum {
|
|
HC_IDLE = 0,
|
|
HC_XFRC,
|
|
HC_HALTED,
|
|
HC_NAK,
|
|
HC_NYET,
|
|
HC_STALL,
|
|
HC_XACTERR,
|
|
HC_BBLERR,
|
|
HC_DATATGLERR,
|
|
}HC_STATUS;
|
|
|
|
typedef enum {
|
|
URB_IDLE = 0,
|
|
URB_DONE,
|
|
URB_NOTREADY,
|
|
URB_ERROR,
|
|
URB_STALL
|
|
}URB_STATE;
|
|
|
|
typedef enum {
|
|
CTRL_START = 0,
|
|
CTRL_XFRC,
|
|
CTRL_HALTED,
|
|
CTRL_NAK,
|
|
CTRL_STALL,
|
|
CTRL_XACTERR,
|
|
CTRL_BBLERR,
|
|
CTRL_DATATGLERR,
|
|
CTRL_FAIL
|
|
}CTRL_STATUS;
|
|
|
|
|
|
typedef struct USB_OTG_hc
|
|
{
|
|
uint8_t dev_addr ;
|
|
uint8_t ep_num;
|
|
uint8_t ep_is_in;
|
|
uint8_t speed;
|
|
uint8_t do_ping;
|
|
uint8_t ep_type;
|
|
uint16_t max_packet;
|
|
uint8_t data_pid;
|
|
uint8_t *xfer_buff;
|
|
uint32_t xfer_len;
|
|
uint32_t xfer_count;
|
|
uint8_t toggle_in;
|
|
uint8_t toggle_out;
|
|
uint32_t dma_addr;
|
|
}
|
|
USB_OTG_HC , *PUSB_OTG_HC;
|
|
|
|
typedef struct USB_OTG_ep
|
|
{
|
|
uint8_t num;
|
|
uint8_t is_in;
|
|
uint8_t is_stall;
|
|
uint8_t type;
|
|
uint8_t data_pid_start;
|
|
uint8_t even_odd_frame;
|
|
uint16_t tx_fifo_num;
|
|
uint32_t maxpacket;
|
|
/* transaction level variables*/
|
|
uint8_t *xfer_buff;
|
|
uint32_t dma_addr;
|
|
uint32_t xfer_len;
|
|
uint32_t xfer_count;
|
|
/* Transfer level variables*/
|
|
uint32_t rem_data_len;
|
|
uint32_t total_data_len;
|
|
uint32_t ctl_data_len;
|
|
|
|
}
|
|
|
|
USB_OTG_EP , *PUSB_OTG_EP;
|
|
|
|
|
|
|
|
typedef struct USB_OTG_core_cfg
|
|
{
|
|
uint8_t host_channels;
|
|
uint8_t dev_endpoints;
|
|
uint8_t speed;
|
|
uint8_t dma_enable;
|
|
uint16_t mps;
|
|
uint16_t TotalFifoSize;
|
|
uint8_t phy_itface;
|
|
uint8_t Sof_output;
|
|
uint8_t low_power;
|
|
uint8_t coreID;
|
|
|
|
}
|
|
USB_OTG_CORE_CFGS, *PUSB_OTG_CORE_CFGS;
|
|
|
|
|
|
|
|
typedef struct usb_setup_req {
|
|
|
|
uint8_t bmRequest;
|
|
uint8_t bRequest;
|
|
uint16_t wValue;
|
|
uint16_t wIndex;
|
|
uint16_t wLength;
|
|
} USB_SETUP_REQ;
|
|
|
|
typedef struct _Device_TypeDef
|
|
{
|
|
uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length);
|
|
uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length);
|
|
} USBD_DEVICE, *pUSBD_DEVICE;
|
|
|
|
//typedef struct USB_OTG_hPort
|
|
//{
|
|
// void (*Disconnect) (void *phost);
|
|
// void (*Connect) (void *phost);
|
|
// uint8_t ConnStatus;
|
|
// uint8_t DisconnStatus;
|
|
// uint8_t ConnHandled;
|
|
// uint8_t DisconnHandled;
|
|
//} USB_OTG_hPort_TypeDef;
|
|
|
|
typedef struct _Device_cb
|
|
{
|
|
uint8_t (*Init) (void *pdev , uint8_t cfgidx);
|
|
uint8_t (*DeInit) (void *pdev , uint8_t cfgidx);
|
|
/* Control Endpoints*/
|
|
uint8_t (*Setup) (void *pdev , USB_SETUP_REQ *req);
|
|
uint8_t (*EP0_TxSent) (void *pdev );
|
|
uint8_t (*EP0_RxReady) (void *pdev );
|
|
/* Class Specific Endpoints*/
|
|
uint8_t (*DataIn) (void *pdev , uint8_t epnum);
|
|
uint8_t (*DataOut) (void *pdev , uint8_t epnum);
|
|
uint8_t (*SOF) (void *pdev);
|
|
uint8_t (*IsoINIncomplete) (void *pdev);
|
|
uint8_t (*IsoOUTIncomplete) (void *pdev);
|
|
|
|
uint8_t *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length);
|
|
#ifdef USB_OTG_HS_CORE
|
|
uint8_t *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length);
|
|
#endif
|
|
|
|
#ifdef USB_SUPPORT_USER_STRING_DESC
|
|
uint8_t *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index, uint16_t *length);
|
|
#endif
|
|
|
|
} USBD_Class_cb_TypeDef;
|
|
|
|
|
|
|
|
typedef struct _USBD_USR_PROP
|
|
{
|
|
void (*Init)(void);
|
|
void (*DeviceReset)(uint8_t speed);
|
|
void (*DeviceConfigured)(void);
|
|
void (*DeviceSuspended)(void);
|
|
void (*DeviceResumed)(void);
|
|
|
|
void (*DeviceConnected)(void);
|
|
void (*DeviceDisconnected)(void);
|
|
|
|
}
|
|
USBD_Usr_cb_TypeDef;
|
|
|
|
typedef struct _DCD
|
|
{
|
|
uint8_t device_config;
|
|
uint8_t device_state;
|
|
uint8_t device_status;
|
|
uint8_t device_old_status;
|
|
uint8_t device_address;
|
|
uint8_t connection_status;
|
|
uint8_t test_mode;
|
|
uint32_t DevRemoteWakeup;
|
|
USB_OTG_EP in_ep [USB_OTG_MAX_TX_FIFOS];
|
|
USB_OTG_EP out_ep [USB_OTG_MAX_TX_FIFOS];
|
|
uint8_t setup_packet [8*3];
|
|
USBD_Class_cb_TypeDef *class_cb;
|
|
USBD_Usr_cb_TypeDef *usr_cb;
|
|
USBD_DEVICE *usr_device;
|
|
uint8_t *pConfig_descriptor;
|
|
}
|
|
DCD_DEV , *DCD_PDEV;
|
|
|
|
|
|
typedef struct _HCD
|
|
{
|
|
uint8_t Rx_Buffer [MAX_DATA_LENGTH];
|
|
__IO uint32_t ConnSts;
|
|
__IO uint32_t ErrCnt[USB_OTG_MAX_TX_FIFOS];
|
|
__IO uint32_t XferCnt[USB_OTG_MAX_TX_FIFOS];
|
|
__IO HC_STATUS HC_Status[USB_OTG_MAX_TX_FIFOS];
|
|
__IO URB_STATE URB_State[USB_OTG_MAX_TX_FIFOS];
|
|
USB_OTG_HC hc [USB_OTG_MAX_TX_FIFOS];
|
|
uint16_t channel [USB_OTG_MAX_TX_FIFOS];
|
|
// USB_OTG_hPort_TypeDef *port_cb;
|
|
}
|
|
HCD_DEV , *USB_OTG_USBH_PDEV;
|
|
|
|
|
|
typedef struct _OTG
|
|
{
|
|
uint8_t OTG_State;
|
|
uint8_t OTG_PrevState;
|
|
uint8_t OTG_Mode;
|
|
}
|
|
OTG_DEV , *USB_OTG_USBO_PDEV;
|
|
|
|
typedef struct USB_OTG_handle
|
|
{
|
|
USB_OTG_CORE_CFGS cfg;
|
|
USB_OTG_CORE_REGS regs;
|
|
#ifdef USE_DEVICE_MODE
|
|
DCD_DEV dev;
|
|
#endif
|
|
#ifdef USE_HOST_MODE
|
|
HCD_DEV host;
|
|
#endif
|
|
#ifdef USE_OTG_MODE
|
|
OTG_DEV otg;
|
|
#endif
|
|
}
|
|
USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE;
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
|
|
/** @defgroup USB_CORE_Exported_Macros
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup USB_CORE_Exported_Variables
|
|
* @{
|
|
*/
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/** @defgroup USB_CORE_Exported_FunctionsPrototype
|
|
* @{
|
|
*/
|
|
|
|
|
|
USB_OTG_STS USB_OTG_CoreInit (USB_OTG_CORE_HANDLE *pdev);
|
|
USB_OTG_STS USB_OTG_SelectCore (USB_OTG_CORE_HANDLE *pdev,
|
|
USB_OTG_CORE_ID_TypeDef coreID);
|
|
USB_OTG_STS USB_OTG_EnableGlobalInt (USB_OTG_CORE_HANDLE *pdev);
|
|
USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev);
|
|
void* USB_OTG_ReadPacket (USB_OTG_CORE_HANDLE *pdev ,
|
|
uint8_t *dest,
|
|
uint16_t len);
|
|
USB_OTG_STS USB_OTG_WritePacket (USB_OTG_CORE_HANDLE *pdev ,
|
|
uint8_t *src,
|
|
uint8_t ch_ep_num,
|
|
uint16_t len);
|
|
USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num);
|
|
USB_OTG_STS USB_OTG_FlushRxFifo (USB_OTG_CORE_HANDLE *pdev);
|
|
|
|
uint32_t USB_OTG_ReadCoreItr (USB_OTG_CORE_HANDLE *pdev);
|
|
uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev);
|
|
uint8_t USB_OTG_IsHostMode (USB_OTG_CORE_HANDLE *pdev);
|
|
uint8_t USB_OTG_IsDeviceMode (USB_OTG_CORE_HANDLE *pdev);
|
|
uint32_t USB_OTG_GetMode (USB_OTG_CORE_HANDLE *pdev);
|
|
USB_OTG_STS USB_OTG_PhyInit (USB_OTG_CORE_HANDLE *pdev);
|
|
USB_OTG_STS USB_OTG_SetCurrentMode (USB_OTG_CORE_HANDLE *pdev,
|
|
uint8_t mode);
|
|
|
|
/*********************** HOST APIs ********************************************/
|
|
#ifdef USE_HOST_MODE
|
|
USB_OTG_STS USB_OTG_CoreInitHost (USB_OTG_CORE_HANDLE *pdev);
|
|
USB_OTG_STS USB_OTG_EnableHostInt (USB_OTG_CORE_HANDLE *pdev);
|
|
USB_OTG_STS USB_OTG_HC_Init (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num);
|
|
USB_OTG_STS USB_OTG_HC_Halt (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num);
|
|
USB_OTG_STS USB_OTG_HC_StartXfer (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num);
|
|
USB_OTG_STS USB_OTG_HC_DoPing (USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num);
|
|
uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev);
|
|
uint32_t USB_OTG_ResetPort (USB_OTG_CORE_HANDLE *pdev);
|
|
uint32_t USB_OTG_ReadHPRT0 (USB_OTG_CORE_HANDLE *pdev);
|
|
void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state);
|
|
void USB_OTG_InitFSLSPClkSel (USB_OTG_CORE_HANDLE *pdev ,uint8_t freq);
|
|
uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) ;
|
|
void USB_OTG_StopHost (USB_OTG_CORE_HANDLE *pdev);
|
|
#endif
|
|
/********************* DEVICE APIs ********************************************/
|
|
#ifdef USE_DEVICE_MODE
|
|
USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev);
|
|
USB_OTG_STS USB_OTG_EnableDevInt (USB_OTG_CORE_HANDLE *pdev);
|
|
uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev);
|
|
enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev);
|
|
USB_OTG_STS USB_OTG_EP0Activate (USB_OTG_CORE_HANDLE *pdev);
|
|
USB_OTG_STS USB_OTG_EPActivate (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
USB_OTG_STS USB_OTG_EPStartXfer (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
USB_OTG_STS USB_OTG_EPSetStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
USB_OTG_STS USB_OTG_EPClearStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep);
|
|
uint32_t USB_OTG_ReadDevAllOutEp_itr (USB_OTG_CORE_HANDLE *pdev);
|
|
uint32_t USB_OTG_ReadDevOutEP_itr (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum);
|
|
uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev);
|
|
void USB_OTG_InitDevSpeed (USB_OTG_CORE_HANDLE *pdev , uint8_t speed);
|
|
uint8_t USBH_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev);
|
|
void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev);
|
|
void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev);
|
|
void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev);
|
|
void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev);
|
|
void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status);
|
|
uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep);
|
|
#endif
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#endif /* __USB_CORE_H__ */
|
|
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
|