问题描述
我现在适配一张网卡的温度传感器,发现协议里传感器I2c地址的的偏移是3个字节,但是在sr中将"OffsetWidth"配置成3后未生效,如下图。
以上配置后,发现BMC起来后未加载此chip对象,请问传感器偏移地址三位该如何配置呢
我现在适配一张网卡的温度传感器,发现协议里传感器I2c地址的的偏移是3个字节,但是在sr中将"OffsetWidth"配置成3后未生效,如下图。
以上配置后,发现BMC起来后未加载此chip对象,请问传感器偏移地址三位该如何配置呢
答案内容由AI生成,仅供参考:
OffsetWidth 为 3 字节?根据您提供的问题描述,您在适配网卡温度传感器时,遇到 OffsetWidth 配置为 3 未生效、且 BMC 启动后未加载 Chip_TempChip 对象 的问题。以下将结合知识库内容进行详细分析与指导。
您期望:
OffsetWidth)设为 3 字节(即 24 位)。但当前现象是:
OffsetWidth 的合法取值范围来自知识库文档 《CSR配置字典之Smc类》 和 《I2C/SMBus 配置及使用说明》:
OffsetWidth: 表示偏移地址的位宽,单位为字节(byte)。- 在 SR 配置中,通常支持的
OffsetWidth值为 1 或 2。- 3 字节偏移宽度(即 24 位)属于非常规配置,多数硬件抽象层(如
hwproxy或SMC模块)不支持大于 2 的OffsetWidth。
特别提醒:虽然 JSON/C++ 层面可以写入
"OffsetWidth": 3,但如果底层驱动或Chip对象解析器不支持,则会导致:
- 对象初始化失败
- 资源树未正确加载该设备
- BMC 忽略该 Chip 配置(表现为“未加载”)
很多情况下,协议规定寄存器偏移使用 3 字节表示,但这 不等于 必须通过 OffsetWidth=3 来配置。
Scanner.Offset 进行逻辑偏移计算Scanner.Offset 字段接受一个十进制数值,表示从目标地址开始读写的“逻辑偏移”。OffsetWidth=2 也能处理最多 0xFFFFF(20 位)偏移。0xFFFFF = 1048575),才需考虑扩展宽度。
示例:
如果传感器要求偏移地址为0x290000(即十进制2,686,976),您可以设置:"Scanner_Temp": { "Chip": "#/Chip_TempChip", "Offset": 2686976, "Size": 1, "Period": 1000 }
即使
OffsetWidth: 2,只要协议允许分步访问或协议层支持扩展寻址,通常仍可工作。
"Chip_TempChip": {
"Address": 114,
"AddrWrit": -1, ← 错别字!应为 AddrWidth
"OffsetWidth": 3,
"WriteMout": 100, ← 错别字!应为 WriteTmout
"Readmout": 100, ← 错别字!应为 ReadTmout
"HealthStatus": 0
}
| 错误字段 | 正确字段名 | 影响 |
|---|---|---|
AddrWrit |
AddrWidth |
地址宽度无效 → 导致通信参数缺失 |
WriteMout |
WriteTmout |
超时参数无法识别 |
Readmout |
ReadTmout |
超时参数无法识别 |
#Chip_TempChip |
#/Chip_TempChip |
引用路径错误 |
正是这些拼写错误导致
Chip_TempChip无法被正确加载!BMC 解析失败后直接跳过该对象。
{
"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)"
}
}
}
OffsetWidth=3请核实以下几点:
| 检查项 | 建议 |
|---|---|
| 硬件规格书是否明确要求三字节偏移? | 如果是连续寄存器块,可能只需高位切换或命令前缀 |
| 是否可通过命令字(CMD byte)实现寻址? | 某些设备用第一个写入字节作为“操作码”而非偏移 |
| 是否支持 I²C 分页访问? | 例如使用页寄存器 + 低偏移组合访问大空间 |
结论:绝大多数场景下,无需设置
OffsetWidth=3。OffsetWidth=2与Scanner.Offset十进制配置足矣。
#/ 开头,如:#/Chip_TempChip、#/MidAvg_TempChip_TempChip 在同一或上级 SR 文件中定义检查 framework.log 或 hwproxy.log
查找是否有关于 Chip_TempChip 的错误日志,如:
Failed to parse object Chip_TempChipUnknown property 'AddrWrit'Invalid chip reference: #Chip_TempChip使用 BMC Studio 查看资源树
访问 http://localhost:10000 → 进入“资源树”或“Model”视图,搜索 Chip_TempChip 是否存在。
手动测试 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
| 项目 | 建议 |
|---|---|
OffsetWidth 是否能设为 3 |
|
| 多字节偏移如何处理 | Scanner.Offset 配置十进制逻辑偏移 |
| BMC 未加载 Chip 对象 | |
| 引用路径 | #/Chip_Name 格式 |
| 实际应用 | OffsetWidth: 2,配合大数 Offset 值即可满足需求 |
您遇到的问题主因是字段拼写错误导致对象解析失败,而非
OffsetWidth=3不被支持。
解决办法:
- 修正
AddrWrit→AddrWidth,WriteMout→WriteTmout,Readmout→ReadTmout- 将
OffsetWidth改为 2- 在
Scanner中用十进制设置正确的Offset值(如2671360)- 确保引用路径加
#/
完成以上修改后,BMC 可正常加载该 Chip 并读取传感器数据。
如有进一步问题,建议提供 完整的 error log 截图 或 设备规格书片段 以确认协议细节。
相关链接:
OffsetWidth设置[0-4]应该都没问题,你可以试试把OffsetWidth改成2或者4能不能加载,建议通过framework.log分析一下未加载原因
可以确认下是整个sr没加载还是单个对象没加载吗?
目前看是OffsetWidth不能配置成3,配置成2或者4就能正常加载
你把framework.log传上来啊,没有日志怎么分析
已经通过ncsi获取到温度了
请问问题是解决了吗?如还有问题请尽快反馈,若问题解决请标记解决方案。
通过厂商提供的NCSI OEM命令能正常获取到温度