Skip to content

Commit 736aa48

Browse files
jgangemideadprogram
authored andcommitted
feat: add ESP32-S2 USB-OTG PostConnect
- detect USB-OTG via ROM .bss at 0x3FFFFD14 (value 2) - set usesUSB flag for USB CDC write path optimization - no watchdog disable needed for USB-OTG interface
1 parent a5e0965 commit 736aa48

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed

pkg/espflasher/target_esp32s2.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package espflasher
22

3+
// ESP32-S2 register addresses for USB interface detection.
4+
// Reference: esptool/targets/esp32s2.py
5+
const (
6+
esp32s2UARTDevBufNo uint32 = 0x3FFFFD14 // ROM .bss: active console interface
7+
esp32s2UARTDevBufNoUSBOTG uint32 = 2 // USB-OTG active
8+
)
9+
310
// ESP32-S2 target definition.
411
// Reference: https://github.com/espressif/esptool/blob/master/esptool/targets/esp32s2.py
512

@@ -41,4 +48,26 @@ var defESP32S2 = &chipDef{
4148
},
4249

4350
FlashSizes: defaultFlashSizes(),
51+
52+
PostConnect: esp32s2PostConnect,
53+
}
54+
55+
// esp32s2PostConnect detects the USB interface type.
56+
// ESP32-S2 only has USB-OTG (no USB-JTAG/Serial), and does not require
57+
// watchdog disable for USB operation.
58+
// Reference: esptool/targets/esp32s2.py _post_connect()
59+
func esp32s2PostConnect(f *Flasher) error {
60+
uartDev, err := f.ReadRegister(esp32s2UARTDevBufNo)
61+
if err != nil {
62+
// In secure download mode, the register may be unreadable.
63+
// Default to non-USB behavior (safe fallback).
64+
return nil
65+
}
66+
67+
if uartDev == esp32s2UARTDevBufNoUSBOTG {
68+
f.usesUSB = true
69+
f.logf("USB-OTG interface detected")
70+
}
71+
72+
return nil
4473
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package espflasher
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestESP32S2PostConnectUSBOTG(t *testing.T) {
12+
mc := &mockConnection{
13+
readRegFunc: func(addr uint32) (uint32, error) {
14+
if addr == esp32s2UARTDevBufNo {
15+
return esp32s2UARTDevBufNoUSBOTG, nil
16+
}
17+
return 0, nil
18+
},
19+
}
20+
f := &Flasher{
21+
conn: mc,
22+
opts: &FlasherOptions{},
23+
}
24+
25+
err := esp32s2PostConnect(f)
26+
require.NoError(t, err)
27+
assert.True(t, f.usesUSB, "usesUSB should be true for USB-OTG")
28+
}
29+
30+
func TestESP32S2PostConnectUART(t *testing.T) {
31+
mc := &mockConnection{
32+
readRegFunc: func(addr uint32) (uint32, error) {
33+
return 0, nil // Not USB, return UART value
34+
},
35+
}
36+
f := &Flasher{
37+
conn: mc,
38+
opts: &FlasherOptions{},
39+
}
40+
41+
err := esp32s2PostConnect(f)
42+
require.NoError(t, err)
43+
assert.False(t, f.usesUSB, "usesUSB should be false for UART")
44+
}
45+
46+
func TestESP32S2PostConnectSecureMode(t *testing.T) {
47+
// Simulate read error (secure download mode)
48+
mc := &mockConnection{
49+
readRegFunc: func(addr uint32) (uint32, error) {
50+
return 0, errors.New("register not readable") // Simulate unreadable register
51+
},
52+
}
53+
f := &Flasher{
54+
conn: mc,
55+
opts: &FlasherOptions{},
56+
}
57+
58+
err := esp32s2PostConnect(f)
59+
require.NoError(t, err, "should gracefully handle read error")
60+
assert.False(t, f.usesUSB, "should default to non-USB on read error")
61+
}

0 commit comments

Comments
 (0)