tasmota-webserial-esptool 6.4.1 → 6.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/build_upload.yml +8 -5
- package/.github/workflows/ci.yml +3 -3
- package/BUGFIX_GET_SECURITY_INFO.md +126 -0
- package/CHANGELOG_CHIP_VARIANT.md +169 -0
- package/CHIP_VARIANT_SUPPORT.md +184 -0
- package/IMPLEMENTATION_SUMMARY.md +232 -0
- package/SECURITY_INFO_EXPLANATION.md +145 -0
- package/css/style.css +1 -0
- package/dist/const.d.ts +9 -0
- package/dist/const.js +15 -0
- package/dist/esp_loader.d.ts +20 -0
- package/dist/esp_loader.js +117 -13
- package/dist/index.js +1 -0
- package/dist/stubs/esp32c5.json +4 -4
- package/dist/stubs/esp32p4r3.json +8 -0
- package/dist/stubs/index.d.ts +1 -1
- package/dist/stubs/index.js +8 -2
- package/dist/web/esp32c5-mcj52-K1.js +1 -0
- package/dist/web/esp32p4r3-Cle9QJmZ.js +1 -0
- package/dist/web/index.js +1 -1
- package/index.html +13 -0
- package/js/modules/esp32c5-mcj52-K1.js +1 -0
- package/js/modules/esp32p4r3-Cle9QJmZ.js +1 -0
- package/js/modules/esptool.js +1 -1
- package/js/script.js +23 -0
- package/package.json +1 -1
- package/src/const.ts +22 -0
- package/src/esp_loader.ts +164 -13
- package/src/index.ts +2 -0
- package/src/stubs/esp32c5.json +4 -4
- package/src/stubs/esp32p4r3.json +8 -0
- package/src/stubs/index.ts +10 -2
- package/tsconfig.json +2 -1
- package/dist/web/esp32c5-C8uE-s4t.js +0 -1
- package/js/modules/esp32c5-C8uE-s4t.js +0 -1
|
@@ -12,8 +12,11 @@ concurrency:
|
|
|
12
12
|
jobs:
|
|
13
13
|
build:
|
|
14
14
|
runs-on: ubuntu-latest
|
|
15
|
+
permissions:
|
|
16
|
+
contents: write
|
|
17
|
+
id-token: write # required to use OIDC
|
|
15
18
|
steps:
|
|
16
|
-
- uses: actions/checkout@
|
|
19
|
+
- uses: actions/checkout@v6
|
|
17
20
|
- name: Remove old files and folders
|
|
18
21
|
run: |
|
|
19
22
|
rm -rf package-lock.json
|
|
@@ -21,7 +24,7 @@ jobs:
|
|
|
21
24
|
rm -rf js/modules
|
|
22
25
|
mkdir js/modules
|
|
23
26
|
- name: install node v20
|
|
24
|
-
uses: actions/setup-node@
|
|
27
|
+
uses: actions/setup-node@v6
|
|
25
28
|
with:
|
|
26
29
|
node-version: 20
|
|
27
30
|
- name: Install Yarn with NPM
|
|
@@ -40,11 +43,11 @@ jobs:
|
|
|
40
43
|
mv js/modules/index.js js/modules/esptool.js
|
|
41
44
|
#ls js/modules/
|
|
42
45
|
- name: Commit Distribution Files
|
|
43
|
-
uses: stefanzweifel/git-auto-commit-action@
|
|
46
|
+
uses: stefanzweifel/git-auto-commit-action@v7
|
|
44
47
|
with:
|
|
45
48
|
commit_message: "Github Action: Updated dist files"
|
|
46
49
|
- name: Publish to NPM registry
|
|
47
|
-
uses: JS-DevTools/npm-publish@
|
|
50
|
+
uses: JS-DevTools/npm-publish@v4
|
|
48
51
|
with:
|
|
49
52
|
registry: https://registry.npmjs.org/
|
|
50
53
|
token: ${{ secrets.NPM_TOKEN }}
|
|
@@ -52,7 +55,7 @@ jobs:
|
|
|
52
55
|
- name: Setup Pages
|
|
53
56
|
uses: actions/configure-pages@v5
|
|
54
57
|
- name: Upload artifact
|
|
55
|
-
uses: actions/upload-pages-artifact@
|
|
58
|
+
uses: actions/upload-pages-artifact@v4
|
|
56
59
|
with:
|
|
57
60
|
path: "."
|
|
58
61
|
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -12,9 +12,9 @@ jobs:
|
|
|
12
12
|
runs-on: ubuntu-latest
|
|
13
13
|
|
|
14
14
|
steps:
|
|
15
|
-
- uses: actions/checkout@
|
|
15
|
+
- uses: actions/checkout@v6
|
|
16
16
|
- name: Use Node.js
|
|
17
|
-
uses: actions/setup-node@
|
|
17
|
+
uses: actions/setup-node@v6
|
|
18
18
|
with:
|
|
19
19
|
node-version: 20
|
|
20
20
|
- name: Remove old package-lock.json
|
|
@@ -25,6 +25,6 @@ jobs:
|
|
|
25
25
|
- run: script/build
|
|
26
26
|
- run: npm exec -- prettier --check src
|
|
27
27
|
- name: Commit changed files
|
|
28
|
-
uses: stefanzweifel/git-auto-commit-action@
|
|
28
|
+
uses: stefanzweifel/git-auto-commit-action@v7
|
|
29
29
|
with:
|
|
30
30
|
commit_message: "Github Action: Updated files"
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Bugfix: GET_SECURITY_INFO für ESP32-C3
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
|
|
5
|
+
ESP32-C3 v0.4 (und andere moderne Chips) sollten `GET_SECURITY_INFO` unterstützen, aber es schlug mit einer leeren Antwort fehl:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
GET_SECURITY_INFO failed, using magic value detection: Error: Invalid security info response length: 0
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Ursache
|
|
12
|
+
|
|
13
|
+
Das Problem lag in der `checkCommand()` Funktion:
|
|
14
|
+
|
|
15
|
+
1. `GET_SECURITY_INFO` wird während `detectChip()` aufgerufen
|
|
16
|
+
2. Zu diesem Zeitpunkt ist `chipFamily` noch **nicht gesetzt**
|
|
17
|
+
3. `checkCommand()` konnte die Status-Länge nicht korrekt bestimmen
|
|
18
|
+
4. Es fiel in den `else` Block und verwendete die falsche Status-Länge
|
|
19
|
+
5. Die Daten wurden falsch geparst → leere `responseData`
|
|
20
|
+
|
|
21
|
+
### Code-Flow (vorher):
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
async detectChip() {
|
|
25
|
+
// chipFamily ist noch NICHT gesetzt!
|
|
26
|
+
const securityInfo = await this.getSecurityInfo();
|
|
27
|
+
// ↓
|
|
28
|
+
// checkCommand(ESP_GET_SECURITY_INFO, ...)
|
|
29
|
+
// ↓
|
|
30
|
+
// chipFamily ist undefined
|
|
31
|
+
// ↓
|
|
32
|
+
// statusLen wird falsch berechnet
|
|
33
|
+
// ↓
|
|
34
|
+
// data wird falsch geparst
|
|
35
|
+
// ↓
|
|
36
|
+
// responseData.length === 0
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Lösung
|
|
41
|
+
|
|
42
|
+
In `checkCommand()` wurde eine spezielle Behandlung für `GET_SECURITY_INFO` hinzugefügt:
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
async checkCommand(opcode, buffer, checksum, timeout) {
|
|
46
|
+
// ...
|
|
47
|
+
|
|
48
|
+
let statusLen = 0;
|
|
49
|
+
|
|
50
|
+
if (this.IS_STUB || this.chipFamily == CHIP_FAMILY_ESP8266) {
|
|
51
|
+
statusLen = 2;
|
|
52
|
+
} else if ([CHIP_FAMILY_ESP32, ...].includes(this.chipFamily)) {
|
|
53
|
+
statusLen = 4;
|
|
54
|
+
} else {
|
|
55
|
+
// NEU: Wenn chipFamily noch nicht gesetzt ist (während detectChip)
|
|
56
|
+
if (opcode === ESP_GET_SECURITY_INFO) {
|
|
57
|
+
statusLen = 4; // Moderne Chips verwenden 4-Byte Status
|
|
58
|
+
} else if ([2, 4].includes(data.length)) {
|
|
59
|
+
statusLen = data.length;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// ...
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Ergebnis
|
|
68
|
+
|
|
69
|
+
Nach dem Fix sollte ESP32-C3 v0.4 (und andere moderne Chips) korrekt erkannt werden:
|
|
70
|
+
|
|
71
|
+
### Vorher:
|
|
72
|
+
```
|
|
73
|
+
[debug] GET_SECURITY_INFO failed, using magic value detection: Error: Invalid security info response length: 0
|
|
74
|
+
[debug] Detected chip via magic value: 0x1B31506F (ESP32-C3)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Nachher (erwartet):
|
|
78
|
+
```
|
|
79
|
+
[debug] Detected chip via IMAGE_CHIP_ID: 5 (ESP32-C3)
|
|
80
|
+
Chip type ESP32-C3
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Betroffene Chips
|
|
84
|
+
|
|
85
|
+
Dieser Fix verbessert die Erkennung für:
|
|
86
|
+
|
|
87
|
+
- ✅ ESP32-C3 (alle Revisionen mit GET_SECURITY_INFO Support)
|
|
88
|
+
- ✅ ESP32-S3
|
|
89
|
+
- ✅ ESP32-C6
|
|
90
|
+
- ✅ ESP32-C61
|
|
91
|
+
- ✅ ESP32-H2
|
|
92
|
+
- ✅ ESP32-C5
|
|
93
|
+
- ✅ ESP32-P4 Rev. 300+
|
|
94
|
+
|
|
95
|
+
## Fallback bleibt erhalten
|
|
96
|
+
|
|
97
|
+
Der Fallback auf Magic Value Detection bleibt weiterhin funktionsfähig für:
|
|
98
|
+
|
|
99
|
+
- ESP8266
|
|
100
|
+
- ESP32
|
|
101
|
+
- ESP32-S2
|
|
102
|
+
- Ältere ROM-Versionen, die GET_SECURITY_INFO nicht unterstützen
|
|
103
|
+
|
|
104
|
+
## Testing
|
|
105
|
+
|
|
106
|
+
### Zu testen:
|
|
107
|
+
- [ ] ESP32-C3 v0.4 → sollte via IMAGE_CHIP_ID erkannt werden
|
|
108
|
+
- [ ] ESP32-S3 → sollte via IMAGE_CHIP_ID erkannt werden
|
|
109
|
+
- [ ] ESP32-P4 Rev. 300+ → sollte via IMAGE_CHIP_ID erkannt werden
|
|
110
|
+
- [ ] ESP8266 → sollte via Magic Value erkannt werden (Fallback)
|
|
111
|
+
- [ ] ESP32 → sollte via Magic Value erkannt werden (Fallback)
|
|
112
|
+
|
|
113
|
+
### Erwartetes Verhalten:
|
|
114
|
+
|
|
115
|
+
**Moderne Chips (mit GET_SECURITY_INFO):**
|
|
116
|
+
```
|
|
117
|
+
[debug] Detected chip via IMAGE_CHIP_ID: X (ESP32-XX)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Ältere Chips (ohne GET_SECURITY_INFO):**
|
|
121
|
+
```
|
|
122
|
+
[debug] GET_SECURITY_INFO failed, using magic value detection
|
|
123
|
+
[debug] Detected chip via magic value: 0xXXXXXXXX (ESP32-XX)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Beide Wege führen zur korrekten Chip-Erkennung! ✅
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Changelog: Chip Variant Support
|
|
2
|
+
|
|
3
|
+
## Änderungen in WebSerial_ESPTool
|
|
4
|
+
|
|
5
|
+
### Neue Features
|
|
6
|
+
|
|
7
|
+
#### 1. `chipVariant` Feld in ESPLoader
|
|
8
|
+
- Neues öffentliches Feld: `chipVariant: string | null`
|
|
9
|
+
- Wird automatisch bei der Chip-Erkennung gesetzt
|
|
10
|
+
- Für ESP32-P4: `"rev0"` (Revision < 300) oder `"rev300"` (Revision >= 300)
|
|
11
|
+
- Für alle anderen Chips: `null`
|
|
12
|
+
|
|
13
|
+
#### 2. Erweiterte ESP32-P4 Erkennung
|
|
14
|
+
- Revision wird aus eFuses gelesen (EFUSE_BLOCK1)
|
|
15
|
+
- Funktioniert sowohl bei IMAGE_CHIP_ID als auch Magic Value Erkennung
|
|
16
|
+
- Logging der erkannten Variante im Debug-Modus
|
|
17
|
+
|
|
18
|
+
### Geänderte Dateien
|
|
19
|
+
|
|
20
|
+
- `src/esp_loader.ts`:
|
|
21
|
+
- Hinzugefügt: `chipVariant: string | null` Feld
|
|
22
|
+
- Erweitert: `detectChip()` Methode setzt chipVariant für ESP32-P4
|
|
23
|
+
- Erweitert: Logging für bessere Nachvollziehbarkeit
|
|
24
|
+
|
|
25
|
+
### API-Änderungen
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
// Vorher
|
|
29
|
+
const esploader = new ESPLoader(port, logger);
|
|
30
|
+
await esploader.initialize();
|
|
31
|
+
console.log(esploader.chipName); // "ESP32-P4"
|
|
32
|
+
console.log(esploader.chipRevision); // 300
|
|
33
|
+
|
|
34
|
+
// Nachher (zusätzlich)
|
|
35
|
+
console.log(esploader.chipVariant); // "rev300"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Abwärtskompatibilität
|
|
39
|
+
|
|
40
|
+
✅ Vollständig abwärtskompatibel
|
|
41
|
+
- Bestehendes Code funktioniert unverändert
|
|
42
|
+
- Neues Feld ist optional und kann ignoriert werden
|
|
43
|
+
- Keine Breaking Changes
|
|
44
|
+
|
|
45
|
+
## Änderungen in esp-web-tools
|
|
46
|
+
|
|
47
|
+
### Neue Features
|
|
48
|
+
|
|
49
|
+
#### 1. `chipVariant` Support in Manifesten
|
|
50
|
+
- Neues optionales Feld in `Build` Interface: `chipVariant?: string`
|
|
51
|
+
- Ermöglicht spezifische Firmware-Builds für verschiedene Chip-Varianten
|
|
52
|
+
- Intelligente Matching-Logik mit Fallback-Unterstützung
|
|
53
|
+
|
|
54
|
+
#### 2. Erweiterte Build-Auswahl
|
|
55
|
+
- Priorisiert Builds mit passendem `chipVariant`
|
|
56
|
+
- Fallback auf Builds ohne `chipVariant` Angabe
|
|
57
|
+
- Bessere Fehlermeldungen mit Varianten-Information
|
|
58
|
+
|
|
59
|
+
### Geänderte Dateien
|
|
60
|
+
|
|
61
|
+
- `src/const.ts`:
|
|
62
|
+
- Erweitert: `Build` Interface mit `chipVariant?: string`
|
|
63
|
+
- Erweitert: `BaseFlashState` Interface mit `chipVariant?: string | null`
|
|
64
|
+
|
|
65
|
+
- `src/flash.ts`:
|
|
66
|
+
- Erweitert: Build-Matching-Logik berücksichtigt chipVariant
|
|
67
|
+
- Erweitert: Fehlermeldungen zeigen chipVariant an
|
|
68
|
+
- Erweitert: Initialisierungsmeldung zeigt chipVariant an
|
|
69
|
+
|
|
70
|
+
- `README.md`:
|
|
71
|
+
- Hinzugefügt: Dokumentation für Chip Variant Support
|
|
72
|
+
- Hinzugefügt: Beispiel für P4-Varianten
|
|
73
|
+
|
|
74
|
+
### Manifest-Beispiel
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"name": "My Firmware",
|
|
79
|
+
"version": "1.0.0",
|
|
80
|
+
"builds": [
|
|
81
|
+
{
|
|
82
|
+
"chipFamily": "ESP32-P4",
|
|
83
|
+
"chipVariant": "rev0",
|
|
84
|
+
"parts": [...]
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"chipFamily": "ESP32-P4",
|
|
88
|
+
"chipVariant": "rev300",
|
|
89
|
+
"parts": [...]
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Abwärtskompatibilität
|
|
96
|
+
|
|
97
|
+
✅ Vollständig abwärtskompatibel
|
|
98
|
+
- Bestehende Manifeste ohne `chipVariant` funktionieren weiterhin
|
|
99
|
+
- `chipVariant` ist optional
|
|
100
|
+
- Keine Breaking Changes
|
|
101
|
+
|
|
102
|
+
## Testing
|
|
103
|
+
|
|
104
|
+
### Build-Tests
|
|
105
|
+
- ✅ WebSerial_ESPTool kompiliert erfolgreich
|
|
106
|
+
- ✅ esp-web-tools kompiliert erfolgreich
|
|
107
|
+
- ✅ Keine TypeScript-Fehler
|
|
108
|
+
- ✅ Keine Linting-Fehler
|
|
109
|
+
|
|
110
|
+
### Funktionale Tests (empfohlen)
|
|
111
|
+
- [ ] Test mit ESP32-P4 Rev. 0 Hardware
|
|
112
|
+
- [ ] Test mit ESP32-P4 Rev. 300 Hardware
|
|
113
|
+
- [ ] Test mit Manifest mit chipVariant
|
|
114
|
+
- [ ] Test mit Manifest ohne chipVariant (Fallback)
|
|
115
|
+
- [ ] Test mit anderen ESP32-Chips (sollte chipVariant = null sein)
|
|
116
|
+
|
|
117
|
+
## Deployment
|
|
118
|
+
|
|
119
|
+
### WebSerial_ESPTool
|
|
120
|
+
1. Version in `package.json` erhöhen
|
|
121
|
+
2. `npm run prepublishOnly` ausführen
|
|
122
|
+
3. `npm publish` ausführen
|
|
123
|
+
|
|
124
|
+
### esp-web-tools
|
|
125
|
+
1. Warten bis neue WebSerial_ESPTool Version verfügbar ist
|
|
126
|
+
2. `package.json` aktualisieren: `"tasmota-webserial-esptool": "^6.5.0"` (oder höher)
|
|
127
|
+
3. Version in `package.json` erhöhen
|
|
128
|
+
4. `npm install`
|
|
129
|
+
5. `npm run prepublishOnly` ausführen
|
|
130
|
+
6. `npm publish` ausführen
|
|
131
|
+
|
|
132
|
+
## Dokumentation
|
|
133
|
+
|
|
134
|
+
- ✅ `CHIP_VARIANT_SUPPORT.md` - Vollständige technische Dokumentation
|
|
135
|
+
- ✅ `manifest-example-p4-variants.json` - Beispiel-Manifest
|
|
136
|
+
- ✅ `README.md` (esp-web-tools) - Kurze Anleitung
|
|
137
|
+
- ✅ `CHANGELOG_CHIP_VARIANT.md` - Diese Datei
|
|
138
|
+
|
|
139
|
+
## Verwendungsbeispiele
|
|
140
|
+
|
|
141
|
+
### Szenario 1: Separate Builds für jede Variante
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"builds": [
|
|
145
|
+
{ "chipFamily": "ESP32-P4", "chipVariant": "rev0", "parts": [...] },
|
|
146
|
+
{ "chipFamily": "ESP32-P4", "chipVariant": "rev300", "parts": [...] }
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Szenario 2: Ein Build für alle Varianten
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"builds": [
|
|
155
|
+
{ "chipFamily": "ESP32-P4", "parts": [...] }
|
|
156
|
+
]
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Szenario 3: Spezifischer Build + Fallback
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"builds": [
|
|
164
|
+
{ "chipFamily": "ESP32-P4", "chipVariant": "rev300", "parts": [...] },
|
|
165
|
+
{ "chipFamily": "ESP32-P4", "parts": [...] }
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
Rev300 verwendet ersten Build, Rev0 verwendet zweiten Build (Fallback).
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# ESP32-P4 Chip Variant Support
|
|
2
|
+
|
|
3
|
+
## Übersicht
|
|
4
|
+
|
|
5
|
+
Die beiden Projekte unterstützen jetzt die Unterscheidung zwischen verschiedenen ESP32-P4 Varianten über das neue `chipVariant` Feld.
|
|
6
|
+
|
|
7
|
+
## WebSerial_ESPTool
|
|
8
|
+
|
|
9
|
+
### Änderungen
|
|
10
|
+
|
|
11
|
+
Das `ESPLoader` Objekt hat jetzt ein neues Feld:
|
|
12
|
+
- `chipVariant: string | null` - Identifiziert die Chip-Variante
|
|
13
|
+
|
|
14
|
+
### ESP32-P4 Varianten
|
|
15
|
+
|
|
16
|
+
Für ESP32-P4 Chips werden folgende Varianten erkannt:
|
|
17
|
+
- `"rev0"` - ESP32-P4 Revision < 300 (ältere Versionen)
|
|
18
|
+
- `"rev300"` - ESP32-P4 Revision >= 300 (neuere Versionen)
|
|
19
|
+
|
|
20
|
+
Die Erkennung erfolgt automatisch basierend auf der Chip-Revision, die aus den eFuses gelesen wird.
|
|
21
|
+
|
|
22
|
+
### Beispiel
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
const esploader = new ESPLoader(port, logger);
|
|
26
|
+
await esploader.initialize();
|
|
27
|
+
|
|
28
|
+
console.log(esploader.chipName); // "ESP32-P4"
|
|
29
|
+
console.log(esploader.chipFamily); // CHIP_FAMILY_ESP32P4
|
|
30
|
+
console.log(esploader.chipRevision); // z.B. 0 oder 300
|
|
31
|
+
console.log(esploader.chipVariant); // "rev0" oder "rev300"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## esp-web-tools
|
|
35
|
+
|
|
36
|
+
### Änderungen
|
|
37
|
+
|
|
38
|
+
#### Manifest Format
|
|
39
|
+
|
|
40
|
+
Das `Build` Interface unterstützt jetzt ein optionales `chipVariant` Feld:
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
interface Build {
|
|
44
|
+
chipFamily: "ESP32-P4" | ...;
|
|
45
|
+
chipVariant?: string; // NEU
|
|
46
|
+
parts: { path: string; offset: number; }[];
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
#### Flash State
|
|
51
|
+
|
|
52
|
+
Der `FlashState` enthält jetzt auch die `chipVariant` Information:
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
interface BaseFlashState {
|
|
56
|
+
chipFamily?: "ESP32-P4" | ...;
|
|
57
|
+
chipVariant?: string | null; // NEU
|
|
58
|
+
// ...
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Manifest Beispiel
|
|
63
|
+
|
|
64
|
+
Hier ist ein Beispiel-Manifest, das verschiedene Firmware-Builds für die zwei P4-Varianten bereitstellt:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"name": "My ESP32-P4 Firmware",
|
|
69
|
+
"version": "1.0.0",
|
|
70
|
+
"builds": [
|
|
71
|
+
{
|
|
72
|
+
"chipFamily": "ESP32-P4",
|
|
73
|
+
"chipVariant": "rev0",
|
|
74
|
+
"parts": [
|
|
75
|
+
{ "path": "bootloader_rev0.bin", "offset": 0 },
|
|
76
|
+
{ "path": "partition-table.bin", "offset": 32768 },
|
|
77
|
+
{ "path": "firmware_rev0.bin", "offset": 65536 }
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"chipFamily": "ESP32-P4",
|
|
82
|
+
"chipVariant": "rev300",
|
|
83
|
+
"parts": [
|
|
84
|
+
{ "path": "bootloader_rev300.bin", "offset": 0 },
|
|
85
|
+
{ "path": "partition-table.bin", "offset": 32768 },
|
|
86
|
+
{ "path": "firmware_rev300.bin", "offset": 65536 }
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"chipFamily": "ESP32-S3",
|
|
91
|
+
"parts": [
|
|
92
|
+
{ "path": "bootloader_s3.bin", "offset": 0 },
|
|
93
|
+
{ "path": "partition-table.bin", "offset": 32768 },
|
|
94
|
+
{ "path": "firmware_s3.bin", "offset": 65536 }
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Matching-Logik
|
|
102
|
+
|
|
103
|
+
Die Firmware-Auswahl funktioniert wie folgt:
|
|
104
|
+
|
|
105
|
+
1. **Wenn `chipVariant` im Build angegeben ist**: Der Build wird nur verwendet, wenn sowohl `chipFamily` als auch `chipVariant` übereinstimmen.
|
|
106
|
+
|
|
107
|
+
2. **Wenn `chipVariant` im Build NICHT angegeben ist**: Der Build wird für alle Varianten dieser `chipFamily` verwendet (Fallback).
|
|
108
|
+
|
|
109
|
+
#### Beispiele
|
|
110
|
+
|
|
111
|
+
**Szenario 1: Spezifische Builds für jede Variante**
|
|
112
|
+
```json
|
|
113
|
+
{
|
|
114
|
+
"builds": [
|
|
115
|
+
{ "chipFamily": "ESP32-P4", "chipVariant": "rev0", "parts": [...] },
|
|
116
|
+
{ "chipFamily": "ESP32-P4", "chipVariant": "rev300", "parts": [...] }
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
- ESP32-P4 rev0 → verwendet ersten Build
|
|
121
|
+
- ESP32-P4 rev300 → verwendet zweiten Build
|
|
122
|
+
|
|
123
|
+
**Szenario 2: Ein Build für alle Varianten**
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"builds": [
|
|
127
|
+
{ "chipFamily": "ESP32-P4", "parts": [...] }
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
- ESP32-P4 rev0 → verwendet den Build
|
|
132
|
+
- ESP32-P4 rev300 → verwendet den Build
|
|
133
|
+
|
|
134
|
+
**Szenario 3: Spezifischer Build + Fallback**
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"builds": [
|
|
138
|
+
{ "chipFamily": "ESP32-P4", "chipVariant": "rev300", "parts": [...] },
|
|
139
|
+
{ "chipFamily": "ESP32-P4", "parts": [...] }
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
- ESP32-P4 rev0 → verwendet zweiten Build (Fallback)
|
|
144
|
+
- ESP32-P4 rev300 → verwendet ersten Build (spezifisch)
|
|
145
|
+
|
|
146
|
+
## Abwärtskompatibilität
|
|
147
|
+
|
|
148
|
+
Alle Änderungen sind vollständig abwärtskompatibel:
|
|
149
|
+
|
|
150
|
+
- Bestehende Manifeste ohne `chipVariant` funktionieren weiterhin
|
|
151
|
+
- Das `chipVariant` Feld ist optional
|
|
152
|
+
- Für alle Chips außer ESP32-P4 ist `chipVariant` `null`
|
|
153
|
+
|
|
154
|
+
## Technische Details
|
|
155
|
+
|
|
156
|
+
### Chip-Erkennung
|
|
157
|
+
|
|
158
|
+
Die ESP32-P4 Revision wird aus den eFuses gelesen (EFUSE_BLOCK1):
|
|
159
|
+
- Minor Revision: Bits [3:0]
|
|
160
|
+
- Major Revision: Bit [23] << 2 | Bits [5:4]
|
|
161
|
+
- Revision = Major * 100 + Minor
|
|
162
|
+
|
|
163
|
+
### Erkennungsmethoden
|
|
164
|
+
|
|
165
|
+
Die Chip-Erkennung verwendet einen zweistufigen Ansatz:
|
|
166
|
+
|
|
167
|
+
1. **Primär: GET_SECURITY_INFO** (IMAGE_CHIP_ID)
|
|
168
|
+
- Unterstützt von: ESP32-C3 (neuere ROM), ESP32-S3, ESP32-C6, ESP32-H2, ESP32-P4 Rev. 300+
|
|
169
|
+
- Liefert direkt die Chip-ID
|
|
170
|
+
- Wenn nicht unterstützt oder leere Antwort → Fallback zu Magic Value
|
|
171
|
+
|
|
172
|
+
2. **Fallback: Magic Value Detection**
|
|
173
|
+
- Unterstützt von: ESP8266, ESP32, ESP32-S2, ESP32-C3 (ältere ROM), ESP32-P4 Rev. < 300
|
|
174
|
+
- Liest Magic-Wert aus Register 0x40001000
|
|
175
|
+
- Zuverlässige Methode für ältere Chips
|
|
176
|
+
|
|
177
|
+
**Für ESP32-P4:**
|
|
178
|
+
- Beide Methoden funktionieren
|
|
179
|
+
- Nach Erkennung wird die Revision aus eFuses gelesen
|
|
180
|
+
- Basierend auf Revision wird `chipVariant` gesetzt:
|
|
181
|
+
- Rev. < 300 → `"rev0"`
|
|
182
|
+
- Rev. >= 300 → `"rev300"`
|
|
183
|
+
|
|
184
|
+
**Hinweis:** Die Debug-Meldung "GET_SECURITY_INFO failed, using magic value detection" ist normal und erwartet für ältere Chips. Der Fallback-Mechanismus stellt sicher, dass alle Chips korrekt erkannt werden.
|