Scanner如何解析多字节的长数据

问题说明

一个SMC命令字当中存放了所有传感器的数据,大概有32个字节。同时这个命令字好像也不带param参数,就是一整块数据连着的。

看现有的所有的Scanner下面配置的Size最多好像也就8,Value最大也就U64,8字节吧?感觉Scanner好像不能实现去解析32字节的数据。

请问这个问题在sr中如何去配置,读取并解析呢?

SmcDfxInfo

我在sr文件中有找到了SmcDfxInfo这个类,从结构上看很像我这次需求实现,但目前没有找到什么资料对这个dfx的说明。

  1. 请问dfx是什么?
  2. dfxinfo的数据格式是否有要求,对于我上面传感器数据这样的可以支持吗?

简单讲DfxInfo就是一把读回来长字节的数据,再Config与mapping的配置分配给scanner

SmcDfxInfo

当前组件存在大量Scanner需要轮询访问,但很多Scanner仅存在偏移差异,针对此情况需要做批量读取

属性名类型描述默认值
Chipro引用的Smc Chip对象
SizeU8SmcDfxInfo的长度
OffsetU32偏移,一般为7424 Function=0x00 Cammand=0x07 RW=1
PeriodU32扫描周期,单位ms程序默认值1000
SmcVersionU32支持的Smc最低版本,用于版本检测
ConfigDictionarySmcDfxInfo中每个字节与对应硬件信号的对应关系,可通过mask按照单字节或者bit位进行对应
MappingDictionaryScanner与硬件信号的对应关系,通过配置表达式获取值,硬件信号名称为Config中的名称
ContextDictionary预留扩展字段,当前1U风扇板 MCU版本号有使用该字段,其他未使用

字段说明:

  • Config为对应byte与硬件信号的对应关系,key表示第几个byte(整数字符串),从1开始,1个byte可以存在多个信号或1个信号,通过信号名称与mask掩码对应整字节数据或其中某个bit位的数据
  • Mapping为Scanner与硬件信号的对应关系,key为Scanner名称,Scanner必须位于同一CSR中,"Value"表示为Scanner的值,通过配置表达式从硬件信号获取值
  • 固定第一个字节表示Smc版本号,2段式,高4位为第一段,低4位为第二段,如32表示版本号为2.0;如果单板无CPLD,仅有MCU,使用前3个字节表示MCU版本号,例如"\x00\x02\x12",表示MCU版本号为0.2.18,在Context中配置表达式获取版本号;

配置样例

    "SmcDfxInfo_CLU": {
      "Chip": "#/Smc_FanBoardSMC",
      "Offset": 7424,
      "Size": 27,
      "Period": 400,
      "SmcVersion": 784,
      "Config": {
        // 即第一个byte为信号 mcu_ver_major 与 mask 255
        "1": {"mcu_ver_major": 255},
        "2": {"mcu_ver_minor": 255},
        "3": {"mcu_ver_build": 255},
        "4": {"board_temp_l": 255},
        "5": {"board_temp_h": 255},
        "14": {"code_power_fail": 255},
        "15": {"code_power_time_out": 255},
        "16": {"fan1_prsnt_n": 1},
        "24": {"fan1_tach_a_data_l": 255},
        "25": {"fan1_tach_a_data_h": 255},
        "26": {"fan1_tach_b_data_l": 255},
        "27": {"fan1_tach_b_data_h": 255}
      },
      "Context": {
        "SmcVersion": "expr(($mcu_ver_major << 16) + ($mcu_ver_minor << 8) + $mcu_ver_build)"
      },
      "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_FanBrdTemp": {"Value": "expr($board_temp_l)"}
      }
    }