Bootstrap

PLDM入门(三):PLDM命令

一、PLDM Messaging Control and Discovery Commands

CommandCode ValueRequirement
SetTID0x01Optional
GetTID0x02Mandatory
GetPLDMVersion0x03Mandatory
GetPLDMTypes0x04Mandatory
GetPLDMCommands0x05Mandatory

1.SetTID Command

Request Data
ByteTypeField NameDescriptionNotes
0uint8TIDTerminus ID to setReserved values: 0x000xFF
Response Data
ByteTypeField NameDescriptionNotes
0enum8completionCodeCommand execution statusValues: PLDM_BASE_CODES

说明

  1. 用途

    • SetTID 命令用于为 PLDM 终端设备(Terminus)设置唯一的终端标识符(TID),通常由 PLDM 初始化代理(Initialization Agent)调用。
  2. 保留值

    • TID 的 0x00 和 0xFF 为保留值,不可用于普通设备。
  3. 状态码

    • 响应中的 completionCode 遵循 PLDM 基础规范定义的错误码集合(PLDM_BASE_CODES),例如:
      • 0x00: 成功
      • 0x80: 无效参数(如尝试设置保留值)

2.GetTID Command

Request Data
ByteTypeField NameDescriptionNotes
0–-None无请求数据(命令仅用于查询)
Response Data
ByteTypeField NameDescriptionNotes
0enum8completionCode命令执行状态码值范围:PLDM_BASE_CODES
1uint8TID当前终端标识符(TID)特殊值:0x00(未分配)、0xFF(保留)

说明

  1. 用途

    • GetTID 命令用于查询 PLDM 终端设备(Terminus)当前设置的终端标识符(TID)。
  2. 保留值含义

    • 0x00: 表示该终端尚未分配有效 TID(例如未初始化)。
    • 0xFF: 保留值,不可用于普通设备。
  3. 状态码

    • completionCode 遵循 PLDM 基础规范定义的错误码集合(PLDM_BASE_CODES),例如:
      • 0x00: 成功
      • 0x80: 设备未就绪(如 TID 未分配时调用其他依赖命令)

3.GetPLDMVersion

用途

  • 查询 PLDM 终端支持的 PLDM 基础规范版本 及 各 PLDM 类型(Type)的规范版本
  • 支持返回同一 PLDM 类型的多个版本号(用于兼容性报告及向后兼容)。
  • 可验证终端是否支持指定的 PLDM 类型(通过 PLDMType 参数)。

Request Data Format

(From DSP0240 PLDM Base Specification v1.0.0, Table 9

ByteTypeField NameDescriptionNotes
0–3uint32DataTransferHandle数据传输句柄当 TransferOperationFlag = GetFirstPart 时,该字段被终端忽略。
4enum8TransferOperationFlag数据传输操作标志值:GetNextPart (0x00)GetFirstPart (0x01)
5uint8PLDMType请求的 PLDM 类型有效值参见 DSP0245 标准

Response Data Format

(From DSP0240 PLDM Base Specification v1.0.0, Table 9

ByteTypeField NameDescriptionNotes
0enum8CompletionCode命令执行状态码可能值:
PLDM_BASE_CODES(基础错误码)
INVALID_DATA_TRANSFER_HANDLE (0x80)
INVALID_TRANSFER_OPERATION_FLAG (0x81)
INVALID_PLDM_TYPE_IN_REQUEST_DATA (0x83)
1–4uint32NextDataTransferHandle下一块数据的传输句柄用于分块传输时标识后续数据
5enum8TransferFlag数据传输阶段标志值:Start (0x01)Middle (0x02)End (0x04)StartAndEnd (0x05)
6–NVariablePLDMVersionData版本数据块格式见表 10,包含版本号数组及校验和

PLDMVersionData Format

(From DSP0240 PLDM Base Specification v1.0.0, Table 10

Byte RangeTypeField NameDescriptionNotes
0–3ver32Version[0]第 1 个支持的版本号格式:主版本 (1字节)次版本 (1字节)更新版本 (1字节)Alpha版本 (1字节)
(例如 1.0.0 对应 0x01 0x00 0x00 0x00
ver32Version[N-1]第 N 个支持的版本号同一 PLDM 类型可能有多个兼容版本
4N – 4N+3uint32PLDMVersionDataIntegrityChecksum数据完整性校验和使用 CRC-32 算法(多项式与 IEEE 802.3 相同)计算,覆盖 PLDMVersionData 全部字节

关键说明

  1. 分块传输机制

    • 若版本数据过大,可通过多次请求分块传输。
    • 使用 TransferFlag 标识数据块位置(如 Start 表示首块,End 表示末块)。
    • 通过 NextDataTransferHandle 链接各块数据,最终拼接为完整 PLDMVersionData
  2. 校验和计算

    • 校验和覆盖 PLDMVersionData 所有字节(从 Version[0] 到校验和字段前的数据)。
    • 算法:CRC-32,多项式为 x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
  3. 特殊版本号

    • PLDM 基础规范版本 固定为 1.0.0(主版本 1,次版本 0,更新版本 0,无 Alpha 版本)。
  4. 错误码说明

    • INVALID_PLDM_TYPE_IN_REQUEST_DATA (0x83): 请求的 PLDMType 不被终端支持。

4.GetPLDMTypes

Request Data
ByteTypeField NameDescriptionNotes
None无请求数据
Response Data
ByteTypeField NameDescriptionNotes
0enum8CompletionCode命令执行状态码值范围:PLDM_BASE_CODES(如 0x00 表示成功)
1–8bitfield8[8]PLDMTypes支持的 PLDM 类型位图每个字节的每一位对应一个 PLDM 类型是否支持
1b:支持
0b:不支持

PLDMTypes 位图结构说明

  • 位图映射规则
    • 字节索引bitfield8[N]N = 0 到 7,对应响应数据字节 1 到 8)。
    • 位索引:每个字节的 最高位(位7)到最低位(位0) 分别对应 PLDM 类型编号
      • bitfield8[N] 的位 [7] → PLDM 类型 N*8 + 7
      • bitfield8[N] 的位 [0] → PLDM 类型 N*8 + 0
    • 总范围:8 字节位图可表示 PLDM 类型 0 至 63(共 64 种类型)。
示例
  • 若 bitfield8[0] 的位 [7] 为 1 → 支持 PLDM 类型 7
  • 若 bitfield8[1] 的位 [0] 为 1 → 支持 PLDM 类型 81*8 + 0)。

说明

  1. 用途

    • 用于发现 PLDM 终端支持的 PLDM 类型(如基础管理、固件更新等)
    • 响应结果可能因 传输端点(Transport Endpoint) 不同而有所差异(例如某类型仅支持特定接口)。
  2. PLDM 类型定义

    • 具体 PLDM 类型编号对应的功能需参考 DSP0245 标准(如 0x00 表示基础类型,0x02 表示固件更新类型)。
  3. 错误码

    • 若命令执行失败,CompletionCode 会返回 PLDM_BASE_CODES 中的错误码(如参数无效、设备忙等)。

5.GetPLDMCommands

Request Data
ByteTypeField NameDescriptionNotes
0uint8PLDMType查询的 PLDM 类型有效值参见 DSP0245 标准
1–4ver32Version查询的 PLDM 类型版本号格式:主版本.次版本.更新版本.Alpha版本(如 1.0.0.0

Response Data
ByteTypeField NameDescriptionNotes
0enum8CompletionCode命令执行状态码可能值:
PLDM_BASE_CODES(基础错误码)
INVALID_PLDM_TYPE_IN_REQUEST_DATA (0x83)
INVALID_PLDM_VERSION_IN_REQUEST_DATA (0x84)
1–32bitfield8[32]PLDMCommands支持的 PLDM 命令位图每个字节的每一位对应一个命令是否支持
1b:支持
0b:不支持

PLDMCommands 位图结构说明

  • 位图映射规则
    • 字节索引bitfield8[N]N = 0 到 31,对应响应数据字节 1 到 32)。
    • 位索引:每个字节的 最高位(位7)到最低位(位0) 分别对应 PLDM 命令编号
      • bitfield8[N] 的位 [7] → 命令编号 N*8 + 7
      • bitfield8[N] 的位 [0] → 命令编号 N*8 + 0
    • 总范围:32 字节位图可表示 PLDM 命令 0 至 255(共 256 个命令)。
示例
  • 若 bitfield8[0] 的位 [7] 为 1 → 支持 命令 7
  • 若 bitfield8[3] 的位 [0] 为 1 → 支持 命令 243*8 + 0)。

说明

  1. 用途

    • 查询 PLDM 终端作为 响应方(Responder) 时,对 指定 PLDM 类型及版本 所支持的 命令集合
    • 响应结果可能因 传输端点(Transport Endpoint) 不同而有所差异(例如某命令仅支持特定接口)。
  2. 错误码

    • INVALID_PLDM_TYPE_IN_REQUEST_DATA (0x83): 请求的 PLDMType 不被支持。
    • INVALID_PLDM_VERSION_IN_REQUEST_DATA (0x84): 请求的 Version 不被支持。
  3. 版本匹配

    • 若请求的版本号与终端支持的版本不完全一致,终端可能返回兼容的旧版本命令位图(具体由各 PLDM 类型规范定义)

二、示例

多部分传输规则

适用场景:当 PLDM 版本数据过大,需分多次传输时,使用 TransferOperationFlagTransferFlag 和 DataTransferHandle 协同控制传输流程。

1. 传输标志与句柄规则
字段/标志规则说明
TransferOperationFlagGetFirstPart (0x01):请求传输数据的第一块(初始化传输)。
GetNextPart (0x00):请求传输数据的后续块
DataTransferHandle- 当 TransferOperationFlag = GetFirstPart 时,请求中的此字段被终端忽略
- 当 TransferOperationFlag = GetNextPart 时,必须设置为前一响应中的 NextDataTransferHandle
TransferFlagStart (0x01):响应数据为传输的第一块
Middle (0x02):中间块(非首尾)。
End (0x04):最后一块。
StartAndEnd (0x05):唯一块(单次传输完成)。
传输完成判定当响应中的 TransferFlag 为 End 或 StartAndEnd 时,表示传输完成

PLDM 终端发现流程

目标:请求方(Requester)通过一系列命令,逐步获取响应方(Responder)的以下信息:

  1. 终端标识符(TID)
  2. 支持的 PLDM 类型(Types)
  3. 每个类型的规范版本(Versions)
  4. 每个版本支持的命令(Commands)

分步骤说明

步骤 1:获取终端标识符(TID)
  • 命令GetTID
  • 用途: 确认响应方的唯一终端标识。
  • 请求数据: 无
  • 响应数据:

    plaintext

    CompletionCode = 0x00 (成功)  
    TID            = 0x01 (示例值)  
步骤 2:发现支持的 PLDM 类型
  • 命令GetPLDMTypes
  • 用途: 获取响应方支持的 PLDM 类型位图。
  • 请求数据: 无
  • 响应数据:

    plaintext

    CompletionCode = 0x00  
    PLDMTypes      = 0b00000011 (位图表示支持 Type 0 和 Type 1)  
    • 解析位图:
      • bitfield8[0] 的位 [0] 为 1 → Type 0 支持
      • bitfield8[0] 的位 [1] 为 1 → Type 1 支持
步骤 3:遍历每个支持的 PLDM 类型

对每个支持的 PLDM 类型(本例为 Type 0 和 Type 1),执行以下操作:

3.1 查询支持的版本
  • 命令GetPLDMVersion
  • 请求参数:

    plaintext

    PLDMType               = 0x00 (或 0x01)  
    Version                = [可指定版本,或留空由终端返回默认]  
    TransferOperationFlag   = GetFirstPart (0x01)  
  • 响应数据:

    plaintext

    CompletionCode         = 0x00  
    TransferFlag           = StartAndEnd (0x05)  
    PLDMVersionData        = Version[0]=1.0.0 (示例值)  
    • 表示 Type 0 和 Type 1 均支持版本 1.0.0
3.2 查询支持的命令集
  • 命令GetPLDMCommands
  • 请求参数:

    plaintext

    PLDMType = 0x00 (或 0x01)  
    Version  = 1.0.0 (从步骤 3.1 获取)  
  • 响应数据:

    plaintext

    CompletionCode = 0x00  
    PLDMCommands   = [位图,表示该类型及版本支持的命令]  
    • 示例(假设 Type 0 支持命令 0x00 和 0x01):

      plaintext

      bitfield8[0] = 0b00000011 → 命令 0 和 1 支持  

关键点总结

  1. 依赖关系

    • GetPLDMTypes 是发现其他能力的基础,需先执行。
    • GetPLDMCommands 依赖 GetPLDMVersion 返回的版本号。
  2. 扩展性

    • 若终端支持多版本(如 1.0.0 和 2.0.0),需对每个版本分别调用 GetPLDMCommands
  3. 错误处理

    • 若请求的 PLDMType 或 Version 无效,响应中返回对应错误码(如 INVALID_PLDM_TYPE_IN_REQUEST_DATA)。
  4. 分块传输场景

    • 若 GetPLDMVersion 返回的数据较大,需按多部分传输机制处理(见前文规则)。

此流程为 PLDM 设备管理中的标准能力发现机制,广泛应用于固件更新、状态监控等场景。

;