最近工作涉及到做一些MI 协议测试用例编写。 看起来MI 协议很繁杂,看了两个多月了,想边学习理解,边进行总结。
MI 协议主要涉及物理层smbus/I2C, 中间传输层的MCTP,和最上层封装起来的MI 层。
这里主要着重在out of band, in band 后期深入在总结。
先总结下MI协议大致的执行过程:
- Host 发MI报文消息给 device(slave)
- 先将MI 报文封装成MCTP报文
- 将完整MCTP报文通过I2C/smbus 链路发给device
- device 收到MCTP报文,解封MCTP报文得到MI报文
- 解析MI 报文发送消息,slave device 会回复的消息数据以MI 格式封装成MI 报文
- 再将MI报文封装成MCTP数据封装
- 再将MCTP报文通过I2C链路发给host
- Host 解封chengMCTP,再回到step 1,形成闭环。
写到这里,好像之前搞混了一个知识点,又混论吞枣了, 到底MI 格式和MCTP 格式,谁封装了谁,谁被解封,谁被解析。
两个报文消息格式有啥不一样来着。 我们仔细探究下协议吧。
从MI 协议这句话,我们可以看出MI 消息报文payload 是MCTP 消息组包的过程,MI消息报文长度不能超过4224 bytes,即MDTS。
从上述协议解析就可以看出来,MCTP报文格式和MI 报文格式差别,及MI 报文怎么组包MCTP packets。
从二者header也可以看出来,tag owner bit 可以设置为1 或0, 用来区别消息request和response互换。