mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-09-07 21:29:05 +00:00
machine: add USBDevice.Attach and USBDevice.Detach (#5563)
* machine: add USBDevice.Attach and USBDevice.Detach The USB device is attached to the bus automatically during startup, before user code has a chance to finish its USB configuration (device identifiers, extra HID interfaces, ...). Composite devices such as keyboards may therefore be enumerated by the host with an incomplete configuration. Attach and Detach expose the soft-connect control (DP pull-up) so that an application or library can detach in an init function, complete its configuration, and attach again to let the host enumerate the finished device. They can also be used to force re-enumeration without replugging the cable. Implemented for atsamd21, atsamd51, nrf52840, rp2040 and rp2350. * machine: make USB Detach sticky on nrf52840 The USB IRQ handler re-enables the DP pull-up on every power-ready event, silently undoing an earlier Detach. Guard the pull-up write with a detached flag so the device stays off the bus until Attach is called. * machine: add USB Attach and Detach to stm32 and esp32 targets - stm32f4, stm32f7, stm32h7: implement Attach and Detach using the DCTL soft-disconnect bit that Configure already toggles. - esp32c3, esp32c6, esp32s3: add no-op stubs to keep user code portable; the fixed-function USB Serial/JTAG controller has no software-controlled soft-connect. * machine: use Attach and Detach in USB Configure Replace the direct soft-connect register writes in Configure with the equivalent Attach and Detach calls on atsamd21, atsamd51, rp2040, rp2350, stm32f4, stm32f7 and stm32h7.
This commit is contained in:
@@ -51,7 +51,7 @@ func (dev *USBDevice) Configure(config UARTConfig) {
|
||||
sam.USB_DEVICE.CTRLB.SetBits(sam.USB_DEVICE_CTRLB_SPDCONF_FS << sam.USB_DEVICE_CTRLB_SPDCONF_Pos)
|
||||
|
||||
// attach
|
||||
sam.USB_DEVICE.CTRLB.ClearBits(sam.USB_DEVICE_CTRLB_DETACH)
|
||||
dev.Attach()
|
||||
|
||||
// enable interrupt for end of reset
|
||||
sam.USB_DEVICE.INTENSET.SetBits(sam.USB_DEVICE_INTENSET_EORST)
|
||||
@@ -71,6 +71,20 @@ func (dev *USBDevice) Configure(config UARTConfig) {
|
||||
dev.initcomplete = true
|
||||
}
|
||||
|
||||
// Attach connects the device to the USB bus, allowing the host to detect and
|
||||
// enumerate it. It can be used together with Detach to delay enumeration
|
||||
// until the USB configuration (device identifiers, classes, ...) is complete.
|
||||
func (dev *USBDevice) Attach() {
|
||||
sam.USB_DEVICE.CTRLB.ClearBits(sam.USB_DEVICE_CTRLB_DETACH)
|
||||
}
|
||||
|
||||
// Detach disconnects the device from the USB bus. To the host this appears
|
||||
// as if the device was unplugged. A subsequent Attach makes the host
|
||||
// enumerate the device again.
|
||||
func (dev *USBDevice) Detach() {
|
||||
sam.USB_DEVICE.CTRLB.SetBits(sam.USB_DEVICE_CTRLB_DETACH)
|
||||
}
|
||||
|
||||
func handlePadCalibration() {
|
||||
// Load Pad Calibration data from non-volatile memory
|
||||
// This requires registers that are not included in the SVD file.
|
||||
|
||||
Reference in New Issue
Block a user