esp32s3-usbserial: common usbserial for both esp32c3 & esp32s3

This commit is contained in:
Dima Jolkin
2026-02-17 10:44:37 +02:00
committed by Ron Evans
parent c1cddffbe9
commit 44ca224056
3 changed files with 52 additions and 88 deletions
-45
View File
@@ -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
}
-41
View File
@@ -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)
}
@@ -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 {