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)

AdresseNameZweck

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 (0xFFFF auf beiden Registern), liegt das Problem auf dem Bus selbst — nicht im Link. Siehe dazu den Hardware Deep Dive zu Pull-up und Adresskonflikten.

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.

AdressbereichTypische BelegungBeispiel

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 EthTrcv_ReadMiiIndication/EthTrcv_WriteMiiIndication, über das Eth das Ergebnis nachträglich an EthTrcv gemeldet hat. Diese beiden Callbacks wurden mit R24-11 aus dem Standard gestrichen — die Change-History der aktuellen SWS (R25-11) listet sie explizit als "Deleted Specification Items in R24-11". EthIf_ReadMii/EthIf_WriteMii sind seither rein synchron, ein separater Rückruf ist nicht mehr nötig. Wer in älteren Projekten oder Schulungsunterlagen auf die Indication-Funktionen stößt, hat es mit einer älteren Release-Generation zu tun, nicht mit einem aktuellen Implementierungsfehler.

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 unter EthTrcvConfig) wählt zwischen zwei sich ausschließenden Zugriffspfaden:

    • EthTrcvMiiInterface — der Transceiver hängt direkt am MDIO-Bus eines Ethernet-Controllers. Konfiguriert über EthTrcvCtrlIdx (welche Eth-Controller-Instanz den Zugriff ausführt) und EthTrcvMiiIdx (der Transceiver-Index, der an EthIf_ReadMii/EthIf_WriteMii durchgereicht 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 über EthIf_SwitchPortReadTrcvRegister/EthIf_SwitchPortWriteTrcvRegister, die EthIf ihrerseits an EthSwt_ReadTrcvRegister/EthSwt_WriteTrcvRegister auf 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 EthIf_WriteMii — ob durch EthTrcvs eigene Zustandsmaschine ausgelöst oder von Diagnose-Tooling nachgespielt, das denselben Pfad wiederverwendet — einen produktiv laufenden Link sofort trennen, etwa wenn Bit 15 (Reset) oder Bit 12 (Autonegotiation Enable) im Basic Control Register unerwartet geändert wird. In Serien-Software sollte Schreibzugriff auf MDIO-Register hinter einer expliziten Diagnose-Session (UDS 0x27/0x10 o. ä.) liegen — unabhängig davon, welches Modul den Schreibzugriff physisch auslöst.

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:

BitNameBedeutung

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).

DiagnosezielWo 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)NameDiagnose-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 (LINK_STATUS-Feld: Init/WaitLink/Active)

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)

COMMUNICATION_STATUS (0x18) ist beim TJA1100 oft aussagekräftiger als das Standard-Basic-Status-Register, weil es den Zustand der internen Link-Zustandsmaschine direkt zeigt (INIT, WAIT_LINK, ACTIVE) statt nur ein latched Bit. Wer regelmäßig mit TJA1100-Boards arbeitet, sollte dieses Register in jedes Diagnoseskript aufnehmen.

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.

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) → 0x0231

Beide 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) = 1

Gefunden: 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 ausgewertet

Ein 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 = ACTIVE

Der 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

ThemaKernaussage 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. COMMUNICATION_STATUS)

AUTOSAR-API

EthTrcv ruft synchron EthIf_ReadMii/EthIf_WriteMii auf; EthIf reicht das intern an Eth_ReadMii/Eth_WriteMii weiter — kein Indication-Rückruf mehr seit R24-11

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