答案内容由AI生成,仅供参考:
总结建议
| 项目 | 建议操作 |
|---|---|
| 确认EEPROM的WP引脚为低电平 | |
CSR中配置EepromWp并使用标准IPMI写入 |
|
| 分页写入,避免跨页,每次写后延时10ms | |
| 先用单字节测试写入能力 | |
检查dmesg日志中的I2C错误 |
推荐最终方案:通过配置完整的CSR结构(包括FruData + Accessor + Eeprom),并使用
ipmitool fru write命令写入标准FRU二进制文件,避免手动调用底层接口。
如有必要,可提供 fru-data.bin 文件生成方法及格式规范。
点击此处查看详细分析解答
如何手动写入硬盘背板EEPROM
根据您提供的故障信息,您正在尝试向自研硬盘背板的EEPROM中写入UID数据但失败。虽然读取操作正常,表明I2C链路基本正常,但写入操作返回错误码 ret: 5,提示“I2C Write/Read Fail”。以下是从上下文信息中综合得出的分析与解决方案。
问题分析
错误分析
"i2c write fail, ret: 5"
ret: 5是I2C通信失败的典型返回码,含义为 “Slave Not Acknowledging”(从设备未应答)。- 这表示在I2C总线上,主机发送数据后,目标EEPROM芯片没有返回ACK信号。
- 尽管读取成功,但写入失败,可能说明:
- 写保护机制未解除;
- EEPROM处于写保护状态;
- 芯片忙于内部写操作(如页编程、擦除);
- 硬件设计或配置存在问题(例如地址线、写保护引脚状态)。
已知成功项
- 读操作正常:说明I2C物理链路和寻址基本正确,可排除严重连接问题或驱动缺失。
解决方案步骤
步骤一:确认并解除EEPROM写保护
大多数EEPROM芯片有硬件写保护引脚(WP),若该引脚接地则允许写入;若接VCC则禁止写入。
建议操作:
- 检查硬件原理图,确认EEPROM的
WP引脚是否连接到高电平。 - 若已接高电平,请改为接地,或通过BMC控制一个GPIO/CPLD寄存器来动态控制该引脚。
软件层面控制写保护(CSR示例)
您需要在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前由系统关闭写保护。
步骤二:验证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 |
特别注意:
- 某些EEPROM在内部写操作期间会暂停响应所有通信(持续数毫秒),必须加入写完后的延时或轮询忙状态。
- 您当前写入24字节数据,需确保未超过页边界(例如32字节页边界),否则必须分页写入。
步骤三:分步调试写入流程
推荐方法:分小块写入 + 添加延时
# 第一步:尝试写入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地址;
- 是否处于写保护状态;
- 是否供电不足或电压不稳定。
步骤四:使用IPMI命令写入(推荐)
避免直接调用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头,会导致后续操作失败- UID格式必须符合规范:
- Vendor ID(8位)+ 单板类型(2位)+ 编码(10位)
- 示例:
0000000103BS0223100(华为SEU)
总结建议
| 项目 | 建议操作 |
|---|---|
| 确认EEPROM的WP引脚为低电平 | |
CSR中配置EepromWp并使用标准IPMI写入 |
|
| 分页写入,避免跨页,每次写后延时10ms | |
| 先用单字节测试写入能力 | |
检查dmesg日志中的I2C错误 |
推荐最终方案:通过配置完整的CSR结构(包括FruData + Accessor + Eeprom),并使用
ipmitool fru write命令写入标准FRU二进制文件,避免手动调用底层接口。
如有必要,可提供 fru-data.bin 文件生成方法及格式规范。
相关链接: