Teil 1 dieser Serie hat den Zustandsautomaten und die Architektur von EthSwt
geklärt. Dieser Teil zeigt die konkrete API — und räumt dabei mit einer
verbreiteten Vereinfachung auf: EthSwt_Init initialisiert nicht
synchron die komplette Switch-Hardware. Laut SWS (Kapitel 8.3.1) kann das
zu lange dauern, um es aus EcuM oder BswM heraus aufzurufen — die
eigentliche Hardware-Konfiguration übernimmt ein separater Background-Task.
Init-Sequenz im Detail
EthSwt_Init(CfgPtr)
│
├─ Speichert Zeiger auf Konfigurationsstruktur
├─ Zustand: ETHSWT_STATE_UNINIT → ETHSWT_STATE_INIT
├─ Alle EthSwtPorts → ETH_MODE_DOWN
└─ Nicht konfigurierte Hardware-Ports werden abgeschaltet
(und bleiben es für die gesamte Laufzeit)
... wiederholte Aufrufe ...
EthSwt_BackgroundTask() ◄── "so oft wie möglich" aufrufen,
│ wenn keine andere Task läuft
├─ Übernimmt Port- und Switch-Initialisierung,
│ falls EthSwt_Init dafür zu lange bräuchte
├─ Prüft Registerzugriff (sonst: ETHSWT_E_ACCESS)
├─ Aktiviert ggf. konfiguriertes Port-Mirroring
│ (SWS_EthSwt_00421/00422)
└─ Zustand: ETHSWT_STATE_INIT → ETHSWT_STATE_PORTINIT_COMPLETED
... danach, nach EthSwtLowPowerModeSupport ...
├─ TRUE → Switch bleibt zunächst im Low-Power-/Inaktiv-Zustand
└─ FALSE → Switch geht direkt in einen aktiven Zustand
EthSwt_SetSwitchPortMode(SwitchIdx, PortIdx, ETH_MODE_ACTIVE)
│ ◄── pro Port explizit aufrufen
├─ Falls EthSwtPort einen EthTrcv referenziert:
│ zusätzlicher Aufruf von EthTrcv_SetTransceiverMode
│ (über die EthIf-API-Abstraktion)
└─ Zustand: ETHSWT_STATE_PORTINIT_COMPLETED → ETHSWT_STATE_ACTIVEDie im ursprünglichen Planungs-Issue angenommene einfache Reihenfolge
“EthSwt_Init` → |
Wichtigste APIs im Überblick
| API | Zweck |
|---|---|
| Zustands- und Zeigerinitialisierung; setzt alle Ports auf |
| Übernimmt ggf. die eigentliche Switch-/Port-Hardware-Initialisierung |
| Port auf |
| Aktuellen Port-Modus auslesen |
| Link-Status eines Ports abfragen |
| MAC-Adresse eines Ports lesen |
| Wird vom BSW-Scheduler zyklisch aufgerufen, unterstützt asynchrones
API-Verhalten (z. B. verzögerte |
Port-Modi im Detail
EthSwt_SetSwitchPortMode erwartet einen von drei Eth_ModeType-Werten:
| Modus | Bedeutung |
|---|---|
| Port deaktivieren — laut Spec möglichst direkt zur Reduktion des Energieverbrauchs |
| Port aktivieren |
| Port aktivieren und einen WakeUp im Netzwerk auslösen — laut SWS z. B. relevant für zu OPEN Alliance TC10 kompatible Hardware |
Referenziert ein |
Link-Status: mit und ohne EthTrcv
EthSwt_GetLinkState verhält sich unterschiedlich, je nachdem, ob der Port
einen EthTrcv referenziert:
Mit EthTrcv-Referenz — der Link-Status kommt von
EthTrcv_GetLinkState(über EthIf), genau wie bei einem einfachen Transceiver-SetupOhne EthTrcv-Referenz (z. B. interner Port zu einem eingebetteten PHY, den der Switch-Chip selbst verwaltet) — der Status kommt vom MAC-Interface des Ports; kann die Hardware das nicht liefern, wird er aus dem aktuellen Port-Modus abgeleitet:
ETH_MODE_ACTIVE→ Link aktiv,ETH_MODE_DOWN→ Link down
Stimmen Port-Modus und PHY-Modus nicht überein, meldet
EthSwt_GetSwitchPortMode den Extended-Production-Error
ETHSWT_E_SYNCPORT2PHY und liefert E_NOT_OK zurück — ein nützliches
Signal beim Debuggen, wenn Switch und Transceiver aus unterschiedlichen
Gründen unterschiedliche Zustände melden.
Fehlerbehandlung & Determinismus
Alle in diesem Post genannten APIs prüfen laut SWS zunächst den
Registerzugriff auf die Switch-Hardware; schlägt er fehl, wird der
Extended-Production-Error ETHSWT_E_ACCESS gesetzt und E_NOT_OK
zurückgegeben. Außerdem gilt für jede API: Wird sie im Zustand
ETHSWT_STATE_UNINIT oder ETHSWT_STATE_INIT aufgerufen (also bevor die
Port-Initialisierung abgeschlossen ist), liefert sie ebenfalls E_NOT_OK.
Praktische Konsequenz: Wer |
Minimalbeispiel: Init-Aufrufsequenz für einen 4-Port-Switch
EthSwt_Init(&EthSwtConfig_0);
// ... Background-Task-Zyklen laufen lassen, bis PORTINIT_COMPLETED ...
EthSwt_BackgroundTask(); // ggf. mehrfach, je nach Scheduling
for (portIdx = 0; portIdx < 4; portIdx++) {
EthSwt_SetSwitchPortMode(0, portIdx, ETH_MODE_ACTIVE);
}
// Zyklischer Betrieb:
EthSwt_MainFunction(); // regelmäßig vom BSW-SchedulerSerie
| Teil | Thema | Status |
|---|---|---|
1 | Grundlagen, SWS & Architektur | fertig |
2 | API & Initialisierung | dieser Post |
3 | ARXML-Konfiguration | folgt |
4 | VLAN-Management, Mirroring & Diagnose | folgt |
Weiter in der EthSwt-Serie: EthSwt Teil 3 — ARXML-Konfiguration in der Praxis