Dieser Post baut auf EthTrcv Teil 2 — API & Initialisierungssequenz auf. Dort ging es um EthTrcv_Init und den Zustandsautomaten zur Laufzeit. Bevor die API überhaupt aufgerufen werden kann, muss aber etwas anderes stimmen: die ARXML-Konfiguration, aus der der Konfigurationsgenerator die EthTrcv_ConfigType-Struktur erzeugt.

Alle Container- und Parameternamen in diesem Post sind 1:1 der offiziellen AUTOSAR CP SWS EthernetTransceiverDriver (Release R25-11) und der AUTOSAR CP SWS EthernetInterface (Release R25-11) entnommen — nicht aus dem Gedächtnis rekonstruiert. Wer selbst nachschlagen will: beide Dokumente sind öffentlich auf autosar.org verfügbar.

BSW-Stacks unterscheiden sich in Details (Vendor Extensions, Namensvarianten bei Post-Build-Konfiguration), aber die hier gezeigten Container- und Parameternamen sind die im Standard definierten. Wer in seinem konkreten Projekt andere Namen sieht, hat es entweder mit einer älteren AUTOSAR-Release oder mit einer Vendor-spezifischen Erweiterung zu tun.

EthTrcv im AUTOSAR-Konfigurationsmodell

Wie jedes Basic-Software-Modul wird EthTrcv über das AUTOSAR ECU-Configuration-Metamodell (ECUC) konfiguriert. Der Konfigurationsgenerator liest das ARXML und erzeugt daraus C-Strukturen — typischerweise EthTrcv_ConfigType mit einer Liste von Transceiver-Beschreibungen, eine pro physischem PHY.

Die reale Container-Hierarchie sieht so aus:

EcucModuleDef "EthTrcv"
│
├── EthTrcvGeneral (1x, modulweit — EINE Instanz für das gesamte Modul)
│   ├── EthTrcvIndex                     [0..255]  Instance-ID des Moduls selbst
│   ├── EthTrcvDevErrorDetect            [bool]
│   ├── EthTrcvMaxTrcvsSupported         [uint]
│   ├── EthTrcvWakeUpSupport             [enum]    gilt für ALLE Transceiver dieser Modulinstanz
│   ├── EthTrcvMainFunctionPeriod        [0..1]
│   ├── EthTrcv...Api (mehrere bool)     welche API-Funktionen generiert werden
│   └── EthTrcvEcucPartitionRef          [0..*]
│
└── EthTrcvConfigSet (1x)
    │
    └── EthTrcvConfig (1..*)             ── ein Container pro Transceiver/PHY
        ├── EthTrcvIdx                   [0..255]  Pflicht
        ├── EthTrcvSpeed                 [enum]    Pflicht
        ├── EthTrcvDuplexMode            [enum]    Pflicht
        ├── EthTrcvConnNeg               [enum]    Pflicht (Auto/Master/Slave/PLCA)
        ├── EthTrcvEnablePLCA            [bool]    Pflicht
        ├── EthTrcvPhysLayerType         [enum]    optional (0..1)
        ├── ... (MACsec-, PLCA-Detail-, OA-TC10-WakeUp-Parameter, optional)
        │
        ├── EthTrcvDemEventParameterRefs (0..1)
        │   └── ETHTRCV_E_ACCESS         ──► Ref auf DemEventParameter
        │
        ├── EthTrcvMgmtInterface (0..1)  ── CHOICE-Container: entweder/oder
        │   ├── EthTrcvMiiInterface (0..1)
        │   │   ├── EthTrcvCtrlIdx       [0..255]  welcher Eth-Controller für MII-Zugriff
        │   │   └── EthTrcvMiiIdx        [0..255]  Transceiver-Index für EthIf_ReadMii/EthIf_WriteMii
        │   └── EthTrcvSwitchInterface (0..1)
        │       ├── EthTrcvSwitchPortRef ──► EthSwtPort
        │       └── EthTrcvSwitchRef     ──► EthSwtConfig
        │
        └── EthTrcvWakeupMap (0..7)
            ├── EthTrcvWakeupReason      [enum]    z. B. ETHTRCV_WUR_PIN
            └── EthTrcvWakeupSourceRef   ──► EcuMWakeupSource

Jeder EthTrcvConfig-Container entspricht genau einem physischen PHY-Chip auf dem PCB. Ein Steuergerät mit drei Ethernet-Ports (z. B. Gateway mit 100BASE-T1-Backbone zu drei Domain-Controllern) hat entsprechend drei EthTrcvConfig-Instanzen — alle unterhalb derselben EthTrcvConfigSet.

EthTrcvGeneral existiert nur einmal pro Modulinstanz, nicht einmal pro Transceiver. Das hat eine wichtige Konsequenz: Parameter wie EthTrcvWakeUpSupport gelten für alle Transceiver, die über diese eine EthTrcv-Modulinstanz verwaltet werden. Braucht ein Steuergerät unterschiedliche WakeUp-Strategien für unterschiedliche PHYs, sind dafür mehrere EthTrcv-Modulinstanzen (mehrere BSW-Module, je nach Partitionierung) nötig — nicht mehrere Werte innerhalb eines EthTrcvConfig.

Pflichtparameter Schritt für Schritt

In EthTrcvConfig — dem Container pro Transceiver — sind fünf Parameter mit Multiplizität 1 (also zwingend) definiert.

EthTrcvIdx — Transceiver-Index

EthTrcvIdx ist der symbolische Index, unter dem der Transceiver in der API adressiert wird — jeder API-Aufruf wie EthTrcv_GetLinkState(TrcvIdx, …​) nimmt diesen Wert als ersten Parameter entgegen. Der Konfigurationsgenerator erzeugt dafür automatisch einen symbolischen Namen (withAuto = true in der Spezifikation).

EigenschaftBeschreibung

Typ

EcucIntegerParamDef, Wertebereich 0 .. 255

Bedeutung

Instanz-ID des konfigurierten Transceivers — eindeutig innerhalb der EthTrcv-Modulinstanz

Multiplizität

1 (Pflicht)

EthTrcvIdx ist nicht automatisch identisch mit dem Index des zugehörigen Eth-Controllers in EthIf oder Eth. Die Zuordnung PHY ↔ MAC-Controller läuft ausschließlich über die Referenzkette in EthIf (siehe unten) — niemals über gleiche Zahlenwerte "die zufällig passen".

Legt die Geschwindigkeit des Transceiver-Links in MBit/s fest. Ist EthTrcvConnNeg = TRCV_CONN_NEG_AUTO gesetzt, ist dieser Wert die für die Auto-Negotiation beworbene Maximalgeschwindigkeit.

Enum-LiteralBedeutung

TRCV_SPEED_10

10 MBit/s

TRCV_SPEED_100

100 MBit/s

TRCV_SPEED_1000

1000 MBit/s

TRCV_SPEED_2500

2500 MBit/s

TRCV_SPEED_5000

5000 MBit/s

TRCV_SPEED_10000

10000 MBit/s

EthTrcvDuplexMode — Duplex-Modus

Legt Voll- oder Halbduplex fest, sofern keine Auto-Negotiation läuft. Bei EthTrcvConnNeg = TRCV_CONN_NEG_AUTO wird dieser Wert ignoriert.

Enum-LiteralBedeutung

ETHTRCV_DUPLEX_MODE_FULL

Vollduplex

ETHTRCV_DUPLEX_MODE_HALF

Halbduplex

EthTrcvConnNeg — Verbindungsaushandlung

Legt fest, wie sich der Transceiver-Link einigt — inklusive Master/Slave-Rolle bei 100BASE-T1-artigen Single-Pair-PHYs.

Enum-LiteralBedeutung

TRCV_CONN_NEG_AUTO

Automatische Aushandlung

TRCV_CONN_NEG_MASTER

Fester Master (z. B. bei 100BASE-T1/1000BASE-T1)

TRCV_CONN_NEG_SLAVE

Fester Slave

TRCV_CONN_NEG_NONE

PLCA (Physical Layer Collision Avoidance, relevant bei 10BASE-T1S)

Ist EthTrcvEnablePLCA = TRUE, muss EthTrcvConnNeg = TRCV_CONN_NEG_NONE gesetzt sein. Ist EthTrcvPhysLayerType = TRCV_PHYS_LAYER_TYPE_10BASE_T1S und PLCA nicht aktiv, muss hier zwingend Master oder Slave konfiguriert werden — 10BASE-T1S kann sowohl mit PLCA als auch mit klassischem CSMA/CD-Medienzugriff betrieben werden.

EthTrcvEnablePLCA — Physical Layer Collision Avoidance

Boolescher Schalter für PLCA, relevant bei TRCV_PHYS_LAYER_TYPE_10BASE_T1S. Ist PLCA aktiviert, müssen zusätzlich die PLCA-Detailparameter (EthTrcvPhysLayerPlcaLocalNodeId, ..NodeCount, ..TransmitOpportunityTimer, ..MaxBurstCount, ..MaxBurstTimer) konfiguriert werden.

Optionale Parameter im Überblick

Über die fünf Pflichtparameter hinaus definiert EthTrcvConfig eine große Zahl optionaler (0..1) Parameter — unter anderem:

ParameterZweck

EthTrcvPhysLayerType

Physical-Layer-Typ des Links: TRCV_PHYS_LAYER_TYPE_100BASE_T1, _100BASE_TX, _1000BASE_T, _1000BASE_T1, _10BASE_T1S, _2500BASE_T1, _5000BASE_T1, _10000BASE_T1. Trotz der zentralen Bedeutung für automotive PHYs ist dieser Parameter laut Spezifikation optional — viele Stacks legen den Physical-Layer-Typ implizit über die gewählte Treibervariante fest.

EthTrcvMacLayerType / ..SubType / ..Speed

Baudrate und Typ auf MAC-Ebene, unabhängig vom Transceiver-Link

EthTrcvMacSecEnabled + EthTrcvMacSecBypass…​

MACsec-Aktivierung und Bypass-Listen (Ziel-MAC, EtherType, VLAN) für unverschlüsselten Verkehr

EthTrcvWakeupSleepOnDatalineEnabled + zugehörige Parameter

OA-TC10-konformes Sleep/WakeUp über die Datenleitung (100BASE-T1) — u. a. EthTrcvForceSleepEnabled, EthTrcvSleepModeExecutionDelay, EthTrcvSleepRequestNumberOfRepetitions, EthTrcvWakeupLocalEnabled, EthTrcvWakeupRemoteEnabled

EthTrcvWakeUpCallout

Name einer Callout-Funktion, nur gültig wenn EthTrcvWakeUpSupport (in EthTrcvGeneral!) nicht ETHTRCV_WAKEUP_NOT_SUPPORTED ist

EthTrcvIcuChannelRef

Referenz auf einen Icu-Kanal, falls WakeUp-Erkennung über einen Interrupt-Capture-Kanal läuft

EthTrcvConfigEcucPartitionRef

Ordnet diese konkrete Transceiver-Konfiguration einer ECUC-Partition zu

Das ist bewusst keine vollständige Liste — allein die MACsec- und PLCA-Parameter umfassen ein Dutzend weiterer optionaler Felder. Die vollständige Referenz liefert Kapitel 10.2.3 der SWS EthernetTransceiverDriver.

Fehlerreferenzierung: EthTrcvDemEventParameterRefs

Anders als man vielleicht erwartet, definiert der Standard hier nur ein einziges standardisiertes DEM-Event:

ParameterBedeutung

ETHTRCV_E_ACCESS

Referenz auf ein DemEventParameter, das gemeldet wird, wenn der Zugriff auf den Transceiver fehlschlägt ("Transceiver access failed")

Es gibt in der Spezifikation kein standardisiertes ETHTRCV_E_PHYDOWN-Event. Wer auf ein solches Event trifft, hat es mit einer Vendor-Erweiterung des BSW-Anbieters zu tun, nicht mit einem AUTOSAR-Standardparameter. Der Container kann durchaus um vendor-spezifische Referenzen erweitert werden — das ist im Standard ausdrücklich vorgesehen — aber ETHTRCV_E_ACCESS ist der einzige Name, auf den man sich stack-übergreifend verlassen kann.

MDIO- vs. Switch-Zugriff: EthTrcvMgmtInterface

Einer der am häufigsten missverstandenen Teile der Konfiguration: Es gibt keinen eigenständigen Parameter für eine MDIO-PHY-Adresse auf Ebene von EthTrcvConfig. Stattdessen wählt der Choice-Container EthTrcvMgmtInterface, wie der Transceiver überhaupt angesprochen wird:

Sub-ContainerBedeutung

EthTrcvMiiInterface

MII-Zugriff zwischen Ethernet-Controller und Transceiver. Ist dieser Container konfiguriert, ruft EthTrcv synchron EthIf_WriteMii / EthIf_ReadMii auf (aus EthIf.h); EthIf reicht den Aufruf laut Spezifikation intern an Eth_WriteMii/ Eth_ReadMii des zuständigen Eth-Treibers weiter — typisch bei extern angebundenem MAC+PHY.

EthTrcvSwitchInterface

Zugriff über einen Ethernet-Switch. Ist dieser Container konfiguriert, ruft EthTrcv stattdessen EthIf_SwitchPortReadTrcvRegister/EthIf_SwitchPortWriteTrcvRegister auf, die EthIf ihrerseits an EthSwt_ReadTrcvRegister/EthSwt_WriteTrcvRegister weiterreicht — es gibt in diesem Fall keinen direkten MDIO-Zugriff durch EthTrcv selbst.

EthTrcvMiiInterface enthält genau zwei Parameter:

ParameterBedeutung

EthTrcvCtrlIdx

Welcher Eth-Controller für den MII-Zugriff auf diesen Transceiver verwendet wird

EthTrcvMiiIdx

Transceiver-Index, der bei jedem EthIf_ReadMii/EthIf_WriteMii-Aufruf mitgegeben wird

Die eigentliche MDIO-PHY-Adresse (die 5-Bit-Hardwareadresse nach IEEE 802.3, per Pin-Strapping am Chip festgelegt) ist im EthTrcv-ECUC-Modell nicht als eigener Parameter modelliert. Sie ist Teil der Umsetzung des Eth-Treibers, an den EthIf den EthIf_ReadMii/EthIf_WriteMii-Aufruf weiterreicht — EthTrcvMiiIdx ist der Index, über den dieser Treiber intern die passende Hardwareadresse nachschlägt. Wo genau diese Zuordnung landet, ist vendor-spezifisch und nicht Teil des EthTrcv-Standards.

EthTrcvSwitchInterface referenziert stattdessen direkt Switch-Konfiguration:

ParameterBedeutung

EthTrcvSwitchPortRef

Referenz auf den EthSwtPort, an dem dieser Transceiver hängt

EthTrcvSwitchRef

Referenz auf die zugehörige EthSwtConfig

WakeUp-Zuordnung: EthTrcvWakeupMap

Bis zu sieben EthTrcvWakeupMap-Instanzen pro Transceiver ordnen einen WakeUp-Grund einer EcuM-WakeUp-Quelle zu:

ParameterBedeutung

EthTrcvWakeupReason

Einer von ETHTRCV_WUR_BUS, _GENERAL, _INTERNAL, _PIN, _POWER_ON, _RESET, _SYSERR

EthTrcvWakeupSourceRef

Referenz auf die passende EcuMWakeupSource

Mindestens eine EthTrcvWakeupMap-Instanz ist erforderlich, sobald EthTrcvWakeUpSupport (in EthTrcvGeneral) nicht ETHTRCV_WAKEUP_NOT_SUPPORTED ist.

Das Zusammenspiel mit EcuM, die WakeUp-Validierung und die Diagnose bei WakeUp-Problemen behandelt Teil 4 der Serie im Detail.

Referenzierung in EthIf

EthTrcv konfiguriert nur den Transceiver selbst. Die Verknüpfung zum MAC-Controller läuft ausschließlich über EthIf — und zwar über zwei Referenzschritte, nicht über einen direkten Verweis:

EthIf
│
├── EthIfConfigSet
│   ├── EthIfController (1..*)         ── ein Container pro Eth-Controller
│   │   ├── EthIfCtrlIdx
│   │   ├── EthIfCtrlMtu
│   │   ├── EthIfPhysControllerRef     ──► EthIfPhysController (Pflicht)
│   │   ├── EthIfEthTrcvRef (0..1)     ──► EthIfTransceiver      ★ Schritt 1
│   │   └── EthIfSwitchRefOrPortGroupRef (0..1) ──► EthIfSwitch | EthIfSwitchPortGroup
│   │
│   └── EthIfTransceiver (0..*)
│       ├── EthIfTransceiverIdx
│       ├── EthIfEthTrcvRef (0..1)     ──► EthTrcvConfig          ★ Schritt 2
│       ├── EthIfCanXLTrcvRef (0..1)   (Alternative: CAN-XL-Transceiver)
│       └── EthIfWEthTrcvRef (0..1)    (Alternative: Wireless-Ethernet-Transceiver)

EthIfController.EthIfEthTrcvRef zeigt nicht direkt auf EthTrcvConfig, sondern auf einen eigenständigen EthIfTransceiver-Container innerhalb von EthIf. Erst dessen eigenes EthIfEthTrcvRef (gleicher Parametername, andere ECUC-ID, anderer Elterncontainer) zeigt schließlich auf den echten EthTrcvConfig-Container im EthTrcv-Modul.

Der Doppelname ist kein Tippfehler in diesem Post: In der offiziellen Spezifikation heißt der Parameter tatsächlich in beiden Containern EthIfEthTrcvRef (ECUC_EthIf_00028 in EthIfController, ECUC_EthIf_00044 in EthIfTransceiver) — nur mit unterschiedlichem Referenzziel. EthIfTransceiver existiert außerdem nicht nur für Ethernet: EthIfCanXLTrcvRef und EthIfWEthTrcvRef sind die Alternativen für CAN-XL- bzw. Wireless-Ethernet-Transceiver — die drei Referenzen schließen sich laut Spezifikation gegenseitig aus.

Der Grund für diesen Umweg über EthIfTransceiver statt eines direkten EthIfController → EthTrcvConfig-Verweises: Ein EthIfTransceiver-Container kann unabhängig von einem konkreten Controller stehen und trägt eigene Parameter wie EthIfQualifiedUnexpectedLinkDownTime — relevant, wenn das Steuergerät laut EthTrcvActAsSlavePassiveEnabled als passiver Kommunikations-Slave agiert.

Vollständiges ARXML-Beispiel

Das folgende Beispiel zeigt eine minimale, aber realistische Konfiguration für einen einzelnen 100BASE-T1-PHY im MII-Modus, inklusive der zweistufigen EthIf-Referenzierung. Es ist zur Veranschaulichung vereinfacht (nicht alle Pflicht-Metainformationen wie VARIANT-Angaben sind ausformuliert), folgt aber den realen Container- und Parameternamen aus der Spezifikation.

<?xml version="1.0" encoding="UTF-8"?>
<AUTOSAR xmlns="http://autosar.org/schema/r4.0">
  <AR-PACKAGES>
    <AR-PACKAGE>
      <SHORT-NAME>EcuC</SHORT-NAME>
      <ELEMENTS>

        <!-- ================= EthTrcv ================= -->
        <ECUC-MODULE-CONFIGURATION-VALUES>
          <SHORT-NAME>EthTrcv</SHORT-NAME>
          <DEFINITION-REF DEST="ECUC-MODULE-DEF">/AUTOSAR/EthTrcv</DEFINITION-REF>

          <CONTAINERS>

            <!-- Modulweite Konfiguration -->
            <ECUC-CONTAINER-VALUE>
              <SHORT-NAME>EthTrcvGeneral</SHORT-NAME>
              <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">
                /AUTOSAR/EthTrcv/EthTrcvGeneral
              </DEFINITION-REF>
              <PARAMETER-VALUES>
                <ECUC-NUMERICAL-PARAM-VALUE>
                  <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">
                    /AUTOSAR/EthTrcv/EthTrcvGeneral/EthTrcvIndex
                  </DEFINITION-REF>
                  <VALUE>0</VALUE>
                </ECUC-NUMERICAL-PARAM-VALUE>
                <ECUC-NUMERICAL-PARAM-VALUE>
                  <DEFINITION-REF DEST="ECUC-BOOLEAN-PARAM-DEF">
                    /AUTOSAR/EthTrcv/EthTrcvGeneral/EthTrcvDevErrorDetect
                  </DEFINITION-REF>
                  <VALUE>true</VALUE>
                </ECUC-NUMERICAL-PARAM-VALUE>
                <!-- Gilt für ALLE EthTrcvConfig-Instanzen dieser Modulinstanz -->
                <ECUC-TEXTUAL-PARAM-VALUE>
                  <DEFINITION-REF DEST="ECUC-ENUMERATION-PARAM-DEF">
                    /AUTOSAR/EthTrcv/EthTrcvGeneral/EthTrcvWakeUpSupport
                  </DEFINITION-REF>
                  <VALUE>ETHTRCV_WAKEUP_BY_POLLING</VALUE>
                </ECUC-TEXTUAL-PARAM-VALUE>
              </PARAMETER-VALUES>
            </ECUC-CONTAINER-VALUE>

            <!-- Ein Transceiver == ein PHY-Chip auf dem PCB -->
            <ECUC-CONTAINER-VALUE>
              <SHORT-NAME>EthTrcvConfigSet</SHORT-NAME>
              <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">
                /AUTOSAR/EthTrcv/EthTrcvConfigSet
              </DEFINITION-REF>

              <SUB-CONTAINERS>
                <ECUC-CONTAINER-VALUE>
                  <SHORT-NAME>EthTrcvConfig_Gateway_Port0</SHORT-NAME>
                  <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">
                    /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig
                  </DEFINITION-REF>

                  <PARAMETER-VALUES>

                    <!-- Pflicht 1: Transceiver-Index -->
                    <ECUC-NUMERICAL-PARAM-VALUE>
                      <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">
                        /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvIdx
                      </DEFINITION-REF>
                      <VALUE>0</VALUE>
                    </ECUC-NUMERICAL-PARAM-VALUE>

                    <!-- Pflicht 2: Speed -->
                    <ECUC-TEXTUAL-PARAM-VALUE>
                      <DEFINITION-REF DEST="ECUC-ENUMERATION-PARAM-DEF">
                        /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvSpeed
                      </DEFINITION-REF>
                      <VALUE>TRCV_SPEED_100</VALUE>
                    </ECUC-TEXTUAL-PARAM-VALUE>

                    <!-- Pflicht 3: Duplex -->
                    <ECUC-TEXTUAL-PARAM-VALUE>
                      <DEFINITION-REF DEST="ECUC-ENUMERATION-PARAM-DEF">
                        /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvDuplexMode
                      </DEFINITION-REF>
                      <VALUE>ETHTRCV_DUPLEX_MODE_FULL</VALUE>
                    </ECUC-TEXTUAL-PARAM-VALUE>

                    <!-- Pflicht 4: Verbindungsaushandlung -- 100BASE-T1 Master -->
                    <ECUC-TEXTUAL-PARAM-VALUE>
                      <DEFINITION-REF DEST="ECUC-ENUMERATION-PARAM-DEF">
                        /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvConnNeg
                      </DEFINITION-REF>
                      <VALUE>TRCV_CONN_NEG_MASTER</VALUE>
                    </ECUC-TEXTUAL-PARAM-VALUE>

                    <!-- Pflicht 5: PLCA deaktiviert (100BASE-T1, nicht 10BASE-T1S) -->
                    <ECUC-NUMERICAL-PARAM-VALUE>
                      <DEFINITION-REF DEST="ECUC-BOOLEAN-PARAM-DEF">
                        /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvEnablePLCA
                      </DEFINITION-REF>
                      <VALUE>false</VALUE>
                    </ECUC-NUMERICAL-PARAM-VALUE>

                    <!-- Optional, aber praxisrelevant: Physical-Layer-Typ -->
                    <ECUC-TEXTUAL-PARAM-VALUE>
                      <DEFINITION-REF DEST="ECUC-ENUMERATION-PARAM-DEF">
                        /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvPhysLayerType
                      </DEFINITION-REF>
                      <VALUE>TRCV_PHYS_LAYER_TYPE_100BASE_T1</VALUE>
                    </ECUC-TEXTUAL-PARAM-VALUE>

                  </PARAMETER-VALUES>

                  <SUB-CONTAINERS>

                    <!-- DEM-Fehlerreferenzierung -->
                    <ECUC-CONTAINER-VALUE>
                      <SHORT-NAME>EthTrcvDemEventParameterRefs</SHORT-NAME>
                      <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">
                        /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvDemEventParameterRefs
                      </DEFINITION-REF>
                      <REFERENCE-VALUES>
                        <ECUC-REFERENCE-VALUE>
                          <DEFINITION-REF DEST="ECUC-REFERENCE-DEF">
                            /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvDemEventParameterRefs/ETHTRCV_E_ACCESS
                          </DEFINITION-REF>
                          <VALUE-REF DEST="DEM-EVENT-PARAMETER">/Dem/DemConfigSet/DEM_EVENT_ETHTRCV_ACCESS</VALUE-REF>
                        </ECUC-REFERENCE-VALUE>
                      </REFERENCE-VALUES>
                    </ECUC-CONTAINER-VALUE>

                    <!-- Choice: MII-Zugriff (Alternative wäre EthTrcvSwitchInterface) -->
                    <ECUC-CONTAINER-VALUE>
                      <SHORT-NAME>EthTrcvMgmtInterface</SHORT-NAME>
                      <DEFINITION-REF DEST="ECUC-CHOICE-CONTAINER-DEF">
                        /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvMgmtInterface
                      </DEFINITION-REF>
                      <SUB-CONTAINERS>
                        <ECUC-CONTAINER-VALUE>
                          <SHORT-NAME>EthTrcvMiiInterface</SHORT-NAME>
                          <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">
                            /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvMgmtInterface/EthTrcvMiiInterface
                          </DEFINITION-REF>
                          <PARAMETER-VALUES>
                            <ECUC-NUMERICAL-PARAM-VALUE>
                              <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">
                                /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvMgmtInterface/EthTrcvMiiInterface/EthTrcvCtrlIdx
                              </DEFINITION-REF>
                              <VALUE>0</VALUE>
                            </ECUC-NUMERICAL-PARAM-VALUE>
                            <ECUC-NUMERICAL-PARAM-VALUE>
                              <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">
                                /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvMgmtInterface/EthTrcvMiiInterface/EthTrcvMiiIdx
                              </DEFINITION-REF>
                              <VALUE>1</VALUE>
                            </ECUC-NUMERICAL-PARAM-VALUE>
                          </PARAMETER-VALUES>
                        </ECUC-CONTAINER-VALUE>
                      </SUB-CONTAINERS>
                    </ECUC-CONTAINER-VALUE>

                    <!-- WakeUp-Zuordnung: Pin-WakeUp -> EcuM-Quelle -->
                    <ECUC-CONTAINER-VALUE>
                      <SHORT-NAME>EthTrcvWakeupMap_Pin</SHORT-NAME>
                      <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">
                        /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvWakeupMap
                      </DEFINITION-REF>
                      <PARAMETER-VALUES>
                        <ECUC-TEXTUAL-PARAM-VALUE>
                          <DEFINITION-REF DEST="ECUC-ENUMERATION-PARAM-DEF">
                            /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvWakeupMap/EthTrcvWakeupReason
                          </DEFINITION-REF>
                          <VALUE>ETHTRCV_WUR_PIN</VALUE>
                        </ECUC-TEXTUAL-PARAM-VALUE>
                      </PARAMETER-VALUES>
                      <REFERENCE-VALUES>
                        <ECUC-REFERENCE-VALUE>
                          <DEFINITION-REF DEST="ECUC-REFERENCE-DEF">
                            /AUTOSAR/EthTrcv/EthTrcvConfigSet/EthTrcvConfig/EthTrcvWakeupMap/EthTrcvWakeupSourceRef
                          </DEFINITION-REF>
                          <VALUE-REF DEST="ECUC-CONTAINER-VALUE">/EcuC/EcuM/EcuMConfiguration/EcuMWakeupSource_EthTrcv0</VALUE-REF>
                        </ECUC-REFERENCE-VALUE>
                      </REFERENCE-VALUES>
                    </ECUC-CONTAINER-VALUE>

                  </SUB-CONTAINERS>

                </ECUC-CONTAINER-VALUE>
              </SUB-CONTAINERS>
            </ECUC-CONTAINER-VALUE>

          </CONTAINERS>
        </ECUC-MODULE-CONFIGURATION-VALUES>

        <!-- ================= EthIf ================= -->
        <ECUC-MODULE-CONFIGURATION-VALUES>
          <SHORT-NAME>EthIf</SHORT-NAME>
          <DEFINITION-REF DEST="ECUC-MODULE-DEF">/AUTOSAR/EthIf</DEFINITION-REF>

          <CONTAINERS>
            <ECUC-CONTAINER-VALUE>
              <SHORT-NAME>EthIfConfigSet</SHORT-NAME>
              <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">
                /AUTOSAR/EthIf/EthIfConfigSet
              </DEFINITION-REF>

              <SUB-CONTAINERS>

                <!-- Schritt 1: Controller -> EthIfTransceiver -->
                <ECUC-CONTAINER-VALUE>
                  <SHORT-NAME>EthIfController_Port0</SHORT-NAME>
                  <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">
                    /AUTOSAR/EthIf/EthIfConfigSet/EthIfController
                  </DEFINITION-REF>

                  <PARAMETER-VALUES>
                    <ECUC-NUMERICAL-PARAM-VALUE>
                      <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">
                        /AUTOSAR/EthIf/EthIfConfigSet/EthIfController/EthIfCtrlIdx
                      </DEFINITION-REF>
                      <VALUE>0</VALUE>
                    </ECUC-NUMERICAL-PARAM-VALUE>
                    <ECUC-NUMERICAL-PARAM-VALUE>
                      <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">
                        /AUTOSAR/EthIf/EthIfConfigSet/EthIfController/EthIfCtrlMtu
                      </DEFINITION-REF>
                      <VALUE>1500</VALUE>
                    </ECUC-NUMERICAL-PARAM-VALUE>
                  </PARAMETER-VALUES>

                  <REFERENCE-VALUES>
                    <ECUC-REFERENCE-VALUE>
                      <DEFINITION-REF DEST="ECUC-REFERENCE-DEF">
                        /AUTOSAR/EthIf/EthIfConfigSet/EthIfController/EthIfPhysControllerRef
                      </DEFINITION-REF>
                      <VALUE-REF DEST="ECUC-CONTAINER-VALUE">/EcuC/EthIf/EthIfConfigSet/EthIfPhysController_Port0</VALUE-REF>
                    </ECUC-REFERENCE-VALUE>
                    <!-- Schritt 1: zeigt auf EthIfTransceiver, NICHT direkt auf EthTrcvConfig -->
                    <ECUC-REFERENCE-VALUE>
                      <DEFINITION-REF DEST="ECUC-REFERENCE-DEF">
                        /AUTOSAR/EthIf/EthIfConfigSet/EthIfController/EthIfEthTrcvRef
                      </DEFINITION-REF>
                      <VALUE-REF DEST="ECUC-CONTAINER-VALUE">/EcuC/EthIf/EthIfConfigSet/EthIfTransceiver_Port0</VALUE-REF>
                    </ECUC-REFERENCE-VALUE>
                  </REFERENCE-VALUES>

                </ECUC-CONTAINER-VALUE>

                <!-- Schritt 2: EthIfTransceiver -> EthTrcvConfig -->
                <ECUC-CONTAINER-VALUE>
                  <SHORT-NAME>EthIfTransceiver_Port0</SHORT-NAME>
                  <DEFINITION-REF DEST="ECUC-PARAM-CONF-CONTAINER-DEF">
                    /AUTOSAR/EthIf/EthIfConfigSet/EthIfTransceiver
                  </DEFINITION-REF>

                  <PARAMETER-VALUES>
                    <ECUC-NUMERICAL-PARAM-VALUE>
                      <DEFINITION-REF DEST="ECUC-INTEGER-PARAM-DEF">
                        /AUTOSAR/EthIf/EthIfConfigSet/EthIfTransceiver/EthIfTransceiverIdx
                      </DEFINITION-REF>
                      <VALUE>0</VALUE>
                    </ECUC-NUMERICAL-PARAM-VALUE>
                  </PARAMETER-VALUES>

                  <REFERENCE-VALUES>
                    <!-- Die eigentliche Verknüpfung zum EthTrcv-Modul -->
                    <ECUC-REFERENCE-VALUE>
                      <DEFINITION-REF DEST="ECUC-REFERENCE-DEF">
                        /AUTOSAR/EthIf/EthIfConfigSet/EthIfTransceiver/EthIfEthTrcvRef
                      </DEFINITION-REF>
                      <VALUE-REF DEST="ECUC-CONTAINER-VALUE">
                        /EcuC/EthTrcv/EthTrcvConfigSet/EthTrcvConfig_Gateway_Port0
                      </VALUE-REF>
                    </ECUC-REFERENCE-VALUE>
                  </REFERENCE-VALUES>

                </ECUC-CONTAINER-VALUE>

              </SUB-CONTAINERS>
            </ECUC-CONTAINER-VALUE>
          </CONTAINERS>
        </ECUC-MODULE-CONFIGURATION-VALUES>

      </ELEMENTS>
    </AR-PACKAGE>
  </AR-PACKAGES>
</AUTOSAR>

Jeder VALUE-REF zeigt auf den vollen SHORT-NAME-Pfad des Zielcontainers — nicht auf den Wert von EthTrcvIdx oder EthIfCtrlIdx. Das ist ein häufiger Denkfehler bei Entwicklern, die aus der reinen C-API-Welt kommen: im ARXML sind Referenzen Pfade, keine Zahlen. Und wie das Beispiel zeigt, braucht die Verknüpfung EthIf ↔ EthTrcv zwei solcher Referenzen, nicht eine.

Typische Konfigurationsfehler

FehlerSymptomUrsache

Falsche EthTrcvMiiIdx/EthTrcvCtrlIdx

EthTrcv_Init läuft durch, aber EthTrcv_GetLinkState liefert dauerhaft ETHTRCV_LINK_STATE_DOWN; EthIf_ReadMii-Aufrufe adressieren den falschen PHY

Werte weichen von der tatsächlichen Verdrahtung/Board-Variante ab, oder Kopierfehler aus einer anderen Konfiguration

EthTrcvConnNeg inkonsistent zur Gegenseite

Bei 100BASE-T1: kein Link, weil beide Seiten Master oder beide Slave sind

Fehlende Abstimmung zwischen den EthTrcvConfig-Instanzen der beiden Kommunikationspartner — siehe auch Master/Slave-Post

Nur EthIfController.EthIfEthTrcvRef gesetzt, EthIfTransceiver.EthIfEthTrcvRef fehlt

EthIf initialisiert den Controller, aber die Verbindung zum eigentlichen EthTrcvConfig fehlt — Transceiver bleibt unkonfiguriert

Die zweistufige Referenzkette wurde nur zur Hälfte nachgezogen — ein klassischer Fehler, wenn man den (in vielen Diagrammen vereinfachten) direkten Verweis erwartet

EthTrcvWakeUpSupport (in EthTrcvGeneral) inkonsistent zur Hardware

EcuM erwartet WakeUp-Fähigkeit für alle Transceiver der Modulinstanz, die ein einzelner verbauter PHY gar nicht hat (oder umgekehrt)

Übersehen, dass dieser Parameter modulweit und nicht pro Transceiver gilt

Doppelt vergebene EthTrcvIdx

Konfigurationsgenerator meldet Fehler, oder — schlimmer — akzeptiert es und der erste passende Eintrag "gewinnt" zur Laufzeit

Manuelles Anlegen einer neuen EthTrcvConfig-Instanz ohne Abgleich mit bestehenden Indizes

Keiner dieser Fehler führt zu einem Compile- oder Link-Fehler. Alle zeigen sich erst zur Laufzeit — häufig erst auf dem realen Board, nicht im HIL-Test mit Ersatzhardware. Ein Review der ARXML-Werte gegen das PHY-Datenblatt und den Schaltplan ist deshalb kein optionaler Schritt.

Serie

TeilTitelStatus

1

EthTrcv Teil 1 — Grundlagen & Einordnung

✅ erschienen

2

EthTrcv Teil 2 — API & Initialisierungssequenz

✅ erschienen

3

EthTrcv Teil 3 — ARXML-Konfiguration in der Praxis

📍 dieser Post

4

EthTrcv Teil 4 — WakeUp-Handling & Diagnose

⏭ nächster Teil

Zusammenfassung

ThemaKernaussage für die Praxis

Container-Struktur

Ein EthTrcvConfig-Container pro physischem PHY, gebündelt in EthTrcvConfigSet; EthTrcvGeneral existiert dagegen nur einmal pro Modulinstanz

Pflichtparameter

EthTrcvIdx, EthTrcvSpeed, EthTrcvDuplexMode, EthTrcvConnNeg, EthTrcvEnablePLCA — es gibt kein EthTrcvBusIdx und kein EthTrcvPhyAddress im Standard

MDIO-/Switch-Zugriff

Läuft über den Choice-Container EthTrcvMgmtInterface (EthTrcvMiiInterface mit EthTrcvCtrlIdx/EthTrcvMiiIdx, oder EthTrcvSwitchInterface) — keine eigene PHY-Adresse auf EthTrcv-Ebene

EthTrcvWakeUpSupport

Liegt in EthTrcvGeneral und gilt für alle Transceiver der Modulinstanz — nicht pro EthTrcvConfig

EthIf-Referenzierung

Zweistufig: EthIfController.EthIfEthTrcvRefEthIfTransceiver, dessen eigenes EthIfEthTrcvRefEthTrcvConfig

Fehlerbild

Nahezu alle Konfigurationsfehler in diesem Modul zeigen sich erst zur Laufzeit auf realer Hardware — nie beim Compilieren