From 7538c551ff5c99c2e71b9e1d719ce6be5961dddc Mon Sep 17 00:00:00 2001 From: Johann Fischer Date: Fri, 10 Feb 2023 23:38:10 +0100 Subject: [PATCH] drivers: usb_dc_dw: add definition for GHWCFG1..4 registers Add definition for GHWCFG1..4 registers to be able to obtain basic information about PHY, endpoints, and Data FIFO. Add GGPIO defines for STM32F4 SoC family USB controllers. This implementation uses GGPIO to enable transceiver, VBUS detection, and a few other functions. Signed-off-by: Johann Fischer --- drivers/usb/device/usb_dc_dw.c | 2 +- drivers/usb/device/usb_dw_registers.h | 43 +++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/drivers/usb/device/usb_dc_dw.c b/drivers/usb/device/usb_dc_dw.c index ebde434fe93..8d1735aba00 100644 --- a/drivers/usb/device/usb_dc_dw.c +++ b/drivers/usb/device/usb_dc_dw.c @@ -236,7 +236,7 @@ static int usb_dw_set_fifo(uint8_t ep) volatile uint32_t *reg = &base->in_ep_reg[ep_idx].diepctl; uint32_t val; int fifo = 0; - int ded_fifo = !!(base->ghwcfg4 & USB_DW_HWCFG4_DEDFIFOMODE); + int ded_fifo = !!(base->ghwcfg4 & USB_DW_GHWCFG4_DEDFIFOMODE); if (!ded_fifo) { /* No support for shared-FIFO mode yet, existing diff --git a/drivers/usb/device/usb_dw_registers.h b/drivers/usb/device/usb_dw_registers.h index 1c739ccf335..44676232f37 100644 --- a/drivers/usb/device/usb_dw_registers.h +++ b/drivers/usb/device/usb_dw_registers.h @@ -56,7 +56,9 @@ struct usb_dw_reg { volatile uint32_t grxstsp; volatile uint32_t grxfsiz; volatile uint32_t gnptxfsiz; - uint32_t reserved[5]; + uint32_t reserved[3]; + volatile uint32_t ggpio; + volatile uint32_t guid; volatile uint32_t gsnpsid; volatile uint32_t ghwcfg1; volatile uint32_t ghwcfg2; @@ -101,6 +103,8 @@ BUILD_ASSERT(sizeof(struct usb_dw_reg) <= 0x0D00); #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) @@ -132,8 +136,41 @@ BUILD_ASSERT(sizeof(struct usb_dw_reg) <= 0x0D00); #define USB_DW_GRXSTSR_PKT_CNT_OFFSET 4 #define USB_DW_GRXSTSR_EP_NUM_MASK (0xF << 0) -/* ? register, offset: 0x0050 */ -#define USB_DW_HWCFG4_DEDFIFOMODE BIT(25) +/* 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)