|
10 | 10 | #include "usbd_if.h"
|
11 | 11 | #include "usbd_cdc_if.h"
|
12 | 12 |
|
| 13 | +#if defined(USB_DISC_PIN) |
| 14 | +// Compatibility with the old way to specify this |
| 15 | +#define USBD_ATTACH_PIN digitalPinToPinName(USB_DISC_PIN) |
| 16 | +#define USBD_ATTACH_LEVEL LOW |
| 17 | +#warning "USB_DISC_PIN is deprecated, use USBD_ATTACH_PINNAME instead" |
| 18 | +#endif /* USB_DISC_PIN */ |
| 19 | + |
| 20 | +// When no USB attach and detach pins were defined, and the USB module |
| 21 | +// also does not have any builtin autocontrolled pullups (indicated by |
| 22 | +// the SDIS bit), assume there are fixed external pullups. This uses a |
| 23 | +// bit of a hack by using the DP pin as a DETACH pin, so it will be |
| 24 | +// driven low very briefly, which looks like a missing pullup to the |
| 25 | +// host. Probably violates USB specs, but works properly in practice. |
| 26 | +#if !defined(USBD_ATTACH_PINNAME) && !defined(USBD_DETACH_PIN) && !defined(USB_OTG_DCTL_SDIS) |
| 27 | +#if defined(USE_USB_HS_IN_FS) |
| 28 | +#define USBD_DETACH_PINNAME USB_OTG_HS_DP |
| 29 | +#elif defined(USB_OTG_FS) |
| 30 | +#define USBD_DETACH_PINNAME USB_OTG_FS_DP |
| 31 | +#else /* USB */ |
| 32 | +#define USBD_DETACH_PINNAME USB_DP |
| 33 | +#endif |
| 34 | +#define USBD_DETACH_LEVEL LOW |
| 35 | +// Make sure to revert to INPUT (instead of OUTPUT HIGH) after the |
| 36 | +// detach "pulse" to restore normal operation. |
| 37 | +#define USBD_ATTACH_MODE INPUT |
| 38 | +#endif /* !defined(USBD_ATTACH_PINNAME) && !defined(USBD_DETACH_PIN) && !defined(USB_OTG_DCTL_SDIS) */ |
| 39 | + |
| 40 | +#if defined(USBD_ATTACH_PINNAME) && !defined(USBD_ATTACH_MODE) |
| 41 | +// Normally (e.g. when controlling a transistor), keep the pin in |
| 42 | +// OUTPUT mode after the detach "pulse" to actively drive the |
| 43 | +// transistor. |
| 44 | +#define USBD_ATTACH_MODE OUTPUT |
| 45 | +#endif /* defined(USBD_ATTACH_PINNAME) && !defined(USBD_ATTACH_MODE) */ |
| 46 | + |
| 47 | +// Some sanity checks |
| 48 | +#if defined(USBD_ATTACH_PINNAME) && defined(USBD_DETACH_PIN) |
| 49 | +#error "Cannot define both USBD_ATTACH_PINNAME and USBD_DETACH_PIN" |
| 50 | +#endif /* defined(USBD_ATTACH_PINNAME) && defined(USBD_DETACH_PIN) */ |
| 51 | +#if defined(USBD_ATTACH_PINNAME) && !defined(USBD_ATTACH_LEVEL) |
| 52 | +#error "USBD_ATTACH_PINNAME also needs USBD_ATTACH_LEVEL defined" |
| 53 | +#endif /* defined(USBD_ATTACH_PINNAME) && !defined(USBD_ATTACH_LEVEL) */ |
| 54 | +#if defined(USBD_DETACH_PINNAME) && !defined(USBD_DETACH_LEVEL) |
| 55 | +#error "USBD_DETACH_PINNAME also needs USBD_DETACH_LEVEL defined" |
| 56 | +#endif /* defined(USBD_DETACH_PINNAME) && !defined(USBD_DETACH_LEVEL) */ |
| 57 | + |
13 | 58 | /**
|
14 | 59 | * @brief Force to re-enumerate USB
|
15 | 60 | * @param None
|
16 | 61 | * @retval None
|
17 | 62 | */
|
18 |
| - |
19 | 63 | WEAK void USBD_reenumerate(void)
|
20 | 64 | {
|
21 | 65 | #ifndef USBD_REENUM_DISABLED
|
22 | 66 | /* Re-enumerate the USB */
|
23 |
| -#ifdef USB_DISC_PIN |
24 |
| - pinMode(USB_DISC_PIN, OUTPUT); |
25 |
| - digitalWrite(USB_DISC_PIN, LOW); |
26 |
| -#else |
27 |
| -#ifdef USE_USB_HS_IN_FS |
28 |
| - PinName pinDP = USB_OTG_HS_DP; |
29 |
| -#elif defined(USB_OTG_FS) |
30 |
| - PinName pinDP = USB_OTG_FS_DP; |
31 |
| -#else /* USB */ |
32 |
| - PinName pinDP = USB_DP; |
33 |
| -#endif |
34 |
| - pin_function(pinDP, STM_PIN_DATA(STM_MODE_OUTPUT_PP, GPIO_NOPULL, 0)); |
35 |
| - digitalWriteFast(pinDP, LOW); |
| 67 | +#ifdef USBD_DETACH_PINNAME |
| 68 | + // Default is attached, so detach, wait, and reattach. |
| 69 | + pin_function(USBD_DETACH_PINNAME, STM_PIN_DATA(STM_MODE_OUTPUT_PP, GPIO_NOPULL, 0)); |
| 70 | + digitalWriteFast(USBD_DETACH_PINNAME, USBD_DETACH_LEVEL); |
36 | 71 | delay(USBD_ENUM_DELAY);
|
37 |
| - pin_function(pinDP, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)); |
38 |
| - /*delay(USBD_ENUM_DELAY);*/ |
39 |
| -#endif /* USB_DISC_PIN */ |
| 72 | + if (USBD_ATTACH_MODE_INPUT == OUTPUT) |
| 73 | + digitalWriteFast(USBD_DETACH_PINNAME, !USBD_DETACH_LEVEL); |
| 74 | + else |
| 75 | + pin_function(USBD_DETACH_PINNAME, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)); |
| 76 | +#elif USBD_ATTACH_PINNAME |
| 77 | + // Default is detached, so just attach |
| 78 | + pin_function(USBD_ATTACH_PINNAME, STM_PIN_DATA(STM_MODE_OUTPUT_PP, GPIO_NOPULL, 0)); |
| 79 | + digitalWriteFast(USBD_ATTACH_PINNAME, USBD_ATTACH_LEVEL); |
| 80 | +#elif !defined(USB_OTG_DCTL_SDIS) |
| 81 | +#warning "No USB attac/detach method, USB might not be reliable through system resets" |
| 82 | +#endif |
40 | 83 | #endif /* USBD_REENUM_DISABLED */
|
41 | 84 | }
|
42 | 85 |
|
|
0 commit comments