diff options
| author | Ha Thach <[email protected]> | 2021-03-04 21:01:39 +0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-03-04 21:01:39 +0700 |
| commit | 5285548c7543354ac8e13da37499019e204b1c49 (patch) | |
| tree | a41e810f5871b8aac960d9b864c455b98d7c0535 /src | |
| parent | 33a29c9e4ca9aebb3469c8f8114365acc3614321 (diff) | |
| parent | 8cabbb28df17bfcb7c549a98aec4eef4e70bba12 (diff) | |
Merge pull request #700 from hathach/fix-rp2040-bus-reset
fix enum walkaround forever check for SE0 when pull up is disabled
Diffstat (limited to 'src')
| -rw-r--r-- | src/portable/raspberrypi/rp2040/dcd_rp2040.c | 43 | ||||
| -rw-r--r-- | src/portable/raspberrypi/rp2040/rp2040_usb.c | 5 |
2 files changed, 34 insertions, 14 deletions
diff --git a/src/portable/raspberrypi/rp2040/dcd_rp2040.c b/src/portable/raspberrypi/rp2040/dcd_rp2040.c index ba708081c..f844a0c65 100644 --- a/src/portable/raspberrypi/rp2040/dcd_rp2040.c +++ b/src/portable/raspberrypi/rp2040/dcd_rp2040.c @@ -312,18 +312,7 @@ static void dcd_rp2040_irq(void) hw_handle_buff_status(); } - if (status & USB_INTS_BUS_RESET_BITS) - { - pico_trace("BUS RESET (addr %d -> %d)\n", assigned_address, 0); - usb_hw->dev_addr_ctrl = 0; - handled |= USB_INTS_BUS_RESET_BITS; - dcd_event_bus_reset(0, TUSB_SPEED_FULL, true); - usb_hw_clear->sie_status = USB_SIE_STATUS_BUS_RESET_BITS; -#if TUD_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX - rp2040_usb_device_enumeration_fix(); -#endif - } - + // SE0 for 2 us or more, usually together with Bus Reset if (status & USB_INTS_DEV_CONN_DIS_BITS) { handled |= USB_INTS_DEV_CONN_DIS_BITS; @@ -340,7 +329,35 @@ static void dcd_rp2040_irq(void) usb_hw_clear->sie_status = USB_SIE_STATUS_CONNECTED_BITS; } -#if 0 // TODO Enable SUSPEND & RESUME interrupt and test later on with/without VBUS detection + // SE0 for 2.5 us or more + if (status & USB_INTS_BUS_RESET_BITS) + { + pico_trace("BUS RESET\n"); + usb_hw->dev_addr_ctrl = 0; + handled |= USB_INTS_BUS_RESET_BITS; + dcd_event_bus_reset(0, TUSB_SPEED_FULL, true); + usb_hw_clear->sie_status = USB_SIE_STATUS_BUS_RESET_BITS; + +#if TUD_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX + // Only run enumeration walk-around if pull up is enabled + if ( usb_hw->sie_ctrl & USB_SIE_CTRL_PULLUP_EN_BITS ) + { + rp2040_usb_device_enumeration_fix(); + } +#endif + } + +#if 0 + // TODO Enable SUSPEND & RESUME interrupt and test later on with/without VBUS detection + + /* Note from pico datasheet 4.1.2.6.4 (v1.2) + * If you enable the suspend interrupt, it is likely you will see a suspend interrupt when + * the device is first connected but the bus is idle. The bus can be idle for a few ms before + * the host begins sending start of frame packets. You will also see a suspend interrupt + * when the device is disconnected if you do not have a VBUS detect circuit connected. This is + * because without VBUS detection, it is impossible to tell the difference between + * being disconnected and suspended. + */ if (status & USB_INTS_DEV_SUSPEND_BITS) { handled |= USB_INTS_DEV_SUSPEND_BITS; diff --git a/src/portable/raspberrypi/rp2040/rp2040_usb.c b/src/portable/raspberrypi/rp2040/rp2040_usb.c index c6f6d7231..98ffea9a3 100644 --- a/src/portable/raspberrypi/rp2040/rp2040_usb.c +++ b/src/portable/raspberrypi/rp2040/rp2040_usb.c @@ -60,8 +60,11 @@ void rp2040_usb_init(void) memset(usb_hw, 0, sizeof(*usb_hw)); memset(usb_dpram, 0, sizeof(*usb_dpram)); - // Mux to phy + // Mux the controller to the onboard usb phy usb_hw->muxing = USB_USB_MUXING_TO_PHY_BITS | USB_USB_MUXING_SOFTCON_BITS; + + // Force VBUS detect so the device thinks it is plugged into a host + // TODO support VBUs detect usb_hw->pwr = USB_USB_PWR_VBUS_DETECT_BITS | USB_USB_PWR_VBUS_DETECT_OVERRIDE_EN_BITS; } |
