blob: 83e67c157ced9922923fbea782d08178d606f02f [file] [log] [blame]
/*
* Copyright (c) 2016 Intel Corporation
* Copyright (c) 2023 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_DRIVERS_USB_DEVICE_USB_DW_REGISTERS_H_
#define ZEPHYR_DRIVERS_USB_DEVICE_USB_DW_REGISTERS_H_
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* This file describes register set for the DesignWare USB 2.0 controller IP,
* other known names are OTG_FS, OTG_HS.
*/
/* USB IN EP Register block type */
struct usb_dw_in_ep_reg {
volatile uint32_t diepctl;
uint32_t reserved;
volatile uint32_t diepint;
uint32_t reserved1;
volatile uint32_t dieptsiz;
volatile uint32_t diepdma;
volatile uint32_t dtxfsts;
uint32_t reserved2;
};
/* USB OUT EP Register block type */
struct usb_dw_out_ep_reg {
volatile uint32_t doepctl;
uint32_t reserved;
volatile uint32_t doepint;
uint32_t reserved1;
volatile uint32_t doeptsiz;
volatile uint32_t doepdma;
uint32_t reserved2;
uint32_t reserved3;
};
/* USB Register block type */
struct usb_dw_reg {
volatile uint32_t gotgctl;
volatile uint32_t gotgint;
volatile uint32_t gahbcfg;
volatile uint32_t gusbcfg;
volatile uint32_t grstctl;
volatile uint32_t gintsts;
volatile uint32_t gintmsk;
volatile uint32_t grxstsr;
volatile uint32_t grxstsp;
volatile uint32_t grxfsiz;
volatile uint32_t gnptxfsiz;
uint32_t reserved[3];
volatile uint32_t ggpio;
volatile uint32_t guid;
volatile uint32_t gsnpsid;
volatile uint32_t ghwcfg1;
volatile uint32_t ghwcfg2;
volatile uint32_t ghwcfg3;
volatile uint32_t ghwcfg4;
volatile uint32_t gdfifocfg;
uint32_t reserved1[43];
volatile uint32_t dieptxf1;
volatile uint32_t dieptxf2;
volatile uint32_t dieptxf3;
volatile uint32_t dieptxf4;
volatile uint32_t dieptxf5;
/* Host mode register 0x0400 .. 0x0670 */
uint32_t reserved2[442];
/* Device mode register 0x0800 .. 0x0D00 */
volatile uint32_t dcfg;
volatile uint32_t dctl;
volatile uint32_t dsts;
uint32_t reserved3;
volatile uint32_t diepmsk;
volatile uint32_t doepmsk;
volatile uint32_t daint;
volatile uint32_t daintmsk;
uint32_t reserved4[2];
volatile uint32_t dvbusdis;
volatile uint32_t dvbuspulse;
volatile uint32_t dthrctl;
volatile uint32_t diepempmsk;
uint32_t reserved5[50];
struct usb_dw_in_ep_reg in_ep_reg[16];
struct usb_dw_out_ep_reg out_ep_reg[16];
};
/*
* With the maximum number of supported endpoints, register set
* of the controller can occupy the region up to 0x0D00.
*/
BUILD_ASSERT(sizeof(struct usb_dw_reg) <= 0x0D00);
/* AHB configuration register, offset: 0x0008 */
#define USB_DW_GAHBCFG_DMA_EN BIT(5)
#define USB_DW_GAHBCFG_GLB_INTR_MASK BIT(0)
/* USB configuration register, offset: 0x000C */
#define USB_DW_GUSBCFG_FORCEDEVMODE BIT(30)
#define USB_DW_GUSBCFG_FORCEHSTMODE BIT(29)
#define USB_DW_GUSBCFG_PHY_IF_MASK BIT(3)
#define USB_DW_GUSBCFG_PHY_IF_8_BIT 0
#define USB_DW_GUSBCFG_PHY_IF_16_BIT BIT(3)
/* Reset register, offset: 0x0010 */
#define USB_DW_GRSTCTL_AHB_IDLE BIT(31)
#define USB_DW_GRSTCTL_TX_FNUM_OFFSET 6
#define USB_DW_GRSTCTL_TX_FFLSH BIT(5)
#define USB_DW_GRSTCTL_C_SFT_RST BIT(0)
/* Core interrupt register, offset: 0x0014 */
#define USB_DW_GINTSTS_WK_UP_INT BIT(31)
#define USB_DW_GINTSTS_OEP_INT BIT(19)
#define USB_DW_GINTSTS_IEP_INT BIT(18)
#define USB_DW_GINTSTS_ENUM_DONE BIT(13)
#define USB_DW_GINTSTS_USB_RST BIT(12)
#define USB_DW_GINTSTS_USB_SUSP BIT(11)
#define USB_DW_GINTSTS_RX_FLVL BIT(4)
#define USB_DW_GINTSTS_OTG_INT BIT(2)
/* Status read and pop registers (device mode), offset: 0x001C 0x0020 */
#define USB_DW_GRXSTSR_PKT_STS_MASK (0xF << 17)
#define USB_DW_GRXSTSR_PKT_STS_OFFSET 17
#define USB_DW_GRXSTSR_PKT_STS_OUT_DATA 2
#define USB_DW_GRXSTSR_PKT_STS_OUT_DATA_DONE 3
#define USB_DW_GRXSTSR_PKT_STS_SETUP_DONE 4
#define USB_DW_GRXSTSR_PKT_STS_SETUP 6
#define USB_DW_GRXSTSR_PKT_CNT_MASK (0x7FF << 4)
#define USB_DW_GRXSTSR_PKT_CNT_OFFSET 4
#define USB_DW_GRXSTSR_EP_NUM_MASK (0xF << 0)
/* Application (vendor) general purpose registers, offset: 0x0038 */
#define USB_DW_GGPIO_STM32_VBDEN BIT(21)
#define USB_DW_GGPIO_STM32_PWRDWN BIT(16)
/* GHWCFG1 register, offset: 0x0044 */
#define USB_DW_GHWCFG1_EPDIR_MASK(i) (0x3 << (i * 2))
#define USB_DW_GHWCFG1_EPDIR_SHIFT(i) (i * 2)
#define USB_DW_GHWCFG1_OUTENDPT 2
#define USB_DW_GHWCFG1_INENDPT 1
#define USB_DW_GHWCFG1_BDIR 0
/* GHWCFG2 register, offset: 0x0048 */
#define USB_DW_GHWCFG2_NUMDEVEPS_MASK (0xF << 10)
#define USB_DW_GHWCFG2_NUMDEVEPS_SHIFT 10
#define USB_DW_GHWCFG2_FSPHYTYPE_MASK (0x3 << 8)
#define USB_DW_GHWCFG2_FSPHYTYPE_SHIFT 8
#define USB_DW_GHWCFG2_FSPHYTYPE_FSPLUSULPI 3
#define USB_DW_GHWCFG2_FSPHYTYPE_FSPLUSUTMI 2
#define USB_DW_GHWCFG2_FSPHYTYPE_FS 1
#define USB_DW_GHWCFG2_FSPHYTYPE_NO_FS 0
#define USB_DW_GHWCFG2_HSPHYTYPE_MASK (0x3 << 6)
#define USB_DW_GHWCFG2_HSPHYTYPE_SHIFT 6
#define USB_DW_GHWCFG2_HSPHYTYPE_UTMIPLUSULPI 3
#define USB_DW_GHWCFG2_HSPHYTYPE_ULPI 2
#define USB_DW_GHWCFG2_HSPHYTYPE_UTMIPLUS 1
#define USB_DW_GHWCFG2_HSPHYTYPE_NO_HS 0
/* GHWCFG3 register, offset: 0x004C */
#define USB_DW_GHWCFG3_DFIFODEPTH_MASK (0xFFFFU << 16)
#define USB_DW_GHWCFG3_DFIFODEPTH_SHIFT 16
/* GHWCFG4 register, offset: 0x0050 */
#define USB_DW_GHWCFG4_INEPS_MASK (0xF << 26)
#define USB_DW_GHWCFG4_INEPS_SHIFT 26
#define USB_DW_GHWCFG4_DEDFIFOMODE BIT(25)
/* Device configuration registers, offset: 0x0800 */
#define USB_DW_DCFG_DEV_ADDR_MASK (0x7F << 4)
#define USB_DW_DCFG_DEV_ADDR_OFFSET 4
#define USB_DW_DCFG_DEV_SPD_USB2_HS 0
#define USB_DW_DCFG_DEV_SPD_USB2_FS 1
#define USB_DW_DCFG_DEV_SPD_LS 2
#define USB_DW_DCFG_DEV_SPD_FS 3
/* Device control register, offset 0x0804 */
#define USB_DW_DCTL_SFT_DISCON BIT(1)
/* Device status register, offset 0x0808 */
#define USB_DW_DSTS_ENUM_SPD_MASK (0x3 << 1)
#define USB_DW_DSTS_ENUM_SPD_OFFSET 1
#define USB_DW_DSTS_ENUM_LS 2
#define USB_DW_DSTS_ENUM_FS 3
/* Device all endpoints interrupt register, offset 0x0818 */
#define USB_DW_DAINT_OUT_EP_INT(ep) (0x10000 << (ep))
#define USB_DW_DAINT_IN_EP_INT(ep) (1 << (ep))
/*
* Device IN/OUT endpoint control register
* IN endpoint offsets 0x0900 + (0x20 * n), n = 0 .. x,
* offset 0x0900 and 0x0B00 are hardcoded to control type.
*
* REVISE: Better own definitions for DIEPTCTL0, DOEPTCTL0...
*/
#define USB_DW_DEPCTL_EP_ENA BIT(31)
#define USB_DW_DEPCTL_EP_DIS BIT(30)
#define USB_DW_DEPCTL_SETDOPID BIT(28)
#define USB_DW_DEPCTL_SNAK BIT(27)
#define USB_DW_DEPCTL_CNAK BIT(26)
#define USB_DW_DEPCTL_STALL BIT(21)
#define USB_DW_DEPCTL_TXFNUM_OFFSET 22
#define USB_DW_DEPCTL_TXFNUM_MASK (0xF << 22)
#define USB_DW_DEPCTL_EP_TYPE_MASK (0x3 << 18)
#define USB_DW_DEPCTL_EP_TYPE_OFFSET 18
#define USB_DW_DEPCTL_EP_TYPE_INTERRUPT 3
#define USB_DW_DEPCTL_EP_TYPE_BULK 2
#define USB_DW_DEPCTL_EP_TYPE_ISO 1
#define USB_DW_DEPCTL_EP_TYPE_CONTROL 0
#define USB_DW_DEPCTL_USB_ACT_EP BIT(15)
#define USB_DW_DEPCTL0_MSP_MASK 0x3
#define USB_DW_DEPCTL0_MSP_8 3
#define USB_DW_DEPCTL0_MSP_16 2
#define USB_DW_DEPCTL0_MSP_32 1
#define USB_DW_DEPCTL0_MSP_64 0
#define USB_DW_DEPCTLn_MSP_MASK 0x3FF
#define USB_DW_DEPCTL_MSP_OFFSET 0
/*
* Device IN endpoint interrupt register
* offsets 0x0908 + (0x20 * n), n = 0 .. x
*/
#define USB_DW_DIEPINT_TX_FEMP BIT(7)
#define USB_DW_DIEPINT_XFER_COMPL BIT(0)
/*
* Device OUT endpoint interrupt register
* offsets 0x0B08 + (0x20 * n), n = 0 .. x
*/
#define USB_DW_DOEPINT_SET_UP BIT(3)
#define USB_DW_DOEPINT_XFER_COMPL BIT(0)
/*
* Device IN/OUT endpoint transfer size register
* IN at offsets 0x0910 + (0x20 * n), n = 0 .. x,
* OUT at offsets 0x0B10 + (0x20 * n), n = 0 .. x
*
* REVISE: Better own definitions for DIEPTSIZ0, DOEPTSIZ0...
*/
#define USB_DW_DEPTSIZ_PKT_CNT_OFFSET 19
#define USB_DW_DIEPTSIZ0_PKT_CNT_MASK (0x3 << 19)
#define USB_DW_DIEPTSIZn_PKT_CNT_MASK (0x3FF << 19)
#define USB_DW_DOEPTSIZn_PKT_CNT_MASK (0x3FF << 19)
#define USB_DW_DOEPTSIZ0_PKT_CNT_MASK (0x1 << 19)
#define USB_DW_DOEPTSIZ_SUP_CNT_OFFSET 29
#define USB_DW_DOEPTSIZ_SUP_CNT_MASK (0x3 << 29)
#define USB_DW_DEPTSIZ_XFER_SIZE_OFFSET 0
#define USB_DW_DEPTSIZ0_XFER_SIZE_MASK 0x7F
#define USB_DW_DEPTSIZn_XFER_SIZE_MASK 0x7FFFF
/*
* Device IN endpoint transmit FIFO status register,
* offsets 0x0918 + (0x20 * n), n = 0 .. x
*/
#define USB_DW_DTXFSTS_TXF_SPC_AVAIL_MASK 0xFFFF
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_DRIVERS_USB_DEVICE_USB_DW_REGISTERS_H_ */