一、PLDM Messaging Control and Discovery Commands
Command | Code Value | Requirement |
---|---|---|
SetTID | 0x01 | Optional |
GetTID | 0x02 | Mandatory |
GetPLDMVersion | 0x03 | Mandatory |
GetPLDMTypes | 0x04 | Mandatory |
GetPLDMCommands | 0x05 | Mandatory |
1.SetTID Command
Request Data
Byte | Type | Field Name | Description | Notes |
---|---|---|---|---|
0 | uint8 | TID | Terminus ID to set | Reserved values: 0x00 , 0xFF |
Response Data
Byte | Type | Field Name | Description | Notes |
---|---|---|---|---|
0 | enum8 | completionCode | Command execution status | Values: PLDM_BASE_CODES |
说明
-
用途:
SetTID
命令用于为 PLDM 终端设备(Terminus)设置唯一的终端标识符(TID),通常由 PLDM 初始化代理(Initialization Agent)调用。
-
保留值:
- TID 的
0x00
和0xFF
为保留值,不可用于普通设备。
- TID 的
-
状态码:
- 响应中的
completionCode
遵循 PLDM 基础规范定义的错误码集合(PLDM_BASE_CODES
),例如:0x00
: 成功0x80
: 无效参数(如尝试设置保留值)
- 响应中的
2.GetTID Command
Request Data
Byte | Type | Field Name | Description | Notes |
---|---|---|---|---|
0– | - | None | 无请求数据(命令仅用于查询) |
Response Data
Byte | Type | Field Name | Description | Notes |
---|---|---|---|---|
0 | enum8 | completionCode | 命令执行状态码 | 值范围:PLDM_BASE_CODES |
1 | uint8 | TID | 当前终端标识符(TID) | 特殊值:0x00 (未分配)、0xFF (保留) |
说明
-
用途:
GetTID
命令用于查询 PLDM 终端设备(Terminus)当前设置的终端标识符(TID)。
-
保留值含义:
0x00
: 表示该终端尚未分配有效 TID(例如未初始化)。0xFF
: 保留值,不可用于普通设备。
-
状态码:
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)
Byte | Type | Field Name | Description | Notes |
---|---|---|---|---|
0–3 | uint32 | DataTransferHandle | 数据传输句柄 | 当 TransferOperationFlag = GetFirstPart 时,该字段被终端忽略。 |
4 | enum8 | TransferOperationFlag | 数据传输操作标志 | 值:GetNextPart (0x00) , GetFirstPart (0x01) |
5 | uint8 | PLDMType | 请求的 PLDM 类型 | 有效值参见 DSP0245 标准 |
Response Data Format
(From DSP0240 PLDM Base Specification v1.0.0, Table 9)
Byte | Type | Field Name | Description | Notes |
---|---|---|---|---|
0 | enum8 | CompletionCode | 命令执行状态码 | 可能值: - PLDM_BASE_CODES (基础错误码)- INVALID_DATA_TRANSFER_HANDLE (0x80) - INVALID_TRANSFER_OPERATION_FLAG (0x81) - INVALID_PLDM_TYPE_IN_REQUEST_DATA (0x83) |
1–4 | uint32 | NextDataTransferHandle | 下一块数据的传输句柄 | 用于分块传输时标识后续数据 |
5 | enum8 | TransferFlag | 数据传输阶段标志 | 值:Start (0x01) , Middle (0x02) , End (0x04) , StartAndEnd (0x05) |
6–N | Variable | PLDMVersionData | 版本数据块 | 格式见表 10,包含版本号数组及校验和 |
PLDMVersionData Format
(From DSP0240 PLDM Base Specification v1.0.0, Table 10)
Byte Range | Type | Field Name | Description | Notes |
---|---|---|---|---|
0–3 | ver32 | Version[0] | 第 1 个支持的版本号 | 格式:主版本 (1字节) ,次版本 (1字节) ,更新版本 (1字节) ,Alpha版本 (1字节) (例如 1.0.0 对应 0x01 0x00 0x00 0x00 ) |
… | ver32 | Version[N-1] | 第 N 个支持的版本号 | 同一 PLDM 类型可能有多个兼容版本 |
4N – 4N+3 | uint32 | PLDMVersionDataIntegrityChecksum | 数据完整性校验和 | 使用 CRC-32 算法(多项式与 IEEE 802.3 相同)计算,覆盖 PLDMVersionData 全部字节 |
关键说明
-
分块传输机制:
- 若版本数据过大,可通过多次请求分块传输。
- 使用
TransferFlag
标识数据块位置(如Start
表示首块,End
表示末块)。 - 通过
NextDataTransferHandle
链接各块数据,最终拼接为完整PLDMVersionData
。
-
校验和计算:
- 校验和覆盖
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
。
- 校验和覆盖
-
特殊版本号:
- PLDM 基础规范版本 固定为
1.0.0
(主版本 1,次版本 0,更新版本 0,无 Alpha 版本)。
- PLDM 基础规范版本 固定为
-
错误码说明:
INVALID_PLDM_TYPE_IN_REQUEST_DATA (0x83)
: 请求的PLDMType
不被终端支持。
4.GetPLDMTypes
Request Data
Byte | Type | Field Name | Description | Notes |
---|---|---|---|---|
– | – | None | 无请求数据 |
Response Data
Byte | Type | Field Name | Description | Notes |
---|---|---|---|---|
0 | enum8 | CompletionCode | 命令执行状态码 | 值范围:PLDM_BASE_CODES (如 0x00 表示成功) |
1–8 | bitfield8[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 类型 8(1*8 + 0
)。
说明
-
用途:
- 用于发现 PLDM 终端支持的 PLDM 类型(如基础管理、固件更新等)。
- 响应结果可能因 传输端点(Transport Endpoint) 不同而有所差异(例如某类型仅支持特定接口)。
-
PLDM 类型定义:
- 具体 PLDM 类型编号对应的功能需参考 DSP0245 标准(如
0x00
表示基础类型,0x02
表示固件更新类型)。
- 具体 PLDM 类型编号对应的功能需参考 DSP0245 标准(如
-
错误码:
- 若命令执行失败,
CompletionCode
会返回PLDM_BASE_CODES
中的错误码(如参数无效、设备忙等)。
- 若命令执行失败,
5.GetPLDMCommands
Request Data
Byte | Type | Field Name | Description | Notes |
---|---|---|---|---|
0 | uint8 | PLDMType | 查询的 PLDM 类型 | 有效值参见 DSP0245 标准 |
1–4 | ver32 | Version | 查询的 PLDM 类型版本号 | 格式:主版本.次版本.更新版本.Alpha版本 (如 1.0.0.0 ) |
Response Data
Byte | Type | Field Name | Description | Notes |
---|---|---|---|---|
0 | enum8 | CompletionCode | 命令执行状态码 | 可能值: - PLDM_BASE_CODES (基础错误码)- INVALID_PLDM_TYPE_IN_REQUEST_DATA (0x83) - INVALID_PLDM_VERSION_IN_REQUEST_DATA (0x84) |
1–32 | bitfield8[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
→ 支持 命令 24(3*8 + 0
)。
说明
-
用途:
- 查询 PLDM 终端作为 响应方(Responder) 时,对 指定 PLDM 类型及版本 所支持的 命令集合。
- 响应结果可能因 传输端点(Transport Endpoint) 不同而有所差异(例如某命令仅支持特定接口)。
-
错误码:
INVALID_PLDM_TYPE_IN_REQUEST_DATA (0x83)
: 请求的PLDMType
不被支持。INVALID_PLDM_VERSION_IN_REQUEST_DATA (0x84)
: 请求的Version
不被支持。
-
版本匹配:
- 若请求的版本号与终端支持的版本不完全一致,终端可能返回兼容的旧版本命令位图(具体由各 PLDM 类型规范定义)
二、示例
多部分传输规则
适用场景:当 PLDM 版本数据过大,需分多次传输时,使用 TransferOperationFlag
、TransferFlag
和 DataTransferHandle
协同控制传输流程。
1. 传输标志与句柄规则
字段/标志 | 规则说明 |
---|---|
TransferOperationFlag | - GetFirstPart (0x01):请求传输数据的第一块(初始化传输)。 - GetNextPart (0x00):请求传输数据的后续块。 |
DataTransferHandle | - 当 TransferOperationFlag = GetFirstPart 时,请求中的此字段被终端忽略。- 当 TransferOperationFlag = GetNextPart 时,必须设置为前一响应中的 NextDataTransferHandle 。 |
TransferFlag | - Start (0x01):响应数据为传输的第一块。 - Middle (0x02):中间块(非首尾)。 - End (0x04):最后一块。 - StartAndEnd (0x05):唯一块(单次传输完成)。 |
传输完成判定 | 当响应中的 TransferFlag 为 End 或 StartAndEnd 时,表示传输完成 |
PLDM 终端发现流程
目标:请求方(Requester)通过一系列命令,逐步获取响应方(Responder)的以下信息:
- 终端标识符(TID)
- 支持的 PLDM 类型(Types)
- 每个类型的规范版本(Versions)
- 每个版本支持的命令(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
。
- 表示 Type 0 和 Type 1 均支持版本
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 支持
- 示例(假设 Type 0 支持命令 0x00 和 0x01):
关键点总结
-
依赖关系:
GetPLDMTypes
是发现其他能力的基础,需先执行。GetPLDMCommands
依赖GetPLDMVersion
返回的版本号。
-
扩展性:
- 若终端支持多版本(如
1.0.0
和2.0.0
),需对每个版本分别调用GetPLDMCommands
。
- 若终端支持多版本(如
-
错误处理:
- 若请求的
PLDMType
或Version
无效,响应中返回对应错误码(如INVALID_PLDM_TYPE_IN_REQUEST_DATA
)。
- 若请求的
-
分块传输场景:
- 若
GetPLDMVersion
返回的数据较大,需按多部分传输机制处理(见前文规则)。
- 若
此流程为 PLDM 设备管理中的标准能力发现机制,广泛应用于固件更新、状态监控等场景。