风扇板CSR配置指导书
更新时间: 2026/03/16
在Gitcode上查看源码

一个完整的SR文件,包含硬件的版本描述信息、硬件的管理拓扑信息、硬件的传感器和状态信息、告警和时间信息、装备测试信息。

SR数据为json格式,完整的SR数据结构包含4部分数据:FormatVersion、DataVersion、ManagementTopology和Objects:

FormatVersion:定义了SR数据格式及整体结构 DataVersion:跟随SR数据内容变化而变化 ManagementTopology:描述本组件内的管理拓扑,主要包含Anchor、Bus、Chip、Connector的层级关系; Objects:配置本组件内部需要描述的业务对象,例如Accessor、Event、Scanner等,各Objects的定义可见CSR字典;

json
 "FormatVersion": "3.00",
  "DataVersion": "1.28",
  "Unit": {
    "Type": "CLU",
    "Name": "FanBoard_1"
  },
  "ManagementTopology": {
  },
  "Objects": {
  }

1 CSR的版本描述信息

  • FormatVersion:定义了SR数据格式及整体结构;
  • DataVersion:跟随SR数据内容变化而变化,作用与CPLD版本号相同,高位为大版本号,低位为小版本号;
  • FormatVersion、DataVersion为A.BC样式(A取值范围为1-255, B、C取值范围是0-9);范围约束:A为大版本,范围:1-255,BC为小版本,范围:01-99,小版本固定两位,不足两位需要补0; 例:
json
"FormatVersion": "2.54", // CSR协议版本号
"DataVersion": "2.54",   // 2.54为固件对外的版本,即BMC显示的CSR版本号,5为大版本号,54为小版本号
"Unit": {
  "Type": "CLU",
  "Name": "FanBoard_1"
}

2 硬件管理拓扑信息

  1. ManagementTopology作为管理拓扑的关键字,按照树结构根节点开始,以层序遍历的方式平铺列出Bus/Chip/Connector的连接关系;

  2. 管理拓扑是SR中描述组件上的管理树模型,包括单板上的管理根链路I2C,hisport_over_I2C通道,以及单板上存在和内存、TPM、UBC连接器和软件虚拟的状态连接器;

  3. Anchor,Buses,Chips,Connectors作为拓扑信息中的关键字, 硬件自发现组件解析CSR时需要匹配这些关键字,其中Anchor表示拓扑结构的入口,为固定命名,Buses中的对象不需要重命名,Connectors下面的对象不需要传递给硬件访问代理组件;

风扇板管理拓扑

风扇板管理拓扑中的组件管理、链路获取及管理层如下:

  • 组件管理: SMC、CPLD、Eeprom、Fan、Pump、Connetor;
  • 链路获取: Accessor、Scanner、SmcDfxInfo;
  • 管理层: 传感器管理、升级管理、能效管理、风扇管理、泵管理(液冷)。

风扇板管理配置举例:

json
"ManagementTopology": {
  "Anchor": {                          // 拓扑结构入口。
    "Buses": [
      "I2c_2",
      "I2c_4",
      "JtagOverLocalBus_1"
    ]
  },
  "I2c_4": {                           // I2c_4固定接CLU。
    "Chips": [
      "Smc_FanBoardSMC",
      "Eeprom_CLU",
      "Chip_Pump_PWM",
      "Chip_Fan_PWM",
      "Connector_Fan1DualSensor",     // 获取风扇转速。
      "Connector_Fan1SingleSensor",
      "Connector_Fan2DualSensor",
      "Connector_Fan2SingleSensor",
      "Connector_Fan3DualSensor",
      "Connector_Fan3SingleSensor",
      "Connector_Fan4DualSensor",
      "Connector_Fan4SingleSensor"
    ]
  },
  "I2c_2": {
    "Chips": [
      "Smc_ExpBoardSMC"
    ]
  },
  "JtagOverLocalBus_1": {              // CPLD升级链路。
    "Chips": [
      "Cpld_1"
    ]
  }
}

3 组件信息获取与管理

3.1 单板信息

3.1.1 主板信息

CSR是单板自描述信息,首先应当描述本板的基本信息。对于主板来讲,主要包括以下信息: 1、单板身份信息:单板UID、单板板名、厂商信息、单板类型、类型描述、单板部件编码、PCB版本、BoardID; 2、单板管理信息:板上CPLD的位号和版本号,CSR的版本号、MCU版本号;

3、注意此处对单板信息描述的对象名称需要与第一章节中单板名称保持一致;

json
"FanBoard_1": {
    "Slot": 1,                                                                                  // slot就是用来区分不同槽位的同类型单板的,通常在上级Connector定义不同的slot值,然后在下级sr中引用,当前由软件进行更新
    "UID": "00000001050302044490",                                                              // 主板UID:vendor(00000001)+组件类型(05)+0302编码(0302044490)
    "Name": "BC83FDCC",                                                                         // 主板板名
    "Manufacturer": "<=/FruData_FanBoard.BoardManufacturer|> expr($1 == '' ? 'XXX' : $1)",   // 厂家信息,此处直接从FRU中获取
    "Type": "CLU",                                                                              // 单板类型:风扇板-CLU
    "Description": "FanBoard",                                                                  //  单板类型描述
    "PartNumber": "<=/FruData_FanBoard.BoardPartNumber|> expr($1 == '' ? '0302044490' : $1)",   // 单板部件编码,即0302编码,此处直接从FRU中获取,若获取不到取0302044490
    "LogicUnit": 1,                                                                             // 逻辑CPLD位号
    "PcbID": "#/Accessor_PcbID.Value",                                                          // 单板的PCB版本
    "PcbVersion": "",                                                                           // 单板的PCB版本,BMC从CPLD中获取单板的PCB版本
    "LogicVersion": "N/A",                                                                      // 逻辑CPLD版本号,无需配置,由软件设置
    "SRVersion": "${DataVersion}",                                                              // 引用CSR文件中定义的CSR固件版本号
    "MCUVersion": "",                                                                           // MCU版本号,无需配置,由软件设置
    "BoardID": 65535,                                                                           // 单板BoardID,天池单板未使用BoardID,此值固定写成65535(CSR为json格式,数据均为10进制)
    "BoardType": "FanBoard",                                                                    // 单板类型:CpuBoard
    "Number": 1,                                                                                // 逻辑编号,当前仅背板使用,主板未使用
    "DeviceName": "FanBoard${Slot}",                                                            // 板卡丝印信息,原则上采用大驼峰命名风格,不带下划线,redfish接口
    "Position": "CLU${Slot}",                                                                   // 位置信息,redfish接口
    "NodeId": "CLU${Slot}FanBoard${Slot}",                                                      // 资源ID,Position和DeviceName拼接而成,redfish接口
    "RefSMCChip": "#/Smc_FanBoardSMC",                                                          // 风扇板挂载的SMC对象
    "FruID": "<=/Fru_FanBoard.FruId",                                                           // 单板的FRUID
    "PowerWattsExp": "#/Accessor_Fan1_Pwr.Value",                                               // 风扇功耗获取
    "RefMCUChip": "#/Smc_FanBoardSMC",                                                          // 风扇板挂载的MCU对象
    "CpldTestReg": "#/Accessor_CpldTest.Value",                                                 // CPLD自检寄存器,BMC通过命令交替向CPLD的自检寄存器写入55h和Aah,再读取Test寄存器,用来判断CPLD是否处于正常工作状态
    "CpldStatus": 0                                                                             // CPLD的自检状态
    }

3.1.2 单板上的器件

单板上有很多关键器件和资源,需要先定义,再调用。

SMC 天池架构下,通过SMC标准命令字承载通用软硬件接口,BMC、BIOS等均通过标准SMC命令字与硬件交互,一块单板只有一个SMC中心(非智能组件没有SMC,比如Riser),通常由CPLD或者MCU实现。 天池架构的管理根链路为I2C,BMC通过I2C与SMC通讯,因此SMC需要配置对应的I2C地址,访问带宽等参数,在天池规范中,SMC的地址固定为0x60。 风扇板上有风扇板SMC接口和拓展板SMC接口,以风扇板SMC接口配置举例:

json
"Smc_FanBoardSMC": {
    "Address": 96,            // 天池架构中,所有单板的SMC地址固定为0x60即96
    "AddrWidth": 1,           // 地址宽度,单位Byte
    "OffsetWidth": 1,         // 地址偏移宽度,单位Byte
    "WriteTmout": 0,          // 写超时,单位ms,SMC的读写超时均设置为0
    "ReadTmout": 0            // 读超时,单位ms,SMC的读写超时均设置为0
}

EEPROM 天池规范要求每个组件在管理跟链路上下挂一个存储器件,用于存储自身的描述信息,即SR的存储载体。当前组件均采用Eeprom作为SR的存储载体。天池规范定义了SR的存储载体的I2C地址固定为0xAE。在这个EEPROM中不仅存储了硬件自描述信息,还包含电子标签和用于自定义数据等。

器件类对象EEPROM包含以下信息:

1、I2C器件公共属性(地址、地址宽度、偏移宽度、写超时、读超时)

2、EEPROM特有属性(分页写数据大小、分页写时间间隔、器件健康状态)

json
"Eeprom_CLU": {
    "OffsetWidth": 2,       // 偏移宽度,单位byte
    "AddrWidth": 1,         // EEPROM的I2C地址位宽,单位byte
    "Address": 174,         // EEPROM的I2C地址,0xAE即10进制的174
    "WriteTmout": 100,      // 写超时,单位ms
    "ReadTmout": 100,       // 读超时,单位ms
    "RwBlockSize": 32,      // 分页读写EEPROM的数据大小,单位为byte,最大允许取值1024,程序默认值为32
    "WriteInterval": 20,    // 分页写延时间隔,单位ms,最大允许取值500
    "HealthStatus": 0       // 器件健康状态,默认配置为0,由软件更新
}

CPLD 基础板(CLU)上的信号控制通常通过CPLD实现,如果板上有CPLD,则需要定义器件类对象CPLD。

json
"Cpld_1": {}  // 此对象在CSR中未定义属性

定义说明:BMC会调用CPLD对象的方法,因此即使CSR中未定义CPLD对象的属性,也要声明CPLD对象。

风扇 风扇板上风扇最最重要的组件,对风扇定义主要信息如下:(前后转子在位,8080控制信号1个,反馈信号2个)

json
"Fan_1": {
    "Coefficient": 1,                                     // 风扇转速系数,风扇前转子转速(或后转子转速)* Coefficient得到风扇当前的实际转速,默认为1
    "FanId": 1,                                           // 风扇id
    "FrontPresence": "<=/Scanner_Fan1_Presence.Value",    // 前转子在位
    "FrontSpeed": "<=/Scanner_Fan1_FSpeed.Value",         // 前转子转速
    "FrontStatus": 0,                                     // 前转子状态,1为异常,0位正常
    "HardwarePWM": "#/Accessor_Fan1_PWM.Value",           // 硬件转速百分比
    "IdentifySpeedLevel": 35,                             // 识别风扇转速级别,通过设置特定转速,判断风扇型号
    "MaxSupportedPWM": 255,                               // 支持的最大占空比
    "Position": "CLU",                                    // 容器信息,风扇的位置
    "PowerGood": "#/Scanner_PowerGood.Value",             // 上下电信息
    "RearPresence": "<=/Scanner_Fan1_Presence.Value",     // 后转子在位
    "RearSpeed": "<=/Scanner_Fan1_RSpeed.Value",          // 后转子转速
    "RearStatus": 0,                                      // 后转子状态,1为异常,0位正常
    "Slot": 1,                                            // 风扇槽位号
    "SystemId": 1                                         // 系统id
},

注:8080风扇有两个转子,8038风扇只有一个转子

泵(液冷环境) 非必需项,按照实际情况是否有laac泵上件进行配置:

json
    "Pump_1": {
      "Id": 1,                                             // 泵id
      "Slot": 1,                                           // 泵槽位号
      "ActualPWM": "#/Accessor_Pump1_PWM.Value",           // 硬件转速百分比
      "MaxSupportedPWM": 255,                              // 支持的最大占空比
      "SpeedRPM": "<=/Scanner_Pump1_Speed.Value",          // 泵转速
      "MaxSpeedRPM": 6600,                                 // 最大转速
      "Presence": "<=/Scanner_Pump1_Presence.Value",       // 泵在位
      "Status": 0,                                         // 泵状态
      "PartNumber": "32060009",                            // 部件编号,支持bmc接口写入
      "PowerGood": "#/Scanner_PowerGood.Value"             // 上下电信息
    },

Connector 天池架构支持组件自发现,组件与基础板、组件与组件均通过连接器连接,如果组件的自描述信息(csr文件)里配置了拓扑信息和connector,就可以根据connector的数据可以找到下一级连接的组件。

Connector对象包含下级硬件组件的参数信息,决定了下级硬件组件执行自发现的方式,也定义了与下级硬件组件关联的Buses信息。

对于风扇板而言,Connector只有风扇传感器: 目前CSR配置了Dual和Single两种类型的风扇,现天池常用风扇8080位双转子,8038为单转子。这里以单转子风扇传感器为例:

json
"Connector_Fan1SingleSensor": {
    "Bom": "Single",                                     // 下级组件的Bom Id
    "Slot": 1,                                           // 给下级组件分配的槽位信息
    "Position": 1,                                       // 用于在命名中区分不同对象,无实际含义
    "Presence": "<=/Fan_1.IsTwins |> expr($1 ? 1 : 0)",  // 在位状态,可以直接配置,也可以间接获取
    "@Default": {
        "Presence": 0
      },
    "Id": "Rotator",                                     // 下级组件的Board Id
    "AuxId": "",                                         // 下级组件的额外Id信息
    "Buses": [                                           // 下级csr中会用到的总线
      "I2c_4"
     ],
     "SystemId": 1,                                     // 给下级组件分配的SystemId
     "IdentifyMode": 2                                  // 下级组件识别方式,3为天池标准类型组件,2为BoardId不可读(上报)类型组件,1为BoardId可读类型组件
}

FRU

json
"Fru_FanBoard": {
      "PcbId": "#/Accessor_PcbID.Value",
      "FruId": 1,
      "FruName": "FanBoard${Slot}"
    }

3.2 硬件资源获取

CSR中承载了所描述硬件对象(单板)的关键硬件资源,包括软件可获取的电压、温度、告警等传感器信息,和软件可以操作的比如复位、清除告警等能力。在天池架构下,组件上通过卫星管理中心SMC来管理单板上的硬件器件,BMC软件通过标准的SMC命令字来获取和控制对应的硬件,因此本章节所描述的Scanner、Accessor、DFX都与对应组件的SMC命令字一一对应,并且与硬件逻辑代码和MCU代码一一对应。

3.2.1 Scanner

硬件SR文件中包含硬件对象的描述,其中scanner可以理解为硬件传感器,用于BMC软件扫描对应的传感器,获取硬件状态信息。在天池组件设计规范中,为了更好的做到软硬件解耦,组件上的传感器都是由硬件获取,并且通过SMC标准命令字上报给BMC,所以scanner对象可以简单理解为BMC通过SMC读取的硬件信息。

对于风扇板来说,传感器主要包括以下几种:

1、 风扇和泵在位传感器,按照实际数量进行配置(泵的传感器,非必需项,按照实际情况配置) Scanner_Fan1_Presence Scanner_Fan2_Presence Scanner_Fan3_Presence Scanner_Fan4_Presence Scanner_Pump1_Presence Scanner_Pump2_Presence

2、 风扇前后转子速率传感器和泵速率传感器,按照实际数量进行配置(泵的传感器,非必需项,按照实际情况配置) Scanner_Fan1_FSpeed Scanner_Fan1_RSpeed Scanner_Fan2_FSpeed Scanner_Fan2_RSpeed Scanner_Fan3_FSpeed Scanner_Fan3_RSpeed Scanner_Fan4_FSpeed Scanner_Fan4_RSpeed Scanner_Pump1_Speed Scanner_Pump2_Speed

3、 风扇板温度传感器 Scanner_FanBrdTemp

4、上电超时,整机电源故障传感器,整机PG信号 Scanner_CLUPwrSigDrop Scanner_CLUPwrOnTimeOut Scanner_PowerGood

4、液冷配置下泵,水浸绳在位传感器,漏液检测传感器 Scanner_ValvePresence Scanner_WatCabAbsent Scanner_LiquidLeakage

下面详细介绍对应的scanner下面的具体属性配置,一个标准的Scanner包含如下信息:

1、 传感器的获取方式(对应传感器的SMC命令字)

2、 软件读取传感器的扫描周期

3、 软件读取传感器的防抖策略(防抖策略为固定配置,不同的传感器防抖策略固定)

4、 软件对传感器进行扫描的条件(例如:电源传感器需要上电以后才开始扫描)

5、 禁用时的备用默认值。

以风扇在位信号为例:

json
 "Scanner_Fan1_Presence": {
      "Chip": "#/Smc_FanBoardSMC",                        // 获取数据的SMC对象
      "Offset": 402656001,                                // 硬件地址偏移(Offset项):需要逻辑/MCU提供opcode
      "Size": 1,                                          // 数据的字节长度
      "Mask": 1,                                          // 数据掩码
      "Type": 0,                                          // 数据获取的方式,0-位操作,1-块操作
      "Period": 2000,                                     // 扫描周期,单位毫秒
      "Debounce": "None",                                 // 滤抖策略,该Scanner无需消抖
      "ScanEnabled": "<=/Scanner_PowerGood.Value",        // 0-Scanner未使能,1-Scanner使能
      "NominalValue": 1,                                  // 当芯片处于不可用状态时,可通过ScanEnabled属性与NominalValue属性配置Scanner的禁用状态与禁用状态下的取值;
      "@Default": {                                       // 为指定属性配置默认值
        "ScanEnabled": 0
      },
      "Value": 0                                         // Scannerd的值
    }

3.2.2 Accessor

Accessor也可以理解为硬件传感器,与Scanner不同,Accessor适用于需要随时读写硬件寄存器的场景。适用于不需要循环周期性获取值或需要写入硬件值的场景,属性可读写,当获取值时,hwproxy监听property_read信号,实时读取硬件的值并更新到资源树,当写入值时,hwproxy监听property_before_change信号,实时写入到硬件中;

对于风扇板而言,Accessor类传感器主要包括以下几类:

1、系统状态类的获取(风扇功率、单板PCB版本、单板逻辑版本、风扇板温度传感器,CPLD自检传感器,JTAG升级通道配置) Accessor_Fan1_Pwr Accessor_PcbID Accessor_LogicVersionID Accessor_FanLm75 Accessor_CpldTest Accessor_LogicVerId Accessor_JtagSwitch

2、系统状态类的配置(风扇PWM,写保护) Accessor_Fan1_PWM Accessor_Fan2_PWM Accessor_Fan3_PWM Accessor_Fan4_PWM Accessor_Pump1_PWM(液冷) Accessor_Pump2_PWM(液冷) Accessor_CLUWP

下面详细介绍对应的Accessor下面的具体属性配置,一个标准的Accesor包含如下信息:

1、 传感器的获取方式(对应传感器的SMC命令字)

2、默认值

以获取单板PCB版本举例:

json
// 以Accessor类名开头,且名称此sr内唯一
// 配置同Scanner,无Period扫描周期属性
"Accessor_PcbID": {
  "Chip": "#/Smc_FanBoardSMC",    // Accessor挂载的chip
  "Offset": 1792,                 // 偏移,json不支持16进制,需转换成10进制
  "Size": 2,                      // 读数据长度
  "Mask": 15,                     // 掩码,位读时有效,块读时无效可置0,从硬件读取数据后与掩码进行按位与操作后返回结果,写入时先获取值,再按位修改后写入到硬件
  "Type": 0,                      // 0:位读 1:块读
  "Value": 0                      // Scanner读取的值,默认0
}

3.2.3 DFX

一块单板的CSR有大量Scanner需要轮询访问,但很多Scanner仅存在偏移差异,**BMC在获取每个scanner信息的时候,都需要消耗一条SMC命令字,导致总线效率很低。针对此情况需要做批量读取。**dfx是Scanner的扩展,为了减少硬件访问次数产生的一个机制,本质是通过dfx汇聚任务一次将chip的数据读取出来,再根据不同的掩码分配给不同的Scanner。 假如Scanner在Dfx中有承载,则单条Scanner的扫描周期表示从Dfx同步数据的周期。比如Dfx的扫描周期为400ms,单条Scanner的扫描周期为2000ms,则表示Dfx刷新5次之后Scanner刷新1次数据。Dfx的Period并非Dfx的扫描周期,而是Dfx扫描完成之后的等待时间,实际Dfx扫描间隔时间会受到总线上其他进程数量影响(风扇板DFX Period设置100,但是在满配场景下测试由于IIC链路上进程过多导致两次Dfx间隔最大可达到7s)。

DFX对象中每个字节的具体信息,需要与硬件的SMC命令字实现保持一致

下面详细介绍对应的SmcDfxInfo下面的具体属性配置,一个标准的SmcDfxInfo包含如下信息:

1、传感器的获取方式(对应传感器的SMC命令字)

2、软件读取传感器的扫描周期

3、此单板支持SmcDfx的CPLD版本

4、SmcDfxInfo中每个字节与对应硬件寄存器的掩码对应关系

5、Scanner的名称与对应的配置表达式(json格式中的key为Scanner名称,Scanner必须位于同一CSR文件中,json格式中的"Value"表示为Scanner的值,通过配置表达式从硬件信号获取值)

风扇板的DFX信息可以理解为一次性读取Scanner的所有值。所包含的部分在Scanner已进行描述,在此不进行多与解释。

json
"SmcDfxInfo_CLU": {
  "Chip": "#/Smc_FanBoardSMC",        // 获取数据的smc对象
  "Offset": 7424,                   // smc命令字的偏移
  "Size": 33,                       // 数据的字节长度
  "Period": 400,                    // 扫描周期,单位ms
  "SmcVersion": 108,                // 支持的SMC最低版本
  "Config": {
        "1": {
          "cpld_ver": 255
        },
        "2": {
          "board_temp_l": 255
        },
        "3": {
          "board_temp_h": 255
        },
        "12": {
          "code_power_fail": 255
        },
        "13": {
          "code_power_time_out": 255
        },
        "14": {
          "fan1_prsnt_n": 1
        },
        "15": {
          "fan2_prsnt_n": 1
        },
        "16": {
          "fan3_prsnt_n": 1
        },
        "17": {
          "fan4_prsnt_n": 1
        },
        "18": {
          "fan1_tach_a_data_l": 255
        },
        "19": {
          "fan1_tach_a_data_h": 255
        },
        "20": {
          "fan1_tach_b_data_l": 255
        },
        "21": {
          "fan1_tach_b_data_h": 255
        },
        "22": {
          "fan2_tach_a_data_l": 255
        },
        "23": {
          "fan2_tach_a_data_h": 255
        },
        "24": {
          "fan2_tach_b_data_l": 255
        },
        "25": {
          "fan2_tach_b_data_h": 255
        },
        "26": {
          "fan3_tach_a_data_l": 255
        },
        "27": {
          "fan3_tach_a_data_h": 255
        },
        "28": {
          "fan3_tach_b_data_l": 255
        },
        "29": {
          "fan3_tach_b_data_h": 255
        },
        "30": {
          "fan4_tach_a_data_l": 255
        },
        "31": {
          "fan4_tach_a_data_h": 255
        },
        "32": {
          "fan4_tach_b_data_l": 255
        },
        "33": {
          "fan4_tach_b_data_h": 255
        }
      },
      "Mapping": {
        "Scanner_Fan1_Presence": {
          "Value": "expr($fan1_prsnt_n)"
        },
        "Scanner_Fan1_FSpeed": {
          "Value": "expr((($fan1_tach_b_data_l >> 7) << 7) + ($fan1_tach_b_data_h << 8))"
        },
        "Scanner_Fan1_RSpeed": {
          "Value": "expr((($fan1_tach_a_data_l >> 7) << 7) + ($fan1_tach_a_data_h << 8))"
        },
        "Scanner_Fan2_Presence": {
          "Value": "expr($fan2_prsnt_n)"
        },
        "Scanner_Fan2_FSpeed": {
          "Value": "expr((($fan2_tach_b_data_l >> 7) << 7) + ($fan2_tach_b_data_h << 8))"
        },
        "Scanner_Fan2_RSpeed": {
          "Value": "expr((($fan2_tach_a_data_l >> 7) << 7) + ($fan2_tach_a_data_h << 8))"
        },
        "Scanner_Fan3_Presence": {
          "Value": "expr($fan3_prsnt_n)"
        },
        "Scanner_Fan3_FSpeed": {
          "Value": "expr((($fan3_tach_b_data_l >> 7) << 7) + ($fan3_tach_b_data_h << 8))"
        },
        "Scanner_Fan3_RSpeed": {
          "Value": "expr((($fan3_tach_a_data_l >> 7) << 7) + ($fan3_tach_a_data_h << 8))"
        },
        "Scanner_Fan4_Presence": {
          "Value": "expr($fan4_prsnt_n)"
        },
        "Scanner_Fan4_FSpeed": {
          "Value": "expr((($fan4_tach_b_data_l >> 7) << 7) + ($fan4_tach_b_data_h << 8))"
        },
        "Scanner_Fan4_RSpeed": {
          "Value": "expr((($fan4_tach_a_data_l >> 7) << 7) + ($fan4_tach_a_data_h << 8))"
        },
        "Scanner_FanBrdTemp": {
          "Value": "expr($board_temp_h)"
        },
        "Scanner_CLUPwrSigDrop": {
          "Value": "expr($code_power_fail)"
        },
        "Scanner_CLUPwrOnTimeOut": {
          "Value": "expr($code_power_time_out)"
        }
      }
}

3.2.4 SmcCmdList

该对象用于BMC获取全量SMC寄存器,在一键收集日志时根据配置发送SMC命令并收集返回数据存在日志中。

json
"SmcCmdList_CLU": {
  "Chip": "#/Smc_FanBoardSMC",//发送SMC命令的目标对象
  "Type": "CLU",            //对象类型,配置错误影响日志名称显示,不影响数据收集功能
  "Slot": 1,                //支持多个槽位号,影响日志名称显示,不影响数据收集功能
  "Config": {               //配置需要发送的SMC命令字,Function、Command、MS、RW、Parameter为SMC命令字格式内容,Length为收集的数据长度,Collected为是否需要收集这条SMC命令字数据,1表示启用收集,0表示禁用收集
    "1": {
      "Function": 0, "Command": 1, "MS": 0, "RW": 1, "Parameter": 0, "Length": 1, "Collected": 1
    },
    "2": {
      "Function": 1, "Command": 1, "MS": 0, "RW": 1, "Parameter": 0, "Length": 1, "Collected": 0
    }
  }
}

3.3 信号处理策略

读取物理寄存器数据时,不可避免会遇到因器件抖动而产生误报等现象,需要采取一些防抖措施来过滤误报场景。

在通过硬件代理Scanner对象读取硬件数据的时候,可以通过Debounce属性配置防抖对象,目前支持的防抖类型有中值滤波,均值防抖,持续一致,二值持续一致,无防抖等类型。

防抖策略在SR配置中非常重要,大量的误告警、FIT告警等问题,都与SR中配置的告警防抖策略息息相关。

CSR文件中定义的Debounce对象必须至少被一个Scanner对象引用

BMC推荐的CSR硬件监控防抖机制详见:官方链接

对基础板而言,主要有以下SMC需要配置防抖:

1、中值滤波:ADC电压(12V缓启、3V3、5V)

2、持续一致滤波:组件工作模式、VRD固件类型区分、Thremtrip信号使能状态

3、二值持续一致滤波:MOS过温、板上时钟检测

4、均值滤波:RTC电源、主板板温

  • 中值滤波

json
"Median": {
    "WindowSize": 6,    // 窗口大小
    "DefaultValue": 11  // 默认值
}
  • 持续一致滤波

json
"Cont": {
    "Num": 6,           // 防抖次数
    "DefaultValue": 11  // 默认值
}
  • 二值持续一致

json
"ContBin": {
    "NumH": 6,          // 高电平防抖次数
    "NumL": 6,          // 低电平防抖次数
    "DefaultValue": 11  // 默认值
}
  • 均值防抖

json
"MidAvg": {
    "WindowSize": 4,    // 窗口大小
    "DefaultValue": 20, // 默认值
    "IsSigned": true    // 是否为有符号数,对获取温度进行滤波时需填true
}
json
"None": {
    "DefaultValue": 11
}

3.4 组件管理

风扇板上组建管理包含固件升级,风扇转速转速管理,以及在液冷机型上的泵转速管理和漏液检测等。

3.4.1 升级管理

风扇板上固件有CSR与CPLD两个需要升级,以CSR为例:

json
    "SRUpgrade_1": {
      "UID": "00000001050302044490",           // 固件UID
      "Type": "CLU",                           // 类型
      "Version": "${DataVersion}",             // 版本
      "StorageChip": "#/Eeprom_CLU",           // CSR升级对应EEPROM芯片
      "SoftwareId": "XXX-YYYY",           // 编码信息
      "WriteProtect": "#/Accessor_CLUWP.Value" // EEPROM写保护
    }

3.4.2 风扇类型识别

描述该CLU支持的风扇型号,用于风扇型号识别,管理该风扇型号的基础风扇信息,如BOM、风扇最大转速、部件编码等

Interface/Private属性/方法描述是否由CSR配置
bmc.kepler.Systems.FanTypeBOMBOM编码
bmc.kepler.Systems.FanTypeFanDiameterMm风扇直径,单位mm
bmc.kepler.Systems.FanTypeFrontMaxSpeed前转子最大转速,用于计算前转子速率比
bmc.kepler.Systems.FanTypeIdentifyRangeHigh风扇型号识别转速右区间
bmc.kepler.Systems.FanTypeIdentifyRangeLow风扇型号识别转速左区间
bmc.kepler.Systems.FanTypeIndex风扇型号索引
bmc.kepler.Systems.FanTypeIsTwins是否为双转子,用于风扇转速传感器管理
bmc.kepler.Systems.FanTypeName风扇型号名
bmc.kepler.Systems.FanTypePartNumber部件编码
bmc.kepler.Systems.FanTypePowerRange功耗区间,与SpeedRange一一对应,风扇功耗无法获取时估算风扇功耗
bmc.kepler.Systems.FanTypeRearMaxSpeed前转子最大转速,用于计算后转子速率比
bmc.kepler.Systems.FanTypeSpeedRange转速区间,与PowerRange一一对应,风扇功耗无法获取时估算风扇功耗
bmc.kepler.Systems.FanTypeSystemId系统Id

风扇型号识别备选池由配置的FanType对象决定。通过Fan对象下配置的IdentifySpeedLevel属性明确该风扇风扇识别时的使用的PWM,当设置该PWM下,风扇转速处于FanType IdentifyRangeLow与IdentifyRangeHigh之间,则认为风扇类型为该FanType

目前风扇类型主要是8038P和8080P,两种风扇最大转速不同。其中8038位单转子,8080为双转子。

json
"FanType_8038P": {
      "Name": "02314BLG 8038+",
      "Index": 1,                    // 风扇型号索引,8030固定为1,8080固定为2
      "IsTwins": false,              // 是否为双转子 根据风扇实际判断,8080是双转子,8030是单转子
      "FrontMaxSpeed": 15000,        // 前转子最大转速
      "RearMaxSpeed": 15000,         // 后转子最大转速
      "IdentifyRangeLow": 3230,      // 风扇型号识别转速左区间,热设计领域输入
      "IdentifyRangeHigh": 4750,     // 风扇型号识别转速右区间,热设计领域输入
      "PartNumber": "02314BLG",      // 部件编码
      "BOM": "BOMxxxxxxx",          // BOM编码
      "SystemId": 1,                 // 系统Id
      "SpeedRange": [                // 速率范围
        0,
        20,
        30,
        40,
        50,
        60,
        70,
        80,
        90,
        100
      ],
      "PowerRange": [                // 功率范围
        120,
        120,
        190,
        390,
        680,
        1050,
        1800,
        2400,
        3600,
        5200
      ],
      "FanDiameterMm": 80
    }

3.4.3 风扇异常调速

风扇异常调速策略,用于描述当某风扇状态异常时,其余状态正常的风扇如何调速

Interface/Private属性/方法描述是否由CSR配置
PrivateFanGroup异常调速策略风扇组,如配置[1,2,3,4], 是指风扇id为1,2,3,4的风扇作用于该异常调速策略
PrivateFanIdx异常风扇Id
PrivateId异常调速策略Id
PrivateSpeedPercentage异常调速策略转速占空比,默认值为80
PrivateStatus风扇异常类型,"AbnormalRotation"-转速异常,"NotInPosition"-风扇不在位,"StopRotation"-风扇停转

配置样例:

json
    "AbnormalFan_1": {
      "FanGroup": [                     // 调速对象
        1,
        2,
        3,
        4
      ],
      "FanIdx": 3,                    // 1代表该策略对应的风扇id为1,即风扇id为1时的异常调速策略
      "Id": 7,                        // 风扇异常调速策略id
      "SpeedPercentage": 70,          // 调速占空比
      "Status": "AbnormalRotation"    // "AbnormalRotation"-转速异常,"NotInPosition"-风扇不在位,"StopRotation"-风扇停转
    }

3.4.4 泵异常调速 (液冷配置,非必需项,按照实际情况是否有laac泵上件进行配置)

泵异常调速策略,用于描述当某泵状态异常时,其余状态正常的泵如何调速

Interface/Private属性/方法描述是否由CSR配置
PrivateDeviceId该调速策略对应的器件id
PrivateId异常调速策略Id
PrivateLiquidCoolingIds异常调速策略液冷器件组,如配置[1,2,3,4], 是指id为1,2,3,4的液冷器件作用于该异常调速策略
PrivateLiquidCoolingPWMs异常调速策略PWM,与LiquidCoolingIds一一对应
PrivateModels泵异常类型,"AbnormalRotation"-转速异常,"NotInPosition"-风扇不在位, "StopWorking"-停止工作

配置样例:

json
    "AbnormalPump_1": {
      "Id": 1,                            // 泵异常调速策略id
      "DeviceId": 1,                      // 该调速策略对应的器件id
      "Models": "AbnormalRotation",       // 风扇异常类型,取值范围为:"AbnormalRotation"-转速异常;"NotInPosition"-不在位;“StopWorking”-停止工作
      "LiquidCoolingIds": [1, 2],         // 当DeviceID对应器件处于Models对应异常状态时,参与调速的泵id序列
      "LiquidCoolingPWMs": [100, 100]     // 泵转速数组,与LiquidCoolingIds对应
    }

3.4.5 漏液检测(液冷配置,非必需项,按照实际情况是否有laac泵上件进行配置)

漏液检测策略管理,可获取漏液状态,针对漏关断阀策略与漏液上下电策略进行设置,并管理策略的使能状态

Interface/Private属性/方法描述是否由CSR配置
bmc.kepler.Chassis.LeakDetectionLeakValvePolicy漏液关断阀策略,0:不操作,1:自动关断
bmc.kepler.Chassis.LeakDetectionLeakPowerPolicy漏液上下电策略,0:不操作,1:自动下电
bmc.kepler.Chassis.LeakDetectionEnabled是否使能漏液动作,false:不使能,true:使能
bmc.kepler.Chassis.LeakDetectionLeakState漏液状态:0:无漏液,1:轻微漏液,2:严重漏液
json
"LeakDetection_1": {
  "LeakValvePolicy": 1,                                                         // 漏液关断阀策略,0:不操作,1:自动关断
  "LeakPowerPolicy": 0,                                                         // 漏液上下电策略,0:不操作,1:自动下电
  "Enabled": true,                                                              // 是否使能漏液动作,false:不使能,true:使能
  "LeakState": "<=/Scanner_LiquidLeakage.Value |> expr((($1 != 0) ? 2 : 0))"    // 漏液状态:0:无漏液,1:轻微漏液,2:严重漏液
}

3.4.6 风扇自动调速

用于描述用于调速器件风扇相关信息,包括风扇在位信息、风扇状态信息、风扇PWM、风扇ID

Interface/Private属性/方法描述是否由CSR配置
bmc.kepler.Systems.CoolingFanFanId风扇ID,引用对应id风扇的Slot
bmc.kepler.Systems.CoolingFanHardwarePWM风扇硬件占空比
bmc.kepler.Systems.CoolingFanFrontPresence前转子在位信息,引用对应id风扇的FrontPresence
bmc.kepler.Systems.CoolingFanRearPresence后转子在位信息,引用对应id风扇的RearPresence
bmc.kepler.Systems.CoolingFanFrontStatus前转子状态,引用对应id风扇的FrontStatus
bmc.kepler.Systems.CoolingFanRearStatus后转子状态,引用对应id风扇的RearStatus
bmc.kepler.Systems.CoolingFanFrontSpeed前转子转速,引用对应id风扇的FrontSpeed
bmc.kepler.Systems.CoolingFanRearSpeed后转子转速,引用对应id风扇的RearSpeed
PrivateSlot风扇槽位号
PrivateMaxSupportedPWM最大支持占空比

配置样例:

json
"CoolingFan_1_1": {
  "FanId": 1,                                    // 风扇Id,Slot是指风扇的槽位号,当有多个系统时,不同风扇的槽位号相同,而风扇id 不会相同
  "FrontPresence": "<=/Fan_1.FrontPresence",     // 前转子在位状态:1在位,0不在位
  "FrontStatus": "<=/Fan_1.FrontStatus",         // 前转子状态:1异常,0正常
  "RearPresence": "<=/Fan_1.RearPresence",       // 后转子在位状态:1在位,0不在位
  "RearStatus": "<=/Fan_1.RearStatus",           // 后转子状态:1异常,0正常
  "HardwarePWM": "#/Accessor_Fan1_PWM.Value",    // 风扇硬件占空比
  "MaxSupportedPWM": 255,                        // 最大支持转速
  "Slot": 1                                      // 槽位号
}

3.4.7 泵自动调速 (液冷配置,非必需项,按照实际情况是否有laac泵上件进行配置)

用于描述用于调速器件泵相关信息,包括泵在位信息、泵状态信息、泵PWM、泵ID

Interface/Private属性/方法描述是否由CSR配置
bmc.kepler.Systems.CoolingPumpId泵ID,引用对应id泵的id
bmc.kepler.Systems.CoolingPumpSlot泵槽位号,引用对应id泵的Slot
bmc.kepler.Systems.CoolingPumpActualPWM泵硬件占空比
bmc.kepler.Systems.CoolingPumpSpeed泵转速
bmc.kepler.Systems.CoolingPumpPresence泵在位状态
bmc.kepler.Systems.CoolingPumpStatus泵状态
bmc.kepler.Systems.CoolingPumpLevel手动模式设置转速值,由软件刷新

配置样例:

json
"CoolingPump_1": { 
    "Id": 1,                                         // 泵Id
    "Slot": 1,                                       // 泵槽位号
    "ActualPWM": "#/Accessor_Pump1_PWM.Value",       // 泵占空比
    "Speed": "<=/Scanner_Pump1_Speed.Value",         // 泵转速
    "Presence": "<=/Scanner_Pump1_Presence.Value",   // 泵在位状态:1在位,0不在位
    "Status": 0                                      // 泵状态:0正常
}

3.4.8 泵转速下发 (液冷配置,非必需项,按照实际情况是否有laac泵上件进行配置)

json
"Pumps_1": {
  "PWMChip": "#/Chip_Pump_PWM",                // 用于关联硬件芯片对象
  "SetPWMCmd": 402673664                       // SMC命令字
}

3.4.9 温度海洋

TemperatureInfo主要用于web界面整机温度海洋的显示,提供服务器机箱温度传感器前面板与后面板的三维热力图,以及对应传感器状态与告警信息,其中温度点横坐标、温度点纵坐标、告警状态、告警阈值下限、温度点名称、温度值、传感器状态、告警阈值上限皆由CSR配置定义。当正确配置相关属性后,web整机温度海洋界面将生成一个温度点信息

配置样例:风扇板板温

json
"TemperatureInfo_1_6": {
  "CoordinateX": 7,                                   // 温度点横坐标
  "CoordinateY": 6,                                   // 温度点纵坐标
  "Health": "<=/ThresholdSensor_FanBoardTemp.Health", // 告警状态
  "LowerThreshold": [                                 // 告警阈值下限,低于该阈值会触发告警
    255, //与对应温度点的传感器的一般事件上限UpperNoncritical,轻微级别告警的门限Condition保持一致
    255, //与对应温度点的传感器的严重事件上限UpperCritical,严重级别告警的门限Condition保持一致
    255 //与对应温度点的传感器的紧急事件上限UpperNonrecoverable,紧急级别告警的门限Condition保持一致
  ],
  "Name": "CLU${Slot} Temp",                         // 温度点名称,用于温度海洋界面对应温度点的传感器名称显示
  "ReadingValue": "<=/Scanner_FanBrdTemp.Value",     // 温度值
  "Status": "<=/Scanner_FanBrdTemp.Status",          // 传感器状态
  "UpperThreshold": [                                // 告警阈值上限,高于该阈值会触发告警
    255, //与对应温度点的传感器的一般事件下限LowerNonCritical,轻微级别告警的门限Condition保持一致
    255, //与对应温度点的传感器的严重事件下限LowerCritical,严重级别告警的门限Condition保持一致
    255 //与对应温度点的传感器的紧急事件下限LowerNonrecoverable,紧急级别告警的门限Condition保持一致
  ]
}

3.4.10 风扇,泵转速管理

json
"Chip_Fan_PWM": {
      "OffsetWidth": 4,    // 地址偏移宽度,单位Byte
      "AddrWidth": 4,      // 地址宽度,单位Byte
      "Address": 96        // 天池架构中,所有单板的SMC地址固定为0x60即96
    },
    "Chip_Pump_PWM": {
      "OffsetWidth": 4,    // 地址偏移宽度,单位Byte
      "AddrWidth": 4,      // 地址宽度,单位Byte
      "Address": 96        // 天池架构中,所有单板的SMC地址固定为0x60即96
    }

3.4.11 传感器管理

传感器包括门限传感器(也叫连续性传感器,表征传感器的值是连续变化的)和离散传感器(表征传感器的值是离散的,如:运行状态,隔离值等)。 在风扇板的CSR中只涉及门限传感器,即连续传感器。门限类传感器主要包含以下内容: 1、风扇板温度 2、泵转速

json
    "ThresholdSensor_Pump1Speed": {
      "AssertMask": 0,               //传感器事件产生掩码,决定是否能产生事件;
      "ReadingMask": 0,              //传感器读值掩码,决定是否能对外显示门限;
      "DeassertMask": 0,             //传感器事件恢复掩码,决定是否能恢复事件;
      "Linearization": 0,            //传感器初始化选项,门限传感器
      "M": 30,                       //按需配置,无原始值缩放转换述求,则默认配置为1
      "RBExp": 224                   //按需配置,无原始值缩放转换述求,则默认配置为1
    }

注意:配置门限传感器时需要考虑传感器使能状态是否受到实体在位和上下电的影响,Capabilities属性(该属性一般配置在soft.sr中)需要按照规范配置

①若传感器使能状态不受实体在位及上下电影响(一般对应关联的实体的Prsence和PowerState配死为1),则配置为104

②若传感器使能状态受实体在位及上下电影响,则配置为232

3.4.12 告警管理

event也叫做精细化告警,主要包括了sensor和BMC其他精细化告警,硬件sr里主要包括风扇、泵、水浸绳在位告警,风扇拔出告警 Event属性补补数据存在于soft.sr文件,同一对象的属性可能会拆开成两部分,一部分属性在硬件csr中,一部分属性在软件csr中。

一个完整的event应该具备以下属性:

json
"Event_LAAC1_Absent": {
      "@Default": {                                       // 数据默认值,防止误告警
        "Reading": 1
      },
      "EventKeyId": "Chassis.LiquidCoolingPumpAbsent",   // 事件码,对应BMC不同的告警码
      "Reading": "<=/Scanner_Pump1_Presence.Value; <=/Scanner_ValvePresence.Value |> expr(($2 == 1) ? 1 : $1)",  // 数据来源(包含数据计算)
      "Condition": 0,                                   // 告警门限值
      "OperatorId": 5,                                  //告警产生条件,该项和告警门限值搭配使用,2表示数据来源传来的值小于等于Condition的值的时候触发告警,其他值的含义见下表
      "Enabled": true,                                  //使能开关
      "DescArg1": "1",                                  // redfish配置参数,用于web界面告警显示
      "Component": "#/Component_Chassis"                // 关联的Component对象
    }

OperatorId详细含义 :

OperatorId 含义 1 小于 2 小于等于 3 大于 4 大于等于 5 等于 6 不等于 7 发生0->1产生告警,1->0消除告警 8 发生1->0产生告警,0->1消除告警

3.5 装备测试项

装备测试中涉及装备向BMC传递数据,需要依靠CSR来实现,因此需在CSR中添加装备测试项相关内容。

Interface/Private属性/方法描述是否由CSR配置
bmc.kepler.ManufactureType测试类型
bmc.kepler.ManufactureId装备测试项
bmc.kepler.ManufactureDeviceNum用来匹配唯一装备项
bmc.kepler.ManufactureSlot用来匹配唯一装备项
bmc.kepler.ManufactureItemName装备项名称
bmc.kepler.ManufacturePrompteReady当前未使用
bmc.kepler.ManufacturePrompteFinish当前未使用
bmc.kepler.ManufactureProcessPeriod当前未使用
PrivateInputChip检查bypass关联chip
PrivateChannel检查InputChip关联chip的bypass,对应channel号
json
"DftIOTest_1": {
      "ActionType": 2,                            // 操作类型
      "Data": 0,                                  // 默认数据
      "Destination": "#/Accessor_FanBLm75.Value", // 获取值
      "DeviceNum": 6,                             // 用来匹配唯一装备项
      "Id": 89,                                   // 装备测试项
      "ItemName": "SMC For FanBoard LM75 Temp",   // 装备项名称
      "ProcessPeriod": 65535,                     // 未使用
      "PrompteFinish": "",                        // 未使用
      "PrompteReady": "",                         // 未使用
      "Type": 2                                   // 测试类型
    },
"DftCardPresence_1": {
      "Type": 1,                                // 测试类型
      "Id": 22,                                 // 装备测试项
      "DeviceNum": 0,                           // 用来匹配唯一装备项
      "ItemName": "Water Rope Presence",        // 装备项名称
      "PrompteReady": "",                       // 未使用
      "PrompteFinish": "",                      // 未使用
      "ProcessPeriod": 65535,                   // 未使用
      "ExpectVal": 1,                           // 期望值
      "Presence": "<=/Scanner_Laac_Presence.Value; <=/Scanner_WatCabAbsent.Value |> expr($1 == 0 ? 1 : $2)"  // 在位信息
    },
    "DftPysicalLed_1": {                        //(部分机型的LED灯控制由多个单板的CPLD完成,例如taishan2.16中前后UID灯的点灯测试由EXU的逻辑控制,而健康灯的点灯由CLU的逻辑控制,故对应的健康灯点灯测试项应该配置到CLU的CSR中)
      "Id": 129,                                // 装备测试项
      "Type": 4,                                // 测试类型
      "Slot": "${GroupId}",                     // 用来匹配唯一装备项
      "DeviceNum": 0,                           // 用来匹配唯一装备项
      "ItemName": "Physical HealthLed Test",    //测试项名称,用于回显
      "PrompteReady": "",                       // 未使用
      "PrompteFinish": "Please check the leds", //测试项操作指示,用于回显
      "ProcessPeriod": 65535,                   // 未使用
      "DftEnable": "#/Accessor_DftEnable.Value" // 用来切换单板装备模式
    },
    "DftLedIntelligence_1": {
      "Id": 132,                                // 装备测试项
      "Slot": "${GroupId}",                     // 用来匹配唯一装备项
      "DeviceNum": 0,                           // 用来匹配唯一装备项
      "ItemName": "Physical HealthLed Test",    //测试项名称,用于回显
      "PrompteReady": "",                       // 未使用
      "PrompteFinish": "Please check the leds", //测试项操作指示,用于回显
      "ProcessPeriod": 65535,                   // 未使用
      "DftEnable": "#/Accessor_DftEnable.Value" // 用来切换单板装备模式
    }