正如我们了解的CanIf模块一样,作为CAN收发器,CAN控制器的统一上层ECU抽象,能够让我们实现CanIf上层的应用模块与底层硬件解耦,大大增加了软件的可移植性。
针对车载以太网而言也是同样的道理,AUTOSAR组织按照同样的方法论实现了车载以太网协议栈的软件架构分布,其中EthIf与CanIf作用与地位相当,都是为了实现底层硬件如以太网控制器与以太网收发器的上层抽象,便于软硬件解耦,大大提高了软件的可复用度。
接下来将从AUTOSAR EthIf模块的层次关系,主体功能以及常用函数接口三个方面展开给大家进行讲解。
模块层次关系
按照AUTOSAR标准文档规范,有关EthIf模块在整个软件架构的具体位置描述如下图1所示:
图1 EthIf与以太网协议栈关系
如上图所示,可以得出如下几个基本结论:
一个以太网协议栈中可以存在多家供应商的以太网控制器,同时针对每家供应商的控制器进行单独控制,互不影响;
同一供应商的以太网控制器可以存在多个,但使用的以太网控制器驱动可以仅使用同一套;
上述三家不同供应商的以太网驱动作为标准AUTOSAR MCAL的一部分,能够完全实现与底层硬件的解耦;
以太网控制器关系
针对多家供应商以太网控制器并存的情况,AUTOSAR EthIf模块基于该种情况来实现了统一管理与实现,能够大大提高同一驱动的复用效率。
如下图2所示,明确表示出了针对以太网控制器不同的前提下EthIf软件模块与以太网控制器驱动两者如何进行Mapping的关系。
通过分析发现,它们两者之间具备如下的索引Mapping 关系,该Mapping关系将能够保证EthIf模块能够唯一,准确的控制各个控制器模块,具体的Mapping规则如下:
EthIf 软件模块针对每一个以太网控制器在其内部进行全局唯一的编号索引,索引从0开始,如EthIf_CtrlIdx所表示的编号所示,全局唯一;
针对同一类型的以太网控制器,对应的以太网驱动在其软件内部模块进行从0开始的索引编号,如下图具备两个相同类型的以太网控制器,因此索引编号分别为0与1,与EthIf模块的全局唯一索引并不冲突;
针对不同类型的以太网控制器,其对应的驱动模块在其内部对应的索引也应该从0开始,无论是否并存其他类型的以太网驱动;
图2 EthIf模块与以太网控制器关系
以太网收发器关系
如下图3所示,以太网收发器与EthIf模块存在如下相应的Mapping关系,具体可以总结为如下几点:
同一类型的以太网收发器可以使用同一个以太网收发器驱动(简称Phy驱动);
不同类型的以太网收发器应采用不同的以太网收发器驱动;
图3 EthIf模块与以太网收发器驱动关系
如下图4所示,对照以太网控制器与EthIf的关系,同理可以看出以太网收发器与EthIf之间的index Mapping关系:
在以太网收发器驱动如果存在多个相同类型的收发器,应当在其内部按照从0开始进行编号表示其唯一性;
图3 以太网收发器编号关系
以太网Switch关系
如下图4所示为以太网Switch与EthIf之间的Index关系:
针对相同类型以太网网关都使用同一驱动;
同一以太网网关内部的Port也会按照index从0开始计数,不同以太网网关内部的Port编号彼此独立,互不干扰;
图4 以太网Switch编号关系
模块主体功能
对于AUTOSAR标准中的EthIf模块作为底层硬件驱动的抽象层,具备如下几个基本功能:
完成通信初始化功能,为数据收发创造基础条件;
具备数据发送功能,提供接口给到上层应用来实现数据的正常发送;
具备数据接收功能,提供接口给到上层应用来实现数据的正常接收;
具备底层Phy Link状态变化管理功能,能够及时监控底层Phy的状态;
接下来将从EthIf模块的上述四个基本功能展开进行讲述,让大家进一步了解EthIf模块的基本工作原理。
通信初始化功能
如下图5所示,描述了EthIf与底层驱动建立通信的必要前提,即需要通过调用EthIf_Init函数来实现Eth控制器与Eth收发器的初始化;
图5 Eth硬件初始化过程
如下图6所示描述了EthSM,EthIf,Eth,EthTrcv四者之间的关系,EthSM通过调用EthIf模块的函数EthIf_SetControllerMode来实现以太网控制器的初始化,同时Eth模块将通过回调函数将是否初始化成功的标志告知EthSM模块。
紧接着EthSM将调用EthIf模块的函数EthIf_SetTransceiverMode函数来实现Eth收发器的初始化,Eth收发器通过回调函数将初始化是否成功的标志告知EthSM模块;
图6 EthIf模块通信初始化过程
数据发送功能
EthIf模块的数据发送功能分为两者模式,一种是Polling模式,另外一种就是Interrupt模式,一般而言都优先采用中断模式来满足系统实时性要求。
如下图7为Polling模式,在Polling模式中可以看到在EthIf_MainfunctionTx函数中会去轮询是否发送成功的标志,这个也是Polling模式的典型特征。
Polling模式
图7 EthIf数据发送Polling模式
Interrupt模式
如下图8所示为以太网数据发送的中断模式,中断模式相比Polling模式可以看出并没有使用到EthIf_MainfunctionTx函数,而是使用Eth模块的中断函数来确认发送是否成功。
图8 EthIf模块数据发送中断模式
数据接收功能
同理相比数据发送功能,EthIf模块的数据接收功能也可以分为Polling模式与中断模式两种,如下图9所示为EthIf模块的数据接收Polling模式。
如下图9所示,如果EthIf模块数据接收采用Polling模式,那么就需要使用到EthIf_MainfunctionRx函数,在该函数中去调用EthIf_RxIndication来告知上层数据已成功被接收,使用该模式会大大降低数据接收效率,一般接收优先采用中断模式。
Polling模式
图9 EthIf模块数据接收Polling模式
Interrupt模式
如下图10所示为EthIf模块的数据接收中断功能,在该模式中可以看到通过Eth模块通过中断函数来进而告知上层数据已被接收。
图10 EthIf模块数据接收中断模式
Link状态变化管理功能
如下图11所示,描述了在EthIf_MainfunctionRx函数中通过调用EthTrcv模块的EthTrcv_GetLinkState来告知上层应用收发器罪行的Link状态。
图11 EthIf模块Link状态变化监控
VLAN支持
EthIf模块必须支持VLAN功能,该模式将会将VLAN归为虚拟控制器这一类,以太网驱动以及以太网收发器将仅针对真实的控制器与收发器,不考虑VLAN这一特性。
如果没有有效的VLAN ID设置,那么虚拟控制器将表示没有打上标签的VLAN,同时EthIf模块将使用Eth 驱动提供的Buffer来支持VLAN功能。
Wake up支持
EthIf模块须通过配置EthIfWakeUpSupport来实现,同时Wakeup有效的前提是底层的以太网收发器(Phy)需要支持休眠唤醒功能才行。
常用函数接口
为了便于大家调试方便,小T将EthIf模块常用的函数总结归纳如下:
图12 常用函数接口说明