AUTOSAR_SWS_EthernetDriver

Specification of Ethernet Driver


简介和功能概述


该规范指定了 AUTOSAR 基础软件模块以太网驱动程序的功能、API 和配置。

在 AUTOSAR 分层软件架构中,以太网驱动程序属于微控制器抽象层,或者更准确地说,属于通信驱动程序。

这表示以太网驱动程序的主要任务为:

向上层(以太网接口模块,EthIf)提供一个由多个同类型的以太网控制器( ECU)组成,独立于硬件的接口。对于所有以太网控制器( ECU)而言,该接口应为统一的。这样,上层(以太网接口模块,EthIf)可以以统一的方式对底层总线系统进行访问。该接口提供初始化、配置及数据传输的功能。然而,以太网驱动程序的配置是特定于总线的,因为它会对以太网控制器( ECU)的具体特性进行考虑。

单个以太网驱动程序仅对同一特定类型的以太网控制器(硬件)进行支持,但可以同时对多个该类型的以太网控制器进行支持。此外,如果以太网驱动程序处于托管模式,则必须确保其能够与交换机(Switch)驱动程序进行交互。在这种情况下,可能需要对以太网帧进行特殊的处理,以便之后交换机(Switch)硬件能够对此以太网帧进行特定的解释。以太网驱动程序的前缀需要唯一的命名空间。以太网接口模块可以通过带有不同前缀的以太网驱动程序访问不同类型的以太网控制器。使用哪个以太网驱动程序来访问特定的以太网控制器取决于以太网接口模块的配置参数。

图 1.1 描述了以太网堆栈的下半部分。一个以太网接口模块通过一个或多个以太网驱动程序访问多个以太网控制器。


注意:

以太网驱动程序的规范允许以目标代码的形式交付代码,遵循“一刀切”的原则,即无需对任何源代码进行修改即可完成以太网接口模块所需的所有配置。因此,对以太网驱动程序的配置基本上无需对以太网驱动程序的具体细节进行考虑。

首字母缩略词和缩写


在本文档范围内且不被包含在 AUTOSAR 词汇表中的首字母缩略词和缩写将在本文档词汇表中被列出。


相关文档


AUTOSAR 的交付文档

[1] Glossary 
  • AUTOSAR_TR_Glossary 

[2] OPEN Sleep/Wake-up Specification for Automotive Ethernet 

[3] General Specification of Basic Software Modules 
  • AUTOSAR_SWS_BSWGeneral 

[4] Specification of Ethernet Interface 
  • AUTOSAR_SWS_EthernetInterface 

[5] Specification of Ethernet Transceiver Driver 
  • AUTOSAR_SWS_EthernetTransceiverDriver 

[6] Specification of Ethernet Switch Driver 
  • AUTOSAR_SWS_EthernetSwitchDriver 

[7] General Requirements on SPAL 
  • AUTOSAR_SRS_SPALGeneral 

[8] Specification of ECU State Manager 
  • AUTOSAR_SWS_ECUStateManager 

[9] Requirements on Ethernet Support in AUTOSAR 
  • AUTOSAR_SRS_Ethernet 

[10] Specification of Default Error Tracer 
  • AUTOSAR_SWS_DefaultErrorTracer


相关标准和规范

[20] IEEE 802.3-2015 

[21] IEC 7498-1 The Basic Model, IEC Norm, 1994 

[22] IETF RFC 2819 

[23] IEEE Standard 802.1AS - 30 of March 2011 http://standards.ieee.org/getieee802/download/802.1AS-2011.pdf 

[24] IEEE 802.3cg-2019 

[25] OPEN ALLIANCE 10BASE-T1S MACPHY Serial interface (Sep 2020), http://www.opensig.org/Automotive-Ethernet-Specifications/

相关规范

AUTOSAR 提供了关于基础软件模块的通用规范 [3](AUTOSAR_SWS_BSWGeneral),该规范也适用于以太网驱动程序。

因此,规范 AUTOSAR_SWS_BSWGeneral 应被视为以太网驱动程序的附加规范及必需规范。

约束和假设


限制

无法对超出所用以太网控制器的可用缓冲区的大小的数据进行传输。必须通过互联网协议 (IP) 或传输控制协议 (TCP) 对较长的数据进行传输。

根据具体以太网控制器(硬件),具体实现可能在异步/同步行为方面异于 API 规范。

对于汽车领域的适用性

以太网堆栈(BSW)旨在被用于需要高数据速率且无需硬实时性的场合。当然,它也可以被用于具有较低需求的场合,例如,低数据速率通信。

对其他模块的依赖


本章列出了与以太网驱动程序进行交互的模块。

使用以太网驱动程序的模块:
  • 以太网接口(EthIf, 参见 [4])
  • 以太网收发器驱动程序(EthTrcv,参见 [5])
  • 以太网交换机驱动程序(EthSwt,参见 [6])

以太网驱动程序使用的模块:
  • BSW 调度器机制被用于确保数据的一致性及主要功能。

对其他模块的依赖:
  • 在某些系统上,以太网控制器可能与其他模块(例如 MCU、Port)共享资源,并且可能依赖于它们的配置。如果这些硬件资源(例如,PLL 配置、内存映射等)位于其他模块中,则以太网驱动程序无需对其进行配置,而是需要确保其先被初始化。

驱动程序服务

[SWS_Eth_00282]{DRAFT}

[SRS_BSW_00005]
  • 如果以太网控制器位于片上,则以太网驱动程序应对任何其他驱动程序模块进行使用。

注意:

MACPHY 除外。

[SWS_Eth_00283]{DRAFT} 

[SRS_BSW_00377]
  • Eth_Init 应对以太网控制器使用的所有片上的硬件资源进行初始化。唯一的例外是(以太网控制器使用的)I/O 引脚,该操作应由 Port 模块完成。

[SWS_Eth_00284]{DRAFT}

[SRS_BSW_00005]
  • MCU 模块(参见 [7])应对其与其他模块“共享”的寄存器进行配置。

提示:

在对以太网驱动程序进行初始化之前,应确保 MCU 模块已被初始化。

[SWS_Eth_00285]{DRAFT}

[SRS_BSW_00005]
  • 如果以太网控制器位于片外(即 MACPHY),则以太网驱动程序应对任何其他驱动程序模块(例如 SPI)进行使用。

提示:

如果以太网驱动程序对任何其他驱动程序模块(例如 SPI)进行使用,则应确保在对以太网驱动程序进行初始化之前, 这些驱动程序模块已被初始化。对不同的驱动程序模块的初始化的顺序在 [8] 中被指定。

需求可追溯性



功能定义


以太网堆栈(BSW)

根据图 7.1,作为 AUTOSAR 分层软件架构的一部分,以太网堆栈(BSW)也构成了一个分层软件架构。图 7.1 描述了该以太网堆栈(BSW)的基本结构。以太网接口模块通过以太网驱动程序层对多个以太网控制器进行访问,该层可由多个以太网驱动程序组成。


交换机(Switch)

此外,交换机(Switch)硬件可能被连接到以太网驱动程序的一个特定的以太网控制器索引。这种情况意味着交换机(Switch)驱动程序与以太网驱动程序之间存在额外的交互(图 7.2)。以太网驱动程序会对交换机(Switch)驱动程序发出请求,以确保当前的以太网帧稍后能够在交换机(Switch)硬件中被处理。


外置 MAC

对于 MACPHY(片外以太网控制器及 PHY,即 MAC 控制器),应通过 SPI 模块完成数据传输及控制管理(图 7.3)。


索引方案

以太网驱动程序的用户使用索引方案来识别不同的以太网控制器,如图 7.4 所示。


[SWS_Eth_00003]

[ ]
  • 以太网驱动程序使用从零开始的索引来抽象化上层软件层的访问。配置中的参数 EthCtrlIdx([ECUC_Eth_00007])与 API 中的参数 CtrlIdx 相对应。

[SWS_Eth_00004]

[ ]
  • 缓冲区索引(BufIdx)对 API 处理的以太网缓冲区进行标识。每个以太网控制器的缓冲区由缓冲区索引 0 到 (n-1) 标识,其中 n 是以太网控制器的缓冲区的数量。缓冲区索引仅在元组 <CtrlIdx, BufIdx> 中有效。BufIdx 将对以太网驱动程序的缓冲区进行唯一地标识。

需求

本章列出了以太网驱动程序的强制需求。

以太网驱动程序的运行时环境包括所有对以太网驱动程序的 API 进行调用的模块。

[SWS_Eth_00005]

[ ]
  • 以太网驱动程序应支持在预编译阶段,链接阶段,后构建阶段的配置。

[SWS_Eth_00006]

[ ]
  • 头文件 Eth.h 应包含软件版本号和规范版本号。

[SWS_Eth_00007]

[ ]
  • 在预处理检查阶段,以太网驱动程序应对相关的代码文件和头文件的一致性(代码文件和头文件的版本号)进行检查。

[SWS_Eth_00008]

[ ]
  • 如果开发错误检测被启用,以太网驱动程序应对 API 的参数的有效性进行检查,并向 DET 报告检测到的错误。

DET 的 API 在 [10] 中被指定。

[SWS_Eth_00011]

[ ]
  • 不应在任何以太网驱动程序的头文件中对全局变量进行定义。

[SWS_Eth_00218]

[ ]
  • 对于对应平台的所有 AUTOSAR 数据类型,以太网驱动程序应确保所有接收和传输(发送)缓冲区的基地址都满足内存对齐的需求。

[SWS_Eth_00216]

[ ] 
  • 对于传输(发送),以太网控制器应根据以下情况启用对协议的校验和进行计算的(硬件)能力(以太网卸载):
    • a) 对于 IPv4 帧,当参数 EthCtrlEnableOffloadChecksumIPv4 被设置为 TRUE
    • b) 对于 ICMP 帧,当参数 EthCtrlEnableOffloadChecksumICMP 被设置为 TRUE
    • c) 对于 TCP 帧,当参数 EthCtrlEnableOffloadChecksumTCP 被设置为 TRUE
    • d) 对于 UDP 帧,当参数 EthCtrlEnableOffloadChecksumUDP 被设置为 TRUE
  • 对于所有其他情况,以太网控制器不应对校验和字段进行操作。

[SWS_Eth_00217]

[ ]
  • 对于接收,以太网控制器应根据以下情况启用丢弃具有错误的协议的校验和的以太网帧的(硬件)能力(以太网卸载):
    • a) 对于 IPv4 帧,当参数 EthCtrlEnableOffloadChecksumIPv4 被设置为 TRUE
    • b) 对于 ICMP 帧,当参数 EthCtrlEnableOffloadChecksumICMP 被设置为 TRUE
    • c) 对于 TCP 帧,当参数 EthCtrlEnableOffloadChecksumTCP 被设置为 TRUE
    • d) 对于 UDP 帧,当参数 EthCtrlEnableOffloadChecksumUDP 被设置为 TRUE
  • 对于所有其他情况,以太网控制器应忽略校验和字段。

[SWS_Eth_00176]

[ ]
  • 应使用全局时间接口来访问时间同步功能(参见 [23])。

[SWS_Eth_00243]

[ ]
  • 以太网驱动程序应对 EthIf_TxConfirmation 进行调用,并将参数  Result 设置为 E_OK,以指示传输(发送)成功。无论是在中断服务例程(中断模式)中还是在 Eth_TxConfirmation(轮询模式)中(若通知已被启用)。

[SWS_Eth_00256]

[ ]
  • 以太网驱动程序应对 EthIf_TxConfirmation 进行调用,并将参数  Result 设置为 E_NOT_OK,以指示传输(发送)失败。

对 EthIf_TxConfirmation 的调用(参数  Result 被设置为 E_NOT_OK)应允许上层实现简单的确保其被调用的方案。它可以依赖于在每次对 Eth_Transmit 进行调用时都会对 EthIf_TxConfirmation 进行调用的事实。

[SWS_Eth_00244]

[ ]
  • 以太网驱动程序应对 EthIf_RxIndication 进行调用,以指示接收成功。无论是在中断服务例程(中断模式)中还是在 Eth_Receive(轮询模式)中(请参阅 [SWS_Eth_00096])。

[SWS_Eth_00247]

[ ]
  • 交换机(Switch)驱动程序的控制管理 API:
    • EthSwt_EthRxProcessFrame
    • EthSwt_EthRxFinishedIndication
    • EthSwt_EthTxPrepareFrame
    • EthSwt_EthTxAdaptBufferLength
    • EthSwt_EthTxProcessFrame
    • EthSwt_EthTxFinishedIndication
  • 被用于告知交换机(Switch)驱动程序有关所需的具有控制管理目的的特殊处理(参见 [4])。

缓冲区处理

可以对(可选)软件实现的缓冲区处理机制进行使用。如果硬件不具备实现公平的流量调度的能力,则需要对软件实现的缓冲区处理机制进行使用。公平的流量调度是为了避免由于(过于)严格的优先级机制导致的不受控制的消息延迟。

(可选)软件实现的缓冲区处理机制基于 CBS 算法(Credit Based Shaper)。CBS 算法根据以太网帧的优先级,将以太网帧分配给专用的软件实现的队列。

通过字节级别的可信度,CBS 算法公平地对不同的软件实现的队列进行传输处理。

以软件实现的队列为基础,应使用 CBS 算法对软件实现的缓冲区()及(常用的)PHY 中的物理内存(硬件实现的队列)进行扩展。在传输过程中,应至少考虑以下几点:
  • 对 Eth_ProvideTxBuffer 进行调用将在软件实现的缓冲区中申请一个软件实现的缓冲区,并存储给定的优先级,及返回指向申请到的软件实现的缓冲区的指针及申请到的软件实现的缓冲区在软件实现的缓冲区中的索引。
  • 上层将拷贝待传输的数据至给定的软件实现的缓冲区中。
  • 拷贝待传输的数据至给定的软件实现的缓冲区中后,上层将使用给定的软件实现的缓冲区的索引对 Eth_Transmit 进行调用。以太网驱动程序应根据给定的优先级(对 Eth_ProvideTxBuffer 进行调用时被指定),在软件实现的队列中对给定的软件实现的缓冲区的索引进行入队。
  • 应根据 CBS 算法对软件实现的队列进行处理。如果软件实现的队列中的某个索引被 CBS 算法评估为可被传输,则与索引对应的软件实现的缓冲区中的数据将被拷贝至硬件实现的队列中。应释放与索引对应的软件实现的缓冲区,以使其可被用于后续的传输。

下图描述了 CBS 算法、其元素及对涉及的不同的 API 的调用:


[SWS_Eth_00263]

[SRS_Eth_00146]
  • 如果参数 EthCtrlConfigSwBufferHandling 被配置为 TRUE,则应启用(可选)软件实现的缓冲区处理机制

注意:

如果存在硬件实现的缓冲区处理机制,建议将参数 EthCtrlConfigSwBufferHandling 配置为 FALSE 以禁用(可选)软件实现的缓冲区处理机制

[SWS_Eth_00299]{OBSOLETE}

[SRS_Eth_00146]
  • 如果参数 EthCtrlConfigSwBufferHandling 被配置为 TRUE,则应为每个被配置的 EthCtrlConfigEgressFifo 分配一个软件实现的 FIFO。

[SWS_Eth_CONSTR_00002]{DRAFT}

[SRS_Eth_00146]
  • 如果参数 EthCtrlConfigSwBufferHandling 被配置为 TRUE,则应为每个被配置的 EthCtrlConfigEgressQueue 分配一个软件实现的队列。

[SWS_Eth_CONSTR_00003]{DRAFT}

[SRS_Eth_00146]
  • 如果参数 EthCtrlConfigSwBufferHandling 被配置为 TRUE,则应至少配置两个 EthCtrlConfigEgressQueue。

注意:

每个软件实现的队列的配置应与一个给定的 EthCtrlConfigEgressFifo 相对应。

[SWS_Eth_00298]{OBSOLETE}

[SRS_Eth_00146]
  • 如果参数 EthCtrlConfigSwBufferHandling 被配置为 TRUE,则每个软件实现的 FIFO 应根据 EthCtrlConfigEgressFifoPriorityAssignment 指定的优先级对以太网帧进行处理,该优先级为 EthCtrlConfigEgressFifo 中参数 EthCtrlConfigEgressFifoPriorityAssignment 的集合。如果没有为 EthCtrlConfigEgressFifo 配置 EthCtrlConfigEgressFifoPriorityAssignment,则具有任何优先级的以太网帧都应由该软件实现的 FIFO 处理。

[SWS_Eth_00302]{DRAFT}

[SRS_Eth_00146]
  • 如果参数 EthCtrlConfigSwBufferHandling 被配置为 TRUE,则每个软件实现的队列应根据 EthCtrlConfigEgressQueuePriorityAssignment 指定的优先级对以太网帧进行处理,该优先级为 EthCtrlConfigEgressQueue 中参数 EthCtrlConfigEgressQueuePriorityAssignment 的集合。如果没有为 EthCtrlConfigEgressQueue 配置 EthCtrlConfigEgressQueuePriorityAssignment,则具有任何优先级的以太网帧都应由该软件实现的队列处理。

注意:

建议为每个 EthCtrlConfigEgressQueue 配置一个 EthCtrlConfigEgressQueuePriorityAssignment,以支持软件算法。

[SWS_Eth_00264]{OBSOLETE}

[SRS_Eth_00146]
  • 如果参数 EthCtrlConfigSwBufferHandling 被配置为 TRUE,则每个软件实现的 FIFO 的长度应由 EthCtrlConfigEgressFifoBufTotal([ECUC_Eth_00050])指定。FIFO 的元素的类型应为 Eth_BufIdxType。

[SWS_Eth_00303]{DRAFT}

[SRS_Eth_00146]
  • 如果参数 EthCtrlConfigSwBufferHandling 被配置为 TRUE,则每个软件实现的队列的长度应由 EthCtrlConfigEgressQueueBufTotal 指定。队列的元素的类型应为 Eth_BufIdxType。

注意:

软件实现的队列应保存在对 Eth_ProvideTxBuffer 的调用中被申请的软件实现的缓冲区的索引。

[SWS_Eth_00297]{OBSOLETE}

[SRS_Eth_00146]
  • 如果参数 EthCtrlConfigSwBufferHandling 被配置为 TRUE,则应根据所有被配置的 EthCtrlConfigEgressFifo 的大小提供一个软件实现的缓冲区。应按以下公式并以字节为单位对每个 EthCtrlConfigEgressFifo 的大小进行计算:单个 EthCtrlConfigEgressFifo 的大小 = EthCtrlConfigEgressFifoBufTotal * EthCtrlConfigEgressFifoBufLenByte。

[SWS_Eth_00304]{DRAFT}

[SRS_Eth_00146]
  • 如果参数 EthCtrlConfigSwBufferHandling 被配置为 TRUE,则应根据所有被配置的 EthCtrlConfigEgressQueue 的大小提供一个软件实现的缓冲区。应按以下公式并以字节为单位对每个 EthCtrlConfigEgressQueue 的大小进行计算:单个 EthCtrlConfigEgressQueue 的大小 = EthCtrlConfigEgressQueueBufTotal * EthCtrlConfigEgressQueueBufLenByte。

注意:

除了软件实现的缓冲区之外,以太网驱动程序还必须对给定的优先级(由 Eth_ProvideTxBuffer 指定)及被申请的软件实现的缓冲区的索引与对应的缓冲区之间的映射关系进行处理。

[SWS_Eth_00265]{OBSOLETE}

[SRS_Eth_00146]
  • 所有软件实现的 FIFO 都应遵循以下标准:
    • 每个软件实现的 FIFO 都应按照 FIFO 的原则进行入队和出队。
    • 无论其余软件实现的 FIFO 的设置如何,软件实现的 FIFO 都应支持独立的配置。

[SWS_Eth_00305]{DRAFT}

[SRS_Eth_00146]
  • 所有软件实现的队列都应遵循以下标准:
    • 每个软件实现的队列都应按照 FIFO 的原则进行入队和出队。
    • 无论其余软件实现的队列的设置如何,软件实现的队列都应支持独立的配置。

注意:

关于上一条公告,建议为每个软件实现的队列配置不同的 EthCtrlConfigEgressQueueCreditBasedShaperIdleSlope 和 EthCtrlConfigEgressQueueCreditBasedShaperSendSlope。这两个配置参数可被用于根据需要自由地配置软件实现的队列的输出速率。

[SWS_Eth_00266]{OBSOLETE}

[SRS_Eth_00146]
  • 应对软件实现的 FIFO 进行遍历,并按照以下方式和顺序更新其信用值:
    • 仅当在软件实现的 FIFO 中存在至少一条消息时,信用值才会递增。空的软件实现的 FIFO 的信用值不会递增,其信用值计数器应被设置为 0。
    • 应遍历所有软件实现的 FIFO,从优先级最高的软件实现的 FIFO 开始,按照从高优先级到低优先级的顺序依次遍历,在每次对 Eth_MainFunction 进行调用后信用值都会递增。每次递增的数量由 EthCtrlConfigShaperIdleSlope 指定。
    • 当一个软件实现的 FIFO 的信用值到达 EthCtrlConfigShaperMaxCredit 时,其信用值不应再递增,并应对下一个软件实现的 FIFO 的信用值进行处理。

[SWS_Eth_00306]{DRAFT}

[SRS_Eth_00146]
  • 应对软件实现的队列进行遍历,并按照以下方式和顺序更新其信用值:
    • 仅当在软件实现的队列中存在至少一条消息时,信用值才会递增。空的软件实现的队列的信用值不会递增,其信用值计数器应被设置为 0。
    • 应遍历所有软件实现的队列,从优先级最高的软件实现的队列开始,按照从高优先级到低优先级的顺序依次遍历,在每次对 Eth_MainFunction 进行调用后信用值都会递增。每次递增的数量由 EthCtrlConfigEgressQueueCreditBasedShaperIdleSlope 指定。
    • 当一个软件实现的队列的信用值到达 EthCtrlConfigQueueCreditBasedShaperMaxCredit 时,其信用值不应再递增,并应对下一个软件实现的队列的信用值进行处理。

[SWS_Eth_00267]

[SRS_Eth_00146]
  • 如果对 Eth_ProvideTxBuffer 进行调用且 EthCtrlConfigSwBufferHandling 被设置为 TRUE,则应对元组(指向软件实现的缓冲区的 BuffIdx 指针(返回)和优先级(由当前被调用的函数的参数提供))进行存储。

[SWS_Eth_00268]{OBSOLETE}

[SRS_Eth_00146]
  • 如果对 Eth_Transmit 进行调用且 EthCrtlConfigSwBufferHandling 被设置为 TRUE,则应在软件实现的 FIFO 中对给定的 BuffIdx 指针进行入队,给定的 BuffIdx 指针将附带 EthCtrlConfigEgressFifoPriorityAssignment(与先前由 Eth_ProvideTxBuffer 提供的优先级相匹配)(参见 [SWS_Eth_00267])。

[SWS_Eth_00307]{DRAFT}

[SRS_Eth_00146]
  • 如果对 Eth_Transmit 进行调用且 EthCtrlConfigSwBufferHandling 被设置为 TRUE,则应在软件实现的队列中对给定的 BuffIdx 指针进行入队,给定的 BuffIdx 指针将附带 EthCtrlConfigEgressQueuePriorityAssignment(与先前由 Eth_ProvideTxBuffer 提供的优先级相匹配)(参见 [SWS_Eth_00267])。

[SWS_Eth_00269]{OBSOLETE}

[SRS_Eth_00146]
  • 对 Eth_Transmit 进行调用后,软件实现的 FIFO 中的消息应被移动到硬件实现的 FIFO 中,如 [SWS_Eth_00271] 中所述。

[SWS_Eth_00308]{DRAFT}

[SRS_Eth_00146]
  • 对 Eth_Transmit 进行调用后,软件实现的队列中的消息应被移动到硬件实现的队列中,如 [SWS_Eth_00310] 中所述。

[SWS_Eth_00270]{OBSOLETE}

[SRS_Eth_00146]
  • 在 Eth_MainFunction 的上下文中,应按给定的顺序执行以下操作:
    • 应对所有软件实现的 FIFO 进行遍历,并应按照 [SWS_Eth_00266] 中的规定对其信用值进行更新。
    • 应对所有软件实现的 FIFO 进行遍历,并检查在其中是否存在待被传输的消息。
    • 对于每个被遍历的软件实现的 FIFO,应按照 [SWS_Eth_00271] 中的规定尝试对其进行传输。

[SWS_Eth_00309]{DRAFT}

[SRS_Eth_00146]
  • 在 Eth_MainFunction 的上下文中,应按给定的顺序执行以下操作:
    • 应对所有软件实现的队列进行遍历,并应按照 [SWS_Eth_00306] 中的规定对其信用值进行更新。
    • 应对所有软件实现的队列进行遍历,并检查在其中是否存在待被传输的消息。
    • 对于每个被遍历的软件实现的队列,应按照 [SWS_Eth_00310] 中的规定尝试对其进行传输。

[SWS_Eth_00271]{OBSOLETE}

[SRS_Eth_00146]
  • 对于在软件实现的 FIFO 中被入队的消息,应按以下方式和顺序将其移动到硬件实现的 FIFO 中:
    • 循环遍历每个软件实现的 FIFO,从优先级最高的软件实现的 FIFO 开始,按照从高优先级到低优先级的顺序依次遍历。
    • 将软件实现的 FIFO 中的信用值超过 EthCtrlConfigShaperMinCredit 的第一条消息移动到硬件实现的 FIFO 中。
    • 如果 EthTrcvPhysLayerPLCAMaxBurstCount 被设置为 0,则将只有一条消息被移动到硬件实现的 FIFO 中,且对下一个软件实现的 FIFO 的遍历将停止。
    • 根据其 EthCtrlConfigShaperSendSlope 减少软件实现的 FIFO 的信用值。
    • 如果 EthTrcvPhysLayerPLCAMaxBurstCount 大于 0,则应按照 [SWS_Eth_00272] 中的规定从 FIFO 头部开始执行。

[SWS_Eth_00310]{DRAFT}

[SRS_Eth_00146]
  • 对于在软件实现的队列中被入队的消息,应按以下方式和顺序将其移动到硬件实现的队列中:
    • 循环遍历每个软件实现的队列,从优先级最高的软件实现的队列开始,按照从高优先级到低优先级的顺序依次遍历。
    • 将软件实现的队列中的信用值超过 EthCtrlConfigEgressQueueCreditBasedShaperMinCredit 的第一条消息移动到硬件实现的队列中。
    • 如果 EthTrcvPhysLayerPLCAMaxBurstCount 被设置为 0,则将只有一条消息被移动到硬件实现的队列中,且对下一个软件实现的队列的遍历将停止。
    • 根据其 EthCtrlConfigEgressQueueCreditBasedShaperSendSlope 减少软件实现的队列的信用值。
    • 如果 EthTrcvPhysLayerPLCAMaxBurstCount 大于 0,则应按照 [SWS_Eth_00311] 中的规定从队列头部开始执行。

[SWS_Eth_00272]{OBSOLETE}

[SRS_Eth_00146]
  • 如果 EthTrcvPhysLayerPLCAMaxBurstCount 大于 0,则应将由 EthTrcvPhysLayerPLCAMaxBurstCount 指定的数量的消息额外地移动到硬件实现的 FIFO 中。应按照 [SWS_Eth_00271] 中的规定对消息进行选择。

[SWS_Eth_00311]{DRAFT}

[SRS_Eth_00146]
  • 如果 EthTrcvPhysLayerPLCAMaxBurstCount大于 0,则应将由 EthTrcvPhysLayerPLCAMaxBurstCount 指定的数量的消息额外地移动到硬件实现的队列中。应按照 [SWS_Eth_00310] 中的规定对消息进行选择。

配置说明

[SWS_Eth_00012]

[ ]
  • 以太网驱动程序应提供一个 XML 文件,其中包含软件识别(应包含供应商 ID、模块 ID 和软件版本信息)及配置和集成过程所需的数据。该文件应描述供应商特定的配置参数,并应包含配置参数的建议值。

[SWS_Eth_00125]

[ ]
  • MCG 应读取以太网驱动程序的 ECU 配置描述。以太网驱动程序相关的配置数据被包含在以太网驱动程序的配置描述中。

[SWS_Eth_00126]

[ ]
  • MCG 应保证被生成的配置数据的一致性。

[SWS_Eth_00013]

[ ]
  • 应在对 ECU 进行配置时对以太网驱动程序的配置的具体值进行计算。不应在运行时对配置的具体值进行计算。

[SWS_Eth_00014]

[ ]
  • 在初始化阶段应传递后构建的配置的起始地址。

注意:

有关初始化的更多详细信息,请参阅第 8.3.1 节。

可以在第 10 章中找到对从配置类到配置参数的分配。

可在本文档的第 10 章中找到以太网驱动程序相关的配置参数的详细描述。

错误分类

开发错误

[SWS_Eth_00016]

[ ]

运行时错误

[SWS_Eth_91014]

[ ]

扩展产品错误

扩展产品错误将作为 DEM 事件被处理。对事件 ID 的定义如下表所示,实际值由 DEM 的配置(外部)分配,并通过 Dem.h 被包含在模块中。

[SWS_Eth_00173]

[ ]

[SWS_Eth_00174]

[ ]

[SWS_Eth_00219]

[ ]

[SWS_Eth_00220]

[ ]

[SWS_Eth_00221]

[ ]

[SWS_Eth_00222]

[ ]

[SWS_Eth_00223]

[ ]

[SWS_Eth_00224]

[ ]

[SWS_Eth_00225]

[ ]

API 规范


导入的类型

本章列出了以下模块包含的所有类型:

[SWS_Eth_00026]

[SRS_Eth_00127]

类型定义

Eth_ConfigType 

[SWS_Eth_00156]

[ ]

Eth_ModeType 

[SWS_Eth_91011]

[ ]

Eth_StateType 

[SWS_Eth_00159]

[ ]

Eth_FrameType 

[SWS_Eth_00160]

[ ]

Eth_DataType 

[SWS_Eth_00161]

[ ]

Eth_BufIdxType 

[SWS_Eth_00175]

[ ]

Eth_RxStatusType 

[SWS_Eth_00162]

[ ]

Eth_FilterActionType 

[SWS_Eth_00163]

[ ]


Eth_TimeStampQualType 

[SWS_Eth_00177]

[ ]

Eth_TimeStampType 

[SWS_Eth_00178]

[ ]

Eth_TimeIntDiffType

[SWS_Eth_00179]

[ ]

Eth_RateRatioType 

[SWS_Eth_00180]

[ ]


Eth_MacVlanType 

[SWS_Eth_91001]

[SRS_Eth_00121]
[SRS_Eth_00072]

Eth_CounterType 

[SWS_Eth_91007]

[ ]

Eth_RxStatsType 

[SWS_Eth_91002]

[SRS_Eth_00127]

Eth_TxStatsType 

[SWS_Eth_91003]

[SRS_Eth_00127]

Eth_TxErrorCounterValuesType 

[SWS_Eth_91004]

[SRS_Eth_00127]

Eth_SpiStatusType 

[SWS_Eth_91013]{DRAFT}

[SRS_Eth_00147]
[SRS_Eth_00120]

函数定义

Eth_Init 

[SWS_Eth_00027]

[ ]

[SWS_Eth_00028]

[ ]
  • 该函数应存储对配置信息的引用,以便在后续的 API 调用中对配置信息进行访问。

[SWS_Eth_00275]

[ ]
  • 该函数为 EthConfigSet 中的所有已被配置的以太网控制器进行以下操作:
    • 禁用所有以太网控制器的传输(发送)/接收通信并清除待被处理的以太网中断
    • 对所有以太网控制器的配置参数(例如,中断、帧长度、帧过滤器等...)进行配置
    • 对所有与传输(发送)/接收相关的资源(例如,缓冲区)进行配置
    • 清除所有待被处理的传输(发送)/接收请求

注意:

实现必须确保以太网控制器提供的控制功能(例如,MDIO)始终可用,而其他驱动程序(例如,以太网交换机驱动程序)将使用这些控制功能,无论被请求的模式(ETH_MODE_DOWNETH_MODE_ACTIVE)是什么。因此,以太网驱动程序可以在 Eth_Init 中对控制功能进行初始化。

[SWS_Eth_00300]{OBSOLETE}

[ ]
  • 如果配置参数 EthCtrlConfigSwBufferHandling 被设置为 TRUE,则所有软件实现的 FIFO 和软件实现的缓冲区都应被初始化为 0。

[SWS_Eth_00312]{DRAFT}

[ ]
  • 如果配置参数 EthCtrlConfigSwBufferHandling 被设置为 TRUE,则所有软件实现的队列和软件实现的缓冲区都应被初始化为 0。

注意:

有关更多详细信息,请参阅 7.1.5 缓冲区处理。

[SWS_Eth_00029]

[ ]
  • 该函数应将状态从 ETH_STATE_UNINIT 切换为 ETH_STATE_INIT

[SWS_Eth_00039]

[ ]
  • 该函数应检查对以太网控制器的访问。如果检查失败,则该函数应上报产品错误 ETH_E_ACCESS

[SWS_Eth_00031]

[ ]
  • 应在初始化期间对 Eth_Init 进行调用。

Eth_SetControllerMode 

[SWS_Eth_91009]

[ ]

[SWS_Eth_00276]

[ ]
  • 该函数应将以太网控制器的模式切换为参数 CtrlMode 指定的模式:
    • 对于 ETH_MODE_DOWN,驱动程序应:
      • 禁用以太网控制器的传输(发送)/接收通信
      • 对所有传输(发送)/接收缓冲区进行重置(即,忽略所有待被处理的传输(发送)/接收请求)
    • 对于 ETH_MODE_ACTIVE,驱动程序应:
      • 启用所有传输(发送)/接收缓冲区
      • 启用以太网控制器的传输(发送)/接收通信

[SWS_Eth_00043]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00044]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00301]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlMode 是否有效。如果参数 CtrlMode 的值不是 ETH_MODE_ACTIVEETH_MODE_DOWN,则该函数应上报开发错误 ETH_E_INV_MODE

[SWS_Eth_00168]

[ ]
  • 该函数应检查对以太网控制器的访问。如果检查失败,则该函数应上报产品错误 ETH_E_ACCESS 并返回 E_NOT_OK。

[SWS_Eth_00045]

[ ]
  • 应在对 Eth_SetControllerMode 进行调用之前对 Eth_Init 进行调用。

Eth_GetControllerMode 

[SWS_Eth_91010]

[ ]

[SWS_Eth_00277]

[ ]
  • 该函数应读取以太网控制器当前的模式。

[SWS_Eth_00048]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00049]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00050]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlModePtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00051]

[ ]
  • 应在对 Eth_GetControllerMode 进行调用之前对 Eth_Init 进行调用。

Eth_GetPhysAddr 

[SWS_Eth_00052]

[ ]

[SWS_Eth_00053]

[ ]
  • 该函数应读取以太网控制器使用的源地址。

[SWS_Eth_00054]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00055]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00056]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 PhysAddrPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00057]

[ ]
  • 应在对 Eth_GetPhysAddr 进行调用之前对 Eth_Init 进行调用。

Eth_SetPhysAddr 

[SWS_Eth_00151]

[ ]

[SWS_Eth_00139]

[ ]
  • 该函数应更新以太网控制器使用的源地址。

[SWS_Eth_00140]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00141]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00142]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 PhysAddrPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00143]

[ ]
  • 应在对 Eth_SetPhysAddr 进行调用之前对 Eth_Init 进行调用。

Eth_UpdatePhysAddrFilter 

[SWS_Eth_00152]

[ ]

[SWS_Eth_00150]

[ ]
  • 该函数应更新以太网控制器使用的源地址接收过滤器。

[SWS_Eth_00245]

[ ]
  • 当网络帧的目标地址与参数 PhyAddrPtr 指向的地址匹配时,以太网驱动程序将接收此帧。(例如,可以通过哈希表或简单的模式匹配完成匹配)。

注意:

如果底层硬件机制可用,则可以使用底层硬件机制。否则,以太网驱动程序需要通过软件执行此操作。

[SWS_Eth_00246]

[ ]
  • 如果匹配成功,则将调用 RxIndication 通知上层,如果匹配失败,则将丢弃该帧。

[SWS_Eth_00164]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00165]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00166]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 PhysAddrPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00167]

[ ]
  • 应在对 Eth_UpdatePhysAddrFilter 进行调用之前对 Eth_Init 进行调用。

[SWS_Eth_00144]

[ ]
  • 如果源地址接收过滤器的源地址(MAC 地址)被设置为 FF:FF:FF:FF:FF:FF,这将使任何帧都可以通过过滤器。

[SWS_Eth_00146]

[ ]
  • 如果使用此 API 并且硬件不支持过滤功能,则应在初始化期间启用混杂模式。

[SWS_Eth_00147]

[ ]
  • 如果源地址接收过滤器的源地址(MAC 地址)设置为 00:00:00:00:00:00,这将使源地址为控制器的唯一单播 MAC 地址的帧才能通过过滤器,并关闭混杂模式(如已打开)。

Eth_WriteMii 

[SWS_Eth_00058]

[ ]

[SWS_Eth_00286]{DRAFT}

[ ]
  • 该函数应检查对以太网控制器的访问。如果检查失败,则该函数应上报运行时错误 ETH_E_COMMUNICATION 并返回 E_NOT_OK。

[SWS_Eth_00278]{DRAFT}

[SRS_Eth_00148]
  • 对于以太网控制器,该函数应根据 IEEE 802.3-2015 第 22 节通过 MII 对指定的收发器寄存器进行写入操作。

[SWS_Eth_00273]

[SRS_Eth_00148]
  • 如果需要根据 IEEE 802.3-2015 第 45 节对寄存器进行写入操作,则 API 应通过寄存器 13 和 14 对其进行访问,如在 IEEE 802.3-2015 附件 22D 中被明确地规定的那样。

[SWS_Eth_00287]{DRAFT}

[SRS_Eth_00147]
[SRS_Eth_00146]
  • 如果配置参数 EthCtrlEnableSpiInterface 被设置为 TRUE,则该函数应按照 TC6 [25] 中所述对写入请求进行处理。

[SWS_Eth_00288]{DRAFT}

[SRS_Eth_00148]
[SRS_Eth_00147]
[SRS_Eth_00146]
  • 当对 PHY 寄存器的访问完成时,该函数应调用 EthTrcv_WriteMiiIndication。

[SWS_Eth_00060]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00061]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00062]

[ ]
  • 应在预编译阶段通过对参数 EthCtrlEnableMii 进行配置以启用或禁用 Eth_WriteMii([ECUC_Eth_00012])。

[SWS_Eth_00063]

[ ]
  • 应在对 Eth_WriteMii 进行调用之前对 Eth_Init 进行调用。

Eth_ReadMii 

[SWS_Eth_00064]

[ ]

[SWS_Eth_00289]{DRAFT}

[SRS_Eth_00148]
[SRS_Eth_00146]
  • 该函数应检查对以太网控制器的访问。如果检查失败,则该函数应上报运行时错误 ETH_E_COMMUNICATION 并返回 E_NOT_OK。

[SWS_Eth_00279]{DRAFT}

[SRS_Eth_00148]
[SRS_Eth_00146]
  • 对于以太网控制器,该函数应根据 IEEE 802.3-2015 第 22 节通过 MII 对指定的收发器寄存器进行读取操作。

[SWS_Eth_00274]

[SRS_Eth_00148]
  • 如果需要根据 IEEE 802.3-2015 第 45 节对寄存器进行读取操作,则 API 应通过寄存器 13 和 14 对其进行访问,如在 IEEE 802.3-2015 附件 22D 中被明确地规定的那样。

[SWS_Eth_00290]{DRAFT}

[SRS_Eth_00148]
[SRS_Eth_00146]
[SRS_Eth_00147]
  • 如果配置参数 EthCtrlEnableSpiInterface 被设置为 TRUE,则该函数应按照 TC6 [25] 中所述对读取请求进行处理。

[SWS_Eth_00291]{DRAFT}

[SRS_Eth_00148]
[SRS_Eth_00146]
[SRS_Eth_00147]
  • 当对 PHY 寄存器的访问完成时,该函数应调用 EthTrcv_ReadMiiIndication。

[SWS_Eth_00066]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00067]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00068]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 RegValPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00069]

[ ]
  • 应在预编译阶段通过对参数 EthCtrlEnableMii 进行配置以启用或禁用 Eth_ReadMii([ECUC_Eth_00012])。

[SWS_Eth_00070]

[ ]
  • 应在对 Eth_ReadMii 进行调用之前对 Eth_Init 进行调用。

Eth_GetCounterValues 

[SWS_Eth_00226]

[SRS_Eth_00127]

[SWS_Eth_00227]

[ ]
  • 该函数将从以太网控制器中读取一串值。

[SWS_Eth_00228]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00229]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00230]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CounterPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00231]

[ ]
  • 应在预编译阶段通过对参数 EthGetCounterValuesApi 进行配置以启用或禁用 Eth_GetCounterValues([ECUC_Eth_00035])。

[SWS_Eth_00232]

[ ]
  • 应在对 Eth_GetCounterValues 进行调用之前对 Eth_Init 进行调用。

Eth_GetRxStats 

[SWS_Eth_00233]

[SRS_Eth_00127]

[SWS_Eth_00234]

[ ]
  • 该函数应根据  IETF RFC 2819 从以太网控制器中读取一串值。

[SWS_Eth_00235]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00236]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00237]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 RxStats 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00238]

[ ]
  • 应在预编译阶段通过对参数 EthGetRxStatsApi 进行配置以启用或禁用 Eth_GetRxStats。

Eth_GetTxStats 

[SWS_Eth_91005]

[SRS_Eth_00127]

[SWS_Eth_00248]

[SRS_BSW_00101]
[SRS_BSW_00416]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00249]

[SRS_BSW_00323]
[SRS_BSW_00369]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00250]

[SRS_BSW_00323]
[SRS_BSW_00369]
  • 如果启用了开发错误检测:该函数应检查参数 TxStats 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00251]

[SRS_Eth_00053]
  • 应在预编译阶段通过对参数 EthGetTxStatsApi 进行配置以启用或禁用 Eth_GetTxStats([ECUC_Eth_00060])。

Eth_GetTxErrorCounterValues 

[SWS_Eth_91006]

[SRS_Eth_00127]

[SWS_Eth_00252]

[SRS_BSW_00101]
[SRS_BSW_00416]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00253]

[SRS_BSW_00323]
[SRS_BSW_00369]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00254]

[SRS_BSW_00323]
[SRS_BSW_00369]
  • 如果启用了开发错误检测:该函数应检查参数 TxErrorCounterValues 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00255]

[SRS_Eth_00053]
  • 应在预编译阶段通过对参数 EthGetTxErrorCounterValuesApi 进行配置以启用或禁用 Eth_GetTxErrorCounterValues([ECUC_Eth_00061])。

Eth_GetSpiStatus 

[SWS_Eth_91012]{DRAFT}

[SRS_Eth_00147]
[SRS_Eth_00120]

[SWS_Eth_00292]{DRAFT}

[SRS_BSW_00101]
[SRS_BSW_00416]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00293]{DRAFT}

[SRS_BSW_00323]
[SRS_BSW_00369]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00294]{DRAFT}

[SRS_BSW_00323]
[SRS_BSW_00369]
  • 如果启用了开发错误检测:该函数应检查参数 SpiStatusType 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00295]{DRAFT}

[SRS_Eth_00146]
[SRS_Eth_00147]
  • 应在预编译阶段通过对参数 EthCtrlEnableSpiInterface 进行配置以启用或禁用 Eth_GetSpiStatus([ECUC_Eth_00073])。

Eth_GetCurrentTime 

[SWS_Eth_00181]

[ ]

[SWS_Eth_00182]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00183]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00184]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 timeQualPtr 和 timeStampPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00210]

[ ]
  • 应在预编译阶段通过对参数 EthGlobalTimeSupport 进行配置以启用或禁用 Eth_GetCurrentTime([ECUC_Eth_00037])。

[SWS_Eth_00185]

[ ]
  • 应在对 Eth_GetCurrentTime 进行调用之前对 Eth_Init 进行调用。

如果 Com-Stack 被分布在多个分区中,则以太网堆栈可能驻留在与对 Eth_GetCurrentTime(通过 EthIf_GetCurrentTime)进行调用的 StbM 模块所在的分区不同的分区中,这意味着对 Eth_GetCurrentTime 的调用可能发生在另一个分区中。

[SWS_Eth_00262]

[ ]
  • 以太网模块应应用适当的机制来允许在其主函数所在的分区以外的其他分区中对 Eth_GetCurrentTime 进行调用,例如,通过提供以太网卫星。

Eth_EnableEgressTimeStamp 

[SWS_Eth_00186]

[ ]

[SWS_Eth_00187]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00188]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00211]

[ ]
  • 应在预编译阶段通过对参数 EthGlobalTimeSupport 进行配置以启用或禁用 Eth_EnableEgressTimeStamp([ECUC_Eth_00037])。

[SWS_Eth_00189]

[ ]
  • 应在对 Eth_EnableEgressTimeStamp 进行调用之前对 Eth_Init 进行调用。

Eth_GetEgressTimeStamp 

[SWS_Eth_00190]

[ ]

[SWS_Eth_00191]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00192]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00193]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 timeQualPtr 和 timeStampPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00212]

[ ]
  • 应在预编译阶段通过对参数 EthGlobalTimeSupport 进行配置以启用或禁用 Eth_GetEgressTimeStamp([ECUC_Eth_00037])。

[SWS_Eth_00194]

[ ]
  • 应在对 Eth_GetEgressTimeStamp 进行调用之前对 Eth_Init 进行调用。

Eth_GetIngressTimeStamp 

[SWS_Eth_00195]

[ ]

[SWS_Eth_00196]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00197]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00198]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 DataPtr,timeQualPtr 和 timeStampPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00213]

[ ]
  • 应在预编译阶段通过对参数 EthGlobalTimeSupport 进行配置以启用或禁用 Eth_GetIngressTimeStamp([ECUC_Eth_00037])。

[SWS_Eth_00199]

[ ]
  • 应在对 Eth_GetIngressTimeStamp 进行调用之前对 Eth_Init 进行调用。

Eth_ProvideTxBuffer 

[SWS_Eth_00077]

[ ]

[SWS_Eth_00078]

[ ]
  • 该函数应提供传输(发送)缓冲区。以太网驱动程序应锁定该缓冲区,直到在后续对 Eth_Transmit 进行了调用,并通过参数 BufIdxPtr 返回缓冲区的索引。

[SWS_Eth_00280]

[ ]
  • 如果通过对 Eth_SetControllerMode 进行调用禁用以太网控制器的传输(发送)/接收通信,则应释放所有已被锁定的传输(发送)缓冲区。

[SWS_Eth_00079]

[ ]
  • 如果通过对 Eth_ProvideTxBuffer 进行调用请求的缓冲区的长度大于可用的缓冲区的长度,则缓冲区不应被锁定,而是返回可用的缓冲区的长度和 BUFREQ_E_OVFL

[SWS_Eth_00080]

[ ]
  • 如果所有可用的缓冲区都已被占用,则应返回 BUFREQ_E_BUSY

[SWS_Eth_00081]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00082]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00083]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 BufIdxPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00084]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 BufPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00085]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 LenBytePtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00086]

[ ]
  • 应在对 Eth_ProvideTxBuffer 进行调用之前对 Eth_Init 进行调用。

Eth_Transmit 

[SWS_Eth_00087]

[ ]

[SWS_Eth_00088]

[ ]
  • 该函数应使用给定的目标地址(MAC 地址)构建以太网帧头,并触发对先前已被填充的传输(发送)缓冲区的传输(发送)。

传输完成后,以太网驱动程序需要释放被分配的缓冲区。缓冲区被释放的实际时间取决于具体实现,例如,在函数 Eth_TxConfirmation、Eth_MainFunction 中,或在对函数 Eth_ProvideTxBuffer 的下一次调用中。

[SWS_Eth_00281]

[ ]
  • 如果通过对 Eth_SetControllerMode 进行调用禁用以太网控制器的传输(发送)/接收通信,则应释放所有待被处理的传输(发送)缓冲区。

[SWS_Eth_00090]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00091]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00092]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 BufIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_PARAM

[SWS_Eth_00093]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 PhysAddrPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

[SWS_Eth_00129]

[ ]
  • 如果启用了开发错误检测:该函数应检查以太网控制器的模式是否为 ETH_MODE_ACTIVE,如果检查失败,则该函数应上报开发错误 ETH_E_INV_MODE

[SWS_Eth_00094]

[ ]
  • 应在对 Eth_Transmit 进行调用之前对 Eth_ProvideTxBuffer 进行调用。

Eth_Receive 

[SWS_Eth_00095]

[ ]

[SWS_Eth_00096]

[ ]
  • 该函数将从接收缓冲区中读取下一帧。该函数使用回调函数 EthIf_RxIndication 将接收到的帧传递给 EthIf,并指示接收缓冲区中是否存在更多的帧。

[SWS_Eth_00097]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00098]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00132]

[ ]
  • 如果启用了开发错误检测:该函数应检查以太网控制器的模式是否为 ETH_MODE_ACTIVE,如果检查失败,则该函数应上报开发错误 ETH_E_INV_MODE

[SWS_Eth_00153]

[ ]
  • 当对回调函数 EthIf_RxIndication 进行调用时,应向 EthIf 指示广播帧(参见 [4])。

[SWS_Eth_00099]

[ ]
  • 应在对 Eth_Receive 进行调用之前对 Eth_Init 进行调用。

Eth_TxConfirmation 

[SWS_Eth_00100]

[ ]

[SWS_Eth_00101]

[ ]
  • 该函数应检查所有已被填充的传输(发送)缓冲区是否已被成功地传输(发送)。如果先前已通过对 Eth_Transmit 进行调用发出请求,则将通过对 EthIf_TxConfirmation 进行调用为每个已被传输(发送)的帧发出传输(发送)确认。

[SWS_Eth_00102]

[ ]
  • 如果之前的对函数 Eth_Transmit 的调用进行了传输确认,则该函数应对缓冲区进行释放。

[SWS_Eth_00103]

[ ]
  • 如果启用了开发错误检测:该函数应检查 Eth_Init 是否先前被调用,如果检查失败,则该函数应上报开发错误 ETH_E_UNINIT

[SWS_Eth_00104]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 CtrlIdx 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_INV_CTRL_IDX

[SWS_Eth_00134]

[ ]
  • 如果启用了开发错误检测:该函数应检查以太网控制器的模式是否为 ETH_MODE_ACTIVE,如果检查失败,则该函数应上报开发错误 ETH_E_INV_MODE

[SWS_Eth_00105]

[ ]
  • 应在对 Eth_TxConfirmation 进行调用之前对 Eth_Init 进行调用。

Eth_GetVersionInfo 

[SWS_Eth_00106]

[ ]

[SWS_Eth_00136]

[ ]
  • 如果启用了开发错误检测:该函数应检查参数 VersionInfoPtr 是否有效。如果检查失败,则该函数应上报开发错误 ETH_E_PARAM_POINTER

回调通知

本章列出了以太网驱动程序向下层模块提供的所有函数。以太网驱动程序的下层模块是 SPI 驱动程序。SPI 驱动程序是 MCAL 的一部分,可被用于在微控制器和外部以太网控制器(即 MACPHY [25])之间交换数据。

调度函数

Eth_MainFunction 

[SWS_Eth_00171]

[ ]
  •  

[SWS_Eth_00169]

[ ]
  • 该函数应检查是否存在被丢失的帧。如果检查失败,则该函数应上报扩展产品错误 ETH_E_RX_FRAMES_LOST

[SWS_Eth_00172]

[ ]
  • 该函数应检查是否存在以太网控制器错误(例如,CRC 错误)。如果检查失败,则该函数应上报扩展产品错误(例如,ETH_E_CRC)。

[SWS_Eth_00240]

[ ]
  • 被用于轮询状态。当以太网控制器的模式发生改变时,应对 EthIf_CtrlModeIndication 进行调用。

预期接口

本章列出了以太网驱动程序所需的由其他模块提供的所有函数。

强制接口

以太网驱动程序需要以下接口以实现其核心功能。

[SWS_Eth_00119]

[ ]

可选接口

以太网驱动程序需要以下接口以实现其可选功能。

[SWS_Eth_00120]

[ ]

可配置的接口

以太网驱动程序不使用可配置的接口。

术语和定义:
  • 可重入:接口应可重入。
  • 不关心:接口的可重入性与该模块无关(一般来说,在这种情况下它是不可重入的)。

序列图


以太网驱动程序的使用将在 EthIf 的序列图中被描述。

配置规范


容器和配置参数

以下章节总结了所有配置参数。参数的详细定义在第 1 章和第 8 章中被描述。

[SWS_Eth_00257]

[ ]
  • 以太网驱动程序应拒绝实际实现不支持的(分区映射)配置。

[SWS_Eth_00258]

[ ]
  • 如果以太网驱动程序管理多个以太网控制器,并且这些以太网控制器的子集共享外设资源或以某种方式耦合(例如,对其的通信的控制只能通过对所有以太网控制器进行全局控制的方式进行),则以太网驱动程序应通过模拟使其对上层模块而言为独立的。协调(例如,对其的通信的控制)必须由上层模块完成。

[SWS_Eth_00296]{DRAFT}

[SRS_BSW_00159]
  • 以太网驱动程序的配置取决于以太网控制器。如果以太网控制器位于片上,则以太网驱动程序的代码生成工具必须与微控制器匹配。如果以太网控制器位于片外(例如,MACPHY),则代码生成工具不得与微控制器匹配。

Eth



EthConfigSet



EthCtrlConfig














[SWS_Eth_00260]

[ ]
  • EthCtrlEcucPartitionRef 引用的 ECUC 分区应是 EthEcucPartitionRef 引用的 ECUC 分区的子集。

[SWS_Eth_00261]

[ ]
  • 同一个通道的 EthCtrlConfig、EthTrcvConfig 和 EthSwtConfig(如果在配置中存在)引用的 ECUC 分区应相同。

[SWS_Eth_CONSTR_00001]

[ ]
  • 如果 EthCtrlEcucPartitionRef 引用了一个或多个 ECUC 分区,则 EthCtrlEcucPartitionRef 的多重性应为 1 ,并应引用 EthEcucPartitionRef 引用的 ECUC 分区中的一个。


EthCtrlConfigEgress






EthCtrlConfigEgressFifo - OBSOLETE







EthCtrlConfigEgressQueue - DRAFT







EthCtrlConfigEgressQueueTransmissionSelection - DRAFT




EthCtrlConfigEgressQueueTransmissionSelectionCBSConfig - DRAFT








EthCtrlConfigScheduler



EthCtrlConfigSchedulerPredecessor





EthCtrlConfigShaper







EthCtrlConfigIngress



EthCtrlConfigIngressFifo - OBSOLETE








EthCtrlConfigIngressQueue - DRAFT








EthCtrlConfigSpiConfiguration



















EthDemEventParameterRefs












EthGeneral














[SWS_Eth_00259]

[ ]
  • 在每个分区中该驱动程序将作为独立运行的实例,这意味着被调用的 API 将仅针对其被调用时所处的分区。


EthCtrlOffloading







评论

此博客中的热门博文

AUTOSAR_SWS_CANDriver

Linux Driver Char Device 笔记

AUTOSAR_SWS_PWMDriver

AUTOSAR_SWS_PortDriver

AUTOSAR_SWS_ECUStateManager

EB - MCAL - MCU

AUTOSAR_SWS_ICUDriver

EB - MCAL - PWM