MCUXpresso_LPC55S69/middleware/usb/host/usb_host_ip3516hs.h
2022-04-08 22:42:47 +08:00

755 lines
32 KiB
C

/*
* Copyright (c) 2016, Freescale Semiconductor, Inc.
* Copyright 2016 - 2019 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef __USB_HOST_IP3516HS_H__
#define __USB_HOST_IP3516HS_H__
/*******************************************************************************
* Definitions
******************************************************************************/
/*! CAPLENGTH/CHIPID register */
#define USB_HOST_IP3516HS_CAPLENGTH_CHIPID_CAPLENGTH_MASK (0xFFU)
#define USB_HOST_IP3516HS_HCSPARAMS_CHIPID_MASK (0xFFFF0000U)
#define USB_HOST_IP3516HS_HCSPARAMS_CHIPID_SHIFT (16U)
/*! HCSPARAMS register */
#define USB_HOST_IP3516HS_HCSPARAMS_N_PORTS_MASK (0x0FU)
#define USB_HOST_IP3516HS_HCSPARAMS_PPC_MASK (0x10U)
#define USB_HOST_IP3516HS_HCSPARAMS_P_INDICATOR_MASK (0x10000U)
/*! HCCPARAMS register */
#define USB_HOST_IP3516HS_HCCPARAMS_LPMC_MASK (0x20000U)
/*! FLADJ Register */
#define USB_HOST_IP3516HS_FLADJ_FLADJ_MASK (0x3FU)
#define USB_HOST_IP3516HS_FLADJ_FRINDEX_MASK (0x3FFF0000U)
#define USB_HOST_IP3516HS_FLADJ_FRINDEX_SHIFT (16U)
/*! ATL PTD BaseAddress register */
#define USB_HOST_IP3516HS_ATL_PTD_ATL_CUR_MASK (0x1F0U)
#define USB_HOST_IP3516HS_ATL_PTD_ATL_CUR_SHIFT (4U)
#define USB_HOST_IP3516HS_ATL_PTD_ATL_BASE_MASK (0xFFFFFE00U)
#define USB_HOST_IP3516HS_ATL_PTD_ATL_BASE_SHIFT (9U)
/*! ISO PTD BaseAddress register */
#define USB_HOST_IP3516HS_ISO_PTD_ISO_FIRST_MASK (0x3E0U)
#define USB_HOST_IP3516HS_ISO_PTD_ISO_FIRST_SHIFT (5U)
#define USB_HOST_IP3516HS_ISO_PTD_ISO_BASE_MASK (0xFFFFFC00U)
#define USB_HOST_IP3516HS_ISO_PTD_ISO_BASE_SHIFT (10U)
/*! INT PTD BaseAddress register */
#define USB_HOST_IP3516HS_INT_PTD_INT_FIRST_MASK (0x3E0U)
#define USB_HOST_IP3516HS_INT_PTD_INT_FIRST_SHIFT (5U)
#define USB_HOST_IP3516HS_INT_PTD_INT_BASE_MASK (0xFFFFFC00U)
#define USB_HOST_IP3516HS_INT_PTD_INT_BASE_SHIFT (10U)
/*! Data Payload BaseAddress register */
#define USB_HOST_IP3516HS_DAT_BASE_MASK (0xFFFF0000U)
#define USB_HOST_IP3516HS_DAT_BASE_SHIFT (16U)
/*! USBCMD Register */
#define USB_HOST_IP3516HS_USBCMD_RS_MASK (0x01U)
#define USB_HOST_IP3516HS_USBCMD_HCRESET_MASK (0x02U)
#define USB_HOST_IP3516HS_USBCMD_FLS_MASK (0x0CU)
#define USB_HOST_IP3516HS_USBCMD_FLS_SHIFT (2U)
#define USB_HOST_IP3516HS_USBCMD_FLS(x) \
(((x) << USB_HOST_IP3516HS_USBCMD_FLS_SHIFT) & USB_HOST_IP3516HS_USBCMD_FLS_MASK)
#define USB_HOST_IP3516HS_USBCMD_LHCR_MASK (0x80U)
#define USB_HOST_IP3516HS_USBCMD_ATL_EN_MASK (0x100U)
#define USB_HOST_IP3516HS_USBCMD_ISO_EN_MASK (0x200U)
#define USB_HOST_IP3516HS_USBCMD_INT_EN_MASK (0x400U)
#define USB_HOST_IP3516HS_USBCMD_HIRD_MASK (0xF000000U)
#define USB_HOST_IP3516HS_USBCMD_HIRD_SHIFT (24U)
#define USB_HOST_IP3516HS_USBCMD_LPM_RWU_MASK (0x10000000U)
#define USB_HOST_IP3516HS_USBCMD_LPM_RWU_SHIFT (28U)
/*! USBSTS Register */
#define USB_HOST_IP3516HS_USBSTS_PCD_MASK (0x04U)
#define USB_HOST_IP3516HS_USBSTS_FLR_MASK (0x08U)
#define USB_HOST_IP3516HS_USBSTS_ATL_IRQ_MASK (0x10000U)
#define USB_HOST_IP3516HS_USBSTS_ISO_IRQ_MASK (0x20000U)
#define USB_HOST_IP3516HS_USBSTS_INT_IRQ_MASK (0x40000U)
#define USB_HOST_IP3516HS_USBSTS_SOF_IRQ_MASK (0x80000U)
/*! USBINTR Register */
#define USB_HOST_IP3516HS_USBINTR_PCDE_MASK (0x04U)
#define USB_HOST_IP3516HS_USBINTR_FLRE_MASK (0x08U)
#define USB_HOST_IP3516HS_USBINTR_ATL_IRQ_E_MASK (0x10000U)
#define USB_HOST_IP3516HS_USBINTR_ISO_IRQ_E_MASK (0x20000U)
#define USB_HOST_IP3516HS_USBINTR_INT_IRQ_E_MASK (0x40000U)
#define USB_HOST_IP3516HS_USBINTR_SOF_E_MASK (0x80000U)
/*! PORTSC1 Register */
#define USB_HOST_IP3516HS_PORTSC1_CCS_MASK (0x01U)
#define USB_HOST_IP3516HS_PORTSC1_CSC_MASK (0x02U)
#define USB_HOST_IP3516HS_PORTSC1_PED_MASK (0x04U)
#define USB_HOST_IP3516HS_PORTSC1_PEDC_MASK (0x08U)
#define USB_HOST_IP3516HS_PORTSC1_OCA_MASK (0x10U)
#define USB_HOST_IP3516HS_PORTSC1_OCC_MASK (0x20U)
#define USB_HOST_IP3516HS_PORTSC1_FPR_MASK (0x40U)
#define USB_HOST_IP3516HS_PORTSC1_SUSP_MASK (0x80U)
#define USB_HOST_IP3516HS_PORTSC1_PR_MASK (0x100U)
#define USB_HOST_IP3516HS_PORTSC1_SUS_L1_MASK (0x200U)
#define USB_HOST_IP3516HS_PORTSC1_LS_MASK (0xC00U)
#define USB_HOST_IP3516HS_PORTSC1_LS_SHIFT (10U)
#define USB_HOST_IP3516HS_PORTSC1_PP_MASK (0x1000U)
#define USB_HOST_IP3516HS_PORTSC1_PIC_MASK (0xC000U)
#define USB_HOST_IP3516HS_PORTSC1_PIC_SHIFT (14U)
#define USB_HOST_IP3516HS_PORTSC1_PTC_MASK (0xF0000U)
#define USB_HOST_IP3516HS_PORTSC1_PTC_SHIFT (16U)
#define USB_HOST_IP3516HS_PORTSC1_PSPD_MASK (0x300000U)
#define USB_HOST_IP3516HS_PORTSC1_PSPD_SHIFT (20U)
#define USB_HOST_IP3516HS_PORTSC1_WOO_MASK (0x400000U)
#define USB_HOST_IP3516HS_PORTSC1_SUS_STAT_MASK (0x1800000U)
#define USB_HOST_IP3516HS_PORTSC1_SUS_STAT_SHIFT (23U)
#define USB_HOST_IP3516HS_PORTSC1_DEV_ADD_MASK (0xFE000000U)
#define USB_HOST_IP3516HS_PORTSC1_DEV_ADD_SHIFT (25U)
#define USB_HOST_IP3516HS_PORTSC1_WIC \
(USB_HOST_IP3516HS_PORTSC1_CSC_MASK | USB_HOST_IP3516HS_PORTSC1_PEDC_MASK | USB_HOST_IP3516HS_PORTSC1_OCC_MASK)
/*! Last PTD in use Register */
#define USB_HOST_IP3516HS_LAST_PTD_IN_USE_ATL_LAST_MASK (0x1FU)
#define USB_HOST_IP3516HS_LAST_PTD_IN_USE_ATL_LAST_SHIFT (0U)
#define USB_HOST_IP3516HS_LAST_PTD_IN_USE_ISO_LAST_MASK (0x1F00U)
#define USB_HOST_IP3516HS_LAST_PTD_IN_USE_ISO_LAST_SHIFT (8U)
#define USB_HOST_IP3516HS_LAST_PTD_IN_USE_INT_LAST_MASK (0x1F0000U)
#define USB_HOST_IP3516HS_LAST_PTD_IN_USE_INT_LAST_SHIFT (16U)
/*! PORT Mode Register */
#define USB_HOST_IP3516HS_PORT_MODE_ID0_MASK (0x01U)
#define USB_HOST_IP3516HS_PORT_MODE_ID0_EN_MASK (0x100U)
#define USB_HOST_IP3516HS_PORT_MODE_DEV_ENABLE_MASK (0x1000U)
#define USB_HOST_IP3516HS_PORT_MODE_SW_CTRL_PDCOM_MASK (0x4000U)
#define USB_HOST_IP3516HS_PORT_MODE_SW_PDCOM_MASK (0x8000U)
/*!
* @addtogroup usb_host_controller_ip3516hs
* @{
*/
/*! @brief IP3516HS Transaction Descriptor */
typedef struct _usb_host_ip3516hs_atl_struct
{
union
{
uint32_t controlState;
struct
{
volatile uint32_t V : 1U; /*!< Valid */
volatile uint32_t NextPTDPointer : 5U; /*!< NextPTDPointer */
uint32_t R1 : 1U; /*!< Reserved */
volatile uint32_t J : 1U; /*!< Jump: 0: increment the PTD pointer. 1: enable the next PTD branching. */
volatile uint32_t
uFrame : 8U; /*!< This field is only applicable for interrupt and isochronous endpoints. */
volatile uint32_t MaxPacketLength : 11U; /*!< Maximum Packet Length */
uint32_t R2 : 1U; /*!< Reserved */
volatile uint32_t Mult : 2U; /*!< EndpointNumber */
uint32_t R3 : 2U; /*!< Reserved */
} stateBitField;
} control1Union;
union
{
uint32_t controlState;
struct
{
volatile uint32_t EP : 4U; /*!< Endpoint number */
volatile uint32_t DeviceAddress : 7U; /*!< Device address */
volatile uint32_t S : 1U; /*!< This bit indicates whether a split transaction has to be executed. */
volatile uint32_t RL : 4U; /*!< Reload: If RL is set to 0h, hardware ignores the NakCnt value. RL and
NakCnt are set to the same value before a transaction. */
volatile uint32_t SE : 2U; /*!< This specifies the speed for a Control or Interrupt transaction to a device
that is not high-speed: 00-Full-speed, 10-Low-speed */
volatile uint32_t PortNumber : 7U; /*!< Port number */
volatile uint32_t HubAddress : 7U; /*!< Hub Address */
} stateBitField;
} control2Union;
union
{
uint32_t data;
struct
{
volatile uint32_t NrBytesToTransfer : 15U; /*!< Number of Bytes to Transfer. */
volatile uint32_t I : 1U; /*!< Interrupt on Complete */
volatile uint32_t DataStartAddress : 16U; /*!< Data buffer address */
} dataBitField;
} dataUnion;
union
{
uint32_t state;
struct
{
volatile uint32_t NrBytesToTransfer : 15U; /*!< Number of Bytes Transferred. */
volatile uint32_t
Token : 2U; /*!< Token: Identifies the token Packet Identifier (PID) for this transaction. */
volatile uint32_t EpType : 2U; /*!< Endpoint type */
volatile uint32_t NakCnt : 4U; /*!< Nak count */
volatile uint32_t Cerr : 2U; /*!< Error count */
volatile uint32_t DT : 1U; /*!< Data Toggle */
volatile uint32_t P : 1U; /*!< Ping */
volatile uint32_t SC : 1U; /*!< Start/Complete */
volatile uint32_t X : 1U; /*!< Error */
volatile uint32_t B : 1U; /*!< Babble */
volatile uint32_t H : 1U; /*!< Halt */
volatile uint32_t A : 1U; /*!< Active */
} stateBitField;
} stateUnion;
} usb_host_ip3516hs_atl_struct_t;
/*! @brief IP3516HS Transaction Descriptor */
typedef struct _usb_host_ip3516hs_ptl_struct
{
union
{
uint32_t controlState;
struct
{
volatile uint32_t V : 1U; /*!< valid */
volatile uint32_t
NextPTDPointer : 5U; /*!< Next PTD Counter: Next PTD branching assigned by the PTDpointer. */
uint32_t R1 : 1U; /*!< Reserved */
volatile uint32_t J : 1U; /*!< Jump: 0: increment the PTD pointer. 1: enable the next PTD branching. */
volatile uint32_t
uFrame : 8U; /*!< This field is only applicable for interrupt and isochronous endpoints. */
volatile uint32_t MaxPacketLength : 11U; /*!< Maximum Packet Length */
uint32_t R2 : 1U; /*!< Reserved */
volatile uint32_t Mult : 2U; /*!< Multiplier */
uint32_t R3 : 2U; /*!< Reserved */
} stateBitField;
} control1Union;
union
{
uint32_t controlState;
struct
{
volatile uint32_t EP : 4U; /*!< Endpoint number */
volatile uint32_t DeviceAddress : 7U; /*!< Device address */
volatile uint32_t S : 1U; /*!< This bit indicates whether a split transaction has to be executed. */
volatile uint32_t RL : 4U; /*!< Reload: If RL is set to 0h, hardware ignores the NakCnt value. RL and
NakCnt are set to the same value before a transaction. */
volatile uint32_t SE : 2U; /*!< This specifies the speed for a Control or Interrupt transaction to a device
that is not high-speed: 00-Full-speed, 10-Low-speed */
uint32_t R1 : 14U; /*!< Reserved */
} stateBitField;
} control2Union;
union
{
uint32_t data;
struct
{
volatile uint32_t NrBytesToTransfer : 15U; /*!< Number of Bytes to Transfer. */
volatile uint32_t I : 1U; /*!< Interrupt on Complete. */
volatile uint32_t DataStartAddress : 16U; /*!< Data buffer address */
} dataBitField;
} dataUnion;
union
{
uint32_t state;
struct
{
volatile uint32_t NrBytesToTransfer : 15U; /*!< Number of Bytes Transferred. */
volatile uint32_t
Token : 2U; /*!< Token: Identifies the token Packet Identifier (PID) for this transaction. */
volatile uint32_t EpType : 2U; /*!< Endpoint type */
volatile uint32_t NakCnt : 4U; /*!< Nak count */
volatile uint32_t Cerr : 2U; /*!< Error count */
volatile uint32_t DT : 1U; /*!< Data Toggle */
volatile uint32_t P : 1U; /*!< Ping */
volatile uint32_t SC : 1U; /*!< Start/Complete */
volatile uint32_t X : 1U; /*!< Error */
volatile uint32_t B : 1U; /*!< Babble */
volatile uint32_t H : 1U; /*!< Halt */
volatile uint32_t A : 1U; /*!< Active */
} stateBitField;
} stateUnion;
union
{
uint32_t status;
struct
{
volatile uint32_t uSA : 8U; /*!< This field is only used for periodic split transactions or if the port is
enabled in HS mode. */
volatile uint32_t Status0 : 3U; /*!< Isochronous IN or OUT status at uSOF0 */
volatile uint32_t Status1 : 3U; /*!< Isochronous IN or OUT status at uSOF1 */
volatile uint32_t Status2 : 3U; /*!< Isochronous IN or OUT status at uSOF2 */
volatile uint32_t Status3 : 3U; /*!< Isochronous IN or OUT status at uSOF3 */
volatile uint32_t Status4 : 3U; /*!< Isochronous IN or OUT status at uSOF4 */
volatile uint32_t Status5 : 3U; /*!< Isochronous IN or OUT status at uSOF5 */
volatile uint32_t Status6 : 3U; /*!< Isochronous IN or OUT status at uSOF6 */
volatile uint32_t Status7 : 3U; /*!< Isochronous IN or OUT status at uSOF7 */
} statusBitField;
} statusUnion;
union
{
uint32_t isoIn;
struct
{
volatile uint32_t isoIn0 : 12U; /*!< Data length */
volatile uint32_t isoIn1 : 12U; /*!< Data length */
volatile uint32_t isoIn2low : 8U; /*!< Data length */
} bitField;
} isoInUnion1;
union
{
uint32_t isoIn;
struct
{
volatile uint32_t isoIn2High : 4U; /*!< Data length */
volatile uint32_t isoIn3 : 12U; /*!< Data length */
volatile uint32_t isoIn4 : 12U; /*!< Data length */
volatile uint32_t isoIn5Low : 4U; /*!< Data length */
} bitField;
} isoInUnion2;
union
{
uint32_t isoIn;
struct
{
volatile uint32_t isoIn5High : 8U; /*!< Data length */
volatile uint32_t isoIn6 : 12U; /*!< Data length */
volatile uint32_t isoIn7 : 12U; /*!< Data length */
} bitField;
} isoInUnion3;
} usb_host_ip3516hs_ptl_struct_t;
/*! @brief IP3516HS Transaction Descriptor */
typedef struct _usb_host_ip3516hs_sptl_struct
{
union
{
uint32_t controlState;
struct
{
volatile uint32_t V : 1U; /*!< Valid */
volatile uint32_t NextPTDPointer : 5U; /*!< NextPTDPointer */
uint32_t R1 : 1U; /*!< Reserved */
volatile uint32_t J : 1U; /*!< Jump */
volatile uint32_t uFrame : 8U; /*!< Frame number at which this PTD will be sent. */
volatile uint32_t MaxPacketLength : 11U; /*!< Maximum Packet Length. */
uint32_t R2 : 1U; /*!< Reserved */
volatile uint32_t Mult : 2U; /*!< Multiplier */
uint32_t R3 : 2U; /*!< Reserved */
} stateBitField;
} control1Union;
union
{
uint32_t controlState;
struct
{
volatile uint32_t EP : 4U; /*!< Endpoint number */
volatile uint32_t DeviceAddress : 7U; /*!< Device address */
volatile uint32_t S : 1U; /*!< This bit indicates whether a split transaction has to be executed. */
volatile uint32_t RL : 4U; /*!< Reload: If RL is set to 0h, hardware ignores the NakCnt value. RL and
NakCnt are set to the same value before a transaction. */
volatile uint32_t SE : 2U; /*!< This specifies the speed for a Control or Interrupt transaction to a device
that is not high-speed: 00-Full-speed, 10-Low-speed */
volatile uint32_t PortNumber : 7U; /*!< Port number */
volatile uint32_t HubAddress : 7U; /*!< Hub Address */
} stateBitField;
} control2Union;
union
{
uint32_t data;
struct
{
volatile uint32_t NrBytesToTransfer : 15U; /*!< Number of Bytes to Transfer. */
volatile uint32_t I : 1U; /*!< Interrupt on Complete. */
volatile uint32_t DataStartAddress : 16U; /*!< Data buffer address */
} dataBitField;
} dataUnion;
union
{
uint32_t state;
struct
{
volatile uint32_t NrBytesToTransfer : 15U; /*!< Number of Bytes Transferred. */
volatile uint32_t
Token : 2U; /*!< Token: Identifies the token Packet Identifier (PID) for this transaction. */
volatile uint32_t EpType : 2U; /*!< Endpoint type */
volatile uint32_t NakCnt : 4U; /*!< Nak count */
volatile uint32_t Cerr : 2U; /*!< Error count */
volatile uint32_t DT : 1U; /*!< Data Toggle */
volatile uint32_t P : 1U; /*!< Ping */
volatile uint32_t SC : 1U; /*!< Start/Complete */
volatile uint32_t X : 1U; /*!< Error */
volatile uint32_t B : 1U; /*!< Babble */
volatile uint32_t H : 1U; /*!< Halt */
volatile uint32_t A : 1U; /*!< Active */
} dataBitField;
} stateUnion;
union
{
uint32_t status;
struct
{
volatile uint32_t uSA : 8U; /*!< This field is only used for periodic split transactions or if the port is
enabled in HS mode. */
volatile uint32_t Status0 : 3U; /*!< Isochronous IN or OUT status at uSOF0 */
volatile uint32_t Status1 : 3U; /*!< Isochronous IN or OUT status at uSOF1 */
volatile uint32_t Status2 : 3U; /*!< Isochronous IN or OUT status at uSOF2 */
volatile uint32_t Status3 : 3U; /*!< Isochronous IN or OUT status at uSOF3 */
volatile uint32_t Status4 : 3U; /*!< Isochronous IN or OUT status at uSOF4 */
volatile uint32_t Status5 : 3U; /*!< Isochronous IN or OUT status at uSOF5 */
volatile uint32_t Status6 : 3U; /*!< Isochronous IN or OUT status at uSOF6 */
volatile uint32_t Status7 : 3U; /*!< Isochronous IN or OUT status at uSOF7 */
} statusBitField;
} statusUnion;
union
{
uint32_t isoIn;
struct
{
volatile uint32_t uSCS : 8U; /*!< All bits can be set to one for every transfer. It specifies which uSOF the
complete split needs to be sent. */
volatile uint32_t isoIn0 : 8U; /*!< Data length */
volatile uint32_t isoIn1 : 8U; /*!< Data length */
volatile uint32_t isoIn2 : 8U; /*!< Data length */
} bitField;
} isoInUnion1;
union
{
uint32_t isoIn;
struct
{
volatile uint32_t isoIn3 : 8U; /*!< Data length */
volatile uint32_t isoIn4 : 8U; /*!< Data length */
volatile uint32_t isoIn5 : 8U; /*!< Data length */
volatile uint32_t isoIn6 : 8U; /*!< Data length */
} bitField;
} isoInUnion2;
union
{
uint32_t isoIn;
struct
{
volatile uint32_t isoIn7 : 8U; /*!< Data length */
volatile uint32_t R : 24U; /*!< Reserved */
} bitField;
} isoInUnion3;
} usb_host_ip3516hs_sptl_struct_t;
#define USB_HOST_IP3516HS_PTD_TOKEN_OUT 0x00U
#define USB_HOST_IP3516HS_PTD_TOKEN_IN 0x01U
#define USB_HOST_IP3516HS_PTD_TOKEN_SETUP 0x02U
#define USB_HOST_IP3516HS_PTD_EPTYPE_OUT 0x00U
#define USB_HOST_IP3516HS_PTD_EPTYPE_IN 0x01U
#define USB_HOST_IP3516HS_PTD_EPTYPE_SETUP 0x02U
#define USB_HOST_IP3516HS_PTD_MAX_TRANSFER_LENGTH 0x7FFFU
#define USB_HOST_IP3516HS_MAX_UFRAME (1UL << 8)
#define USB_HOST_IP3516HS_MAX_FRAME (USB_HOST_IP3516HS_MAX_UFRAME)
#define USB_HOST_IP3516HS_PERIODIC_TRANSFER_GAP (3U)
#define USB_HOST_IP3516HS_ISO_MULTIPLE_TRANSFER (8U)
/*! @brief Check the port connect state delay if the state is unstable */
#define USB_HOST_IP3516HS_PORT_CONNECT_DEBOUNCE_DELAY (101U)
#define USB_HOST_IP3516HS_TIME_DELAY (3500U)
#define USB_HOST_IP3516HS_HUB_LS_SETUP_TIME_DELAY (333U)
#if ((defined(USB_HOST_CONFIG_LOW_POWER_MODE)) && (USB_HOST_CONFIG_LOW_POWER_MODE > 0U))
typedef enum _bus_ip3516hs_suspend_request_state
{
kBus_Ip3516HsIdle = 0,
kBus_Ip3516HsStartSuspend,
kBus_Ip3516HsSuspended,
kBus_Ip3516HsStartResume,
kBus_Ip3516HsL1StartSleep,
kBus_Ip3516HsL1Sleeped,
kBus_Ip3516HsL1StartResume,
kBus_Ip3516HsError,
} bus_ip3516hs_suspend_request_state_t;
#endif
typedef enum _usb_host_ip3516hs_transfer_status
{
kStatus_UsbHostIp3516Hs_Idle = 0,
kStatus_UsbHostIp3516Hs_Setup,
kStatus_UsbHostIp3516Hs_Data,
kStatus_UsbHostIp3516Hs_Data2,
kStatus_UsbHostIp3516Hs_State,
} usb_host_ip3516hs_transfer_status_t;
#if ((defined(USB_HOST_CONFIG_IP3516HS_MAX_ISO)) && (USB_HOST_CONFIG_IP3516HS_MAX_ISO > 0U))
typedef union index_length
{
uint32_t indexLength;
struct
{
uint32_t tdIndex : 8U;
uint32_t bufferIndex : 8U;
uint32_t bufferLength : 16U;
} state;
} indexLength_t;
#endif
typedef struct _usb_host_ip3516hs_td_struct
{
#if (defined(USB_HOST_CONFIG_IP3516HS_MAX_ISO) && (USB_HOST_CONFIG_IP3516HS_MAX_ISO > 0U))
usb_host_ip3516hs_ptl_struct_t iso[USB_HOST_CONFIG_IP3516HS_MAX_ISO];
#endif
#if (defined(USB_HOST_CONFIG_IP3516HS_MAX_INT) && (USB_HOST_CONFIG_IP3516HS_MAX_INT > 0U))
usb_host_ip3516hs_ptl_struct_t interrupt[USB_HOST_CONFIG_IP3516HS_MAX_INT];
#endif
usb_host_ip3516hs_atl_struct_t atl[(((USB_HOST_CONFIG_IP3516HS_MAX_ATL - 1U) >> 1U) + 1U) << 1U];
} usb_host_ip3516hs_ptd_struct_t;
/*! @brief task event */
#define USB_HOST_IP3516HS_EVENT_ATTACH (0x01U)
#define USB_HOST_IP3516HS_EVENT_DETACH (0x02U)
#define USB_HOST_IP3516HS_EVENT_PORT_CHANGE (0x04U)
#define USB_HOST_IP3516HS_EVENT_ISO_TOKEN_DONE (0x08U)
#define USB_HOST_IP3516HS_EVENT_INT_TOKEN_DONE (0x10U)
#define USB_HOST_IP3516HS_EVENT_ATL_TOKEN_DONE (0x20U)
#define USB_HOST_IP3516HS_EVENT_SOF (0x40U)
#define USB_HOST_IP3516HS_PERIODIC_BANDWIDTH_PERCENT ((float)90U / (float)100U)
#define USB_HOST_IP3516HS_PERIODIC_BANDWIDTH ((float)125U * USB_HOST_IP3516HS_PERIODIC_BANDWIDTH_PERCENT)
/*! @brief Transfer scan interval (ms)*/
#define USB_HOST_IP3516HS_TRANSFER_SCAN_INTERVAL (200U)
/*! @brief Time out gap for each transfer (USB_HOST_OHCI_TRANSFER_SCAN_INTERVAL * 1ms) */
#define USB_HOST_IP3516HS_TRANSFER_TIMEOUT_GAP ((5000U * 8U) / USB_HOST_IP3516HS_TRANSFER_SCAN_INTERVAL)
#define USB_HOST_IP3516HS_CONTROL_PIPE_MAX_TRANSFER_LENGTH 64U
/*! @brief USB host Ip3516Hs lock */
#define USB_HostIp3516HsLock() (void)OSA_MutexLock(usbHostState->mutex, USB_OSA_WAIT_TIMEOUT)
/*! @brief USB host Ip3516Hs unlock */
#define USB_HostIp3516HsUnlock() (void)OSA_MutexUnlock(usbHostState->mutex)
/*! @brief IP3516HS Host Controller Operational Registers */
typedef struct _usb_host_ip3516hs_hcor_struct
{
__I uint32_t CAPLENGTH_CHIPID;
__I uint32_t HCSPARAMS;
__I uint32_t HCCPARAMS;
__IO uint32_t FLADJ_FRINDEX;
__IO uint32_t ATL_PTD_BASE_ADDRESS;
__IO uint32_t ISO_PTD_BASE_ADDRESS;
__IO uint32_t INT_PTD_BASE_ADDRESS;
__IO uint32_t DATA_PAYLOAD_BASE_ADDRESS;
__IO uint32_t USBCMD;
__IO uint32_t USBSTS;
__IO uint32_t USBINTR;
__IO uint32_t PORTSC1;
__IO uint32_t ATL_PTD_DONE_MAP;
__IO uint32_t ATL_PTD_SKIP_MAP;
__IO uint32_t ISO_PTD_DONE_MAP;
__IO uint32_t ISO_PTD_SKIP_MAP;
__IO uint32_t INT_PTD_DONE_MAP;
__IO uint32_t INT_PTD_SKIP_MAP;
__IO uint32_t LAST_PTD_IN_USE;
__IO uint32_t UTMI_ULPI_DEBUG;
__IO uint32_t PORT_MODE;
uint8_t RESERVED_0[48];
#if (defined(FSL_FEATURE_USBHSH_HAS_TURNAROUND_TIMEOUT) && (FSL_FEATURE_USBHSH_HAS_TURNAROUND_TIMEOUT > 0U))
__IO uint32_t PACKET_TURNAROUND_TIMEOUT;
#endif
} usb_host_ip3516hs_register_struct_t;
/*! @brief Port state for device attachment/detachment. */
typedef enum _usb_host_ip3516hs_port_state
{
kUSB_DeviceIp3516HsPortDetached = 0U, /*!< Port is detached and de-initialized */
kUSB_DeviceIp3516HsPortPhyDetached, /*!< Port is physically detached */
kUSB_DeviceIp3516HsPortPhyAttached, /*!< Port is physically attached */
kUSB_DeviceIp3516HsPortAttached, /*!< Port is attached and initialized */
} usb_host_ip3516hs_port_state_t;
typedef struct _usb_host_ip3516hs_port_state_struct
{
volatile uint8_t portSpeed; /*!< Port speed */
volatile uint8_t portStatus; /*!< Port status */
} usb_host_ip3516hs_port_state_struct_t;
typedef struct _usb_host_ip3516hs_pipe_struct
{
usb_host_pipe_t pipeCommon; /*!< Common pipe information */
usb_host_transfer_t *trList;
volatile usb_host_transfer_t *currentTr;
uint32_t bufferIndex;
uint32_t bufferLength;
uint16_t cutOffTime;
uint16_t busHsTime;
uint16_t busNoneHsTime;
uint16_t startUFrame;
uint16_t lastPrimedIndex;
uint8_t ssSlot;
uint8_t csSlot;
uint8_t tdIndex;
volatile uint8_t isBusy;
} usb_host_ip3516hs_pipe_struct_t;
/*! @brief IP3516HS controller driver instance structure */
typedef struct _usb_host_ip3516hs_state_struct
{
volatile usb_host_ip3516hs_register_struct_t *usbRegBase; /*!< The base address of the register */
void *hostHandle; /*!< Related host handle*/
#if (defined(USB_HOST_CONFIG_BATTERY_CHARGER) && (USB_HOST_CONFIG_BATTERY_CHARGER > 0U)) && \
(defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))
void *dcdHandle; /*!< Dcd handle used to identify the device object belongs to */
#endif
usb_host_ip3516hs_port_state_struct_t *portState;
usb_host_ip3516hs_pipe_struct_t *pipeList;
usb_host_ip3516hs_pipe_struct_t *pipeListInUsing;
volatile uint32_t bufferArrayBitMap[4]; /*!< Bit map for USB dedicated RAM (Uint is 64bytes) */
#if ((defined(USB_HOST_CONFIG_LOW_POWER_MODE)) && (USB_HOST_CONFIG_LOW_POWER_MODE > 0U))
uint64_t matchTick;
#endif
osa_event_handle_t ip3516HsEvent; /*!< IP3516HS event*/
uint32_t taskEventHandleBuffer[(OSA_EVENT_HANDLE_SIZE + 3) / 4]; /*!< task event handle buffer*/
osa_mutex_handle_t mutex; /*!< Ip3516Hs layer mutex*/
uint32_t mutexBuffer[(OSA_MUTEX_HANDLE_SIZE + 3) / 4];
usb_host_ip3516hs_pipe_struct_t pipePool[USB_HOST_CONFIG_IP3516HS_MAX_PIPE];
uint8_t controllerId; /*!< Controller id */
uint8_t portNumber; /*!< Port count */
uint8_t isrNumber; /*!< ISR Number */
volatile uint8_t isrLevel; /*!< The disable deep of the ISR */
#if ((defined USB_HOST_CONFIG_COMPLIANCE_TEST) && (USB_HOST_CONFIG_COMPLIANCE_TEST))
uint8_t complianceTestStart;
uint8_t complianceTest;
#endif
#if ((defined(USB_HOST_CONFIG_LOW_POWER_MODE)) && (USB_HOST_CONFIG_LOW_POWER_MODE > 0U))
#if ((defined(USB_HOST_CONFIG_LPM_L1)) && (USB_HOST_CONFIG_LPM_L1 > 0U))
uint8_t hirdValue;
uint8_t L1remoteWakeupEnable;
#endif
uint8_t busSuspendStatus; /*!< Bus Suspend Status*/
#endif
#if (defined(USB_HOST_CONFIG_BATTERY_CHARGER) && (USB_HOST_CONFIG_BATTERY_CHARGER > 0U)) && \
(defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))
uint8_t chargerType;
#endif
} usb_host_ip3516hs_state_struct_t;
/*******************************************************************************
* API
******************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif
/*!
* @name USB host IP3516HS APIs
* @{
*/
/*!
* @brief Creates the USB host IP3516HS instance.
*
* This function initializes the USB host IP3516HS controller driver.
*
* @param controllerId The controller ID of the USB IP. See the enumeration usb_controller_index_t.
* @param hostHandle The host level handle.
* @param controllerHandle Returns the controller instance handle.
*
* @retval kStatus_USB_Success The host is initialized successfully.
* @retval kStatus_USB_AllocFail Allocates memory failed.
* @retval kStatus_USB_Error Host mutex create failed, IP3516HS mutex or IP3516HS event create failed.
* Or, IP3516HS IP initialize failed.
*/
extern usb_status_t USB_HostIp3516HsCreate(uint8_t controllerId,
usb_host_handle hostHandle,
usb_host_controller_handle *controllerHandle);
/*!
* @brief Destroys the USB host IP3516HS instance.
*
* This function deinitializes the USB host IP3516HS controller driver.
*
* @param controllerHandle The controller handle.
*
* @retval kStatus_USB_Success The host is initialized successfully.
*/
extern usb_status_t USB_HostIp3516HsDestory(usb_host_controller_handle controllerHandle);
/*!
* @brief Opens the USB host pipe.
*
* This function opens a pipe according to the pipe_init_ptr parameter.
*
* @param controllerHandle The controller handle.
* @param pipeHandle The pipe handle pointer used to return the pipe handle.
* @param pipeInit It is used to initialize the pipe.
*
* @retval kStatus_USB_Success The host is initialized successfully.
* @retval kStatus_USB_Error There is no idle pipe.
*
*/
extern usb_status_t USB_HostIp3516HsOpenPipe(usb_host_controller_handle controllerHandle,
usb_host_pipe_handle *pipeHandle,
usb_host_pipe_init_t *pipeInit);
/*!
* @brief Closes the USB host pipe.
*
* This function closes a pipe and frees the related resources.
*
* @param controllerHandle The controller handle.
* @param pipeHandle The closing pipe handle.
*
* @retval kStatus_USB_Success The host is initialized successfully.
*/
extern usb_status_t USB_HostIp3516HsClosePipe(usb_host_controller_handle controllerHandle,
usb_host_pipe_handle pipeHandle);
/*!
* @brief Sends data to the pipe.
*
* This function requests to send the transfer to the specified pipe.
*
* @param controllerHandle The controller handle.
* @param pipeHandle The sending pipe handle.
* @param transfer The transfer information.
*
* @retval kStatus_USB_Success Send successful.
* @retval kStatus_USB_LackSwapBuffer There is no swap buffer for IP3516HS.
*/
extern usb_status_t USB_HostIp3516HsWritePipe(usb_host_controller_handle controllerHandle,
usb_host_pipe_handle pipeHandle,
usb_host_transfer_t *transfer);
/*!
* @brief Receives data from the pipe.
*
* This function requests to receive the transfer from the specified pipe.
*
* @param controllerHandle The controller handle.
* @param pipeHandle The receiving pipe handle.
* @param transfer The transfer information.
*
* @retval kStatus_USB_Success Receive successful.
* @retval kStatus_USB_LackSwapBuffer There is no swap buffer for IP3516HS.
*/
extern usb_status_t USB_HostIp3516HsReadPipe(usb_host_controller_handle controllerHandle,
usb_host_pipe_handle pipeHandle,
usb_host_transfer_t *transfer);
/*!
* @brief Controls the IP3516HS.
*
* This function controls the IP3516HS.
*
* @param controllerHandle The controller handle.
* @param ioctlEvent See the enumeration host_bus_control_t.
* @param ioctlParam The control parameter.
*
* @retval kStatus_USB_Success Cancel successful.
* @retval kStatus_USB_InvalidHandle The controllerHandle is a NULL pointer.
*/
extern usb_status_t USB_HostIp3516HsIoctl(usb_host_controller_handle controllerHandle,
uint32_t ioctlEvent,
void *ioctlParam);
/*! @}*/
#ifdef __cplusplus
}
#endif
/*! @}*/
#endif /* __USB_HOST_IP3516HS_H__ */