如何将sr的chip对象的OffsetWidth配置成3

问题描述

我现在适配一张网卡的温度传感器,发现协议里传感器I2c地址的的偏移是3个字节,但是在sr中将"OffsetWidth"配置成3后未生效,如下图。

以上配置后,发现BMC起来后未加载此chip对象,请问传感器偏移地址三位该如何配置呢

答案内容由AI生成,仅供参考:

如何正确配置 SR 文件中 Chip 对象的 OffsetWidth 为 3 字节?

根据您提供的问题描述,您在适配网卡温度传感器时,遇到 OffsetWidth 配置为 3 未生效、且 BMC 启动后未加载 Chip_TempChip 对象 的问题。以下将结合知识库内容进行详细分析与指导。


:magnifying_glass_tilted_left: 问题核心分析

您期望:

  • 将 I²C 设备偏移地址宽度(OffsetWidth)设为 3 字节(即 24 位)
  • 使用该配置正确读取温度传感器数据。

但当前现象是:

  • BMC 启动后未加载该 Chip 对象。
  • 配置疑似“未生效”。

:books: 基于文档与知识图谱的关键信息整合

:white_check_mark: 1. OffsetWidth 的合法取值范围

来自知识库文档 《CSR配置字典之Smc类》《I2C/SMBus 配置及使用说明》

  • OffsetWidth: 表示偏移地址的位宽,单位为字节(byte)。
  • 在 SR 配置中,通常支持的 OffsetWidth 值为 1 或 2
  • 3 字节偏移宽度(即 24 位)属于非常规配置,多数硬件抽象层(如 hwproxySMC 模块)不支持大于 2 的 OffsetWidth

:red_exclamation_mark: 特别提醒:虽然 JSON/C++ 层面可以写入 "OffsetWidth": 3,但如果底层驱动或 Chip 对象解析器不支持,则会导致:

  • 对象初始化失败
  • 资源树未正确加载该设备
  • BMC 忽略该 Chip 配置(表现为“未加载”)

:white_check_mark: 2. 实际偏移处理方式:逻辑偏移 vs 物理偏移

很多情况下,协议规定寄存器偏移使用 3 字节表示,但这 不等于 必须通过 OffsetWidth=3 来配置。

:white_check_mark: 推荐做法:使用 Scanner.Offset 进行逻辑偏移计算

  • Scanner.Offset 字段接受一个十进制数值,表示从目标地址开始读写的“逻辑偏移”。
  • BMC 系统通常会将此值自动转换为底层 I²C 写入命令中的字节序列(高位补零),即使 OffsetWidth=2 也能处理最多 0xFFFFF(20 位)偏移
  • 若偏移确实超过 20 位(即大于 0xFFFFF = 1048575),才需考虑扩展宽度。

:hammer_and_wrench: 示例:
如果传感器要求偏移地址为 0x290000(即十进制 2,686,976),您可以设置:

"Scanner_Temp": {
  "Chip": "#/Chip_TempChip",
  "Offset": 2686976,
  "Size": 1,
  "Period": 1000
}

:light_bulb: 即使 OffsetWidth: 2,只要协议允许分步访问或协议层支持扩展寻址,通常仍可工作。


:white_check_mark: 3. 您当前配置的问题点

"Chip_TempChip": {
  "Address": 114,
  "AddrWrit": -1,               ← 错别字!应为 AddrWidth
  "OffsetWidth": 3,
  "WriteMout": 100,             ← 错别字!应为 WriteTmout
  "Readmout": 100,              ← 错别字!应为 ReadTmout
  "HealthStatus": 0
}

:cross_mark: 存在 多个拼写错误,导致整个对象解析失败:

错误字段 正确字段名 影响
AddrWrit AddrWidth 地址宽度无效 → 导致通信参数缺失
WriteMout WriteTmout 超时参数无法识别
Readmout ReadTmout 超时参数无法识别
#Chip_TempChip #/Chip_TempChip 引用路径错误

:warning: 正是这些拼写错误导致 Chip_TempChip 无法被正确加载!BMC 解析失败后直接跳过该对象。


:white_check_mark: 正确配置方法(解决方案)

:white_check_mark: 第一步:修正拼写错误并标准化配置

{
  "Objects": {
    "Chip_TempChip": {
      "Name": "Chip_TempChip",
      "Address": 114,
      "AddrWidth": 1,
      "OffsetWidth": 2,               // 推荐:最大支持偏移到 0xFFFFF(20 位)
      "WriteTmout": 100,
      "ReadTmout": 100,
      "HealthStatus": 0
    },
    "Scanner_Temp": {
      "Chip": "#/Chip_TempChip",      // 注意必须以 "#/" 开头
      "Size": 1,
      "Offset": 2671360,               // 十进制 = 0x28C000(即 3 字节偏移的实际值)
      "Mask": 255,
      "Type": 1,                       // 块读
      "Period": 1000,
      "Debounce": "#/MidAvg_Temp",
      "ScanEnabled": "~=::FruCtrl_1_0.PowerState > string.cmp($1, 'ON') > expr($1 ? 1 : 0)"
    }
  }
}

:white_check_mark: 第二步:确认是否真需 OffsetWidth=3

请核实以下几点:

检查项 建议
硬件规格书是否明确要求三字节偏移? 如果是连续寄存器块,可能只需高位切换或命令前缀
是否可通过命令字(CMD byte)实现寻址? 某些设备用第一个写入字节作为“操作码”而非偏移
是否支持 I²C 分页访问? 例如使用页寄存器 + 低偏移组合访问大空间

:pushpin: 结论:绝大多数场景下,无需设置 OffsetWidth=3OffsetWidth=2Scanner.Offset 十进制配置足矣。


:white_check_mark: 第三步:验证路径与命名规范

  • 所有引用必须以 #/ 开头,如:#/Chip_TempChip#/MidAvg_Temp
  • 确保 Chip_TempChip 在同一或上级 SR 文件中定义
  • 若跨文件,需保证 CSR 加载顺序和依赖关系正确

:white_check_mark: 第四步:调试建议

  1. 检查 framework.loghwproxy.log
    查找是否有关于 Chip_TempChip 的错误日志,如:

    • Failed to parse object Chip_TempChip
    • Unknown property 'AddrWrit'
    • Invalid chip reference: #Chip_TempChip
  2. 使用 BMC Studio 查看资源树
    访问 http://localhost:10000 → 进入“资源树”或“Model”视图,搜索 Chip_TempChip 是否存在。

  3. 手动测试 I²C 通信

    # 示例:通过 busctl 读取指定地址和偏移
    busctl --user call bmc.kepler.hwproxy \
      /bmc/kepler/Chip/Chip_TempChip \
      bmc.kepler.Chip.BlockIo Read a{ss}uu 0 0x28C000 1
    

:white_check_mark: 总结与建议

项目 建议
OffsetWidth 是否能设为 3 :cross_mark: 不推荐,大多数系统仅支持 1 或 2
多字节偏移如何处理 :white_check_mark: 使用 Scanner.Offset 配置十进制逻辑偏移
BMC 未加载 Chip 对象 :white_check_mark: 优先排查拼写错误(如 AddrWrit → AddrWidth)
引用路径 :white_check_mark: 必须使用 #/Chip_Name 格式
实际应用 :white_check_mark: 保持 OffsetWidth: 2,配合大数 Offset 值即可满足需求

:puzzle_piece: 最终结论

您遇到的问题主因是字段拼写错误导致对象解析失败,而非 OffsetWidth=3 不被支持。

:wrench: 解决办法

  1. 修正 AddrWritAddrWidthWriteMoutWriteTmoutReadmoutReadTmout
  2. OffsetWidth 改为 2
  3. Scanner 中用十进制设置正确的 Offset 值(如 2671360
  4. 确保引用路径加 #/

完成以上修改后,BMC 可正常加载该 Chip 并读取传感器数据。

如有进一步问题,建议提供 完整的 error log 截图设备规格书片段 以确认协议细节。

相关链接:

  1. 通过PCA9546访问Retimer片内数据异常
  2. 【提问求助】BMC studio板卡适配后仿真启动报错问题
  3. i2c读取数据,参数超出范围
  4. 自研板卡如何实现自发现
  5. 硬件代理总线读写接口使用方法 | 文档中心 | openUBMC

OffsetWidth设置[0-4]应该都没问题,你可以试试把OffsetWidth改成2或者4能不能加载,建议通过framework.log分析一下未加载原因

可以确认下是整个sr没加载还是单个对象没加载吗?

我把OffsetWidth改成2或者4,对象能正常加载,但是数据还是获取不到,我在V2上一样的适配就可以,移植到V3就不行了,V2是下面这样适配的

目前看是OffsetWidth不能配置成3,配置成2或者4就能正常加载

你把framework.log传上来啊,没有日志怎么分析

已经通过ncsi获取到温度了

请问问题是解决了吗?如还有问题请尽快反馈,若问题解决请标记解决方案。

通过厂商提供的NCSI OEM命令能正常获取到温度