下一章:跟我实现半导体SECSGEM通讯协议之(二)- HSMS连接建立及超时处理
HSMS消息格式
HSMS消息格式按顺序分别为包含4字节的消息长度,10字节的消息头与n字节的消息体。
字节数 | 描述 |
---|---|
4 Bytes | 指消息头与消息体字节数相加的总长度之和。由此可知一条基于HSMS的消息最长可达2的32次方,是4GB |
10 Bytes | 消息头 |
0-n Bytes | 消息体, 其中PType指定消息体的类型,PType为0时表示消息体为SECS-II消息 |
10字节消息头:定义了HSMS消息的类型。如下表:
消息类型 | 0-1字节 SessionID | 2字节 | 3字节 | 4字节 PType | 5字节 SType | 6-9字节System Bytes |
---|---|---|---|---|---|---|
数据消息 | * | W-bit 以及 SECS Stream | SECS Function | 0 | 0 | Primary: 唯一值, Reply: 与 primary一致 |
Select.req | * | 0 | 0 | 0 | 1 | 唯一值 |
Select.rsp | 与Select.req一致 | 0 | Select Status | 0 | 2 | 与Select.req一致 |
Deselect.req | * | 0 | 0 | 0 | 3 | 唯一值 |
Deselect.rsp | 与 Deselect.req一致 | 0 | 0 | 0 | 4 | 与 Deselect.req一致 |
Linktest.req | 0xFFFF | 0 | 0 | 0 | 5 | 唯一值 |
Linktest.rsp | 0xFFFF | 0 | 0 | 0 | 6 | 与Linktest.req一致 |
Reject.req | 与被Reject消息一致 | 被Reject消息的PType或是SType | Reason Code | 0 | 7 | 与被Reject消息一致 |
Seperate.req | * | 0 | 0 | 0 | 9 | 唯一值 |
当PType=0时,表示消息体承载的消息为SECS-II消息。本系列也只讨论HSMS-SS, SECS-II的实现过程。
HSMS消息大致分为两类:
-
数据消息(Data Message):
当Byte5(SType)= 0 时,表示此消息为数据消息。
当Byte4(PType)= 0时,表示这条数据消息为SECS-II的数据消息。此时:
Byte0-1则表示为SECS-II的Device ID.
Byte2为W-bit以及Stream,W-bit占用此字节的第8位,为1表示消息需要回复,为0表示不需要回复。剩下7位表示SECS-II的stream。如下图所示:
Byte3表示SECS-II的Function。 -
控制消息(Control Message):
上表所示的消息除Data Message(PType=0,SType=0)外,其余都是控制消息。
控制消息定义了HSMS底层相关的通讯连接建立(Select ),心跳(Linktest)以及断开连接(Deselect / Seperate)
Byte6-9则是表示消息的唯一ID,当发送消息与回复消息ID相同时,则说明是一对Primary和Secondary消息。
下面是Hsms消息所对应的结构体,其中关键字__attribute__ ((packed)) 表示不需要字节对齐。
typedef struct __attribute__ ((__packed__)) hsms_msg_s {
uint32_t len;
uint16_t session_id;
char h2;
char h3;
char ptype;
char stype;
uint32_t system_bytes;
char body[];