machine: only enable USB-CDC when needed

Enabling USB consumes a lot of power. So it's better to keep it disabled
by default when the serial port is set to something other than "usb"
(USB-CDC).

On my nice!nano clone, it reduces current consumption from 1mA to
0.13mA (and most of the rest is probably consumed by a connected SCD41
sensor).

This change might break some expectations, when a board uses USB but not
USB-CDC (I think this is rare, but I didn't check specifically).
This commit is contained in:
Ayke van Laethem
2025-11-28 09:36:36 +01:00
committed by Ron Evans
parent 01723025d7
commit 571f34e0e6
7 changed files with 20 additions and 12 deletions
+4
View File
@@ -519,6 +519,10 @@ type Serialer interface {
RTS() bool
}
func initUSB() {
// nothing to do here
}
// USB Serial/JTAG Controller
// See esp32-c3_technical_reference_manual_en.pdf
// pg. 736
+1
View File
@@ -6,5 +6,6 @@ package machine
var Serial Serialer
func InitSerial() {
initUSB()
Serial = USBCDC
}
+11
View File
@@ -19,6 +19,17 @@ var (
USBCDC Serialer
)
func initUSB() {
enableUSBCDC()
USBDev.Configure(UARTConfig{})
}
// Using go:linkname here because there's a circular dependency between the
// machine package and the machine/usb/cdc package.
//
//go:linkname enableUSBCDC machine/usb/cdc.EnableUSBCDC
func enableUSBCDC()
type Serialer interface {
WriteByte(c byte) error
Write(data []byte) (n int, err error)