Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support boards without VBUS pin and with divider on VBUS pin #175

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

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.

None yet

1 participant