主要分析oem中如何将ipmb报文通过I2C进行发送至别的智能板卡。在本次代码分析中,需要下载两个模块,phosphor-ipmi-ipmb 和 intel-ipmi-oem。
phosphor-ipmi-ipmb
该模块会生成一个服务:
名称:xyz.openbmc_project.Ipmi.Channel.Ipmb
路径:/xyz/openbmc_project/Ipmi/Channel/Ipmb
接口:org.openbmc.Ipmb
方法:sendRequest
可以通过以下脚本进行调用。通过该脚本,我们可以利用示波器在对应的I2C总线上看到生成的波形:
#!/bin/bash
IPMB_OBJ="xyz.openbmc_project.Ipmi.Channel.Ipmb"
IPMB_PATH="/xyz/openbmc_project/Ipmi/Channel/Ipmb"
IPMB_INTF="org.openbmc.Ipmb"
ME_CMD_RECOVER="1 0x2e 0 0xdf 4 0x57 0x01 0x00 0x01"
IPMB_CALL="sendRequest yyyyay"
busctl call $IPMB_OBJ $IPMB_PATH $IPMB_INTF $IPMB_CALL $ME_CMD_RECOVER
报文中第一字节数据是用来选择使用哪一条ipmb数据通道,由json文件中的type 和 devIndex共同决定。
在IPMB协议中,BMC芯片与各智能板卡之间采用I2C多主协议进行通讯。目前在我的项目中,他们之间是通过I2C的。phhsphor-ipmi-ipmb生成服务的主要作用就是将传入的报文信息通过物理线路进行发送。该模块的初始化过程中,我们需要在内核中将对应的I2C进行配置为ipmb-dev驱动,将phosphor-ipmi-ipmb对应的json文件进行填写(依据硬件信息),将ipmb模块进行添加到openbmc工程中。
Intel-ipmi-oem
在这个oem模块中,工作就是组织报文,并通过phhsphor-ipmi-ipmb提供的服务进行发送。
附:对于在内核中初始化ipmb驱动,我是采用的比较暴力的方式直接进行修改,未找到正规方式。希望了解该部分内容的朋友多交流啊!