From bf4d2fef4aa9114884e98afc6a17974c903acbe9 Mon Sep 17 00:00:00 2001 From: Dima Jolkin Date: Tue, 17 Feb 2026 10:44:37 +0200 Subject: [PATCH] esp32s3-usbserial: common usbserial for both esp32c3 & esp32s3 --- src/machine/machine_esp32_usb.go | 45 ---------------- src/machine/machine_esp32s3_usb.go | 41 -------------- ..._esp32c3_usb.go => machine_esp32xx_usb.go} | 54 ++++++++++++++++++- 3 files changed, 52 insertions(+), 88 deletions(-) delete mode 100644 src/machine/machine_esp32_usb.go delete mode 100644 src/machine/machine_esp32s3_usb.go rename src/machine/{machine_esp32c3_usb.go => machine_esp32xx_usb.go} (59%) diff --git a/src/machine/machine_esp32_usb.go b/src/machine/machine_esp32_usb.go deleted file mode 100644 index 6f40a48fc..000000000 --- a/src/machine/machine_esp32_usb.go +++ /dev/null @@ -1,45 +0,0 @@ -//go:build esp32s3 || esp32c3 - -package machine - -import ( - "device/esp" -) - -type USB_DEVICE struct { - Bus *esp.USB_DEVICE_Type -} - -var ( - _USBCDC = &USB_DEVICE{ - Bus: esp.USB_DEVICE, - } - - USBCDC Serialer = _USBCDC -) - -type Serialer interface { - WriteByte(c byte) error - Write(data []byte) (n int, err error) - Configure(config UARTConfig) error - Buffered() int - ReadByte() (byte, error) - DTR() bool - RTS() bool -} - -func (usbdev *USB_DEVICE) Configure(config UARTConfig) error { - return nil -} - -func (usbdev *USB_DEVICE) Buffered() int { - return int(usbdev.Bus.GetEP1_CONF_SERIAL_OUT_EP_DATA_AVAIL()) -} - -func (usbdev *USB_DEVICE) DTR() bool { - return false -} - -func (usbdev *USB_DEVICE) RTS() bool { - return false -} diff --git a/src/machine/machine_esp32s3_usb.go b/src/machine/machine_esp32s3_usb.go deleted file mode 100644 index c9bfbe7ed..000000000 --- a/src/machine/machine_esp32s3_usb.go +++ /dev/null @@ -1,41 +0,0 @@ -//go:build esp32s3 - -package machine - -import "errors" - -func initUSB() { - USBCDC.Configure(UARTConfig{BaudRate: 115200}) -} - -func (usbdev *USB_DEVICE) WriteByte(c byte) error { - timeout := 10000 - for usbdev.Bus.GetEP1_CONF_SERIAL_IN_EP_DATA_FREE() == 0 && timeout > 0 { - timeout-- - } - if timeout == 0 { - return nil - } - usbdev.Bus.SetEP1_RDWR_BYTE(uint32(c)) - usbdev.Bus.SetEP1_CONF_WR_DONE(1) - return nil -} - -func (usbdev *USB_DEVICE) Write(data []byte) (n int, err error) { - for _, c := range data { - err = usbdev.WriteByte(c) - if err != nil { - return n, err - } - n++ - } - return n, nil -} - -func (usbdev *USB_DEVICE) ReadByte() (byte, error) { - return 0, errors.New("ReadByte not implemented") -} - -func (usbdev *USB_DEVICE) flush() { - usbdev.Bus.SetEP1_CONF_WR_DONE(1) -} diff --git a/src/machine/machine_esp32c3_usb.go b/src/machine/machine_esp32xx_usb.go similarity index 59% rename from src/machine/machine_esp32c3_usb.go rename to src/machine/machine_esp32xx_usb.go index 730967312..bdd1281a8 100644 --- a/src/machine/machine_esp32c3_usb.go +++ b/src/machine/machine_esp32xx_usb.go @@ -1,8 +1,26 @@ -//go:build esp32c3 +//go:build esp32s3 || esp32c3 package machine -import "errors" +import ( + "device/esp" + "errors" +) + +// USB Serial/JTAG Controller +// See esp32-c3_technical_reference_manual_en.pdf +// pg. 736 +type USB_DEVICE struct { + Bus *esp.USB_DEVICE_Type +} + +var ( + _USBCDC = &USB_DEVICE{ + Bus: esp.USB_DEVICE, + } + + USBCDC Serialer = _USBCDC +) var ( errUSBWrongSize = errors.New("USB: invalid write size") @@ -10,14 +28,30 @@ var ( errUSBBufferEmpty = errors.New("USB: read buffer empty") ) +type Serialer interface { + WriteByte(c byte) error + Write(data []byte) (n int, err error) + Configure(config UARTConfig) error + Buffered() int + ReadByte() (byte, error) + DTR() bool + RTS() bool +} + func initUSB() {} +func (usbdev *USB_DEVICE) Configure(config UARTConfig) error { + return nil +} + func (usbdev *USB_DEVICE) WriteByte(c byte) error { if usbdev.Bus.GetEP1_CONF_SERIAL_IN_EP_DATA_FREE() == 0 { return errUSBCouldNotWriteAllData } + usbdev.Bus.SetEP1_RDWR_BYTE(uint32(c)) usbdev.flush() + return nil } @@ -25,26 +59,42 @@ func (usbdev *USB_DEVICE) Write(data []byte) (n int, err error) { if len(data) == 0 || len(data) > 64 { return 0, errUSBWrongSize } + for i, c := range data { if usbdev.Bus.GetEP1_CONF_SERIAL_IN_EP_DATA_FREE() == 0 { if i > 0 { usbdev.flush() } + return i, errUSBCouldNotWriteAllData } usbdev.Bus.SetEP1_RDWR_BYTE(uint32(c)) } + usbdev.flush() return len(data), nil } +func (usbdev *USB_DEVICE) Buffered() int { + return int(usbdev.Bus.GetEP1_CONF_SERIAL_OUT_EP_DATA_AVAIL()) +} + func (usbdev *USB_DEVICE) ReadByte() (byte, error) { if usbdev.Bus.GetEP1_CONF_SERIAL_OUT_EP_DATA_AVAIL() != 0 { return byte(usbdev.Bus.GetEP1_RDWR_BYTE()), nil } + return 0, nil } +func (usbdev *USB_DEVICE) DTR() bool { + return false +} + +func (usbdev *USB_DEVICE) RTS() bool { + return false +} + func (usbdev *USB_DEVICE) flush() { usbdev.Bus.SetEP1_CONF_WR_DONE(1) for usbdev.Bus.GetEP1_CONF_SERIAL_IN_EP_DATA_FREE() == 0 {