Dieser Post ist Teil der EthTrcv-Serie und baut auf dem vorherigen Post zu Loopback-Modi auf. Dort ging es darum, den Datenpfad durch den PHY gezielt kurzzuschließen um Hardware-Fehler einzugrenzen. Dieser Post geht einen Schritt tiefer: Wie liest man die PHY-Register selbst, die einem sagen warum ein Link nicht hochkommt — bevor man überhaupt zum Loopback greift?
Wer schon mal einen Link-Fehler auf Basis von EthTrcv_GetLinkState allein diagnostiziert hat,
kennt das Problem: Der Rückgabewert ist binär, ETHTRCV_LINK_STATE_DOWN oder
ETHTRCV_LINK_STATE_ACTIVE. Die eigentliche Fehlerursache — Autonegotiation-Mismatch,
Kabelfehler, Übersprechen — steckt in den PHY-Registern, nicht im AUTOSAR-Rückgabewert.
Was ist MDIO? — Kurzer Recap
MDIO (Management Data Input/Output) ist der serielle Steuerbus zwischen MAC/SoC und PHY-Chip,
über den EthTrcv_Init und alle Register-Zugriffe laufen — nicht über MII/RGMII.
IEEE 802.3 kennt zwei Frame-Formate: Clause 22 (klassisch, 32 Register pro PHY) und
Clause 45 (erweitert, mit DEVAD-Adressraum, Pflicht bei 1000BASE-T1 und Safety-PHYs).
Elektrische Details (Pull-up-Widerstand, MDC-Timing, Bus-Topologie bei mehreren PHYs) sind hier bewusst ausgeklammert — die stehen ausführlich im Hardware Deep Dive, Abschnitt "Der MDIO-Bus". Dieser Post setzt voraus, dass der Bus elektrisch sauber funktioniert, und konzentriert sich darauf, was man über ihn liest und wie man die Werte interpretiert. |
Kurz zur Auffrischung das Frame-Format, weil die Feldnamen im weiteren Verlauf ständig auftauchen:
Clause 22: ST | OP | PHYAD[4:0] | REGAD[4:0] | TA | DATA[15:0]
Clause 45: ST | OP | PRTAD[4:0] | DEVAD[5:0] | TA | ADDR/DATA[15:0]PHYAD/PRTAD adressiert den Chip auf dem Bus, REGAD/DEVAD+Adresse adressiert das Register
innerhalb des Chips. Genau diese Registeradressen sind das Thema dieses Posts.
PHY-Register-Map
Jeder IEEE-konforme PHY implementiert einen Satz Standard-Register, die bei jedem Hersteller an der gleichen Adresse liegen und die gleiche Bedeutung haben. Darüber hinaus definiert jeder Hersteller Vendor-spezifische Register für Diagnosefunktionen, die über den IEEE-Standard hinausgehen (Kabeldiagnose, erweiterte Fehlerzähler, LED-Konfiguration).
Standard-Register (Clause 22, Register 0–15)
| Adresse | Name | Zweck |
|---|---|---|
0 | Basic Control Register (BCR) | Reset, Autonegotiation aktivieren/neu starten, Speed/Duplex forcen, Power-Down |
1 | Basic Status Register (BSR) | Link-Status, Autonegotiation-Complete, unterstützte Fähigkeiten (Capabilities) |
2 | PHY Identifier 1 | Obere 16 Bit der Organizationally Unique Identifier (OUI) |
3 | PHY Identifier 2 | Untere OUI-Bits + Model Number + Revision Number |
4 | Auto-Negotiation Advertisement | Welche Modi bietet dieser PHY dem Link-Partner an |
5 | Auto-Negotiation Link Partner Ability | Welche Modi bietet der Link-Partner an (nach abgeschlossener Negotiation gültig) |
6 | Auto-Negotiation Expansion | Zusatzinfos zur Negotiation, z. B. ob der Link-Partner überhaupt Autonegotiation kann |
9–10 | 1000BASE-T Control/Status (falls unterstützt) | Master/Slave-Konfiguration, Gigabit-spezifische Fähigkeiten |
Register 2 und 3 (PHY Identifier) sind der erste Handgriff bei jeder MDIO-Diagnose-Session,
noch bevor man sich mit Link-Status beschäftigt. Antwortet der PHY auf diesen Read gar nicht
( |
Vendor-spezifische Register (Beispielbereich)
Automotive-PHYs wie der TJA1100/TJA1101 (NXP), DP83TC81x (TI) oder 88Q2xxx (Marvell) belegen typischerweise die Register ab Adresse 16 (0x10) mit herstellerspezifischen Funktionen. Die genauen Adressen unterscheiden sich zwischen Herstellern — das Datenblatt ist hier Pflichtlektüre.
| Adressbereich | Typische Belegung | Beispiel |
|---|---|---|
0x10–0x12 | Erweiterter Status, Interrupt-Maske/-Status | "Link down"-Interrupt aktivieren, Ursache im Statusregister nachlesen |
0x13–0x17 | Kabeldiagnose (TDR-Ergebnis) | Kabellänge, Kurzschluss-/Unterbrechungserkennung, betroffene Ader |
0x18–0x1F | Symbol-Fehlerzähler, SQI (Signal Quality Index) | Laufende Bitfehlerrate während des Betriebs abschätzen |
MDIO über AUTOSAR
Im Normalfall greift Applikationscode nicht direkt auf MDIO zu — und die Funktion, die
EthTrcv dafür aufruft, gehört auch nicht zu EthTrcv selbst, sondern zu EthIf:
EthIf_ReadMii/EthIf_WriteMii (deklariert in EthIf.h). EthIf ist dabei nur Vermittler,
nicht Ausführender: Laut Spezifikation (SWS_EthIf_00706/SWS_EthIf_00707) leitet EthIf
den Aufruf intern an die Funktion <EthDrv>_ReadMii/<EthDrv>_WriteMii des zuständigen
Ethernet-Controller-Treibers weiter — in der Praxis also an Eth_ReadMii/Eth_WriteMii des
Eth-Moduls, das den physischen MDIO-Bus tatsächlich schaltet.
Std_ReturnType EthIf_ReadMii(
uint8 CtrlIdx,
uint8 TrcvIdx,
uint8 RegIdx,
uint16* RegValPtr
);
Std_ReturnType EthIf_WriteMii(
uint8 CtrlIdx,
uint8 TrcvIdx,
uint8 RegIdx,
uint16 RegVal
);CtrlIdx wählt den Ethernet-Controller (MAC) aus, dem der betreffende MDIO-Bus gehört,
TrcvIdx den Transceiver auf diesem Bus, RegIdx die Registeradresse gemäß PHY-Register-Map.
Beide Funktionen sind laut Spezifikation ausdrücklich synchron (Sync/Async: Synchronous)
— sie blockieren, bis die MDIO-Transaktion abgeschlossen ist, und liefern das Ergebnis direkt
als Std_ReturnType zurück; EthIf_ReadMii zusätzlich den gelesenen Registerwert über
RegValPtr.
Frühere AUTOSAR-Releases (bis einschließlich R23-11) kannten hierfür ein asynchrones
Callback-Paar |
Für EthTrcv bedeutet das: Es reicht ein einziger, blockierender Aufruf pro Registerzugriff.
Das ist einfacher als das frühere Request/Indication-Muster, hat aber eine Kehrseite —
EthTrcv_MainFunction darf nicht so lange synchron auf eine MDIO-Transaktion warten, dass
andere Aufgaben des Treibers ins Hintertreffen geraten. Wie lange ein Aufruf real blockiert,
hängt vom Timing des zugrunde liegenden Eth-Treibers und der MDC-Frequenz ab.
Ob EthTrcv überhaupt per MII mit Eth spricht, ist eine Konfigurationsentscheidung, kein Automatismus. AUTOSAR modelliert das als Choice-Container in der ECU-Konfiguration:
EthTrcvMgmtInterface(Choice-Container unterEthTrcvConfig) wählt zwischen zwei sich ausschließenden Zugriffspfaden:EthTrcvMiiInterface— der Transceiver hängt direkt am MDIO-Bus eines Ethernet-Controllers. Konfiguriert überEthTrcvCtrlIdx(welche Eth-Controller-Instanz den Zugriff ausführt) undEthTrcvMiiIdx(der Transceiver-Index, der anEthIf_ReadMii/EthIf_WriteMiidurchgereicht wird).EthTrcvSwitchInterface— der Transceiver sitzt stattdessen hinter einem Ethernet-Switch. In diesem Fall gibt es keinen direkten MDIO-Zugriff durch EthTrcv; Register-Reads/-Writes laufen stattdessen überEthIf_SwitchPortReadTrcvRegister/EthIf_SwitchPortWriteTrcvRegister, die EthIf ihrerseits anEthSwt_ReadTrcvRegister/EthSwt_WriteTrcvRegisterauf dem Switch-Treiber weiterreicht — spiegelbildlich zum MII-Pfad.
Einen Parameter EthTrcvReadMiiApi gibt es nicht — welcher Zugriffsweg aktiv ist, wird
darüber entschieden, welcher der beiden Container im ARXML konfiguriert ist, nicht über ein
Bool-Flag.
Weil die MDIO-Transaktion letztlich über Eth läuft, kann ein ungünstig getimtes |
MDIO direkt im Diagnose-Code
Nicht jede Debug-Situation hat Zugriff auf den vollständigen AUTOSAR-Stack — beim Hardware-Bring-up läuft oft noch kein RTE, oder man debuggt auf einem Evaluation-Board ganz ohne AUTOSAR. In diesem Fall bleiben zwei Wege:
Weg 1 — Bare-Metal-Treiber: Ein minimaler MDIO-Treiber, der direkt die MAC-Register des SoCs für MDIO-Transaktionen anspricht (die meisten SoC-MACs haben dafür ein eigenes MDIO-Controller-Register-Set, unabhängig vom eigentlichen Ethernet-Datenpfad).
// Pseudocode — SoC-spezifisch, Registernamen variieren
MDIO_ADDR_REG = (PhyAddr << 5) | RegAddr;
MDIO_CTRL_REG = MDIO_OP_READ | MDIO_START;
while (!(MDIO_STATUS_REG & MDIO_BUSY_CLEAR)) { /* warten */ }
uint16_t value = MDIO_DATA_REG;Weg 2 — externer MDIO-Adapter (siehe Abschnitt "Tooling" unten): Wenn selbst der SoC nicht vertrauenswürdig ist (z. B. weil man einen MAC-Fehler vom PHY-Fehler unterscheiden will), kann ein externer USB-MDIO-Adapter komplett am Ziel-SoC vorbei direkt auf den MDIO-Bus zugreifen.
Beide Wege sind reine Bring-up-/Labor-Werkzeuge. In Serien-Software läuft MDIO-Zugriff ausschließlich über das Zusammenspiel von Eth und EthTrcv im AUTOSAR-Stack — alles andere unterläuft die Timing- und Zustandsgarantien, die dieses Zusammenspiel intern einhält. |
Wichtige Diagnose-Register
Für die tägliche Fehlersuche reicht ein kleiner, immer wiederkehrender Satz an Registern. Die folgende Tabelle zeigt die Standard-Bits im Basic Status Register (Adresse 1), die für Link-Diagnose relevant sind:
| Bit | Name | Bedeutung |
|---|---|---|
15 | 100BASE-T4 | Capability-Flag, in Automotive-PHYs meist irrelevant (0) |
5 | Auto-Negotiation Complete | 1 = Negotiation abgeschlossen; bei 0 hängt der Link evtl. im Negotiation-Loop fest |
4 | Remote Fault | Link-Partner meldet einen Fehler — Ursache liegt auf der Gegenseite |
3 | Auto-Negotiation Ability | PHY unterstützt Autonegotiation (statisches Capability-Bit) |
2 | Link Status | 1 = Link up. Latched-Low: einmal auf 0 gefallen, bleibt es bis zum nächsten Read auf 0 — zweimal lesen für den aktuellen Zustand! |
1 | Jabber Detect | PHY hat eine übermäßig lange Übertragung des Link-Partners erkannt |
0 | Extended Capability | PHY unterstützt erweiterte Register jenseits 0–5 |
Bit 2 (Link Status) ist latched-low — das ist eine der häufigsten Fehlerquellen bei MDIO-basierter Diagnose. Ein einzelner Read nach einem kurzen Link-Flap zeigt fälschlich "Link down" an, obwohl der Link im Moment des Reads längst wieder oben ist. Der Standard-Workaround: zweimal hintereinander lesen. Der erste Read liefert den gelatchten (u. U. veralteten) Zustand, der zweite Read den tatsächlich aktuellen. |
Für Speed und Duplex existieren keine eigenen Bits im Basic Status Register — die liegen entweder im Auto-Negotiation Link Partner Ability Register (5) in Kombination mit dem Advertisement-Register (4), oder direkt in einem Vendor-Statusregister, das viele PHYs als bequeme Abkürzung anbieten (z. B. "Auto-Negotiated Speed/Duplex" in einem einzigen Register statt der Ableitung aus zwei Capability-Registern).
| Diagnoseziel | Wo nachsehen |
|---|---|
Link up/down (aktuell) | Basic Status Register Bit 2, zweimal lesen |
Autonegotiation abgeschlossen? | Basic Status Register Bit 5 |
Ausgehandelte Speed/Duplex | Vendor-Statusregister (herstellerspezifisch) oder Ableitung aus Reg. 4 ∩ Reg. 5 |
Fehlerflags (CRC, Symbol-Fehler) | Vendor-spezifisches Fehlerzähler-Register, meist Read-Clear-on-Read |
Kabeldiagnose-Ergebnis (Länge, Fehlerort) | Vendor-spezifisches TDR-Register, muss vorher per Kommando gestartet werden |
Vendor-Beispiel: NXP TJA1100
Der TJA1100 ist einer der verbreitetsten 100BASE-T1-PHYs in Automotive-Designs und eignet sich gut als konkretes Beispiel, weil sein Registersatz gut dokumentiert und repräsentativ für die Klasse der 100BASE-T1-Automotive-PHYs ist.
| Register (Adresse) | Name | Diagnose-Information |
|---|---|---|
0x00 | MII_BASIC_CONTROL | Standard-Register, Reset/Power-Down/Loopback-Steuerung |
0x01 | MII_BASIC_STATUS | Standard-Register, Link Status (latched-low wie oben beschrieben) |
0x11 | EXT_CTRL_STATUS | Konfigurations-Flags: Master/Slave-Rolle, Wake-Request-Konfiguration |
0x12 | PHY_CONTROL | Betriebsmodus (Normal / Silent / Loopback-Untervarianten) |
0x13 | PHY_STATUS | Zusammengefasster Zustand: Link-Status, Local/Remote-Wake-Anfrage, Power-Modus |
0x14 | PHY_INTERRUPT_STATUS | Interrupt-Ursachen: Link-Statuswechsel, Temperaturfehler, Undervoltage |
0x15 | PHY_INTERRUPT_ENABLE | Maskierung, welche Interrupt-Quellen den INT_N-Pin auslösen |
0x18 | COMMUNICATION_STATUS | Linkzustand des internen State-Machine ( |
0x1A | CABLE_TEST | Startet Kabeldiagnose und liefert Ergebnis (Short/Open/Length-Schätzung) |
0x1B | SYMBOL_ERROR_COUNTER | Zählt fehlerhafte PAM3-Symbole seit letztem Lesevorgang (Read-Clear) |
|
Tooling
Für MDIO-Diagnose abseits des Ziel-SoCs gibt es etablierte Werkzeugklassen:
Externe MDIO-USB-Adapter — z. B. auf Basis von FTDI-Bitbang-Modi oder dedizierten MDIO-Master-Chips. Erlauben Register-Reads/-Writes von einem PC aus, unabhängig vom Ziel-SoC. Nützlich, um Zielsystem-Software (MAC-Treiber, EthTrcv-Init-Reihenfolge) als Fehlerquelle auszuschließen.
Diagnoseskripte — Python-Skripte über pyserial/USB-HID-Schnittstelle des Adapters, die eine Registerkarte des jeweiligen PHYs abfragen und lesbar formatieren. In der Praxis lohnt sich ein kleines Skript, das beim Start automatisch PHY-ID, Link-Status (zweimal gelesen), Autonegotiation-Ergebnis und Fehlerzähler ausgibt — die "erste Minute" jeder Link-Diagnose.
Protokoll-/Busanalysatoren — Logic-Analyzer mit MDIO/MDC-Dekoder-Plugin zeichnen den kompletten Bus-Traffic auf Signalebene auf. Notwendig, wenn der Verdacht auf ein Timing-Problem (siehe Setup/Hold-Zeiten im Hardware Deep Dive) besteht statt auf falsche Registerwerte.
Herstellertools — viele PHY-Hersteller liefern eigene GUI-Tools (z. B. NXP TJA110x Config Tool) die über einen Referenzadapter Register lesbar aufbereiten inklusive Bitfeld-Beschriftung. Praktisch für einmalige Analyse, weniger geeignet für automatisierte Regressionstests.
Ein Diagnoseskript, das rohe Registerwerte in menschenlesbare Aussagen übersetzt ("Link: UP, Speed: 100 Mbit/s, Duplex: Full, letzte Autonegotiation vor 3 Zyklen erfolgreich"), spart in der Praxis mehr Zeit als jede einzelne Verbesserung an der Hardware-Diagnose selbst. Es lohnt sich, dieses Skript früh im Projekt zu bauen und über die gesamte Entwicklungszeit zu pflegen. |
Fallstudie — Link bleibt DOWN
Ausgangslage: Ein Steuergerät mit TJA1100-PHY meldet über EthTrcv_GetLinkState
dauerhaft ETHTRCV_LINK_STATE_DOWN. Das Kabel ist augenscheinlich korrekt gesteckt,
die Gegenseite (Switch-Port) zeigt ebenfalls keinen Link. Schritt-für-Schritt-Diagnose
über MDIO-Register:
Schritt 1 — Ist der PHY überhaupt ansprechbar?
Read Register 0x02 (PHY Identifier 1) → 0x0180
Read Register 0x03 (PHY Identifier 2) → 0x0231Beide Werte entsprechen der bekannten TJA1100-OUI. Der PHY antwortet — MDIO-Bus,
Pull-up und PHY-Adresse sind also in Ordnung. Wäre hier 0xFFFF zurückgekommen,
läge der Fehler auf Busebene (siehe Hardware Deep Dive), nicht im Link selbst.
Schritt 2 — Basic Control Register prüfen: ist der PHY im Power-Down oder Reset?
Read Register 0x00 (Basic Control) → 0x0800
Bit 11 (Power Down) = 1Gefunden: Bit 11 ist gesetzt, der PHY befindet sich im Power-Down-Modus. Das erklärt den fehlenden Link vollständig — ein PHY im Power-Down treibt keine Signale auf die Leitung.
Schritt 3 — Ursache für Power-Down eingrenzen
Read Register 0x11 (EXT_CTRL_STATUS) → 0x0004
Bit 2 = CONFIG_EN — Konfigurationspins wurden zuletzt ausgewertetEin Blick ins TJA1100-Datenblatt zeigt: Bit 11 im Basic Control Register wird beim
Power-On je nach Zustand des CONFIG-Pins automatisch gesetzt. In diesem Fall war ein
Pull-Widerstand auf dem CONFIG-Pin des Evaluation-Boards falsch bestückt — eine
Board-Bestückungsvariante, die für ein anderes Power-On-Verhalten vorgesehen war.
Schritt 4 — Workaround zur Bestätigung: Power-Down per Software aufheben
Write Register 0x00 → 0x1200 // Bit 11 löschen, Bit 12 (Autonegotiation Enable) setzen
Read Register 0x01 (Basic Status) → 0x0004 // erster Read: alter latched Zustand
Read Register 0x01 (Basic Status) → 0x0024 // zweiter Read: Bit 2 = 1 → Link up!Nach dem Löschen von Power-Down und einem Autonegotiation-Neustart kommt der Link
tatsächlich hoch. Root Cause bestätigt: Hardware-Bestückungsfehler auf dem CONFIG-Pin,
kein Software- oder Kabelfehler.
Schritt 5 — Ausgehandelten Modus verifizieren
Read Register 0x18 (COMMUNICATION_STATUS) → 0x0002
LINK_STATUS-Feld = ACTIVEDer interne Zustandsautomat des TJA1100 bestätigt ACTIVE — die Diagnose ist
abgeschlossen. Die endgültige Behebung erfolgt auf Hardware-Ebene (Bestückungskorrektur
in der nächsten Board-Revision); bis dahin dient das MDIO-Write aus Schritt 4 als
Werkstatt-Workaround, nicht als Serienlösung.
Diese Fallstudie zeigt einen Fall, in dem die Ursache eindeutig Hardware war — aber der Weg dahin führte über Software-lesbare Register. Genau das ist der Wert von MDIO-Register-Diagnose: Sie trennt zuverlässig zwischen "PHY antwortet nicht" (Busebene), "PHY antwortet, aber im falschen Zustand" (Konfiguration/Hardware-Straps) und "PHY ist im richtigen Zustand, aber Link kommt trotzdem nicht" (Kabel/Gegenseite). |
Zusammenfassung
| Thema | Kernaussage für Software-Entwickler |
|---|---|
Standard-Register (0–6) | PHY-ID zuerst lesen — Antwort/Nicht-Antwort trennt Busfehler von Link-Fehler |
Link Status Bit | Latched-low — immer zweimal lesen für den aktuellen Zustand |
Vendor-Register | Datenblatt ist Pflicht; oft aussagekräftiger als Standard-Register (z. B. |
AUTOSAR-API | EthTrcv ruft synchron |
Bare-Metal-Zugriff | Nur für Bring-up/Labor — in Serien-Software läuft alles über das Eth/EthTrcv-Zusammenspiel |
Fallstudie | Ein einfacher Registerpfad (PHY-ID → Basic Control → Vendor-Status) grenzt die meisten Link-Down-Ursachen in wenigen Minuten ein |
Weiter in der EthTrcv-Serie: EthTrcv & IEEE 802.1AS — gPTP und Hardware-Timestamping im PHY