This post builds on EthTrcv Part 2 — API & Initialization Sequence. That post covered EthTrcv_Init and the runtime state machine. But before the API can even be called, something else has to be right: the ARXML configuration from which the configuration generator produces the EthTrcv_ConfigType structure.

Every container and parameter name in this post is taken 1:1 from the official AUTOSAR CP SWS EthernetTransceiverDriver (Release R25-11) and the AUTOSAR CP SWS EthernetInterface (Release R25-11) — not reconstructed from memory. Both documents are publicly available on autosar.org if you want to verify them yourself.

BSW stacks differ in details (vendor extensions, naming variants for post-build configuration), but the container and parameter names shown here are the ones defined in the standard. If your concrete project shows different names, you’re either looking at an older AUTOSAR release or a vendor-specific extension.

EthTrcv in the AUTOSAR Configuration Model

Like every Basic Software module, EthTrcv is configured through the AUTOSAR ECU Configuration metamodel (ECUC). The configuration generator reads the ARXML and produces C structures from it — typically EthTrcv_ConfigType with a list of transceiver descriptions, one per physical PHY.

The real container hierarchy looks like this:

EcucModuleDef "EthTrcv"
│
├── EthTrcvGeneral (1x, module-wide — ONE instance for the whole module)
│   ├── EthTrcvIndex                     [0..255]  Instance ID of the module itself
│   ├── EthTrcvDevErrorDetect            [bool]
│   ├── EthTrcvMaxTrcvsSupported         [uint]
│   ├── EthTrcvWakeUpSupport             [enum]    applies to ALL transceivers of this module instance
│   ├── EthTrcvMainFunctionPeriod        [0..1]
│   ├── EthTrcv...Api (several bool)     which API functions get generated
│   └── EthTrcvEcucPartitionRef          [0..*]
│
└── EthTrcvConfigSet (1x)
    │
    └── EthTrcvConfig (1..*)             ── one container per transceiver/PHY
        ├── EthTrcvIdx                   [0..255]  mandatory
        ├── EthTrcvSpeed                 [enum]    mandatory
        ├── EthTrcvDuplexMode            [enum]    mandatory
        ├── EthTrcvConnNeg               [enum]    mandatory (Auto/Master/Slave/PLCA)
        ├── EthTrcvEnablePLCA            [bool]    mandatory
        ├── EthTrcvPhysLayerType         [enum]    optional (0..1)
        ├── ... (MACsec, PLCA detail, OA TC10 WakeUp parameters, optional)
        │
        ├── EthTrcvDemEventParameterRefs (0..1)
        │   └── ETHTRCV_E_ACCESS         ──► ref to DemEventParameter
        │
        ├── EthTrcvMgmtInterface (0..1)  ── CHOICE container: either/or
        │   ├── EthTrcvMiiInterface (0..1)
        │   │   ├── EthTrcvCtrlIdx       [0..255]  which Eth controller for MII access
        │   │   └── EthTrcvMiiIdx        [0..255]  transceiver index for EthIf_ReadMii/EthIf_WriteMii
        │   └── EthTrcvSwitchInterface (0..1)
        │       ├── EthTrcvSwitchPortRef ──► EthSwtPort
        │       └── EthTrcvSwitchRef     ──► EthSwtConfig
        │
        └── EthTrcvWakeupMap (0..7)
            ├── EthTrcvWakeupReason      [enum]    e.g. ETHTRCV_WUR_PIN
            └── EthTrcvWakeupSourceRef   ──► EcuMWakeupSource

Each EthTrcvConfig container corresponds to exactly one physical PHY chip on the PCB. An ECU with three Ethernet ports (e.g. a gateway with a 100BASE-T1 backbone to three domain controllers) accordingly has three EthTrcvConfig instances — all underneath the same EthTrcvConfigSet.

EthTrcvGeneral only exists once per module instance, not once per transceiver. That has an important consequence: parameters like EthTrcvWakeUpSupport apply to all transceivers managed by that one EthTrcv module instance. If an ECU needs different WakeUp strategies for different PHYs, that requires multiple EthTrcv module instances (multiple BSW modules, depending on partitioning) — not multiple values within a single EthTrcvConfig.

Mandatory Parameters Step by Step

EthTrcvConfig — the per-transceiver container — defines five parameters with multiplicity 1 (i.e. mandatory).

EthTrcvIdx — Transceiver Index

EthTrcvIdx is the symbolic index under which the transceiver is addressed in the API — every API call like EthTrcv_GetLinkState(TrcvIdx, …​) takes this value as its first parameter. The configuration generator automatically produces a symbolic name for it (withAuto = true in the spec).

PropertyDescription

Type

EcucIntegerParamDef, range 0 .. 255

Meaning

Instance ID of the configured transceiver — unique within the EthTrcv module instance

Multiplicity

1 (mandatory)

EthTrcvIdx is not automatically identical to the index of the associated Eth controller in EthIf or Eth. The mapping between PHY and MAC controller runs exclusively through the EthIf reference chain (see below) — never through matching numeric values "that happen to line up".

Specifies the transceiver link speed in Mbit/s. If EthTrcvConnNeg = TRCV_CONN_NEG_AUTO is set, this is the maximum speed advertised for Auto-Negotiation.

Enum literalMeaning

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 Mode

Specifies full or half duplex, provided Auto-Negotiation is not running. If EthTrcvConnNeg = TRCV_CONN_NEG_AUTO, this value is ignored.

Enum literalMeaning

ETHTRCV_DUPLEX_MODE_FULL

Full duplex

ETHTRCV_DUPLEX_MODE_HALF

Half duplex

EthTrcvConnNeg — Connection Negotiation

Specifies how the transceiver link negotiates — including the Master/Slave role for 100BASE-T1-style single-pair PHYs.

Enum literalMeaning

TRCV_CONN_NEG_AUTO

Automatic negotiation

TRCV_CONN_NEG_MASTER

Fixed master (e.g. for 100BASE-T1/1000BASE-T1)

TRCV_CONN_NEG_SLAVE

Fixed slave

TRCV_CONN_NEG_NONE

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

If EthTrcvEnablePLCA = TRUE, EthTrcvConnNeg must be set to TRCV_CONN_NEG_NONE. If EthTrcvPhysLayerType = TRCV_PHYS_LAYER_TYPE_10BASE_T1S and PLCA is not active, master or slave must be configured here — 10BASE-T1S can run with either PLCA or classic CSMA/CD media access.

EthTrcvEnablePLCA — Physical Layer Collision Avoidance

Boolean switch for PLCA, relevant for TRCV_PHYS_LAYER_TYPE_10BASE_T1S. If PLCA is enabled, the PLCA detail parameters (EthTrcvPhysLayerPlcaLocalNodeId, ..NodeCount, ..TransmitOpportunityTimer, ..MaxBurstCount, ..MaxBurstTimer) must also be configured.

Optional Parameters at a Glance

Beyond the five mandatory parameters, EthTrcvConfig defines a large number of optional (0..1) parameters — among them:

ParameterPurpose

EthTrcvPhysLayerType

Physical layer type of the link: TRCV_PHYS_LAYER_TYPE_100BASE_T1, _100BASE_TX, _1000BASE_T, _1000BASE_T1, _10BASE_T1S, _2500BASE_T1, _5000BASE_T1, _10000BASE_T1. Despite its central importance for automotive PHYs, this parameter is optional per the spec — many stacks determine the physical layer type implicitly through the chosen driver variant.

EthTrcvMacLayerType / ..SubType / ..Speed

Baud rate and type at the MAC level, independent of the transceiver link

EthTrcvMacSecEnabled + EthTrcvMacSecBypass…​

MACsec activation and bypass lists (destination MAC, EtherType, VLAN) for unencrypted traffic

EthTrcvWakeupSleepOnDatalineEnabled + related parameters

OA TC10-compliant sleep/wakeup over the data line (100BASE-T1) — including EthTrcvForceSleepEnabled, EthTrcvSleepModeExecutionDelay, EthTrcvSleepRequestNumberOfRepetitions, EthTrcvWakeupLocalEnabled, EthTrcvWakeupRemoteEnabled

EthTrcvWakeUpCallout

Name of a callout function, only valid if EthTrcvWakeUpSupport (in EthTrcvGeneral!) is not ETHTRCV_WAKEUP_NOT_SUPPORTED

EthTrcvIcuChannelRef

Reference to an Icu channel, if wakeup detection runs via an interrupt-capture channel

EthTrcvConfigEcucPartitionRef

Assigns this specific transceiver configuration to an ECUC partition

This is deliberately not a complete list — the MACsec and PLCA parameters alone add another dozen optional fields. The full reference is chapter 10.2.3 of the SWS EthernetTransceiverDriver.

Error Referencing: EthTrcvDemEventParameterRefs

Contrary to what one might expect, the spec only defines one standardized DEM event here:

ParameterMeaning

ETHTRCV_E_ACCESS

Reference to a DemEventParameter reported when access to the transceiver fails ("Transceiver access failed")

There is no standardized ETHTRCV_E_PHYDOWN event in the specification. If you come across one, you’re looking at a vendor extension of the BSW supplier, not an AUTOSAR standard parameter. The container can certainly be extended with vendor-specific references — the standard explicitly allows for that — but ETHTRCV_E_ACCESS is the only name you can rely on across stacks.

MDIO vs. Switch Access: EthTrcvMgmtInterface

One of the most commonly misunderstood parts of the configuration: there is no standalone MDIO PHY address parameter at the EthTrcvConfig level. Instead, the choice container EthTrcvMgmtInterface selects how the transceiver is addressed at all:

Sub-containerMeaning

EthTrcvMiiInterface

MII access between the Ethernet controller and the transceiver. If this container is configured, EthTrcv synchronously calls EthIf_WriteMii / EthIf_ReadMii (from EthIf.h); per the spec, EthIf forwards the call internally to Eth_WriteMii/Eth_ReadMii of the responsible Eth driver — typical for an externally attached MAC+PHY.

EthTrcvSwitchInterface

Access through an Ethernet switch. If this container is configured, EthTrcv instead calls EthIf_SwitchPortReadTrcvRegister/ EthIf_SwitchPortWriteTrcvRegister, which EthIf forwards to EthSwt_ReadTrcvRegister/EthSwt_WriteTrcvRegister — in this case there is no direct MDIO access by EthTrcv at all.

EthTrcvMiiInterface contains exactly two parameters:

ParameterMeaning

EthTrcvCtrlIdx

Which Eth controller is used for MII access to this transceiver

EthTrcvMiiIdx

Transceiver index passed along with every EthIf_ReadMii/EthIf_WriteMii call

The actual MDIO PHY address (the 5-bit hardware address per IEEE 802.3, set via pin strapping on the chip) is not modeled as its own parameter in the EthTrcv ECUC model. It’s part of how the Eth driver — the one EthIf forwards the EthIf_ReadMii/EthIf_WriteMii call to — implements register access; EthTrcvMiiIdx is the index that driver uses internally to look up the matching hardware address. Exactly where that mapping lives is vendor-specific and not part of the EthTrcv standard.

EthTrcvSwitchInterface instead references switch configuration directly:

ParameterMeaning

EthTrcvSwitchPortRef

Reference to the EthSwtPort this transceiver is attached to

EthTrcvSwitchRef

Reference to the matching EthSwtConfig

WakeUp Mapping: EthTrcvWakeupMap

Up to seven EthTrcvWakeupMap instances per transceiver map a wakeup reason to an EcuM wakeup source:

ParameterMeaning

EthTrcvWakeupReason

One of ETHTRCV_WUR_BUS, _GENERAL, _INTERNAL, _PIN, _POWER_ON, _RESET, _SYSERR

EthTrcvWakeupSourceRef

Reference to the matching EcuMWakeupSource

At least one EthTrcvWakeupMap instance is required as soon as EthTrcvWakeUpSupport (in EthTrcvGeneral) is not ETHTRCV_WAKEUP_NOT_SUPPORTED.

The interplay with EcuM, wakeup validation, and diagnosing wakeup problems are covered in detail in Part 4 of the series.

Referencing in EthIf

EthTrcv only configures the transceiver itself. The link to the MAC controller runs exclusively through EthIf — and through two reference hops, not a direct one:

EthIf
│
├── EthIfConfigSet
│   ├── EthIfController (1..*)         ── one container per Eth controller
│   │   ├── EthIfCtrlIdx
│   │   ├── EthIfCtrlMtu
│   │   ├── EthIfPhysControllerRef     ──► EthIfPhysController (mandatory)
│   │   ├── EthIfEthTrcvRef (0..1)     ──► EthIfTransceiver       ★ Step 1
│   │   └── EthIfSwitchRefOrPortGroupRef (0..1) ──► EthIfSwitch | EthIfSwitchPortGroup
│   │
│   └── EthIfTransceiver (0..*)
│       ├── EthIfTransceiverIdx
│       ├── EthIfEthTrcvRef (0..1)     ──► EthTrcvConfig           ★ Step 2
│       ├── EthIfCanXLTrcvRef (0..1)   (alternative: CAN XL transceiver)
│       └── EthIfWEthTrcvRef (0..1)    (alternative: wireless Ethernet transceiver)

EthIfController.EthIfEthTrcvRef does not point directly at EthTrcvConfig — it points at a standalone EthIfTransceiver container inside EthIf. Only that container’s own EthIfEthTrcvRef (same parameter name, different ECUC ID, different parent container) finally points at the real EthTrcvConfig container in the EthTrcv module.

The duplicate name is not a typo in this post: in the official spec, the parameter really is called EthIfEthTrcvRef in both containers (ECUC_EthIf_00028 in EthIfController, ECUC_EthIf_00044 in EthIfTransceiver) — just with a different reference target. EthIfTransceiver also isn’t Ethernet-only: EthIfCanXLTrcvRef and EthIfWEthTrcvRef are the alternatives for CAN XL and wireless Ethernet transceivers — per the spec, the three references are mutually exclusive.

The reason for this detour through EthIfTransceiver instead of a direct EthIfController → EthTrcvConfig link: an EthIfTransceiver container can stand independently of any particular controller and carries its own parameters like EthIfQualifiedUnexpectedLinkDownTime — relevant when the ECU acts as a passive communication slave per EthTrcvActAsSlavePassiveEnabled.

Complete ARXML Example

The following example shows a minimal but realistic configuration for a single 100BASE-T1 PHY in MII mode, including the two-step EthIf referencing. It’s simplified for illustration (not every mandatory metadata field like VARIANT annotations is spelled out), but follows the real container and parameter names from the spec.

<?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>

            <!-- Module-wide configuration -->
            <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>
                <!-- Applies to ALL EthTrcvConfig instances of this module instance -->
                <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>

            <!-- One transceiver == one PHY chip on the 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>

                    <!-- Mandatory 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>

                    <!-- Mandatory 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>

                    <!-- Mandatory 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>

                    <!-- Mandatory 4: connection negotiation -- 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>

                    <!-- Mandatory 5: PLCA disabled (100BASE-T1, not 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, but practically relevant: physical layer type -->
                    <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 error referencing -->
                    <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 access (the alternative would be 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 mapping: pin wakeup -> EcuM source -->
                    <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>

                <!-- Step 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>
                    <!-- Step 1: points to EthIfTransceiver, NOT directly to 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>

                <!-- Step 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>
                    <!-- The actual link into the EthTrcv module -->
                    <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>

Every VALUE-REF points to the full SHORT-NAME path of the target container — not to the value of EthTrcvIdx or EthIfCtrlIdx. That’s a common mistake for developers coming purely from the C API world: in ARXML, references are paths, not numbers. And as the example shows, the EthIf ↔ EthTrcv link needs two such references, not one.

Common Configuration Mistakes

MistakeSymptomCause

Wrong EthTrcvMiiIdx/EthTrcvCtrlIdx

EthTrcv_Init runs fine, but EthTrcv_GetLinkState permanently returns ETHTRCV_LINK_STATE_DOWN; EthIf_ReadMii calls address the wrong PHY

Values don’t match the actual wiring/board variant, or a copy-paste error from a different configuration

EthTrcvConnNeg inconsistent with the peer

No link on 100BASE-T1, because both sides are master or both are slave

Missing coordination between the EthTrcvConfig instances of the two communication partners — see also the Master/Slave post

Only EthIfController.EthIfEthTrcvRef is set, EthIfTransceiver.EthIfEthTrcvRef is missing

EthIf initializes the controller, but the link to the actual EthTrcvConfig is missing — the transceiver stays unconfigured

The two-step reference chain was only followed halfway — a classic mistake when you expect the (often simplified-in-diagrams) direct reference

EthTrcvWakeUpSupport (in EthTrcvGeneral) inconsistent with the hardware

EcuM expects wakeup capability for all transceivers of the module instance that a single installed PHY doesn’t actually have (or vice versa)

Overlooked that this parameter is module-wide, not per transceiver

Duplicate EthTrcvIdx values

Configuration generator reports an error, or — worse — accepts it and the first matching entry "wins" at runtime

Manually adding a new EthTrcvConfig instance without checking against existing indices

None of these mistakes causes a compile or link error. All of them only show up at runtime — often only on the real board, not in a HIL test with substitute hardware. Reviewing the ARXML values against the PHY datasheet and the schematic is therefore not an optional step.

Series

PartTitleStatus

1

EthTrcv Part 1 — Basics & Classification

✅ published

2

EthTrcv Part 2 — API & Initialization Sequence

✅ published

3

EthTrcv Part 3 — ARXML Configuration in Practice

📍 this post

4

EthTrcv Part 4 — WakeUp Handling & Diagnostics

⏭ next part

Summary

TopicKey takeaway for practice

Container structure

One EthTrcvConfig container per physical PHY, bundled in EthTrcvConfigSet; EthTrcvGeneral, by contrast, only exists once per module instance

Mandatory parameters

EthTrcvIdx, EthTrcvSpeed, EthTrcvDuplexMode, EthTrcvConnNeg, EthTrcvEnablePLCA — there is no EthTrcvBusIdx and no EthTrcvPhyAddress in the standard

MDIO/switch access

Runs through the choice container EthTrcvMgmtInterface (EthTrcvMiiInterface with EthTrcvCtrlIdx/EthTrcvMiiIdx, or EthTrcvSwitchInterface) — no standalone PHY address at the EthTrcv level

EthTrcvWakeUpSupport

Lives in EthTrcvGeneral and applies to all transceivers of the module instance — not per EthTrcvConfig

EthIf referencing

Two-step: EthIfController.EthIfEthTrcvRefEthIfTransceiver, whose own EthIfEthTrcvRefEthTrcvConfig

Failure pattern

Nearly all configuration mistakes in this module only show up at runtime on real hardware — never at compile time