Skip to content

Conversation

matthijskooijman
Copy link

This PR adds support for boards:

  1. That do not have a VBUS pin. For these boards, VBUS is always assumed to be present. This restores the behavior that was removed in bdd33df. Note that not having a VBUS pin is not recommended, since it technically violates the USB spec and might preclude some USB features, but with this changes such boards can at least work.
  2. That have a resistor divider on their VBUS pin (e.g. for measuring VBUS voltage). For these boards, no pulldown is enabled on the pin, to prevent unbalancing the divider.

Note that this just changes the code, it does not include the resulting changes to the precompiled binaries.

Since commit bdd33df (Refresh USB logic; callback for events; hotplug in
STOP mode; STOP mode in USB SUSPEND; bunch of race conditions in the
USB/CDC code; avoid SOF interrupt; 500mA max power in descriptiors),
the USBD code would assume a VBUS pin is available and only initialize
the USB stack when a VBUS voltage is present.

This commit restores the older behavior of, when
`STM32L0_CONFIG_PIN_VBUS` (so indirectly also `usbd_pin_vbus`) is
`STM32L0_GPIO_PIN_NONE`, assuming VBUS is always present. USB
initialization can still be controlled using `USBDevice.attach()`.
This is already done by usbd_conf.c which is also the place where it is
read, so no need to do it again here.
This can be useful to allow measuring the actual USB voltage, rather
than just detect presence.

Previously the USB code would always enable an internal pulldown on the
VBUS, which would skew the reading (and, if the divider is fairly high
impedance, can even prevent detecting VBUS presence using a digital
read).

With this commit, boards can indicate they use an external divider using
the STM32L0_CONFIG_PIN_VBUS_HAS_DIVIDER macro in their variant.h. When
this is defined, the internal pullup is not enabled to prevent it from
causing issues and because it is no longer needed (the external divider
functions as a pulldown).
@matthijskooijman
Copy link
Author

Note that some previous discussion starting at #125 (comment) indicates that removing support for boards without a VBUS pin was intentional, apparently because it prevents using a feature called "BCD" (which I'm still not quite sure what that is).

Since I needed this support for a few boards I made and thus created the commits already, I figured I'd submit them here just in case this point could be revisited, or in case it is useful for someone else maybe.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant