blob: c6af8e889546dfc6c79459c99cd954d0d4f6c6c0 [file] [log] [blame]
/*******************************************************************************
This software file (the "File") is distributed by Marvell International Ltd.
or its affiliate(s) under the terms of the GNU General Public License Version 2,
June 1991 (the "License"). You may use, redistribute and/or modify this File
in accordance with the terms and conditions of the License, a copy of which
is available along with the File in the license.txt file or by writing to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
or on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED. The GPL License provides additional details about this warranty
disclaimer.
(C) Copyright 2004 - 2007 Marvell Semiconductor Israel Ltd. All Rights Reserved.
(C) Copyright 1999 - 2004 Chipidea Microelectronica, S.A. All Rights Reserved.
*******************************************************************************/
#ifndef __mvUsbCore_h__
#define __mvUsbCore_h__
#include "usb/api/mvUsbTypes.h"
/* VUSBHS specific defines */
#define VUSBHS_MAX_PORTS (8)
#define EHCI_CAP_LEN_MASK (0x000000FF)
#define EHCI_DATA_STRUCTURE_BASE_ADDRESS (0)
/* Command Register Bit Masks */
#define EHCI_CMD_RUN_STOP (0x00000001)
#define EHCI_CMD_CTRL_RESET (0x00000002)
#define EHCI_CMD_SETUP_TRIPWIRE_SET (0x00002000)
#define EHCI_CMD_SETUP_TRIPWIRE_CLEAR ~EHCI_CMD_SETUP_TRIPWIRE_SET
#define EHCI_CMD_ATDTW_TRIPWIRE_SET (0x00004000)
#define EHCI_CMD_ATDTW_TRIPWIRE_CLEAR ~EHCI_CMD_ATDTW_TRIPWIRE_SET
/*bit 15,3,2 are for frame list size */
#define EHCI_CMD_FRAME_SIZE_1024 (0x00000000) /* 000 */
#define EHCI_CMD_FRAME_SIZE_512 (0x00000004) /* 001 */
#define EHCI_CMD_FRAME_SIZE_256 (0x00000008) /* 010 */
#define EHCI_CMD_FRAME_SIZE_128 (0x0000000C) /* 011 */
#define EHCI_CMD_FRAME_SIZE_64 (0x00008000) /* 100 */
#define EHCI_CMD_FRAME_SIZE_32 (0x00008004) /* 101 */
#define EHCI_CMD_FRAME_SIZE_16 (0x00008008) /* 110 */
#define EHCI_CMD_FRAME_SIZE_8 (0x0000800C) /* 111 */
/* Hardware Rev 4.0 related change */
/* Mode Register Bit Masks */
#define VUSBHS_MODE_CTRL_MODE_IDLE (0x00000000)
#define VUSBHS_MODE_CTRL_MODE_DEV (0x00000002)
#define VUSBHS_MODE_CTRL_MODE_HOST (0x00000003)
#define VUSBHS_MODE_BIG_ENDIAN (0x00000004)
#define VUSBHS_MODE_SETUP_LOCK_DISABLE (0x00000008)
#define VUSBHS_MODE_STREAM_DISABLE (0x00000010)
/* Interrupt Enable Register Bit Masks */
#define EHCI_INTR_INT_EN (0x00000001)
#define EHCI_INTR_ERR_INT_EN (0x00000002)
#define EHCI_INTR_PORT_CHANGE_DETECT_EN (0x00000004)
#define EHCI_INTR_ASYNC_ADV_AAE (0x00000020)
#define EHCI_INTR_ASYNC_ADV_AAE_ENABLE (0x00000020) /* | with this to enable */
#define EHCI_INTR_ASYNC_ADV_AAE_DISABLE (0xFFFFFFDF) /* & with this to disable */
#define EHCI_INTR_RESET_EN (0x00000040)
#define EHCI_INTR_SOF_UFRAME_EN (0x00000080)
#define EHCI_INTR_DEVICE_SUSPEND (0x00000100)
/* Interrupt Status Register Masks */
#define EHCI_STS_SOF (0x00000080)
#define EHCI_STS_RESET (0x00000040)
#define EHCI_STS_PORT_CHANGE (0x00000004)
#define EHCI_STS_ERR (0x00000002)
#define EHCI_STS_INT (0x00000001)
#define EHCI_STS_SUSPEND (0x00000100)
#define EHCI_STS_HC_HALTED (0x00001000)
/* Endpoint Queue Head Bit Masks */
#define VUSB_EP_QUEUE_HEAD_IOS (0x00008000)
#define VUSB_EP_QUEUE_HEAD_IOC (0x00008000)
#define VUSB_EP_QUEUE_HEAD_INT (0x00000100)
#define VUSB_EP_QUEUE_HEAD_NEXT_TERMINATE (0x00000001)
#define VUSB_EP_QUEUE_HEAD_MAX_PKT_LEN_POS (16)
#define VUSB_EP_QUEUE_HEAD_ZERO_LEN_TER_SEL (0x20000000)
#define VUSB_EP_QUEUE_HEAD_MULT_POS (30)
#define VUSB_EP_MAX_LENGTH_TRANSFER (0x4000)
#define VUSB_EP_QUEUE_HEAD_STATUS_ACTIVE (0x00000080)
#define VUSBHS_TD_NEXT_TERMINATE (0x00000001)
#define VUSBHS_TD_IOC (0x00008000)
#define VUSBHS_TD_STATUS_ACTIVE (0x00000080)
#define VUSBHS_TD_STATUS_HALTED (0x00000040)
#define VUSBHS_TD_RESERVED_FIELDS (0x00007F00)
#define VUSBHS_TD_ERROR_MASK (0x68)
#define VUSBHS_TD_ADDR_MASK (0xFFFFFFE0)
#define VUSBHS_TD_LENGTH_BIT_POS (16)
#define EHCI_EPCTRL_TX_ALL_MASK (0xFFFF0000)
#define EHCI_EPCTRL_RX_ALL_MASK (0x0000FFFF)
#define EHCI_EPCTRL_TX_DATA_TOGGLE_RST (0x00400000)
#define EHCI_EPCTRL_TX_EP_STALL (0x00010000)
#define EHCI_EPCTRL_RX_EP_STALL (0x00000001)
#define EHCI_EPCTRL_RX_DATA_TOGGLE_RST (0x00000040)
#define EHCI_EPCTRL_RX_ENABLE (0x00000080)
#define EHCI_EPCTRL_TX_ENABLE (0x00800000)
#define EHCI_EPCTRL_CONTROL (0x00000000)
#define EHCI_EPCTRL_ISOCHRONOUS (0x00040000)
#define EHCI_EPCTRL_BULK (0x00080000)
#define EHCI_EPCTRL_INT (0x000C0000)
#define EHCI_EPCTRL_TX_TYPE (0x000C0000)
#define EHCI_EPCTRL_RX_TYPE (0x0000000C)
#define EHCI_EPCTRL_DATA_TOGGLE_INHIBIT (0x00000020)
#define EHCI_EPCTRL_TX_EP_TYPE_SHIFT (18)
#define EHCI_EPCTRL_RX_EP_TYPE_SHIFT (2)
/* set bit 24 (PFSC) in PORTSCX register */
#define EHCI_PORTSCX_FORCE_FULL_SPEED_CONNECT (0x01000000)
/* set bit 23 (PHCD) in PORTSCX register */
#define EHCI_PORTSCX_PHY_CLOCK_DISABLE (0x00800000)
#define EHCI_PORTSCX_PORT_POWER (0x00001000)
#define EHCI_PORTSCX_LINE_STATUS_BITS (0x00000C00)
#define EHCI_PORTSCX_LINE_STATUS_SE0 (0x00000000)
#define EHCI_PORTSCX_LINE_STATUS_KSTATE (0x00000400)
#define EHCI_PORTSCX_LINE_STATUS_JSTATE (0x00000800)
#define EHCI_PORTSCX_PORT_HIGH_SPEED (0x00000200)
#define EHCI_PORTSCX_PORT_RESET (0x00000100)
#define EHCI_PORTSCX_PORT_SUSPEND (0x00000080)
#define EHCI_PORTSCX_PORT_FORCE_RESUME (0x00000040)
#define EHCI_PORTSCX_PORT_EN_DIS_CHANGE (0x00000008)
#define EHCI_PORTSCX_PORT_ENABLE (0x00000004)
#define EHCI_PORTSCX_CONNECT_STATUS_CHANGE (0x00000002)
#define EHCI_PORTSCX_CURRENT_CONNECT_STATUS (0x00000001)
#define VUSBHS_PORTSCX_PORT_SPEED_FULL (0x00000000)
#define VUSBHS_PORTSCX_PORT_SPEED_LOW (0x04000000)
#define VUSBHS_PORTSCX_PORT_SPEED_HIGH (0x08000000)
#define VUSBHS_SPEED_MASK (0x0C000000)
#define VUSBHS_SPEED_BIT_POS (26)
#define EHCI_PORTSCX_W1C_BITS (0x2A)
#define VUSB_EP_QH_PACKET_SIZE (0x3FFF0000)
#define VUSB_EP_TR_PACKET_SIZE (0x7FFF0000)
#define VUSBHS_FRINDEX_MS_MASK (0xFFFFFFF8)
#define VUSBHS_ADDRESS_BIT_SHIFT (25)
#define VUSB20_DCC_MAX_ENDPTS_SUPPORTED (0x1F)
#define VUSB20_DCC_HOST_MODE_MASK (1 << 8)
#define VUSB20_DCC_DEVICE_MODE_MASK (1 << 7)
#define EHCI_HCC_PARAMS_64_BIT_ADDR_CAP (0x01)
#define EHCI_HCC_PARAMS_PGM_FRM_LIST_FLAG (0x02)
#define EHCI_HCC_PARAMS_ASYNC_PARK_CAP (0x04)
#define EHCI_HCC_PARAMS_ISOCH_SCHED_THRESHOLD (0xF0)
#define EHCI_HCC_PARAMS_ISOCH_FRAME_CACHED (0x80)
#define VUSB20_HCS_PARAMS_PORT_POWER_CONTROL_FLAG (0x10)
#define VUSB20_HOST_INTR_EN_BITS (0x37)
#define VUSB20_DEFAULT_PERIODIC_FRAME_LIST_SIZE (1024)
#define VUSB20_NEW_PERIODIC_FRAME_LIST_BITS (2)
#define EHCI_FRAME_LIST_ELEMENT_POINTER_T_BIT (0x01)
#define EHCI_ITD_T_BIT (0x01)
#define EHCI_SITD_T_BIT (0x01)
#define EHCI_QUEUE_HEAD_POINTER_T_BIT (0x01)
/************************************************************
Split transatcions specific defines
************************************************************/
#define EHCI_START_SPLIT_MAX_BUDGET 188
#define EHCI_ELEMENT_TYPE_ITD (0x00)
#define EHCI_ELEMENT_TYPE_QH (0x02)
#define EHCI_ELEMENT_TYPE_SITD (0x04)
#define EHCI_ELEMENT_TYPE_FSTN (0x06)
#define EHCI_ELEMENT_TYPE_MASK (0x06)
#define EHCI_FRAME_LIST_ELEMENT_TYPE_ITD (0x00)
#define EHCI_FRAME_LIST_ELEMENT_TYPE_QH (0x01)
#define EHCI_FRAME_LIST_ELEMENT_TYPE_SITD (0x02)
#define EHCI_FRAME_LIST_ELEMENT_TYPE_FSTN (0x03)
#define EHCI_FRAME_LIST_ELEMENT_TYPE_BIT_POS (1)
#define EHCI_QH_ELEMENT_TYPE_ITD (0x00)
#define EHCI_QH_ELEMENT_TYPE_QH (0x01)
#define EHCI_QH_ELEMENT_TYPE_SITD (0x02)
#define EHCI_QH_ELEMENT_TYPE_FSTN (0x03)
#define EHCI_QH_ELEMENT_TYPE_BIT_POS (1)
#define EHCI_QTD_PID_OUT_TOKEN (0x000)
#define EHCI_QTD_PID_IN_TOKEN (0x100)
#define EHCI_QTD_PID_SETUP_TOKEN (0x200)
#define EHCI_QTD_IOC (0x8000)
#define EHCI_QTD_STATUS_ACTIVE (0x0080)
#define EHCI_QTD_STATUS_HALTED (0x0040)
#define EHCI_QTD_PID_SETUP (0x0200)
#define EHCI_QTD_PID_IN (0x0100)
#define EHCI_QTD_PID_OUT (0x0000)
#define EHCI_QTD_LENGTH_BIT_POS (16)
#define EHCI_QTD_DATA_TOGGLE (0x80000000)
#define EHCI_QTD_DATA_TOGGLE_BIT_POS (31)
#define EHCI_QTD_LENGTH_BIT_MASK (0x7FFF0000)
#define EHCI_QTD_ERROR_BITS_MASK (0x0000003E)
#define EHCI_QTD_DEFAULT_CERR_VALUE (0xC00)
#define EHCI_SETUP_TOKEN (2)
#define EHCI_OUT_TOKEN (0)
#define EHCI_IN_TOKEN (1)
#define EHCI_QTD_T_BIT (0x01)
#define EHCI_QH_ENDPOINT_SPEED_FULL (0x00)
#define EHCI_QH_ENDPOINT_SPEED_LOW (0x01)
#define EHCI_QH_ENDPOINT_SPEED_HIGH (0x02)
#define EHCI_QH_ENDPOINT_SPEED_RESERVED (0x03)
#define EHCI_ITD_LENGTH_BIT_POS (16)
#define EHCI_ITD_IOC_BIT (0x00008000)
#define EHCI_ITD_ACTIVE_BIT (0x80000000)
#define EHCI_ITD_PG_SELECT_BIT_POS (12)
#define EHCI_ITD_DIRECTION_BIT_POS (11)
#define EHCI_ITD_EP_BIT_POS (8)
#define EHCI_ITD_STATUS (0xF0000000)
#define EHCI_ITD_STATUS_ACTIVE (0x80000000) /*bit 4 = 1000*/
#define EHCI_ITD_STATUS_DATA_BUFFER_ERR (0x40000000) /*bit 3 = 0100*/
#define EHCI_ITD_STATUS_BABBLE_ERROR (0x20000000) /*bit 2 = 0010*/
#define EHCI_ITD_STATUS_TRANSACTION_ERR (0x10000000) /*bit 4 = 0001*/
#define EHCI_ITD_LENGTH_TRANSMITTED (0x0FFF0000)
#define EHCI_ITD_BUFFER_OFFSET (0x00000FFF)
#define EHCI_ITD_PAGE_NUMBER (0x00007000)
#define EHCI_ITD_BUFFER_POINTER (0xFFFFF000)
#define EHCI_ITD_MULTI_TRANSACTION_BITS (0x00000003)
/* SITD position bits */
#define EHCI_SITD_DIRECTION_BIT_POS (31)
#define EHCI_SITD_PORT_NUMBER_BIT_POS (24)
#define EHCI_SITD_HUB_ADDR_BIT_POS (16)
#define EHCI_SITD_EP_ADDR_BIT_POS (8)
#define EHCI_SITD_COMPLETE_SPLIT_MASK_BIT_POS (8)
#define EHCI_SITD_IOC_BIT_SET (0x80000000)
#define EHCI_SITD_PAGE_SELECT_BIT_POS (30)
#define EHCI_SITD_TRANSFER_LENGTH_BIT_POS (16)
#define EHCI_SITD_STATUS_ACTIVE (0x80)
#define EHCI_SITD_STATUS (0xFF)
#define EHCI_SITD_LENGTH_TRANSMITTED (0x03FF0000)
#define EHCI_SITD_BUFFER_OFFSET (0x00000FFF)
#define EHCI_SITD_PAGE_NUMBER (0x40000000)
#define EHCI_SITD_BUFFER_POINTER (0xFFFFF000)
#define EHCI_SITD_BUFFER_PTR_BIT_POS (12)
#define EHCI_SITD_TP_BIT_POS (3)
#define EHCI_SITD_TP_ALL (0)
#define EHCI_SITD_TP_BEGIN (1)
#define EHCI_SITD_TP_MID (2)
#define EHCI_SITD_TP_END (3)
/* Interrupt enable bit masks */
#define EHCI_IER_ASYNCH_ADVANCE (0x00000020)
#define EHCI_IER_HOST_SYS_ERROR (0x00000010)
#define EHCI_IER_FRAME_LIST_ROLLOVER (0x00000008)
#define EHCI_IER_PORT_CHANGE (0x00000004)
#define EHCI_IER_USB_ERROR (0x00000002)
#define EHCI_IER_USB_INTERRUPT (0x00000001)
/* Interrupt status bit masks */
#define EHCI_STS_RECLAIMATION (0x00002000)
#define EHCI_STS_SOF_COUNT (0x00000080)
#define EHCI_STS_ASYNCH_ADVANCE (0x00000020)
#define EHCI_STS_HOST_SYS_ERROR (0x00000010)
#define EHCI_STS_FRAME_LIST_ROLLOVER (0x00000008)
#define EHCI_STS_PORT_CHANGE (0x00000004)
#define EHCI_STS_USB_ERROR (0x00000002)
#define EHCI_STS_USB_INTERRUPT (0x00000001)
/* Status bit masks */
#define EHCI_STS_ASYNCH_SCHEDULE (0x00008000)
#define EHCI_STS_PERIODIC_SCHEDULE (0x00004000)
#define EHCI_STS_RECLAMATION (0x00002000)
#define EHCI_STS_HC_HALTED (0x00001000)
/* USB command bit masks */
#define EHCI_USBCMD_ASYNC_SCHED_ENABLE (0x00000020)
#define EHCI_USBCMD_PERIODIC_SCHED_ENABLE (0x00000010)
#define EHCI_HCS_PARAMS_N_PORTS (0x0F)
#define VUSB_HS_DELAY (3500)
#define EHCI_QH_EP_NUM_MASK (0x0F00)
#define EHCI_QH_EP_NUM_BITS_POS (8)
#define EHCI_QH_DEVICE_ADDRESS_MASK (0x7F)
#define EHCI_QH_SPEED_BITS_POS (12)
#define EHCI_QH_MAX_PKT_SIZE_BITS_POS (16)
#define EHCI_QH_NAK_COUNT_RL_BITS_POS (28)
#define EHCI_QH_EP_CTRL_FLAG_BIT_POS (27)
#define EHCI_QH_HEAD_RECLAMATION_BIT_POS (15)
#define EHCI_QH_DTC_BIT_POS (14)
#define EHCI_QH_HIGH_BW_MULT_BIT_POS (30)
#define EHCI_QH_HUB_PORT_NUM_BITS_POS (23)
#define EHCI_QH_HUB_ADDR_BITS_POS (16)
#define EHCI_QH_SPLIT_COMPLETION_MASK_BITS_POS (8)
#define EHCI_QH_SPLIT_COMPLETION_MASK (0xFF00)
#define EHCI_QH_INTR_SCHED_MASK (0xFF)
#define EHCI_QH_INACTIVATE_NEXT_TR_BIT_POS (7)
#define EHCI_QH_HORIZ_PHY_ADDRESS_MASK (0xFFFFFFE0)
#define EHCI_QH_TR_OVERLAY_DT_BIT (0x80000000)
#define EHCI_SITD_SPLIT_COMPLETION_MASK_BITS_POS (8)
#define EHCI_INTR_NO_THRESHOLD_IMMEDIATE (0x00010000)
#define EHCI_NEW_PERIODIC_FRAME_LIST_SIZE (1024)
#define EHCI_FRAME_LIST_SIZE_BITS_POS (2)
#define EHCI_HORIZ_PHY_ADDRESS_MASK (0xFFFFFFE0)
#define DEFAULT_MAX_NAK_COUNT (15)
/* OTG Status and control register bit masks */
/* OTG interrupt enable bit masks */
#define VUSBHS_OTGSC_INTERRUPT_ENABLE_BITS_MASK (0x5F000000)
#define VUSBHS_OTGSC_DPIE (0x40000000) /* Data-line pulsing IE */
#define VUSBHS_OTGSC_1MSIE (0x20000000)
#define VUSBHS_OTGSC_BSEIE (0x10000000) /* B-session end IE */
#define VUSBHS_OTGSC_BSVIE (0x08000000) /* B-session valid IE */
#define VUSBHS_OTGSC_ASVIE (0x04000000) /* A-session valid IE */
#define VUSBHS_OTGSC_AVVIE (0x02000000) /* A-V-bus valid IE */
#define VUSBHS_OTGSC_IDIE (0x01000000) /* OTG ID IE */
/* OTG interrupt status bit masks */
#define VUSBHS_OTGSC_INTERRUPT_STATUS_BITS_MASK (0x005F0000)
#define VUSBHS_OTGSC_DPIS (0x00400000) /* Data-line pulsing IS */
#define VUSBHS_OTGSC_1MSIS (0x00200000)
#define VUSBHS_OTGSC_BSEIS (0x00100000) /* B-session end IS */
#define VUSBHS_OTGSC_BSVIS (0x00080000) /* B-session valid IS */
#define VUSBHS_OTGSC_ASVIS (0x00040000) /* A-session valid IS */
#define VUSBHS_OTGSC_AVVIS (0x00020000) /* A-Vbus valid IS */
#define VUSBHS_OTGSC_IDIS (0x00010000) /* OTG ID IS */
/* OTG status bit masks */
#define VUSBHS_OTGSC_DPS (0x00004000)
#define VUSBHS_OTGSC_BSE (0x00001000) /* B-session end */
#define VUSBHS_OTGSC_BSV (0x00000800) /* B-session valid */
#define VUSBHS_OTGSC_ASV (0x00000400) /* A-session valid */
#define VUSBHS_OTGSC_AVV (0x00000200) /* A-Vbus Valid */
#define VUSBHS_OTGSC_ID (0x00000100) /* OTG ID */
/* OTG control bit masks */
#define VUSBHS_OTGSC_CTL_BITS (0x2F)
#define VUSBHS_OTGSC_HABA (0x00000080) /* hardware assisted data pulse bits*/
#define VUSBHS_OTGSC_HADP (0x00000040) /* hardware assisted data pulse bits*/
#ifdef PATCH_3
/* the following change is to be compatable with 4.0 revision of
hardware. Enable the following switch in config.mk to enable the
changes. */
/* WEB20040409 below line changed from VUSBHS_OTGSC_B_HOST_EN to VUSBHS_OTGSC_IDPU
to reflect change in usbhs4.0 B_HOST_EN has not been used quite some time */
#define VUSBHS_OTGSC_IDPU (0x00000020) /* ID pull enable */
#else
#define VUSBHS_OTGSC_B_HOST_EN (0x00000020) /* B_host_enable */
#endif
#define VUSBHS_OTGSC_DP (0x00000010) /* Data-pulsing */
#define VUSBHS_OTGSC_OT (0x00000008) /* OTG termination */
#if 0
#define VUSBHS_OTGSC_VO (0x00000004) /* Vbus on */
#endif
#define VUSBHS_OTGSC_HAAR (0x00000004) /* Auto reset bit*/
#define VUSBHS_OTGSC_VC (0x00000002) /* Vbus charge */
#define VUSBHS_OTGSC_VD (0x00000001) /* Vbus discharge */
typedef uint_32 USB_REGISTER, _PTR_ USB_REGISTER_PTR;
/* The VUSB register structure */
typedef struct {
union {
struct {
volatile USB_REGISTER CAPLENGTH_HCIVER;
volatile USB_REGISTER HCS_PARAMS; /* HC structural parameters */
volatile USB_REGISTER HCC_PARAMS; /* HC Capability Parameters*/
volatile USB_REGISTER RESERVED1[5];
volatile USB_REGISTER DCI_VERSION; /* DC version number and reserved 16 bits */
volatile USB_REGISTER DCC_PARAMS; /* DC Capability Parameters */
} CAPABILITY_REGISTERS;
struct {
volatile USB_REGISTER USB_CMD; /* Command register */
volatile USB_REGISTER USB_STS; /* Status register */
volatile USB_REGISTER USB_INTR; /* Interrupt enable */
volatile USB_REGISTER USB_FRINDEX; /* Frame index */
volatile USB_REGISTER CTRLDSSEGMENT; /* 4G segment selector */
volatile USB_REGISTER DEVICE_ADDR; /* Device Address */
volatile USB_REGISTER EP_LIST_ADDR; /* Endpoint List Address */
volatile USB_REGISTER RESERVED0[9];
volatile USB_REGISTER CONFIG_FLAG; /* Configured Flag register */
volatile USB_REGISTER PORTSCX[VUSBHS_MAX_PORTS]; /* Port Status/Control x, x = 1..8 */
volatile USB_REGISTER OTGSC;
volatile USB_REGISTER USB_MODE; /* USB Host/Device mode */
volatile USB_REGISTER ENDPT_SETUP_STAT; /* Endpoint Setup Status */
volatile USB_REGISTER ENDPTPRIME; /* Endpoint Initialize */
volatile USB_REGISTER ENDPTFLUSH; /* Endpoint De-initialize */
volatile USB_REGISTER ENDPTSTATUS; /* Endpoint Status */
volatile USB_REGISTER ENDPTCOMPLETE; /* Endpoint Interrupt On Complete */
volatile USB_REGISTER ENDPTCTRLX[16]; /* Endpoint Control, where x = 0.. 15 */
} OPERATIONAL_DEVICE_REGISTERS;
struct {
volatile USB_REGISTER USB_CMD; /* Command register */
volatile USB_REGISTER USB_STS; /* Status register */
volatile USB_REGISTER USB_INTR; /* Interrupt enable */
volatile USB_REGISTER USB_FRINDEX; /* Frame index */
volatile USB_REGISTER CTRLDSSEGMENT; /* 4G segment selector */
volatile USB_REGISTER PERIODIC_LIST_BASE_ADDR; /* Periodic schedule list */
volatile USB_REGISTER CURR_ASYNC_LIST_ADDR; /* Current Asynch schedule list */
volatile USB_REGISTER ASYNCTTSTS; /* Async buffer in embedded TT control */
volatile USB_REGISTER RESERVED0[8];
volatile USB_REGISTER CONFIG_FLAG; /* Configured Flag register */
volatile USB_REGISTER PORTSCX[VUSBHS_MAX_PORTS]; /* Port Status/Control x, x = 1..8 */
volatile USB_REGISTER OTGSC; /* OTG status and control register */
volatile USB_REGISTER USB_MODE; /* USB Host/Device mode */
} OPERATIONAL_HOST_REGISTERS;
} REGISTERS;
} VUSB20_REG_STRUCT, _PTR_ VUSB20_REG_STRUCT_PTR;
typedef struct {
volatile uint_32 MAX_PKT_LENGTH; /* Bits 16..26 Bit 15 is Interrupt
** On Setup
*/
volatile uint_32 CURR_DTD_PTR; /* Current dTD Pointer */
volatile uint_32 NEXT_DTD_PTR; /* Next dTD Pointer */
volatile uint_32 SIZE_IOC_INT_STS; /* Total bytes (16..30), IOC (15),
** INT (8), STS (0-7)
*/
volatile uint_32 BUFF_PTR0; /* Buffer pointer Page 0 (12-31) */
volatile uint_32 BUFF_PTR1; /* Buffer pointer Page 1 (12-31) */
volatile uint_32 BUFF_PTR2; /* Buffer pointer Page 2 (12-31) */
volatile uint_32 BUFF_PTR3; /* Buffer pointer Page 3 (12-31) */
volatile uint_32 BUFF_PTR4; /* Buffer pointer Page 4 (12-31) */
volatile uint_32 RESERVED1;
volatile uint_8 SETUP_BUFFER[8]; /* 8 bytes of setup data that follows
** the Setup PID
*/
volatile uint_32 RESERVED2[4];
} VUSB20_EP_QUEUE_HEAD_STRUCT, _PTR_ VUSB20_EP_QUEUE_HEAD_STRUCT_PTR;
typedef struct {
pointer PRIVATE;
void (_CODE_PTR_ FREE)(pointer);
pointer XD_FOR_THIS_DTD;
} SCRATCH_STRUCT, _PTR_ SCRATCH_STRUCT_PTR;
typedef struct ep_tr_struct {
volatile uint_32 NEXT_TR_ELEM_PTR; /* Memory address of next
** dTD to be processed (5-31)
** and the T (bit 0) indicating
** pointer validity
*/
volatile uint_32 SIZE_IOC_STS; /* total bytes (16-30),
** IOC (15), Status (0-7)
*/
volatile uint_32 BUFF_PTR0; /* Buffer pointer Page 0 */
volatile uint_32 BUFF_PTR1; /* Buffer pointer Page 1 */
volatile uint_32 BUFF_PTR2; /* Buffer pointer Page 2 */
volatile uint_32 BUFF_PTR3; /* Buffer pointer Page 3 */
volatile uint_32 BUFF_PTR4; /* Buffer pointer Page 4 */
volatile SCRATCH_STRUCT_PTR SCRATCH_PTR;
} VUSB20_EP_TR_STRUCT, _PTR_ VUSB20_EP_TR_STRUCT_PTR;
typedef struct {
uint_32 NEXT_LINK_PTR; /* (5-31) Memory address of
** next schedule data structure
** item Type (1..2 ) and the
** T (bit 0) indicating pointer
** validity
*/
uint_32 TR_STATUS_CTL_LIST[8]; /* bits 31-28: Status,
** bits 27-16: Tr X length
** bit 15: Int on complete
** bits 14-12: Page Select
** bits 11-0: Tr X offset
*/
uint_32 BUFFER_PAGE_PTR_LIST[7]; /* bits 31-12 4K aligned pointer
** to physical memory
** bits 11-8 endpoint no.
** bit 7: reserved
** bits 6-0 device address*/
SCRATCH_STRUCT_PTR SCRATCH_PTR;
pointer PIPE_DESCR_FOR_THIS_ITD;
pointer PIPE_TR_DESCR_FOR_THIS_ITD;
uint_32_ptr frame_list_ptr;
uint_32 number_of_transactions;
/* 32-byte aligned structures */
uint_32 RESERVED[11];
} EHCI_ITD_STRUCT, _PTR_ EHCI_ITD_STRUCT_PTR;
typedef struct {
uint_32 NEXT_LINK_PTR; /* (5-31) Memory address of
** next schedule data structure
** item Type (1..2 ) and the
** T (bit 0) indicating pointer
** validity
*/
uint_32 EP_CAPAB_CHARAC; /* bits 31: Direction (I/O),
** bits 30-24: Port number
** bit 23: reserved
** bits 22-16: Hub address
** bits 15-12: Reserved
** bits 11-8: Endpoint number
** bit 7: reserved
** bits 6-0: device address
*/
uint_32 UFRAME_SCHED_CTL; /* bits 31-16: reserved
** bits 15-8: Split completion mask
** bits 7-0: Split start mask
*/
uint_32 TRANSFER_STATE; /* bit 31: int on complete
** bit 30: Page Select
** bits 29-26: Reserved
** bits 25-16: total bytes to
** transfer
** bits 15-8: uframe
** complete-split progress mask
** bits 7-0: status
*/
uint_32 BUFFER_PTR_0; /* bits 31-12: 4K aligned pointer
** to physical memory
** bits 11-0: Current offset
*/
uint_32 BUFFER_PTR_1; /* bits 31-12: 4K aligned pointer
** to physical memory
** bits 11-5 reserved
** bits 4-3 tr position
** bits 2-0 tr count
*/
uint_32 BACK_LINK_PTR; /* bits 31-5 back pointer points to sITD
** bits 4-1: reserved
** bit 0: terminate
*/
SCRATCH_STRUCT_PTR SCRATCH_PTR;
pointer PIPE_DESCR_FOR_THIS_SITD;
pointer PIPE_TR_DESCR_FOR_THIS_SITD;
uint_32_ptr frame_list_ptr;
/* align to 16 word boundry */
uint_32 RESERVED[5];
} EHCI_SITD_STRUCT, _PTR_ EHCI_SITD_STRUCT_PTR;
typedef struct {
uint_32 NEXT_QTD_PTR; /* (5-31) Memory address of
** next qTD to be processed
** (4..1) reserved
** T (bit 0) indicating pointer
** validity
*/
uint_32 ALT_NEXT_QTD_PTR; /* bits 31-5: alternate next
** qTD if the above one encounters
** a short packet
** (4..1) reserved
** T (bit 0) indicating pointer
** validity
*/
uint_32 TOKEN; /* bits 31: data toggle
** bits 30-16: Total bytes to transfer
** bit 15: Interrupt on Complete
** bits 14-12: Current page
** bits 11-10: Error Counter
** bits 9-8: PID code
** bits 7-0: status
*/
uint_32 BUFFER_PTR_0; /* bit 31-12: 4K-page aligned
** physical memory address
** bit 11-0: Current Offset
*/
uint_32 BUFFER_PTR_1; /* bit 31-12: 4K-page aligned
** physical memory address
** bit 11-0: reserved
*/
uint_32 BUFFER_PTR_2; /* bit 31-12: 4K-page aligned
** physical memory address
** bit 11-0: reserved
*/
uint_32 BUFFER_PTR_3; /* bit 31-12: 4K-page aligned
** physical memory address
** bit 11-0: reserved
*/
uint_32 BUFFER_PTR_4; /* bit 31-12: 4K-page aligned
** physical memory address
** bit 11-0: reserved
*/
SCRATCH_STRUCT_PTR SCRATCH_PTR;
pointer PIPE_DESCR_FOR_THIS_QTD;
pointer TR_FOR_THIS_QTD;
uint_32 RESERVED[5];
} EHCI_QTD_STRUCT, _PTR_ EHCI_QTD_STRUCT_PTR;
typedef struct {
uint_32 HORIZ_LINK_PTR; /* (5-31) Memory address of
** next data object to be processed
** (4..3) reserved
** (2..1) type of the item
** T (bit 0) indicating pointer
** validity
*/
uint_32 EP_CAPAB_CHARAC1; /* bits 31-28: NAK count reload,
** bit 27: Control endpoint flag
** bit 26-16: Maximum packet length
** bit 15: Head of reclamation
** list flag
** bit 14: data toggle control
** bits 13-12: endpoint speed
** bit 11-8: endpoint number
** bits 7: Inactivate on next tr
** bits 6-0: Device address
*/
uint_32 EP_CAPAB_CHARAC2; /* bits 31-30: High-BW pipe
** Multiplier,
** bit 29-23: Port number
** bit 22-16: Hub address
** bit 15-8: Split completion mask
** bit 7-0: Interrupt schedule mask
*/
uint_32 CURR_QTD_LINK_PTR;/* bits 31-5: physical memory address
** of the current xaction processed
*/
uint_32 NEXT_QTD_LINK_PTR;/* bits 31-5: physical memory address
** of the current xaction processed
** bit 0: Terminate bit
*/
uint_32 ALT_NEXT_QTD_LINK_PTR; /* bits 31-5: physical memory address
** of the current xaction processed
** bits 4-1: NAK counter
** bit 0: Terminate bit
*/
uint_32 STATUS; /* bit 31: data-toggle
** bits 30-16: total bytes to transfer
** bit 15: Interrupt on complete
** bits 11-10: Error counter
** bit 0: Ping state/Err
** physical memory address
** bit 11-0: reserved
*/
uint_32 BUFFER_PTR_0; /* bit 31-12: 4K-page aligned
** physical memory address
** bit 11-0: reserved
*/
uint_32 BUFFER_PTR_1; /* bit 31-12: 4K-page aligned
** physical memory address
** bit 7-0: Split-transaction,
** complete-split progress
*/
uint_32 BUFFER_PTR_2; /* bits 31-12: 4K-page aligned
** physical memory address
** bits 11-5: S-bytes
** bits 4-0: Split-transaction
** frame tag
*/
uint_32 BUFFER_PTR_3; /* bit 31-12: 4K-page aligned
** physical memory address
** bit 11-0: reserved
*/
uint_32 BUFFER_PTR_4; /* bit 31-12: 4K-page aligned
** physical memory address
** bit 11-0: reserved
*/
SCRATCH_STRUCT_PTR SCRATCH_PTR;
pointer PIPE_DESCR_FOR_THIS_QH;
uint_32 RESERVED[18];
} EHCI_QH_STRUCT, _PTR_ EHCI_QH_STRUCT_PTR;
typedef struct {
uint_32 NORMAL_PATH_LINK_PTR; /* (5-31) Memory address of
** next data object to be processed
** in the periodic list
** bits 4-3: reserved
** (2..1) type of the item
** T (bit 0) indicating pointer
** validity
*/
uint_32 BACK_PATH_LINK_PTR; /* bits 31-5: Memory address of
** the queue head,
** bit 4-3: reserved
** (2..1) type of the item
** T (bit 0) indicating pointer
** validity
*/
SCRATCH_STRUCT_PTR SCRATCH_PTR;
/* 32-bytes aligned */
uint_32 RESERVED[6];
} EHCI_FSTN_STRUCT, _PTR_ EHCI_FSTN_STRUCT_PTR;
typedef uint_32 EHCI_FRAME_LIST_ELEMENT_POINTER;
#endif /* __mvUsbCore_h__ */
/* EOF */