xtensa/esp32s3: Fix USB pull-up and pull-down issue

ESP32-S3 USB OTG device can't call function esp32s3_pullup to notify USB host that it connects or disconnects.
This commit is contained in:
Dong Heng 2024-01-12 15:01:23 +08:00 committed by Xiang Xiao
parent e966fff597
commit 85238fa4de
1 changed files with 23 additions and 6 deletions

View File

@ -5063,14 +5063,22 @@ static int esp32s3_pullup(struct usbdev_s *dev, bool enable)
usbtrace(TRACE_DEVPULLUP, (uint16_t)enable); usbtrace(TRACE_DEVPULLUP, (uint16_t)enable);
irqstate_t flags = enter_critical_section(); irqstate_t flags = enter_critical_section();
regval = esp32s3_getreg(ESP32S3_OTG_DCTL);
if (enable) if (enable)
{ {
/* Connect the device by clearing the soft disconnect bit in the DCTL /* Connect the device by clearing the soft disconnect bit in the DCTL
* register. * register.
*/ */
regval = esp32s3_getreg(ESP32S3_OTG_DCTL);
regval &= ~OTG_DCTL_SDIS; regval &= ~OTG_DCTL_SDIS;
esp32s3_putreg(regval, ESP32S3_OTG_DCTL);
/* Set DP pull-up */
regval = esp32s3_getreg(USB_WRAP_OTG_CONF_REG);
regval &= ~USB_WRAP_DP_PULLDOWN;
regval |= USB_WRAP_DP_PULLUP;
esp32s3_putreg(regval, USB_WRAP_OTG_CONF_REG);
} }
else else
{ {
@ -5078,10 +5086,18 @@ static int esp32s3_pullup(struct usbdev_s *dev, bool enable)
* register. * register.
*/ */
regval = esp32s3_getreg(ESP32S3_OTG_DCTL);
regval |= OTG_DCTL_SDIS; regval |= OTG_DCTL_SDIS;
esp32s3_putreg(regval, ESP32S3_OTG_DCTL);
/* Set DP pull-down */
regval = esp32s3_getreg(USB_WRAP_OTG_CONF_REG);
regval &= ~USB_WRAP_DP_PULLUP;
regval |= USB_WRAP_DP_PULLDOWN;
esp32s3_putreg(regval, USB_WRAP_OTG_CONF_REG);
} }
esp32s3_putreg(regval, ESP32S3_OTG_DCTL);
leave_critical_section(flags); leave_critical_section(flags);
return OK; return OK;
} }
@ -5297,11 +5313,12 @@ static void esp32s3_hwinitialize(struct esp32s3_usbdev_s *priv)
regval |= RTC_CNTL_SW_HW_USB_PHY_SEL | RTC_CNTL_SW_USB_PHY_SEL; regval |= RTC_CNTL_SW_HW_USB_PHY_SEL | RTC_CNTL_SW_USB_PHY_SEL;
esp32s3_putreg(regval, RTC_CNTL_RTC_USB_CONF_REG); esp32s3_putreg(regval, RTC_CNTL_RTC_USB_CONF_REG);
/* Set USB DM and DP pin pull-down */
regval = esp32s3_getreg(USB_WRAP_OTG_CONF_REG); regval = esp32s3_getreg(USB_WRAP_OTG_CONF_REG);
regval &= ~(USB_WRAP_PHY_SEL | USB_WRAP_DM_PULLUP | regval &= ~(USB_WRAP_PHY_SEL | USB_WRAP_DP_PULLUP | USB_WRAP_DM_PULLUP);
USB_WRAP_DP_PULLDOWN | USB_WRAP_DM_PULLDOWN); regval |= USB_WRAP_PAD_PULL_OVERRIDE | USB_WRAP_DP_PULLDOWN |
regval |= USB_WRAP_PAD_PULL_OVERRIDE | USB_WRAP_DP_PULLUP | USB_WRAP_DM_PULLDOWN | USB_WRAP_USB_PAD_ENABLE;
USB_WRAP_USB_PAD_ENABLE;
esp32s3_putreg(regval, USB_WRAP_OTG_CONF_REG); esp32s3_putreg(regval, USB_WRAP_OTG_CONF_REG);
/* At start-up the core is in FS mode. */ /* At start-up the core is in FS mode. */