mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-16 10:43:29 +00:00
esp32s3-usbserial: split usb
This commit is contained in:
@@ -0,0 +1,45 @@
|
|||||||
|
//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
|
||||||
|
}
|
||||||
@@ -509,102 +509,6 @@ func (uart *UART) writeByte(b byte) error {
|
|||||||
|
|
||||||
func (uart *UART) flush() {}
|
func (uart *UART) flush() {}
|
||||||
|
|
||||||
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() {
|
|
||||||
// nothing to do here
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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")
|
|
||||||
errUSBCouldNotWriteAllData = errors.New("USB: could not write all data")
|
|
||||||
errUSBBufferEmpty = errors.New("USB: read buffer empty")
|
|
||||||
)
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
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 {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRNG returns 32-bit random numbers using the ESP32-C3 true random number generator,
|
// GetRNG returns 32-bit random numbers using the ESP32-C3 true random number generator,
|
||||||
// Random numbers are generated based on the thermal noise in the system and the
|
// Random numbers are generated based on the thermal noise in the system and the
|
||||||
// asynchronous clock mismatch.
|
// asynchronous clock mismatch.
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
//go:build esp32c3
|
||||||
|
|
||||||
|
package machine
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
var (
|
||||||
|
errUSBWrongSize = errors.New("USB: invalid write size")
|
||||||
|
errUSBCouldNotWriteAllData = errors.New("USB: could not write all data")
|
||||||
|
errUSBBufferEmpty = errors.New("USB: read buffer empty")
|
||||||
|
)
|
||||||
|
|
||||||
|
func initUSB() {}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
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) 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) flush() {
|
||||||
|
usbdev.Bus.SetEP1_CONF_WR_DONE(1)
|
||||||
|
for usbdev.Bus.GetEP1_CONF_SERIAL_IN_EP_DATA_FREE() == 0 {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -308,91 +308,3 @@ func (uart *UART) writeByte(b byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (uart *UART) flush() {}
|
func (uart *UART) flush() {}
|
||||||
|
|
||||||
// USB Serial/JTAG Controller for ESP32-S3
|
|
||||||
type USB_DEVICE struct {
|
|
||||||
Bus *esp.USB_DEVICE_Type
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
_USBCDC = &USB_DEVICE{
|
|
||||||
Bus: esp.USB_DEVICE,
|
|
||||||
}
|
|
||||||
|
|
||||||
USBCDC Serialer = _USBCDC
|
|
||||||
)
|
|
||||||
|
|
||||||
func initUSB() {
|
|
||||||
USBCDC.Configure(UARTConfig{BaudRate: 115200})
|
|
||||||
}
|
|
||||||
|
|
||||||
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) WriteByte(c byte) error {
|
|
||||||
// Host is connected - wait for TX FIFO space with reasonable timeout
|
|
||||||
timeout := 10000 // Generous timeout for connected host
|
|
||||||
for usbdev.Bus.GetEP1_CONF_SERIAL_IN_EP_DATA_FREE() == 0 && timeout > 0 {
|
|
||||||
timeout--
|
|
||||||
}
|
|
||||||
|
|
||||||
// Even with host connected, don't hang forever
|
|
||||||
if timeout == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write byte to USB Serial/JTAG endpoint
|
|
||||||
usbdev.Bus.SetEP1_RDWR_BYTE(uint32(c))
|
|
||||||
|
|
||||||
// Trigger transmission
|
|
||||||
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) {
|
|
||||||
// TODO: Implement USB Serial/JTAG input reading
|
|
||||||
return 0, errors.New("ReadByte not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (usbdev *USB_DEVICE) Buffered() int {
|
|
||||||
// Return number of bytes available to read
|
|
||||||
return int(usbdev.Bus.GetEP1_CONF_SERIAL_OUT_EP_DATA_AVAIL())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (usbdev *USB_DEVICE) DTR() bool {
|
|
||||||
// Data Terminal Ready - not applicable for USB Serial/JTAG
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (usbdev *USB_DEVICE) RTS() bool {
|
|
||||||
// Request To Send - not applicable for USB Serial/JTAG
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (usbdev *USB_DEVICE) flush() {
|
|
||||||
// Force transmission of any buffered data
|
|
||||||
usbdev.Bus.SetEP1_CONF_WR_DONE(1)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
//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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user