最近在适配自研硬盘背板,目前背板EEPROM里没有内容,想要手动写入UID到硬盘背板的EEPROM种,但是失败了,返回结果如下
其中读取EEPROM是正常的,链路应该没问题,请问如何进行写入?
答案内容由AI生成,仅供参考:
| 项目 | 建议操作 |
|---|---|
| 确认EEPROM的WP引脚为低电平 | |
CSR中配置EepromWp并使用标准IPMI写入 |
|
| 分页写入,避免跨页,每次写后延时10ms | |
| 先用单字节测试写入能力 | |
检查dmesg日志中的I2C错误 |
推荐最终方案:通过配置完整的CSR结构(包括FruData + Accessor + Eeprom),并使用
ipmitool fru write命令写入标准FRU二进制文件,避免手动调用底层接口。
如有必要,可提供 fru-data.bin 文件生成方法及格式规范。
根据您提供的故障信息,您正在尝试向自研硬盘背板的EEPROM中写入UID数据但失败。虽然读取操作正常,表明I2C链路基本正常,但写入操作返回错误码 ret: 5,提示“I2C Write/Read Fail”。以下是从上下文信息中综合得出的分析与解决方案。
"i2c write fail, ret: 5"
ret: 5 是I2C通信失败的典型返回码,含义为 “Slave Not Acknowledging”(从设备未应答)。大多数EEPROM芯片有硬件写保护引脚(WP),若该引脚接地则允许写入;若接VCC则禁止写入。
建议操作:
WP 引脚是否连接到高电平。您需要在CSR配置中定义一个Accessor对象用于控制写保护:
"Accessor_SEUWP": {
"Chip": "#/Smc_ExpBoardSMC",
"Size": 1,
"Offset": 11776,
"Mask": 255,
"Type": 0,
"Value": 0
},
"FruData_SEU": {
"FruId": 1,
"FruDev": "#/Eeprom_SEU",
"EepromWp": "#/Accessor_SEUWP.Value",
"StorageType": "EepromV2"
}
说明:
EepromWp字段指向写保护控制寄存器,确保在写入EEPROM前由系统关闭写保护。
使用 I2c_5 总线写入 Eeprom_SEU_010102,需确认:
| 项目 | 推荐值 | 验证方式 |
|---|---|---|
地址 (Address) |
0xAE (174) |
查阅EEPROM规格书 |
页大小 (PageSize) |
常见 16/32/64 字节 | 确保单次写不超过一页 |
偏移宽度 (OffsetWidth) |
通常为 1 或 2 字节 | CSR中Eeprom_SEU_010102.OffsetWidth |
| 总线速度 | ≤ 400 kbps | 默认I2C Fast Mode |
特别注意:
# 第一步:尝试写入1字节(测试最小单位)
busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_SEU_010102 \
bmc.kepler.Chip.BlockIO Write a{ss}ay 0 1 0x30
sleep 0.01 # 等待EEPROM完成写入(典型10ms)
# 第二步:读回验证
busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Eeprom/Eeprom_SEU_010102 \
bmc.kepler.Chip.BlockIO Read a{ss}u 0 0 1
如果单字节写入也失败,请重点检查:
- EEPROM是否支持该I2C地址;
- 是否处于写保护状态;
- 是否供电不足或电压不稳定。
避免直接调用D-Bus接口,建议使用标准IPMI命令 EepromWriteCmd,它封装了完整流程(含完成码、校验、重试等)。
ipmitool):ipmitool raw 0x00 0x00 0x03 0x08 \
0x30 0x30 0x30 0x30 0x30 0x30 0x37 0x30 \
0x33 0x42 0x53 0x45 0x32 0x32 0x33 0x31 \
0x30 0x30 0x00 0x00 0x00 0x00 0x00
参数说明:
0x00 0x00:NetFn=00, Cmd=00(EepromWriteCmd)0x03:SubCmd = 0x03 表示写EEPROM0x08:写入长度为8字节(调整为您实际长度)
提示:在CSR中将
StorageType设为EepromV2并配置FruData服务,可让系统自动处理写入。
确保以下服务正常启动:
| 服务名 | 功能 |
|---|---|
bmc.kepler.hwproxy |
提供硬件访问代理,必须运行 |
bmc.kepler.hwdiscovery |
发现并加载EEPROM设备对象 |
frudata_service.lua |
处理FRU数据写入逻辑 |
systemctl status bmc-kepler-hwproxy
busctl --user list-names | grep hwproxy
若发现
frudata_service.lua报错,如 “read eeprom header failed”,可能是头信息格式不符合规范。
修改CSR配置:
"Eeprom_SEU": {
"Address": 174,
"AddrWidth": 1,
"OffsetWidth": 1,
"WriteTmout": 100,
"ReadTmout": 100,
"RwBlockSize": 16
}
定义写保护控制:
"EepromWp": "#/Accessor_SEUWP.Value"
重启BMC服务,加载新配置
通过IPMI写入FRU数据:
ipmitool fru write 0 fru-data.bin
验证写入结果:
ipmitool fru print 0
EepromWriteCmd 是专用于EEPROM写入的IPMI命令(定义于 mds/ipmi.json)frudata_service.lua 是负责FRU数据读写的Lua脚本,写失败时会睡眠10秒bmc.kepler.hwdiscovery 负责硬件发现,若其无法读取EEPROM头,会导致后续操作失败0000000103BS0223100(华为SEU)| 项目 | 建议操作 |
|---|---|
| 确认EEPROM的WP引脚为低电平 | |
CSR中配置EepromWp并使用标准IPMI写入 |
|
| 分页写入,避免跨页,每次写后延时10ms | |
| 先用单字节测试写入能力 | |
检查dmesg日志中的I2C错误 |
推荐最终方案:通过配置完整的CSR结构(包括FruData + Accessor + Eeprom),并使用
ipmitool fru write命令写入标准FRU二进制文件,避免手动调用底层接口。
如有必要,可提供 fru-data.bin 文件生成方法及格式规范。
相关链接:
经过验证,写数据到EEPROM时需要关闭硬盘背板写保护