MIPI UniPro v2.0 规范详解:数据链路层(L2)

MIPI UniPro v2.0 Specification: Data Link Layer (L2)

本文完整整理了MIPI联盟2022年2月19日发布的《UniPro Specification v2.0》第6章内容,涵盖数据链路层的服务定义、接口原语、帧结构、核心协议机制、初始化流程及管理信息库(MIB)等全部技术细节,可直接用于技术学习与参考。


6 数据链路层(L2)Data Link Layer (L2)

本章的核心目标是定义概念性的数据链路层服务和数据链路层协议的特性与行为。本章不规定具体的实现方式或产品形态,也不限制系统内数据链路层及其接口的实现方案。

图60展示了数据链路层使用的服务接入点(SAP)模型。数据链路层通过两个按流量类别划分的服务接入点(DL_TCx_SAP)向网络层提供服务;同时,数据链路层依赖PHY适配层通过PA_SAP提供的服务。数据链路层管理服务接入点(DL_LM_SAP)用于向设备管理实体(DME)提供配置和控制接口。

图片


图60 数据链路层SAP模型 Figure 60 Data Link Layer SAP Model

6.1 数据链路层服务功能与特性

Data Link Layer Service Functionality and Features
数据链路层的核心服务是保证用户数据在数据链路层服务用户之间透明、可靠地传输。底层通信资源的使用方式对数据链路层服务用户完全透明。

发送方向关键特性
  • 帧组帧

  • 可选的帧抢占功能

  • 触发PHY初始化

  • 流量控制

  • 支持最多2个流量类别,采用基于优先级的仲裁机制,流量类别0(TC0)为强制实现

  • CRC生成

  • 出错时重传帧

接收方向关键特性
  • 帧解帧

  • 接收被抢占帧的能力

  • 生成流量控制信用信息

  • 支持2个流量类别的接收

  • CRC校验

  • 检测各类错误并自主响应

  • 自动确认所有未确认的帧

6.2 来自PHY适配层的假设服务

Services Assumed from PHY Adapter Layer
数据链路层假设PHY适配层提供以下服务,以完成对上层的服务交付:

  • 发送和接收控制符号

  • 发送和接收数据符号

  • PHY初始化

6.3 DL_TCx_SAP

数据链路层通过DL_TCx_SAP向服务用户提供服务。每个流量类别使用专用的服务接入点传输数据,定义了两个SAP:DL_TC0_SAP和DL_TC1_SAP,流量类别由所使用的SAP标识。

发送端通过DL_TCx_SAP将DL_SDU传递给数据链路层,传输至对端数据链路层;接收端数据链路层将接收到的数据以DL_SDU的形式交付给上层。

6.3.1 数据传输原语

Data Transfer Primitives
DL_TCx_SAP的数据传输原语如下表所示:

表30 DL_TCx_SAP数据传输原语 Table 30 DL_TCx_SAP Data Transfer Primitives

名称   Name

请求   Request

指示   Indication

响应   Response

本地响应 Local Response

确认   Confirm

本地确认 Local Confirm

DL_DATA

6.3.1.1

6.3.1.3

6.3.1.4

-

-

6.3.1.2

DL_TCx_SAP原语的参数定义如下表所示:

表31 DL_TCx_SAP原语参数 Table 31 DL_TCx_SAP Primitive Parameters

名称   Name

类型   Type

有效范围 Valid Range

值   Value

描述   Description

DL_SDU

字节流 byte stream

1 ~   DL_MTU

-

指定通过DL_TCx_SAP传输的、发送前或接收后的数据长度

L2ResultCode

枚举 Enumeration

-

SUCCESS=0NO_PEER_TC=1

指示DL_DATA.req请求的结果

6.3.1.1 DL_DATA.req

该原语用于通过数据链路层的指定流量类别发送DL_SDU,流量类别由所使用的SAP确定。用户可发送长度为1~DL_MTU字节的任意整数长度数据。

  • 语义:DL_DATA.req( DL_SDU )

  • 生成时机:数据链路层服务用户需要发送DL_SDU时生成该原语

  • 接收效果:数据链路层服务提供者收到该原语后,将DL_SDU传输至对端数据链路层

6.3.1.2 DL_DATA.cnf_L

该原语通知数据链路层服务用户,服务提供者(本层L2)已准备好接收新的DL_DATA.req原语。

  • 语义:DL_DATA.cnf_L( L2ResultCode )

  • 生成时机:

    • DL_PeerTCxPresent = TRUE(对端设备实现了该TC),则L2ResultCode设为SUCCESS

    • DL_PeerTCxPresent = FALSE(对端设备未实现该TC),则L2ResultCode设为NO_PEER_TC,此时DL_DATA.req提供的DL_SDU将被忽略,不会放入发送逻辑缓冲区,也不会在链路上发送

  • 接收效果:

    • 在发送DL_DATA.req之后、收到对应的DL_DATA.cnf_L之前,服务用户不得发送新的DL_DATA.req

    • 服务用户可在复位后,或收到上一个DL_DATA.req对应的DL_DATA.cnf_L后,立即发送新的DL_DATA.req

6.3.1.3 DL_DATA.ind

本地接收端数据链路层服务提供者通过该原语,将接收到的DL_SDU通过对应流量类别的SAP交付给数据链路层服务用户。DL_SDU长度为1~DL_MTU字节。

  • 语义:DL_DATA.ind( DL_SDU )

  • 生成时机:数据链路层服务提供者在本地接收端收到DL_PDU时生成该原语,且仅在数据链路层初始化完成后(见6.7节)才会交付DL_SDU

  • 接收效果:数据链路层服务用户收到该原语后,应消耗对应SAP关联流量类别的DL_SDU

6.3.1.4 DL_DATA.rsp_L

该原语通知服务提供者,数据链路层服务用户(上层L3)已准备好接收新的DL_DATA.ind原语。

  • 语义:DL_DATA.rsp_L( )

  • 生成时机:数据链路层服务用户响应DL_DATA.ind原语,指示其可以接收并处理新的DL_PDU

  • 接收效果:

    • 在发送DL_DATA.ind之后、收到对应的DL_DATA.rsp_L之前,数据链路层不得发送新的DL_DATA.ind

    • 数据链路层仅可在复位后,或收到上一个DL_DATA.ind对应的DL_DATA.rsp_L后,发送新的DL_DATA.ind

6.4 DL_LM_SAP

数据链路层管理(DL_LM)SAP提供三类服务原语:配置原语、控制原语和状态原语。设备管理实体(DME)通过DL_LM_SAP上的原语配置、控制数据链路层,并获取其状态信息。

  • 配置原语:用于访问数据链路层特有的配置信息,这些信息存储在数据链路层管理信息库(DL_MIB)中,DL_MIB位于DL_LM实体内部。不允许并发访问DL_MIB,数据链路层属性定义见6.8节

  • 控制原语:提供对数据链路层的直接控制,由DME生成,可并发执行

  • 状态原语:指示数据链路层的状态信息,由数据链路层生成,可并发执行

6.4.1 配置原语

Configuration Primitives
DME使用DL_LM_GETDL_LM_\*SET配置原语分别读取和写入DL_MIB中的配置属性值。GET和SET原语均为带对应确认原语的请求原语,前缀为DL_LM

表32 DL_LM配置原语 Table 32 DL_LM Configuration Primitives

名称   Name

请求   Request

指示   Indication

本地响应 Local Response

响应   Response

本地确认 Local Confirm

确认   Confirm

DL_LM_GET

6.4.1.1

-

-

-

6.4.1.2

-

DL_LM_SET

6.4.1.3

-

-

-

6.4.1.4

-

DL_LM_CAPABILITY_SET

6.4.1.5

-

-

-

6.4.1.6

-

表33 DL_LM配置原语参数 Table 33 DL_LM Configuration Primitive Parameters

名称   Name

类型   Type

有效范围 Valid Range

值   Value

描述   Description

MIBattribute

-

整数 0x2000~0x2FFF,该范围内的MIB属性定义见6.8节

-

MIB属性的地址

MIBvalue

-

变量,定义见6.8节

-

MIB属性的值

ConfigResultCode

枚举 Enum

-

SUCCESS=0INVALID_MIB_ATTRIBUTE=1INVALID_MIB_ATTRIBUTE_VALUE=2READ_ONLY_MIB_ATTRIBUTE=3

指示请求的结果

AttrSetType

枚举 Enum

-

NORMAL=0STATIC=1

选择设置属性的实际值(NORMAL)还是复位值(STATIC)

DLCreditUnitMode

枚举 Enum

-

CREDIT_UNIT_32=0CREDIT_UNIT_128=1

定义请求的信用单位模式

6.4.1.1 DL_LM_GET.req

该原语请求获取由MIBattribute标识的指定DL_MIB属性的信息。

  • 语义:DL_LM_GET.req( MIBattribute )

  • 生成时机:DME需要从DL_MIB获取信息时生成

  • 接收效果:DL_LM实体尝试从DL_MIB中检索请求的属性值,并通过DL_LM_GET.cnf_L返回结果

6.4.1.2 DL_LM_GET.cnf_L

该原语报告DL_MIB信息请求的结果。

  • 语义:DL_LM_GET.cnf_L( ConfigResultCode, MIBvalue )

  • 生成时机:数据链路层响应DME的DL_LM_GET.req生成该原语,ConfigResultCode取值如下:
    表34 DL_LM_GET.cnf_L ConfigResultCode取值 Table 34 DL_LM_GET.cnf_L ConfigResultCode Values

    ConfigResultCode

    条件   Condition

    SUCCESS

    请求成功,即DL_LM_GET.req指定的MIB属性可读取,此时DL_LM将MIBvalue设为该属性的值

    INVALID_MIB_ATTRIBUTE

    DL_LM_GET.req指定的MIB属性无效或未实现,此时MIBvalue的值未定义

  • 接收效果:DME获知操作结果;若ConfigResultCode为SUCCESS,则MIBvalue携带属性值;其他情况下MIBvalue未定义

6.4.1.3 DL_LM_SET.req

该原语尝试将指定的DL_MIB属性设置为MIBvalue指定的值。

  • 语义:DL_LM_SET.req( AttrSetType, MIBattribute, MIBvalue )

  • 生成时机:DME需要设置DL_MIB属性值时生成

  • 接收效果:DL_LM尝试在其数据库中设置指定MIB属性的值,并通过DL_LM_SET.cnf_L返回结果

6.4.1.4 DL_LM_SET.cnf_L

该原语报告设置DL_MIB属性值的尝试结果。

  • 语义:DL_LM_SET.cnf_L( ConfigResultCode )

  • 生成时机:数据链路层响应DME的DL_LM_SET.req生成该原语,ConfigResultCode取值如下:
    表35 DL_LM_SET.cnf_L ConfigResultCode取值 Table 35 DL_LM_SET.cnf_L ConfigResultCode Values

    ConfigResultCode

    条件   Condition

    SUCCESS

    请求成功,即DL_LM_SET.req指定的MIB属性已被设置为指定的MIBvalue

    INVALID_MIB_ATTRIBUTE

    DL_LM_SET.req指定的MIB属性无效或未实现;若AttrSetType为STATIC,则指定的属性不支持设置其复位值

    READ_ONLY_MIB_ATTRIBUTE

    DL_LM_SET.req指定的MIB属性存在,但为只读属性

    INVALID_MIB_ATTRIBUTE_VALUE

    DL_LM_SET.req指定的MIB属性存在且可写,但MIBvalue的值超出了该属性的实现范围或有效范围

  • 接收效果:向DME确认DL_LM_SET.req在数据链路层的成功或失败,对DME无进一步影响

6.4.1.5 DL_LM_CAPABILITY_SET.req

该原语由DME发出,请求第2层更新特定的能力属性。

  • 语义:DL_LM_CAPABILITY_SET.req( DLCreditUnitMode )

  • 生成时机:在UniPro启动过程中(见9.11.2节),当DME希望数据链路层更新特定能力属性时生成

  • 接收效果:数据链路层根据DLCreditUnitMode参数指示的模式,更新DL_MTUDL_SYMBOL_MTUDL_CreditUnitSize属性(见表49),然后发出DL_LM_CAPABILITY_SET.cnf_L原语

6.4.1.6 DL_LM_CAPABILITY_SET.cnf_L

该原语由第2层发出,通知DME能力属性已更新完成。

  • 语义:DL_LM_CAPABILITY_SET.cnf_L( )

  • 生成时机:数据链路层响应DME的DL_LM_CAPABILITY_SET.req,在完成DL_MTUDL_SYMBOL_MTUDL_CreditUnitSize属性更新后生成

  • 接收效果:DME获知数据链路层能力更新过程完成,继续执行启动流程

6.4.2 控制原语

Control Primitives
本节定义的服务原语用于控制数据链路层。

表36 DL_LM_SAP控制原语 Table 36 DL_LM_SAP Control Primitives

名称   Name

请求   Request

指示   Indication

本地响应 Local Response

响应   Response

本地确认 Local Confirm

确认   Confirm

DL_LM_RESET

6.4.2.1

-

-

-

6.4.2.2

-

DL_LM_ENABLE_LAYER

6.4.2.3

-

-

-

6.4.2.4

-

DL_LM_LINKSTARTUP

6.4.2.5

-

-

-

6.4.2.6

-

DL_LM_HIBERNATE_ENTER

6.4.2.7

-

-

-

6.4.2.8

-

DL_LM_HIBERNATE_EXIT

6.4.2.9

-

-

-

6.4.2.10

-

DL_LM_PRE_HIBERNATE_EXIT

6.4.2.11

-

-

-

6.4.2.12

-

表37 DL_LM_SAP控制原语参数 Table 37 DL_LM_SAP Control Primitive Parameters

名称   Name

类型   Type

有效范围 Valid Range

值   Value

描述   Description

ResetLevel

枚举 Enum

-

COLD=0WARM=1

定义请求的复位级别

6.4.2.1 DL_LM_RESET.req

该原语请求复位数据链路层。

  • 语义:DL_LM_RESET.req( ResetLevel )

  • 生成时机:DME需要复位数据链路层时生成

  • 接收效果:

    • 数据链路层将发送器和接收器复位至上电复位状态和值

    • TCx实体丢弃所有正在处理和位于任何逻辑缓冲区中的DL_SDU

    • 在复位/启动完成前,数据链路层不执行数据发送或接收操作

    • COLD复位:复位整个数据链路层,包括统计信息

    • WARM复位:复位数据链路层,但保留统计信息(若存在)

6.4.2.2 DL_LM_RESET.cnf_L

该原语用于UniPro复位流程(见9.11.1节)。

  • 语义:DL_LM_RESET.cnf_L( )

  • 生成时机:在启动流程中,数据链路层使用该原语向DME指示其已退出复位,准备执行L2初始化协议(见6.7节)

  • 接收效果:DME获知数据链路层已退出复位

6.4.2.3 DL_LM_ENABLE_LAYER.req

该原语启动UniPro启动流程要求的L2初始化协议(见6.7节)。

  • 语义:DL_LM_ENABLE_LAYER.req( )

  • 生成时机:作为UniPro启动流程的一部分(见9.11.2节),在数据链路层退出复位且PHY适配层准备就绪后,由DME生成

  • 接收效果:数据链路层进入准备接收AFC帧的状态(作为L2初始化协议的一部分),达到该状态后,通过DL_LM_ENABLE_LAYER.cnf_L向DME指示

6.4.2.4 DL_LM_ENABLE_LAYER.cnf_L

该原语用于UniPro启动流程(见9.11.2节),向DME指示数据链路层已准备好执行L2初始化协议。

  • 语义:DL_LM_ENABLE_LAYER.cnf_L( )

  • 生成时机:数据链路层达到可启动L2初始化协议的状态后生成

  • 接收效果:DME获知启动流程中数据链路层已准备好执行L2初始化协议

6.4.2.5 DL_LM_LINKSTARTUP.req

该原语通过启动数据链路层初始化,尝试建立与对端设备的链路(见6.7节)。

  • 语义:DL_LM_LINKSTARTUP.req( )

  • 生成时机:DME希望建立与对端设备的链路时生成

  • 接收效果:启动数据链路层初始化;初始化完成后,数据链路层进入正常运行状态,并通过DL_LM_LINKSTARTUP.cnf_L向DME指示

6.4.2.6 DL_LM_LINKSTARTUP.cnf_L

该原语用于UniPro启动流程(见9.11.2节),向DME指示数据链路层初始化已完成,网络层可使用该层。

  • 语义:DL_LM_LINKSTARTUP.cnf_L( )

  • 生成时机:数据链路层初始化完成后生成

  • 接收效果:DME获知数据链路层初始化已完成

6.4.2.7 DL_LM_HIBERNATE_ENTER.req

该原语请求数据链路层进入休眠状态。

  • 语义:DL_LM_HIBERNATE_ENTER.req( )

  • 生成时机:DME希望休眠数据链路层时生成

  • 接收效果:

    • 数据链路层首先进入冻结状态,所有定时器停止运行,并保留以下属性的值:
      DL_TC0TXFCThresholdDL_FC0ProtectionTimeOutValDL_TC0ReplayTimeOutValDL_AFC0ReqTimeOutValDL_AFC0CreditThresholdDL_TC0OutAckThreshold
      DL_TC1TXFCThresholdDL_FC1ProtectionTimeOutValDL_TC1ReplayTimeOutValDL_AFC1ReqTimeOutValDL_AFC1CreditThresholdDL_TC1OutAckThreshold
      DL_MTUDL_SYMBOL_MTUDL_CreditUnitSizeDL_TC0TxMaxSDUSizeDL_TC1TxMaxSDUSize
      DL_TC0RxInitCreditValDL_TC1RxInitCreditValDL_TC0TxBufferSizeDL_TC1TxBufferSize

    • 即将进入休眠前,数据链路层通过DL_LM_HIBERNATE_ENTER.cnf_L向DME指示其意图,然后进入休眠状态

6.4.2.8 DL_LM_HIBERNATE_ENTER.cnf_L

该原语用于指示数据链路层即将进入休眠状态。

  • 语义:DL_LM_HIBERNATE_ENTER.cnf_L( )

  • 生成时机:数据链路层响应DL_LM_HIBERNATE_ENTER.req,指示其正在进入休眠状态

  • 接收效果:DME获知数据链路层完成了进入休眠所需的所有必要操作

6.4.2.9 DL_LM_HIBERNATE_EXIT.req

该原语请求数据链路层退出休眠状态,返回正常运行。

  • 语义:DL_LM_HIBERNATE_EXIT.req( )

  • 生成时机:DME希望唤醒数据链路层时生成

  • 接收效果:

    • 数据链路层转换至复位状态,恢复进入休眠状态时保留的所有属性值

    • 然后使能自身,最后启动数据链路层初始化

    • 初始化完成后,生成DL_LM_HIBERNATE_EXIT.cnf_L,向DME指示其已返回正常运行

6.4.2.10 DL_LM_HIBERNATE_EXIT.cnf_L

该原语用于向DME指示数据链路层已退出休眠状态,返回正常运行。

  • 语义:DL_LM_HIBERNATE_EXIT.cnf_L( )

  • 生成时机:数据链路层响应DL_LM_HIBERNATE_EXIT.req,指示其已不再休眠并返回正常运行

  • 接收效果:DME获知数据链路层完成了退出休眠所需的所有必要操作

6.4.2.11 DL_LM_PRE_HIBERNATE_EXIT.req

对该原语的支持是可选的;但若实现支持,则必须按本节描述实现。
该原语用于请求数据链路层停止或准备停止休眠,并准备返回正常运行。退出休眠需使用DL_LM_HIBERNATE_EXIT.req原语。

  • 语义:DL_LM_PRE_HIBERNATE_EXIT.req( )

  • 生成时机:当DME需要在正式退出休眠前,让数据链路层先做好退出准备时生成

  • 接收效果:数据链路层使能PA_ESCDATA.indPA_DATA.ind的处理,为退出休眠状态做准备

6.4.2.12 DL_LM_PRE_HIBERNATE_EXIT.cnf_L

对该原语的支持是可选的;但若实现支持,则必须按本节描述实现。
该原语用于向DME指示数据链路层已做好退出休眠、返回正常运行的准备,且能正确处理来自PA层的PA_ESCDATA.indPA_DATA.ind

  • 语义:DL_LM_PRE_HIBERNATE_EXIT.cnf_L( )

  • 生成时机:数据链路层响应DL_LM_PRE_HIBERNATE_EXIT.req,指示其已为返回正常运行做好准备

  • 接收效果:DME获知数据链路层完成了退出休眠前的所有必要准备操作

6.4.3 状态原语

Status Primitives
本节定义的服务原语用于数据链路层提供状态信息。

表38 DL_LM_SAP状态原语 Table 38 DL_LM_SAP Status Primitives

名称   Name

请求   Request

指示   Indication

本地响应 Local Response

响应   Response

本地确认 Local Confirm

确认   Confirm

DL_LM_ERROR

-

6.4.3.1

-

-

-

-

DL_LM_CTRL_NOFRAME

-

6.4.3.2

-

-

-

-

DL_LM_TC1_NOFRAME

-

6.4.3.3

-

-

-

-

DL_LM_TC0_NOFRAME

-

6.4.3.4

-

-

-

-

DL_LM_CTRL_FRAME

-

6.4.3.5

-

-

-

-

DL_LM_TC1_FRAME

-

6.4.3.6

-

-

-

-

DL_LM_TC0_FRAME

-

6.4.3.7

-

-

-

-

表39 DL_LM_SAP状态原语参数 Table 39 DL_LM_SAP Primitive Parameters

名称   Name

类型   Type

有效范围 Valid Range

值   Value

描述   Description

DLErrorCode

枚举 Enum

-

NAC_RECEIVED=1TCx_REPLAY_TIMER_EXPIRED=2AFCx_REQUEST_TIMER_EXPIRED=3FCx_PROTECTION_TIMER_EXPIRED=4CRC_ERROR=5RX_BUFFER_OVERFLOW=6MAX_FRAME_LENGTH_EXCEEDED=7WRONG_SEQUENCE_NUMBER=8AFC_FRAME_SYNTAX_ERROR=9NAC_FRAME_SYNTAX_ERROR=10EOF_SYNTAX_ERROR=11FRAME_SYNTAX_ERROR=12BAD_CTRL_SYMBOL_TYPE=13PA_INIT_ERROR=14PA_ERROR_IND_RECEIVED=15PA_INIT=16

向DME指示数据链路层发生的错误事件

6.4.3.1 DL_LM_ERROR.ind

该服务原语向DME指示数据链路层发生了错误事件。

  • 语义:DL_LM_ERROR.ind( DLErrorCode )

  • 生成时机:数据链路层检测到错误相关事件时生成,报告以下四类事件:

    • PA_INIT_ERRORPA_INIT.req失败

    • PA_INIT:数据链路层已向PA层发出PA_INIT.req,或已从PA层收到PA_INIT.ind

    • CRC_ERROR:数据帧或控制帧检测到CRC错误

    • RX_BUFFER_OVERFLOW:接收缓冲区溢出(可能因错误的SOF符号或向未实现的流量类别发送数据导致)

    • MAX_FRAME_LENGTH_EXCEEDED:收到的帧有效载荷长度超过DL_MTU

    • WRONG_SEQUENCE_NUMBER:收到帧序列号错误的正确帧

    • AFC_FRAME_SYNTAX_ERROR:收到AFC符号后未跟随两个数据符号

    • NAC_FRAME_SYNTAX_ERROR:收到NAC符号后未跟随一个数据符号

    • EOF_SYNTAX_ERROR:收到EOF_EVEN或EOF_ODD符号后未跟随一个数据符号

    • FRAME_SYNTAX_ERROR:收到意外的帧序列

    • BAD_CTRL_SYMBOL_TYPE:收到不支持的数据或控制符号

    • PA_ERROR_IND_RECEIVED:收到PA_ERROR.ind

    1. 导致帧重传的事件:NAC_RECEIVED(收到NAC帧)、TCx_REPLAY_TIMER_EXPIRED(TCx重放定时器超时)

    2. AFC传输可能失败导致的事件:AFCx_REQUEST_TIMER_EXPIRED(AFCx请求定时器超时)、FCx_PROTECTION_TIMER_EXPIRED(FCx保护定时器超时)

    3. 接收链路上检测到的、导致向对端报告NAC的错误:

    4. PHY(重)初始化的尝试或失败:

  • 接收效果:该指示可用于执行统计相关操作

6.4.3.2 DL_LM_CTRL_NOFRAME.ind

该原语向DME指示数据链路层发送器没有排队等待传输的控制帧。

  • 语义:DL_LM_CTRL_NOFRAME.ind( )

  • 生成时机:数据链路层没有新的控制帧要传输时生成

  • 接收效果:该指示可用于执行电源管理相关操作

6.4.3.3 DL_LM_TC1_NOFRAME.ind

该原语向DME指示数据链路层发送器中没有流量类别1的新的或未确认的数据帧。

  • 语义:DL_LM_TC1_NOFRAME.ind( )

  • 生成时机:没有TC1数据要发送,且所有已发送的TC1帧都已被确认时生成

  • 接收效果:该指示可用于执行电源管理相关操作

6.4.3.4 DL_LM_TC0_NOFRAME.ind

该原语向DME指示数据链路层发送器中没有流量类别0的新的或未确认的数据帧。

  • 语义:DL_LM_TC0_NOFRAME.ind( )

  • 生成时机:没有TC0数据要发送,且所有已发送的TC0帧都已被确认时生成

  • 接收效果:该指示可用于执行电源管理相关操作

6.4.3.5 DL_LM_CTRL_FRAME.ind

该原语向DME指示数据链路层有控制帧(AFC0、AFC1或NAC帧)需要传输。

  • 语义:DL_LM_CTRL_FRAME.ind( )

  • 生成时机:有控制帧要传输时生成

  • 接收效果:该指示可用于执行电源管理相关操作

6.4.3.6 DL_LM_TC1_FRAME.ind

该原语向DME指示数据链路层发送器中至少有一个流量类别1的新的或未确认的数据帧。

  • 语义:DL_LM_TC1_FRAME.ind( )

  • 生成时机:至少有一个TC1数据帧要发送,或并非所有已发送的TC1帧都已被确认时生成

  • 接收效果:该指示可用于执行电源管理相关操作

6.4.3.7 DL_LM_TC0_FRAME.ind

该原语向DME指示数据链路层发送器中至少有一个流量类别0的新的或未确认的数据帧。

  • 语义:DL_LM_TC0_FRAME.ind( )

  • 生成时机:至少有一个TC0数据帧要发送,或并非所有已发送的TC0帧都已被确认时生成

  • 接收效果:该指示可用于执行电源管理相关操作

6.5 协议数据单元的结构与编码

Structure and Encoding of Protocol Data Units
数据链路层PDU(DL_PDU),即帧,由一系列17位符号组成,这些符号分为数据符号和控制符号,分别定义在6.5.1节和6.5.2节。

符号的最高位(第16位)用于区分数据符号和控制符号。这两类符号使用不同的PA层服务原语,使PA层采用适合底层PHY的编码方案。

注意:这并不意味着这些17位符号直接在链路上传输。PHY适配层或PHY层可以使用合适的编码方案对这些符号进行转换。

数据链路层支持两类帧:数据帧和控制帧。

  • 数据帧:用于在不同UniPort上的两个数据链路层之间传输数据

  • 控制帧:用于流量控制和可靠性保证

图片

图61 控制帧与数据帧分类 Figure 61 Control and Data Frames Taxonomy

数据链路层必须支持至少一个流量类别的数据帧;若同时支持两个流量类别,则必须支持具有不同优先级的两个流量类别的数据帧。数据帧始终包含帧起始(SOF)符号、一个或多个数据字节、可选的填充字节、帧结束(EOF_EVEN或EOF_ODD)符号和错误校验符号。每个流量类别的帧长度是灵活的(见6.8节),但最大帧长度限制为DL_SYMBOL_MTU个符号(不包括SOF符号、EOF_EVEN/EOF_ODD符号、COF符号和CRC符号)。

此外,每个流量类别拥有独立的AFC帧,所有流量类别共享一个公共的NAC帧。控制帧与数据帧的区别在于没有SOF和EOF_EVEN/EOF_ODD符号,ESC_DL与控制符号类型共同作为对应控制帧的起始。每个控制帧为固定长度,长度取决于其类型。根据优先级规则(见6.6.4节),控制帧可以在数据帧传输过程中发送,即可以抢占数据帧。

应避免数据链路层帧内出现传输间隙,导致PHY在高速模式下插入PHY空闲符号。

6.5.1 数据符号

Data Symbol
数据链路层使用数据符号传输或接收数据信息。数据链路层中,数据符号的第16位必须设为\'0\'。

图片

图62 数据链路层数据符号 Figure 62 Data Link Layer Data Symbol

数据链路层使用PHY适配层提供的PA_DATA.req服务原语发送数据符号,并将从PHY适配层PA_DATA.ind服务原语收到的PA_SDU视为数据符号。标识位(第16位)不通过服务原语传递。

6.5.2 控制符号

Control Symbol
数据链路层使用控制符号接收或传输控制信息。控制符号的第15~8位为高字节,第7~0位为低字节。数据链路层中,控制符号的第16位必须设为\'1\'。

数据链路层使用PHY适配层提供的PA_ESCDATA.req服务原语发送控制符号,并将从PHY适配层PA_ESCDATA.ind服务原语收到的PA_SDU视为控制符号。标识位(第16位)不通过服务原语传递。

ESC_DL字符用作数据链路层控制符号标识符,低字节分为控制符号类型字段和参数字段。控制符号类型字段指定控制符号的标识,参数字段为不同控制符号指定不同的参数值。

图片

图63 控制符号定义 Figure 63 Control Symbol Definition

注意:数据和控制符号可由PA层转换为适合PHY的编码方案。若底层PHY支持字符编码,则控制符号标识符(控制符号的高字节)可转换为特殊的PHY字符。由于此类特殊PHY字符的数量有限,数据链路层应尽量减少控制符号标识符的数量。

当前定义的控制符号高字节如下表所示,未定义的值保留供将来使用。数据链路层不得使用保留值,若收到保留值则应丢弃。

表40 控制符号高字节编码 Table 40 Control Symbol MS Byte Encoding

控制符号高字节 Control Symbol MS Byte

Tx_Data Bit[16]

Tx_Data Bits[15:8]

描述   Description

ESC_DL

1

00000001

数据链路层控制符号标识符

所有数据链路层控制符号及其对应的控制符号类型和简要描述如下表所示:

表41 控制符号类型字段定义 Table 41 Control Symbol Type Field Definition

控制符号 Control Symbol

类型   Type

描述   Description

SOF

0b000

帧起始,参数包含流量类别标识符

EOF_EVEN

0b001

偶数长度L2有效载荷的帧结束,参数指示帧序列号

EOF_ODD

0b010

奇数长度L2有效载荷的帧结束,参数指示帧序列号

COF

0b011

被抢占帧的继续,参数包含流量类别标识符

0b100

保留 Reserved

-

NAC

0b101

否定确认控制帧的起始,参数包含请求对端重新初始化其TX PHY的标志

AFC

0b110

确认与流量控制帧的起始,参数包含流量类别标识符和AFC类型标识

0b111

保留 Reserved

-

剩余值保留供将来使用。发送器不得使用保留的控制符号类型值,收到保留类型值的控制符号应丢弃。

数据链路层控制符号的参数字段定义如下表所示:

表42 控制符号参数字段定义 Table 42 Control Symbols Parameter Field Definition

控制符号 Control Symbol

参数字段 Parameter Field

Bit 4

SOF

TC

EOF_EVEN

EOF_ODD

COF

TC

AFC

TC

NAC

保留 Reserved

数据链路层发送器应将保留位设为\'1\',接收器应忽略保留位。

SOF、COF和AFC控制符号的第4位和第3位用于标识流量类别,用法如下表所示:

表43 流量类别标识 Table 43 Traffic Class Identification

TC

流量类别 Traffic Class

11

保留 Reserved

10

保留 Reserved

01

TC1

00

TC0

数据链路层发送器不得使用保留的流量类别值,收到保留TC值的SOF、COF或AFC控制符号应丢弃。

6.5.3 数据帧

Data Frames
数据链路层所有流量类别使用相同的用户数据帧格式,用于封装上层PDU。每个上层PDU必须封装在一个数据链路层帧中,且一个数据帧只能封装一个上层PDU。

数据帧始终以SOF符号开头;SOF符号之后是组成帧SDU(即L3提供的PDU)的所有数据符号作为有效载荷。若帧有效载荷包含奇数个字节,则最后一个数据符号的高字节携带最后一个有效载荷字节,低字节填充0x00。若发生帧抢占,则在恢复帧传输时插入COF符号。数据帧根据有效载荷字节数的奇偶性,分别以EOF_EVEN符号或EOF_ODD符号结束;EOF符号之后是一个数据符号,携带采用CCITT CRC-16标准的帧校验和(见6.6.11节)。

所有数据链路层数据帧遵循以下规则:

  • 数据帧受CCITT CRC-16校验和保护

  • 仅当CRC校验和正确时,才使用数据帧的信息

图片

图64 偶数长度DL_SDU的数据帧 Figure 64 Data Frame with Even Number of DL_SDU Bytes

填充字节始终位于数据帧EOF_ODD符号之前的最后一个数据符号的低字节。发送器应将填充字节设为0,接收器在将其送入CRC校验器后应丢弃该填充字节,且不得将其传递给上层。

图片

图65 奇数长度DL_SDU的数据帧 Figure 65 Data Frame with Odd Number of DL_SDU Bytes

图片

图66 被抢占的数据帧 Figure 66 Data Frame with Preemption

6.5.4 控制帧

Control Frames
所有数据链路层控制帧遵循以下规则:

  • 控制帧受CCITT CRC-16校验和保护

  • 仅当CRC校验和正确时,才使用控制帧的信息

  • 控制帧不得被抢占

6.5.4.1 数据链路层确认与流量控制帧(AFC)

Data Link Layer Acknowledgment and Flow Control Frame
AFC帧用于确认正确接收的数据帧,并交换对应流量类别的流量控制信息。AFC帧始终以AFC控制符号开头,后跟两个数据符号,包含流量类别标识、信用传输请求(CReq)位、帧序列号和流量控制信用值。

确认信息(帧序列号)和流量控制信息(信用值)归属于TC字段标识的流量类别。

图片

图67 AFC帧 Figure 67 AFC Frame

AFC帧用于与对端交换信用信息和确认信息。AFCx符号中的CReq位用于向对端请求对应流量类别的流量控制信息,请求AFC帧传输的规则定义在6.6.9节。

帧序列号为5位,支持对每个流量类别的帧进行单独确认或组确认(最多确认16个连续帧),详见6.6.8.1节。

信用单位的字节大小由DL_CreditUnitSize定义(见表49),AFC帧中的Credit Value字段长度由DL_CreditValSizeBits定义(见表48)。因此:

  • DL_CreditUnitSize = 32,则一个AFC帧最多可传达4KB接收缓冲区大小的信用信息

  • DL_CreditUnitSize = 128,则一个AFC帧最多可传达16KB接收缓冲区大小的信用信息

流量控制信用表示自启动以来可用的总信用数,而非相对值。在数据链路层初始化阶段,通过AFC帧传达缓冲区的空闲空间,详见6.7节。

发送时保留位应设为\'1\',接收时忽略保留位。

6.5.4.2 数据链路层否定确认控制帧(NAC)

Data Link Layer Negative Acknowledgment Control Frame
当接收器在任何帧中检测到错误(见6.6.10节)、收到序列号错误的数据帧,或反向链路需要重新初始化时,应发送NAC帧。NAC帧长度为2个符号,包含RReq位,用于请求对端重新初始化其TX PHY。

图片

图68 NAC帧 Figure 68 NAC Frame

发送时保留位应设为\'1\',接收时忽略保留位。

6.6 协议特性

Protocol Features
本节描述数据链路层发送器和接收器的控制流程和数据流程。

6.6.1 PDU组帧特性

PDU Composition Feature
上层PDU始终封装在一个数据链路层帧中,每个上层PDU必须封装在单独的数据链路层帧中。上层应提供长度不超过数据链路层发送最大帧长度的PDU。

数据链路层发送器为每个上层PDU添加SOF控制符号作为头部,添加EOF_EVEN/EOF_ODD控制符号和CRC符号作为尾部。

图片

图69 偶数长度DL_SDU的PDU组帧 Figure 69 Composition of PDU with Even Length DL_SDU

6.6.1.1 帧抢占

Preemption
为减少高优先级帧的传输延迟,并结合上层提升服务质量,数据链路层可在低优先级数据帧正在传输时,插入高优先级帧,该功能称为帧抢占。

  • 发送端的帧抢占功能是可选的,由DL_TxPreemptionCap属性定义

  • 接收端必须始终能够接收被抢占和未被抢占的帧

被抢占帧的传输必须以COF符号继续,后跟该流量类别的数据符号或EOF_EVEN/EOF_ODD符号。此外,前一个抢占帧之后可以紧接着发生另一次抢占。

图片

图70 带抢占的PDU组帧(流量类别Y > X) Figure 70 Composition with Preemption (Traffic Class Y > X)

帧抢占时必须遵守以下规则:

  • 抢占不得发生在EOF_EVEN/EOF_ODD符号与CRC符号之间

  • 抢占不得发生在AFC和NAC帧内部(包括CRC符号)

  • 除上述禁止位置外,抢占可发生在任何符号边界

6.6.2 PDU解帧特性

PDU Decomposition Feature
数据链路层接收器从收到的帧中移除对端添加的头部(SOF符号)和尾部(EOF_EVEN/EOF_ODD符号及CRC符号)。若满足以下所有条件,则将DL_SDU交付给上层:

  1. 帧的CRC校验通过

  2. 帧序列号符合预期顺序

  3. 该帧不是之前已经交付给上层的重传帧

图片

图71 偶数长度DL_SDU的PDU解帧 Figure 71 Decomposition with Even Length DL_SDU

若发生帧抢占,则在将帧交付给网络层之前,还需移除所有COF控制符号。若满足上述正确性规则,则将帧的正确完整有效载荷(不含COF符号)交付给上层。

图片

图72 带抢占的PDU解帧 Figure 72 Decomposition with Preemption

6.6.3 缓冲机制

Buffering Mechanism
每个流量类别的发送器必须提供重传能力,在帧传输后保留该帧,直到其被对应流量类别确认。这种保留机制允许在帧传输失败时进行重传。

所有TC缓冲区遵循以下规则:

  • 上层PDU必须在帧开始传输前完整地提供给数据链路层

  • 数据链路层仅在能够重传该PDU时,才接受上层PDU

对于任何流量类别,数据链路层实现必须能够重传其发送的任何帧,直到该帧被确认。此外,数据链路层实现必须能够接收任何流量类别的最大有效载荷长度(DL_MTU)的帧,且不得向上层交付包含6.4.3.1节定义的任何错误的帧数据。

6.6.4 仲裁方案

Arbitration Scheme
所有帧类型的数据链路层优先级(从高到低)如下表所示:

表44 支持的优先级 Table 44 Supported Priorities

优先级   Priority

数据链路层帧名称 DL Layer Frame Name

帧类型   Frame Type

描述   Description

最高 Highest

NAC

控制帧 Control

否定确认控制帧

-

AFC1   (promoted)

控制帧 Control

由AFC1_REQUEST_TIMER超时、FC1_PROTECTION_TIMER超时、收到CReq=1的AFC1帧,或AFC1_REQUEST_TIMER运行时收到PA_DL_PAUSE.ind触发的AFC1帧

-

AFC0   (promoted)

控制帧 Control

由AFC0_REQUEST_TIMER超时、FC0_PROTECTION_TIMER超时、收到CReq=1的AFC0帧,或AFC0_REQUEST_TIMER运行时收到PA_DL_PAUSE.ind触发的AFC0帧

-

AFC1

控制帧 Control

由其他条件触发的AFC1帧

-

TC1

数据帧 Data

流量类别1数据帧

-

AFC0

控制帧 Control

由其他条件触发的AFC0帧

最低 Lowest

TC0

数据帧 Data

用于延迟要求不严格的流量的流量类别0数据帧

6.6.5 链路属性变更

Change of Certain Link Properties
当链路的某些属性(如电源模式、活动通道数等)发生变化时,PHY适配层(L1.5)和数据链路层(L2)之间需要进行协调,以确保属性变更前、变更中和变更后的正常运行。这种协调由PHY适配层通过PA_DL_PAUSE.ind原语发起。

收到PA_DL_PAUSE.ind后:

  1. 所有数据链路层定时器停止

  2. 数据链路层可完成当前正在传输的帧

  3. 数据链路层必须在发出PA_DL_PAUSE.rsp_L之前,传输所有挂起的、提升优先级的AFC或NAC帧

  4. 冻结状态必须在任何正在传输的帧传输完成后立即进入

  5. 进入冻结状态后,生成PA_DL_PAUSE.rsp_L

  6. 生成PA_DL_PAUSE.rsp_L后,数据链路层不得向PHY适配层发送任何新符号

  7. 若没有正在传输的帧,且没有挂起的、提升优先级的AFC或NAC帧,则数据链路层应立即生成PA_DL_PAUSE.rsp_L

图片

图73 PA_DL_PAUSE.rsp_L生成示例 Figure 73 Generation of PA_DL_PAUSE.rsp_L Example

若在帧传输过程中进入冻结状态,则退出冻结状态并恢复正常运行时,该帧应从中断点继续传输。

PHY适配层通过向数据链路层发送PA_DL_RESUME.ind原语,指示操作已完成。收到该原语后:

  • 数据链路层退出冻结状态,恢复正常运行

  • 根据仲裁方案发送所有挂起的帧

  • 重新使能帧传输,复位并重启所有定时器

  • 收到PA_DL_RESUME.ind恢复运行时,数据链路层不得生成COF符号

6.6.6 TCx数据帧传输

TCx Data Frame Transmission
任何流量类别的数据帧传输必须遵循以下规则:

  • 帧必须按照仲裁方案传输,高优先级帧可抢占低优先级数据帧

  • 仅当满足以下所有条件时,才可启动数据帧传输:

    1. 有足够的信用值可发送完整的DL_SDU到对端

    2. 未确认的帧数量少于16个

  • 被抢占的数据帧的传输必须以COF符号继续

6.6.7 流量控制

Flow Control
数据链路层采用每个流量类别独立的信用流量控制方案。发送器必须跟踪接收器的空闲逻辑缓冲区空间,仅当对端接收器对应TC有足够的空闲逻辑缓冲区容纳完整帧时,才启动该流量类别的数据帧传输。

信用值仅用于数据帧有效载荷和填充字节,不用于传输SOF、EOF_EVEN、EOF_ODD、COF、CRC符号以及控制帧。

流量控制方案的核心原理:

  • 发送器按流量类别跟踪对端RX逻辑缓冲区的可用空间

  • 系统基于寄存器实现,寄存器表示自上电/复位以来可用的总信用数

  • 通过比较自上电/复位以来使用的总信用数,判断是否可以发送帧

  • 信用值是保守的,可能略滞后于接收器的实际可用空间,但永远不会高估,保证系统鲁棒性

  • 信用机制具有自修复能力:若AFC帧丢失,下一个更新的AFC帧会自动纠正错误

启动流程中,双方为每个流量类别交换CReq=1的AFC帧,Credit Value字段等于各自接收逻辑缓冲区的大小(以信用单位计)。Credit Value字段的内容取决于DL_CreditUnitSize的值,该值由DL_LM_CAPABILITY_SET.reqDLCreditUnitMode参数确定(见6.4.1.5节)。若数据链路层接收逻辑缓冲区的大小大于AFC帧可传达的最大缓冲区大小,则Credit Value字段应设为128。

每个节点为每个TC维护以下寄存器值:

  • R:存储收到的信用数

  • U:存储使用的总信用数

  • S:存储发送的总信用数

  • A:存储可用的总信用数

  • Part_U:存储U的部分信用数(不足一个信用单位的字节数)

  • Part_A:存储A的部分信用数(不足一个信用单位的字节数)

  • 节点的发送部分处理寄存器R和U

  • 节点的接收部分处理寄存器S和A

  • R、U、S的初始值为0

  • A的初始值为接收逻辑缓冲区的大小(以信用单位计),若缓冲区大小不是信用单位大小的整数倍,则向下取整

  • 所有信用寄存器的长度为8位,与AFC帧中Credit Value字段的长度相同,采用模256运算,溢出忽略

流量控制的核心规则:

  1. 收到无错误的对应TC的AFC帧时,用收到的Credit Value字段值替换R的值

  2. 发送有效载荷或填充字节时,按发送的完整信用单位数递增U,不足一个信用单位的字节数累计在Part_U中;当Part_U超过一个信用单位时,U加1,Part_U减去一个信用单位

  3. 上层从数据链路层取走有效载荷字节,以及数据链路层丢弃填充字节,会在接收器逻辑缓冲区中创建空闲空间;按创建的完整信用单位数递增A,不足一个信用单位的字节数累计在Part_A中;当Part_A超过一个信用单位时,A加1,Part_A减去一个信用单位

  4. 发送AFC帧时,将A的值填入AFC的Credit Value字段,同时将S的值替换为A的值

  5. 数据帧首次传输时,允许发送的最大字节数由以下公式计算:
    [
    \left[ \left( (R + 2^{DL_CreditValSizeBits} - U) \mod 2^{DL_CreditValSizeBits} \right) \times DL_CreditUnitSize - Part_U \right] \text{ 字节}
    ]
    若帧有效载荷(含填充字节)大于该值,则不得启动传输

  6. 重传数据帧时,不检查信用值,直接传输;且每个帧的信用值仅在首次传输时计入U和Part_U,重传时不计入

AFC帧的流量控制触发条件:
当满足以下条件时,节点应发送AFC帧:
[
\left[ (A + 2^{DL_CreditValSizeBits} - S) \mod 2^{DL_CreditValSizeBits} \right] > DL_AFCxCreditThreshold
]

若数据链路层发送器有数据帧要发送,但可用信用数少于DL_TCxTXFCThreshold,则在FCx_PROTECTION_TIMER超时后,发送CReq=1的AFCx帧,请求对端发送流量控制信息。

FCx_PROTECTION_TIMER用于防止AFCx帧丢失导致的信用丢失,其超时值为DL_FCxProtectionTimeOutVal。该定时器在以下任一条件满足时复位:

  • 自身超时

  • 收到无错误的AFCx帧

该定时器在以下所有条件满足时运行:

  • 对端节点的TCx存在

  • 对应TCx的发送端信用数少于DL_TCxTXFCThreshold且有数据要发送

  • 数据链路层处于初始化阶段,且未收到对应TCx的AFC帧

若发送CReq=1的AFCx帧后,FCx_PROTECTION_TIMER超时仍未收到AFCx帧,则触发PA_INIT.req并使能NAC传输。收到PA_INIT.cnf_L后,先发送对应RReq位的NAC帧,再发送CReq=1的AFCx帧。

注意:响应CReq=1的AFCx帧时,对应AFCx帧的优先级会提升,见6.6.4节。

6.6.8 确认操作

Acknowledgment Operation
本地发送器发送的每个数据链路层数据帧,必须由对端接收器进行单独确认或组确认。对端接收器仅确认状态良好的帧(见6.6.10节)。

若帧的CRC校验和错误或序列号意外,则数据链路层应丢弃整个帧,不进行任何处理,并发送NAC帧。若数据帧无错误(CRC正确且序列号符合预期),则接收器应调度一个包含该帧序列号的确认。

由于确认和流量控制信息在同一个AFC帧中传输,因此AFC帧的生成可能不是立即的,需遵循6.6.9节的AFC帧生成规则。AFC帧包含接收器逻辑缓冲区的当前信用信息,以及对应流量类别最后一个正确接收帧的序列号。当收到AFC帧中的序列号时,所有发送至该序列号(含)的帧均视为已确认。

每个流量类别有独立的AFC帧(AFC0对应TC0,AFC1对应TC1)。

6.6.8.1 帧序列号标识

Frame Sequence Number Identification
每个数据帧使用5位帧序列号,序列号包含在EOF_EVEN/EOF_ODD符号中。每个流量类别独立使用自己的帧序列号,不与其他TC共享。

帧序列号的特性:

  • 每个流量类别有独立的帧序列号

  • 有效范围:0~31

  • 发送对应TC的帧时,序列号递增,并支持回绕机制

  • 复位时,每个流量类别的第一个发送数据帧的序列号为0

  • 复位时,最后一个正确接收的帧序列号设为31,下一个预期接收的帧序列号为0

  • 收到预期序列号的正确数据帧时,序列号递增,并支持回绕机制

递增回绕的序列号机制支持每个流量类别最多16个未确认帧的组确认。该限制是为了保证按序交付和检测重放帧。

6.6.8.2 重传与帧确认超时机制

Retransmission and Frame Acknowledgment Timeout Mechanism
每个流量类别提供专用的重放定时器(TCx_REPLAY_TIMER),用于识别未确认的已发送帧。该定时器在收到已确认帧的AFCx帧但仍有未确认帧时,不得复位。

数据帧重传时,有效载荷和帧序列号必须与原始传输完全相同,重传按仲裁方案处理。重传时所有帧必须顺序发送,即使在重传过程中收到了某个待重传帧的确认,也必须完成所有重传。

若收到的AFCx帧中的序列号不在未确认帧范围内,或大于对应TC最后一个(重)发送的数据帧的序列号,则接受其中的流量控制信息,但丢弃确认信息。

若TCx_REPLAY_TIMER超时仍未收到确认,则触发PA_INIT.req并使能NAC传输。收到PA_INIT.cnf_L后,按以下顺序发送:

  1. 对应RReq位的NAC帧

  2. TC1的AFC帧(含当前流量控制和确认状态)

  3. TC1所有未确认的数据帧(若有)

  4. TC0的AFC帧(含当前流量控制和确认状态)

  5. TC0所有未确认的数据帧(若有)

若在任何数据帧传输过程中检测到NAC帧:

  • 若尚未发送EOF_EVEN/EOF_ODD符号,则停止当前数据帧传输

  • 若已发送EOF_EVEN/EOF_ODD符号,则不停止该帧

  • 若在任何控制帧传输过程中检测到NAC帧,则不停止正在传输的控制帧

NAC帧的接收方执行以下操作:

  1. 若NAC帧的RReq位为\'1\',则触发PHY适配层的PA_INIT.req,并等待PA_INIT.cnf_L

  2. 若NAC帧的RReq位为\'0\',则触发PHY适配层的PA_LANE_ALIGN.req,并等待PA_LANE_ALIGN.cnf_L

  3. 完成上述操作后,按优先级方案发送所有TC的AFC帧和未确认数据帧

接收器通过比较收到的帧序列号与预期序列号,检测重传帧。若收到的序列号不是预期的,则与预期序列号之前的16个序列号比较;若匹配,则识别为重传帧并丢弃。无论是否识别为重传帧,都应为每个正确接收的数据帧调度确认。

重放定时器(TCx_REPLAY_TIMER)在以下任一条件满足时复位:

  • 发送TCx数据帧的最后一个符号(CRC符号)

  • 收到确认至少一个未确认数据帧的正确AFCx帧

  • 收到正确的NAC帧

  • 自身超时

该定时器在以下所有条件满足时运行:

  • 存在至少一个未确认的已发送TCx数据帧

  • 数据链路层未因PA_INIT.req请求而等待PA_INIT.cnf_L

帧确认定时器(AFCx_REQUEST_TIMER)在以下任一条件满足时复位:

  • 收到正确的TCx数据帧

  • 收到正确的NAC帧

  • 发送AFCx帧

  • 自身超时

该定时器在以下条件满足时运行:

  • 存在未确认的已接收TCx数据帧

  • 数据链路层未因PA_INIT.req请求而等待PA_INIT.cnf_L

注意:AFCx_REQUEST_TIMER超时会提升对应AFCx帧的优先级,见6.6.4节。

图片

图78 TC0的帧确认定时器和重放定时器定义 Figure 78 Definition of Frame Acknowledgment Timer and Replay Timer for TC0

6.6.9 AFCx帧传输

AFCx Frame Transmission
所有AFC帧传输规则仅在因DL_LM_LINKSTARTUP.reqDL_LM_HIBERNATE_EXIT.req发送了第一个CReq=1的AFCx帧后才生效。其他情况下,若对端设备未实现TC1(即DL_PeerTC1Present = FALSE),则初始AFC交换后禁用TC1的AFC帧传输。

触发发送CReq=0的AFCx帧的条件:

  1. 收到NAC帧后

  2. TCx_REPLAY_TIMER超时后

  3. AFCx_REQUEST_TIMER超时后(此时AFCx帧优先级提升)

  4. 待确认的帧数超过DL_TCxOutAckThreshold时:
    [
    [(32 + currentTCxFrSeqNum - lastAFCxFrSeqNum) \mod 32] > DL_TCxOutAckThreshold
    ]

  5. 收到重传的数据帧,且其序列号等于最后一个已确认的帧序列号时

  6. 接收器可用信用数与已发送信用数的差值超过DL_AFCxCreditThreshold时:
    [
    [(2^{DL_CreditValSizeBits} + A - S) \mod 2^{DL_CreditValSizeBits}] > DL_AFCxCreditThreshold
    ]

  7. 收到CReq=1的AFCx帧后(此时AFCx帧优先级提升,即使DL_PeerTCxPresent = FALSE也需响应)

  8. AFCx_REQUEST_TIMER运行时收到PA_DL_PAUSE.ind后(此时AFCx帧优先级提升)

触发发送CReq=1的AFCx帧的条件:

  1. FCx_PROTECTION_TIMER超时后(此时AFCx帧优先级提升)

  2. 初始AFC交换期间发送的第一个AFC帧

6.6.10 NAC帧传输

NAC Frame Transmission
发送NAC帧前,必须先触发PA_LANE_ALIGN.req原语。

当发生以下任一情况时,应发送NAC帧(RReq位根据PA_INIT.cnf_LPAReverseLinkInitialized参数设置):

  1. 输入帧检测到CRC错误

  2. 任何TC的接收缓冲区溢出

  3. 任何TC收到的帧有效载荷长度超过DL_SYMBOL_MTU个符号

  4. 任何TC收到的数据帧序列号不正确(满足公式4)

  5. AFC符号后未跟随两个数据符号

  6. NAC符号后未跟随一个数据符号

  7. EOF_EVEN或EOF_ODD符号后未跟随一个数据符号(即CRC符号)

  8. 收到PA_ERROR.ind

  9. 在未启动帧的情况下收到COF、EOF_EVEN或EOF_ODD符号

  10. 同一流量类别的数据帧正在进行且未被抢占时,收到该TC的SOF符号

  11. TC1数据帧正在进行时,收到TC=0的SOF符号

  12. 同一流量类别的数据帧正在进行且未被抢占时,收到该TC的COF符号

  13. 收到继续不同TC数据帧的COF符号

  14. 在抢占帧的CRC之后收到EOF_EVEN、EOF_ODD或数据符号

  15. 收到字段值无效的DL控制符号(如未定义的控制符号类型或TC)

  16. 收到意外的帧序列(帧之间收到数据符号)

接收器检测到上述任何错误时,应丢弃所有部分接收的数据帧。发送NAC帧后,NAC传输将被禁用,直到数据链路层收到一个无错误的数据或控制(AFC或NAC)帧。

尽管NAC传输可能被禁用,但当发生以下任一情况时,仍应发送对应RReq位的NAC帧:

  1. 发送CReq=1的AFCx帧后,等待响应时FCx_PROTECTION_TIMER超时

  2. TCx_REPLAY_TIMER超时

不正确的帧序列号定义:若预期序列号为ExpSeq,收到的序列号为RcvSeq,则当满足以下公式时,RcvSeq为不正确:
[
0 < (32 + RcvSeq - ExpSeq) \mod 32 < 16
]

6.6.11 错误检测机制

Error Detection Mechanism
数据链路层使用CCITT CRC-16标准对所有数据帧和控制帧(AFC和NAC)进行传输错误检测。CRC覆盖从帧的第一个控制符号(SOF、AFC或NAC符号)开始,到CRC符号之前的所有符号(包括任何COF符号)。携带CRC校验和的DL层数据符号的第16位(始终为0)不被CRC覆盖。

图片

图79 CRC覆盖范围 Figure 79 CRC Coverage

CRC-16多项式:
[
G(x) = x^{16} + x^{12} + x^5 + 1
]

发送端CRC计算规则:

  1. CRC-16值初始化为0b1111 1111 1111 1111

  2. CRC计算的第一个比特是DL符号的最高位(第16位)

  3. 计算结果取反得到最终的CRC-16校验和

CRC校验和在DL层数据符号中的位分配如下:

图片

图80 CRC-16校验和在DL层数据符号中的位分配 Figure 80 Bit Allocation for CRC-16 Checksum in DL Layer Data Symbol

接收端CRC计算规则:

  1. CRC-16值初始化为0b1111 1111 1111 1111

  2. 将帧有效载荷(包括DL层控制符号和数据符号)送入CRC-16计算器

  3. 若无传输错误,计算结果应与收到的校验和一致

6.6.12 PHY初始化条件

PHY Initialization Condition
当满足以下任一条件时,必须触发PA_INIT.req

  1. 收到RReq位为\&#39;1\&#39;的NAC帧

  2. 发送CReq=1的AFCx帧后,FCx_PROTECTION_TIMER超时

  3. TCx_REPLAY_TIMER超时

PA_INIT.req成功,则发送NAC帧,数据链路层继续运行。若收到PAResult = FALSEPA_INIT.cnf_L,则自主错误恢复耗尽,发生致命错误。此时:

  1. 数据链路层应使用DL_LM_ERROR.ind( PA_INIT_ERROR )通知DME

  2. 发出该通知后,数据链路层被阻塞,无法发送NAC帧

  3. DME应使用DME_ERROR.ind( DL, PA_INIT_ERROR )通知应用

  4. 应用收到该通知后,应复位UniPro协议栈

6.7 数据链路层初始化

Data Link Layer Initialization
数据链路层初始化包括初始信用交换,是准备链路执行正常操作的过程。初始信用交换在DME生成DL_LM_LINKSTARTUP.reqDL_LM_HIBERNATE_EXIT.req原语时启动。这两个原语必须在DME通过DL_LM_ENABLE_LAYER.req使能DL且收到DL_LM_ENABLE_LAYER.cnf_L确认后才能调用。

收到DL_LM_LINKSTARTUP.reqDL_LM_HIBERNATE_EXIT.req后,数据链路层首先发送流量类别1的AFC帧(AFC1),然后发送流量类别0的AFC帧(AFC0)。这两个AFC帧的CReq位均设为\&#39;1\&#39;,携带的帧序列号和信用值分别为两个流量类别的复位值:

  • 最后一个已确认帧序列号:31(见6.6.8节)

  • 累计信用数A:接收逻辑缓冲区的大小(以信用单位计,见6.6.7节)

在收到第一个AFCx帧之前,对应的FCx_PROTECTION_TIMER持续运行。FCx_PROTECTION_TIMER的行为、AFC帧传输规则和NAC帧传输规则确保了初始化期间信用交换的可靠性。

初始AFC交换中对端TC存在性的判断:

  • 若收到的第一个AFCx帧的流量控制信用值为0,则DL_PeerTCxPresent = FALSE

  • 若收到的第一个AFCx帧的流量控制信用值≥10,则DL_PeerTCxPresent = TRUE

  • 其他信用值不支持,会导致未定义行为

当每个流量类别都收到一个AFCx帧时,初始信用交换完成,数据链路层初始化完成,L2通过发送DL_LM_LINKSTARTUP.cnf_L原语向DME报告其已进入运行状态。

第一个AFC帧中收到的TCx信用数存储在DL_PeerTCxRxInitCreditVal中,该值减1定义了DL_TCxTXFCThreshold的有效上限(见表47)。

仅支持一个流量类别的UniPro实现必须实现TC0。

图片

图81 初始信用交换示例 Figure 81 Initial Credit Exchange Example

6.8 管理信息库与协议常量

Management Information Base and Protocol Constants
本节定义数据链路层的可读写属性、静态属性和协议常量。所有属性均应可读;具有多个强制值的属性应可写。所有UniPro属性复位为表中指定的默认值,部分属性支持加载持久化值(存储在非易失性存储器、eFuse等中)。

表47 数据链路层(可读写)属性 Table 47 Data Link Layer (gettable, settable) Attributes

属性   Attribute

属性ID   Attribute ID

描述   Description

类型   Type

单位   Unit

有效值   Valid Attribute Value(s)

强制值   Mandatory Value(s)

复位值   Reset Value

TC0参数

DL_TC0TXFCThreshold¹

0x2040

触发发送CReq=1的AFC0帧以请求对端流量控制更新的阈值,休眠期间保留

整数 Integer

DL_CreditUnitSize

1 ~   DL_PeerTC0RxInitCreditVal - 1

9

9

DL_FC0ProtectionTimeOutVal

0x2041

FC0_PROTECTION_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留

整数 Integer

µs

0 ~   65535

-

8191

DL_TC0ReplayTimeOutVal

0x2042

TC0_REPLAY_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留

整数 Integer

µs

0 ~   65535

-

65535

DL_AFC0ReqTimeOutVal

0x2043

AFC0_REQUEST_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留

整数 Integer

µs

0 ~   65535

-

32767

DL_AFC0CreditThreshold

0x2044

基于接收器TC0可用信用触发AFC0的阈值,休眠期间保留

整数 Integer

DL_CreditUnitSize

0 ~ 127

0 ~ 8

8

DL_TC0OutAckThreshold

0x2045

TC0的未确认帧数阈值(发送AFC0前可接收的TC0数据帧数),休眠期间保留

整数 Integer

帧 Frame

0 ~ 15

-

0

TC1参数

DL_TC1TXFCThreshold¹

0x2060

触发发送CReq=1的AFC1帧以请求对端流量控制更新的阈值,休眠期间保留

整数 Integer

DL_CreditUnitSize

1 ~   DL_PeerTC1RxInitCreditVal - 1

9

9

DL_FC1ProtectionTimeOutVal

0x2061

FC1_PROTECTION_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留

整数 Integer

µs

0 ~   65535

-

8191

DL_TC1ReplayTimeOutVal

0x2062

TC1_REPLAY_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留

整数 Integer

µs

0 ~   65535

-

65535

DL_AFC1ReqTimeOutVal

0x2063

AFC1_REQUEST_TIMER的超时值,实际超时时间为设置值±10%,0表示关闭,休眠期间保留

整数 Integer

µs

0 ~   65535

-

32767

DL_AFC1CreditThreshold

0x2064

基于接收器TC1可用信用触发AFC1的阈值,休眠期间保留

整数 Integer

DL_CreditUnitSize

0 ~ 127

0 ~ 8

8

DL_TC1OutAckThreshold

0x2065

TC1的未确认帧数阈值(发送AFC1前可接收的TC1数据帧数),休眠期间保留

整数 Integer

帧 Frame

0 ~ 15

-

0

¹ 最大值取决于接收器缓冲区大小

表48 数据链路层协议常量 Table 48 Data Link Layer Protocol Constants

属性   Attribute

描述   Description

类型   Type

单位   Unit

值   Value

DL_MTU_SMALL

DLCreditUnit32模式下的最大有效载荷长度

整数 Integer

字节 Byte

288

DL_MTU_LARGE

DLCreditUnit128模式下的最大有效载荷长度

整数 Integer

字节 Byte

1160

DL_SYMBOL_MTU_SMALL

DL_MTU_SMALL大小有效载荷的最大符号数(DL_SYMBOL_MTU_SMALL   = DL_MTU_SMALL/2)

整数 Integer

符号 Symbol

144

DL_SYMBOL_MTU_LARGE

DL_MTU_LARGE大小有效载荷的最大符号数(DL_SYMBOL_MTU_LARGE   = DL_MTU_LARGE/2)

整数 Integer

符号 Symbol

580

DL_CreditValSizeBits

AFC帧中Credit   Value字段的位数

整数 Integer

位 Bit

8

DL_CreditUnitSizeSmall

DLCreditUnit32模式下的一个信用单位大小

整数 Integer

字节 Byte

32

DL_CreditUnitSizeLarge

DLCreditUnit128模式下的一个信用单位大小

整数 Integer

字节 Byte

128

表49 数据链路层(可读,静态)属性 Table 49 Data Link Layer (gettable, static) Attributes

属性   Attribute

属性ID   Attribute ID

描述   Description

类型   Type

单位   Unit

有效值   Valid Attribute Value(s)

DL_TxPreemptionCap

0x2000

两个流量类别的发送端抢占能力

布尔 Bool

-

TRUE=1,   FALSE=0

DL_MTU²

0x2007

最大有效载荷长度- DLCreditUnit32模式:等于DL_MTU_SMALL-   DLCreditUnit128模式:等于DL_MTU_LARGE休眠期间保留

整数 Integer

字节 Byte

DL_MTU_SMALL,   DL_MTU_LARGE

DL_SYMBOL_MTU²

0x2008

DL_MTU大小有效载荷的最大符号数-   DLCreditUnit32模式:等于DL_SYMBOL_MTU_SMALL- DLCreditUnit128模式:等于DL_SYMBOL_MTU_LARGE休眠期间保留

整数 Integer

符号 Symbol

DL_SYMBOL_MTU_SMALL,   DL_SYMBOL_MTU_LARGE

DL_CreditUnitSize²

0x2009

一个信用单位的大小- DLCreditUnit32模式:等于DL_CreditUnitSizeSmall-   DLCreditUnit128模式:等于DL_CreditUnitSizeLarge休眠期间保留

整数 Integer

字节 Byte

DL_CreditUnitSizeSmall,   DL_CreditUnitSizeLarge

TC0

DL_TC0TxMaxSDUSize³⁴

0x2001

TC0发送器最大SDU大小

整数 Integer

符号 Symbol

1 ~   DL_SYMBOL_MTU

DL_TC0RxInitCreditVal¹³⁴

0x2002

TC0接收器初始信用值(初始寄存器A的值)

整数 Integer

DL_CreditUnitSize

10 ~ 128

DL_TC0TxBufferSize³⁴

0x2005

TC0发送器缓冲区大小

整数 Integer

DL_CreditUnitSize

10 ~ 128

DL_PeerTC0Present

0x2046

对端设备支持TC0

布尔 Bool

-

TRUE=1,   FALSE=0

DL_PeerTC0RxInitCreditVal¹

0x2047

对端TC0接收器初始信用值(初始寄存器A的值)

整数 Integer

DL_CreditUnitSize

10 ~ 128

TC1

DL_TC1TxMaxSDUSize³⁴

0x2003

TC1发送器最大SDU大小

整数 Integer

符号 Symbol

1 ~   DL_SYMBOL_MTU

DL_TC1RxInitCreditVal¹³⁴

0x2004

TC1接收器初始信用值(初始寄存器A的值)

整数 Integer

DL_CreditUnitSize

0, 10 ~   128

DL_TC1TxBufferSize³⁴

0x2006

TC1发送器缓冲区大小

整数 Integer

DL_CreditUnitSize

0, 10 ~   128

DL_PeerTC1Present

0x2066

对端设备支持TC1

布尔 Bool

-

TRUE=1,   FALSE=0

DL_PeerTC1RxInitCreditVal¹

0x2067

对端TC1接收器初始信用值(初始寄存器A的值)

整数 Integer

DL_CreditUnitSize

0, 10 ~   128

¹ 最大值取决于接收器缓冲区大小
² 该属性的值在链路启动时确定,降级后的值在DME_LINKSTARTUP.cnf_L(SUCCESS)后生效
³ 数据链路层根据链路启动时确定的降级DLCreditUnitMode转换该属性的值
⁴ 该属性在休眠期间保留


本文整理自MIPI Alliance发布的《Specification for UniPro Version 2.0》(2022-02-19)第6章,版权归MIPI Alliance所有,仅供技术学习交流使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值