如何手动写入硬盘背板EEPROM

最近在适配自研硬盘背板,目前背板EEPROM里没有内容,想要手动写入UID到硬盘背板的EEPROM种,但是失败了,返回结果如下


其中读取EEPROM是正常的,链路应该没问题,请问如何进行写入?

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

:white_check_mark: 总结建议

项目 建议操作
:electric_plug: 硬件 确认EEPROM的WP引脚为低电平
:puzzle_piece: 软件 CSR中配置EepromWp并使用标准IPMI写入
:floppy_disk: 写入方式 分页写入,避免跨页,每次写后延时10ms
:hammer_and_wrench: 调试 先用单字节测试写入能力
:telephone_receiver: 支持 检查dmesg日志中的I2C错误

:green_circle: 推荐最终方案:通过配置完整的CSR结构(包括FruData + Accessor + Eeprom),并使用 ipmitool fru write 命令写入标准FRU二进制文件,避免手动调用底层接口。

如有必要,可提供 fru-data.bin 文件生成方法及格式规范。

点击此处查看详细分析解答

如何手动写入硬盘背板EEPROM

根据您提供的故障信息,您正在尝试向自研硬盘背板的EEPROM中写入UID数据但失败。虽然读取操作正常,表明I2C链路基本正常,但写入操作返回错误码 ret: 5,提示“I2C Write/Read Fail”。以下是从上下文信息中综合得出的分析与解决方案。

:magnifying_glass_tilted_left: 问题分析

:cross_mark: 错误分析

"i2c write fail, ret: 5"
  • ret: 5 是I2C通信失败的典型返回码,含义为 “Slave Not Acknowledging”(从设备未应答)
  • 这表示在I2C总线上,主机发送数据后,目标EEPROM芯片没有返回ACK信号。
  • 尽管读取成功,但写入失败,可能说明:
    • 写保护机制未解除;
    • EEPROM处于写保护状态;
    • 芯片忙于内部写操作(如页编程、擦除);
    • 硬件设计或配置存在问题(例如地址线、写保护引脚状态)。

:white_check_mark: 已知成功项

  • 读操作正常:说明I2C物理链路和寻址基本正确,可排除严重连接问题或驱动缺失。

:hammer_and_wrench: 解决方案步骤

步骤一:确认并解除EEPROM写保护

大多数EEPROM芯片有硬件写保护引脚(WP),若该引脚接地则允许写入;若接VCC则禁止写入。

:white_check_mark: 建议操作:

  • 检查硬件原理图,确认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"
}

:warning: 说明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

:red_exclamation_mark: 特别注意:

  • 某些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 表示写EEPROM
  • 0x08:写入长度为8字节(调整为您实际长度)
  • 后续为要写入的数据

:light_bulb: 提示:在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”,可能是头信息格式不符合规范。


:white_check_mark: 正确写入流程(建议做法)

  1. 修改CSR配置:

    "Eeprom_SEU": {
      "Address": 174,
      "AddrWidth": 1,
      "OffsetWidth": 1,
      "WriteTmout": 100,
      "ReadTmout": 100,
      "RwBlockSize": 16
    }
    
  2. 定义写保护控制:

    "EepromWp": "#/Accessor_SEUWP.Value"
    
  3. 重启BMC服务,加载新配置

  4. 通过IPMI写入FRU数据:

    ipmitool fru write 0 fru-data.bin
    
  5. 验证写入结果:

    ipmitool fru print 0
    

:clipboard: 参考资料

  • EepromWriteCmd 是专用于EEPROM写入的IPMI命令(定义于 mds/ipmi.json
  • frudata_service.lua 是负责FRU数据读写的Lua脚本,写失败时会睡眠10秒
  • bmc.kepler.hwdiscovery 负责硬件发现,若其无法读取EEPROM头,会导致后续操作失败
  • UID格式必须符合规范:
    • Vendor ID(8位)+ 单板类型(2位)+ 编码(10位)
    • 示例:0000000103BS0223100(华为SEU)

:white_check_mark: 总结建议

项目 建议操作
:electric_plug: 硬件 确认EEPROM的WP引脚为低电平
:puzzle_piece: 软件 CSR中配置EepromWp并使用标准IPMI写入
:floppy_disk: 写入方式 分页写入,避免跨页,每次写后延时10ms
:hammer_and_wrench: 调试 先用单字节测试写入能力
:telephone_receiver: 支持 检查dmesg日志中的I2C错误

:green_circle: 推荐最终方案:通过配置完整的CSR结构(包括FruData + Accessor + Eeprom),并使用 ipmitool fru write 命令写入标准FRU二进制文件,避免手动调用底层接口。

如有必要,可提供 fru-data.bin 文件生成方法及格式规范。

相关链接:

  1. StorageType配置为EepromV2,fru write没有写入
  2. 【教学培训篇】读写eeprom
  3. 无签名UBMC上无法继续更新BMC固件
  4. 读取fru显示Device not present
  5. 硬盘背板开发指南 | 文档中心 | openUBMC

经过验证,写数据到EEPROM时需要关闭硬盘背板写保护