summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2020-07-01 13:09:07 +0700
committerGitHub <[email protected]>2020-07-01 13:09:07 +0700
commit530b0099a55492bb1bc2f5cda3530569d221e8d4 (patch)
treebc1047729ab0c29902ef924dfffe3b684e00dfae /src
parent0477446224c1c193f5ae8a0cbed7c33e13e7ce6c (diff)
parent30a18e260562194b0541584600a0cfc88b1ef178 (diff)
Merge pull request #439 from UweBonnes/add-stm-hs
Add stm hs
Diffstat (limited to 'src')
-rw-r--r--src/portable/st/synopsys/dcd_synopsys.c117
1 files changed, 102 insertions, 15 deletions
diff --git a/src/portable/st/synopsys/dcd_synopsys.c b/src/portable/st/synopsys/dcd_synopsys.c
index 845aecf1e..ba3cc3460 100644
--- a/src/portable/st/synopsys/dcd_synopsys.c
+++ b/src/portable/st/synopsys/dcd_synopsys.c
@@ -27,6 +27,7 @@
*/
#include "tusb_option.h"
+#include "../../../../hw/bsp//board.h"
#if defined (STM32F105x8) || defined (STM32F105xB) || defined (STM32F105xC) || \
defined (STM32F107xB) || defined (STM32F107xC)
@@ -53,33 +54,39 @@
// EP_FIFO_SIZE : Size of dedicated USB SRAM
#if CFG_TUSB_MCU == OPT_MCU_STM32F1
#include "stm32f1xx.h"
- #define EP_MAX 4
- #define EP_FIFO_SIZE 1280
+ #define EP_MAX_FS 4
+ #define EP_FIFO_SIZE_FS 1280
#elif CFG_TUSB_MCU == OPT_MCU_STM32F2
#include "stm32f2xx.h"
- #define EP_MAX USB_OTG_FS_MAX_IN_ENDPOINTS
- #define EP_FIFO_SIZE USB_OTG_FS_TOTAL_FIFO_SIZE
+ #define EP_MAX_FS USB_OTG_FS_MAX_IN_ENDPOINTS
+ #define EP_FIFO_SIZE_FS USB_OTG_FS_TOTAL_FIFO_SIZE
#elif CFG_TUSB_MCU == OPT_MCU_STM32F4
#include "stm32f4xx.h"
- #define EP_MAX USB_OTG_FS_MAX_IN_ENDPOINTS
- #define EP_FIFO_SIZE USB_OTG_FS_TOTAL_FIFO_SIZE
+ #define EP_MAX_FS USB_OTG_FS_MAX_IN_ENDPOINTS
+ #define EP_FIFO_SIZE_FS USB_OTG_FS_TOTAL_FIFO_SIZE
+ #define EP_MAX_HS USB_OTG_HS_MAX_IN_ENDPOINTS
+ #define EP_FIFO_SIZE_HS USB_OTG_HS_TOTAL_FIFO_SIZE
#elif CFG_TUSB_MCU == OPT_MCU_STM32H7
#include "stm32h7xx.h"
- #define EP_MAX 9
- #define EP_FIFO_SIZE 4096
+ #define EP_MAX_FS 9
+ #define EP_FIFO_SIZE_FS 4096
+ #define EP_MAX_HS 9
+ #define EP_FIFO_SIZE_HS 4096
#elif CFG_TUSB_MCU == OPT_MCU_STM32F7
#include "stm32f7xx.h"
- #define EP_MAX 6
- #define EP_FIFO_SIZE 1280
+ #define EP_MAX_FS 6
+ #define EP_FIFO_SIZE_FS 1280
+ #define EP_MAX_HS 9
+ #define EP_FIFO_SIZE_HS 4096
#elif CFG_TUSB_MCU == OPT_MCU_STM32L4
#include "stm32l4xx.h"
- #define EP_MAX 6
- #define EP_FIFO_SIZE 1280
+ #define EP_MAX_FS 6
+ #define EP_FIFO_SIZE_FS 1280
#else
#error "Unsupported MCUs"
@@ -140,6 +147,13 @@ typedef struct {
typedef volatile uint32_t * usb_fifo_t;
+#if TUD_OPT_RHPORT == 1
+# define EP_MAX EP_MAX_HS
+# define EP_FIFO_SIZE EP_FIFO_SIZE_HS
+#else
+# define EP_MAX EP_MAX_FS
+# define EP_FIFO_SIZE EP_FIFO_SIZE_FS
+#endif
xfer_ctl_t xfer_status[EP_MAX][2];
#define XFER_CTL_BASE(_ep, _dir) &xfer_status[_ep][_dir]
@@ -287,6 +301,59 @@ static void edpt_schedule_packets(uint8_t rhport, uint8_t const epnum, uint8_t c
}
+# if defined(USB_HS_PHYC) && TUD_OPT_HIGH_SPEED
+static bool USB_HS_PHYCInit(void)
+{
+ USB_HS_PHYC_GlobalTypeDef *usb_hs_phyc = (USB_HS_PHYC_GlobalTypeDef *)USB_HS_PHYC_CONTROLLER_BASE;
+ // Enable LDO
+ usb_hs_phyc->USB_HS_PHYC_LDO |= USB_HS_PHYC_LDO_ENABLE;
+ int32_t count = 2000000;
+ while(1) {
+ if (usb_hs_phyc->USB_HS_PHYC_LDO & USB_HS_PHYC_LDO_STATUS)
+ break;
+ TU_ASSERT(count > 0);
+ }
+ uint32_t phyc_pll = 0;
+ switch (HSE_VALUE) {
+ case 12000000:
+ phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_12MHZ;
+ break;
+ case 12500000:
+ phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_12_5MHZ;
+ break;
+ case 16000000:
+ phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_16MHZ;
+ break;
+ case 24000000:
+ phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_24MHZ;
+ break;
+ case 25000000:
+ phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_25MHZ;
+ break;
+ case 32000000:
+ // Value not defined in header
+ phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_Msk;
+ break;
+ default:
+ TU_ASSERT(0);
+ }
+ usb_hs_phyc->USB_HS_PHYC_PLL = phyc_pll;
+
+ // Use magic value as in stm32f7xx_ll_usb.
+# if !defined (USB_HS_PHYC_TUNE_VALUE)
+# define USB_HS_PHYC_TUNE_VALUE 0x00000F13U /*!< Value of USB HS PHY Tune */
+# endif /* USB_HS_PHYC_TUNE_VALUE */
+ // Control the tuning interface of the High Speed PHY */
+ usb_hs_phyc->USB_HS_PHYC_TUNE |= USB_HS_PHYC_TUNE_VALUE;
+
+ // Enable PLL internal PHY
+ usb_hs_phyc->USB_HS_PHYC_PLL = phyc_pll | USB_HS_PHYC_PLL_PLLEN;
+
+ board_delay(2);
+ return true;
+}
+# endif
+
/*------------------------------------------------------------------*/
/* Controller API
*------------------------------------------------------------------*/
@@ -301,12 +368,31 @@ void dcd_init (uint8_t rhport)
#if TUD_OPT_HIGH_SPEED // TODO may pass parameter instead of using macro for HighSpeed
if ( rhport == 1 )
{
- // Highspeed with external ULPI PHY
-
// deactivate internal PHY
usb_otg->GCCFG &= ~USB_OTG_GCCFG_PWRDWN;
- // On selected MCUs HS port1 can be used with external PHY via ULPI interface
+ // TODO may pass parameter instead of using macro for HighSpeed
+#if defined(USB_HS_PHYC)
+ // Highspeed with embedded UTMI PHYC
+ // Init The UTMI Interface
+ usb_otg->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL);
+
+ // Select vbus source
+ usb_otg->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI);
+
+ // Select UTMI Interace
+ usb_otg->GUSBCFG &= ~USB_OTG_GUSBCFG_ULPI_UTMI_SEL;
+ usb_otg->GCCFG |= USB_OTG_GCCFG_PHYHSEN;
+
+ //Enables control of a High Speed USB PHY
+ USB_HS_PHYCInit();
+
+ // Disable external VBUS detection
+ usb_otg->GUSBCFG &= ~USB_OTG_GUSBCFG_ULPIEVBUSD;
+
+# else// On selected MCUs HS port1 can be used with external PHY via ULPI interface
+ // Highspeed with external ULPI PHY
+
// Init ULPI Interface
usb_otg->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL);
@@ -314,6 +400,7 @@ void dcd_init (uint8_t rhport)
usb_otg->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI);
set_turnaround(usb_otg, TUSB_SPEED_HIGH);
+# endif
}
else
#endif