CRPS电源适配总结
主要总结如何通过修改power_mgmt组件,适配一款新的CRPS电源,遇到的问题及解决方案。
一 设备树adpter适配
设备树adpter适配主要针对PsuSlot和OnePower对象,组件仓有一份PsuSlot和OnePower的设备树加载通用模型,但如果有差异化的诉求,与通用逻辑不一致,则需要通过在对应的csr目录下补充adapter
这里以PsuSlot举例,如果想差异性实现代码,则需要新建一个文件夹,文件夹命名和配置的CSR同名,在下面新增对应的PsuSlot文件,框架在加载时,会优先使用和CSR命名匹配的文件夹下对象,其次使用通用的文件。
二 电源协议Protocol适配与加 载
CPRS协议有部分寄存器与原来通用的Pmbus不同,因此需要加载CRPS协议自己的协议文件 。
根据上层传入的physical_interface(即OnePower对象上配置的PhysicalInterface属性),在设备树的init.lua(include/device_tree/adapters/power_mgmt/protocol/init.lua)文件中定义加载的协议文件,这里有两种 写法
写法一:
physical_interface = {OnePower对外显示Protocol字段,require xxx文件, monitor的文件 路径 }
举 例:
pmbus_qb900 = {‘pmbus’, require (base_content .. ‘pmbus_qb900’), base_content .. ‘monitor.pmbus _qb9 00’}
对应在OnePower_0中PhysicalInterface配置pmbus_qb900,最后加载的协议文件为pmbus_ qb90 0.lua
写法二:
厂商= { [型号] = {OnePower对外显示Protocol字段,require xxx文件, monito r的文件路径 } }
举例:
[‘Grea t Wall’] = {
[‘GW-CRPS800N2’] = {‘pmbus’, require (base_content .. ‘pmbus_crps’), base_content .. 'mo nito r.pmbus '}
}
使用该写法需要先加载默认协议pmbus.lua,由adapter读完厂商型号后,再根据厂商、型号重新加载协议文件,例子中使用pmbus协议先读取厂商和型号,如果读取到厂商是Great Wall,型号是’ GW-CRPS800N2’,就根据这条记录加载pmbus_crps.lua的协议文件。否则仍然加载pmb us.lua 的协议文件
三 CRPS寄存器适配
CRPS电源与华为pmbus电源都使用PMBUS协议,实现的主要区别就是很多寄存器与华为电源寄存器不同,相同的寄存器可以继承pmbus.lua的实现。差异部分在pmbus_crps中需要做单独的实现。这里还需要注意即使是相同的寄存器,有可能存在获取值单位或者转换方式不同可能需要单独适配。
四 CRPS电源主备模式的适配
根据厂商提供的CRPS电源规格书,目前CRPS电源,使用冷备模式来实现BMC的主备模式。例如对应CRPS电源的冷备模式依赖0xD0命令字。
对于软件部分,给0xD0寄存器下发0x01则可以设置电源为主电源,此时主电源会将S对应引脚电压拉高。给电源的0xD0下发0x02 /0x03/0x04,则可以将电源设置为备电源,备电源会自动检测引脚电压, 当电压为高时,会备机进入冷备状态,输出功率降低。当给电源0xD0寄存器下发0x00则会推出冷备模式。
先下 发0x01进入冷备模式。设置主电源设置0x01。设置备份时设置0x02\0x03\0x04,这里需要注意只有设置0x01进入冷备模式后,才能设置冷备模式 。
五 遇到的问题及解决方案
1 获取厂商和型号时末尾有空格导致协议无法加载厂商特定的协议文件
此时可以在获取到厂商和型号后,先去掉后面的空格,可以参考类似下面实现
2 部分CRPS型号没有获取额定功率的寄存器
在型号字段中会带额定功率可以考虑从model中截取连续的3位数到4位数作为 额定功率,例如:‘GW-CRPS800N2’取800作为额定功率
3 冷备模式设置失败
部分型号电源必须有多个同型号CRPS电源同 时接入 并且全部上电情况下,才能设置冷备模式,否则会设置0XD0为1失败。因此建议使用同厂商同型号电源。
部分型号电源只有单个CRPS电源接入上电无法设置CR MODE,即设置0XD0为1失败 。调试时需要注意只有多个电源时再进行主备模式的调试。
目前适配的所有CRPS电源均需要先设置冷备模式使能(即设置0XD0为1)后才能设置备状态(即设置0XD0为2/3/4)
4 MFR_SPECIFIC寄存器
MFR_SEPCIFIC(0x80)在华为电源中是读取STATUS_MFR_SPECIFIC值,但在CRPS电源一般使用0X80寄存器读取AC/DC状态。 因此这里需要根据具体电源AC/DC的获取的逻辑在get_power_supply_type 中进行适配。
此时如果在电源的sr中配置了接触 不良的告警使用到了STATUS_MFR_SPECIFIC的值。则会产生一个电源接触不良的告警。 因此在CRPS电源适配中可以将sr中的Event_PSUPoorContactMinor事件读值表达式进行修改,不去获取mfr_specific值,或者在power_mgmt适配代码的update_mfr_specific_status函数中需要返回255,屏蔽mfr_specific_status数据异常产生的告警。





