@@ -8,21 +8,21 @@ import (
8
8
)
9
9
10
10
// https://github.com/raspberrypi/pico-sdk/blob/master/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c
11
+ // According to errata RP2040-E5:
12
+ // "It is safe (and inexpensive) to enable the software workaround even when using versions of RP2040
13
+ // which include the fix in hardware."
14
+ // So let us always use the software fix.
11
15
func fixRP2040UsbDeviceEnumeration () {
12
-
13
- // Actually check for B0/B1 h/w
14
- if ChipVersion () == 1 {
15
- // After coming out of reset, the hardware expects 800us of LS_J (linestate J) time
16
- // before it will move to the connected state. However on a hub that broadcasts packets
17
- // for other devices this isn't the case. The plan here is to wait for the end of the bus
18
- // reset, force an LS_J for 1ms and then switch control back to the USB phy. Unfortunately
19
- // this requires us to use GPIO15 as there is no other way to force the input path.
20
- // We only need to force DP as DM can be left at zero. It will be gated off by GPIO
21
- // logic if it isn't func selected.
22
-
23
- // Wait SE0 phase will call force ls_j phase which will call finish phase
24
- hw_enumeration_fix_wait_se0 ()
25
- }
16
+ // After coming out of reset, the hardware expects 800us of LS_J (linestate J) time
17
+ // before it will move to the connected state. However on a hub that broadcasts packets
18
+ // for other devices this isn't the case. The plan here is to wait for the end of the bus
19
+ // reset, force an LS_J for 1ms and then switch control back to the USB phy. Unfortunately
20
+ // this requires us to use GPIO15 as there is no other way to force the input path.
21
+ // We only need to force DP as DM can be left at zero. It will be gated off by GPIO
22
+ // logic if it isn't func selected.
23
+
24
+ // Wait SE0 phase will call force ls_j phase which will call finish phase
25
+ hw_enumeration_fix_wait_se0 ()
26
26
}
27
27
28
28
func hw_enumeration_fix_wait_se0 () {
@@ -87,8 +87,8 @@ func hw_enumeration_fix_force_ls_j() {
87
87
// Switch to GPIO phy with LS_J forced
88
88
rp .USBCTRL_REGS .USB_MUXING .Set (rp .USBCTRL_REGS_USB_MUXING_TO_DIGITAL_PAD | rp .USBCTRL_REGS_USB_MUXING_SOFTCON )
89
89
90
- // LS_J is now forced but while loop here just to check
91
- waitCycles (125000 )
90
+ // LS_J is now forced but while loop to wait ~800us here just to check
91
+ waitCycles (25000 )
92
92
93
93
// if timer pool disabled, or no timer available, have to busy wait.
94
94
hw_enumeration_fix_finish ()
0 commit comments