背景
来源1:BMC原有能力收集Flash存储的日志信息,在不同代际的硬件上通路设计存在差异,硬件新通路上要求通过SPIOverHisport实现。
来源2:新增krun特性,其中krun固件是保存在Flash器件上的,预期通过SPIOverHisport来擦写该Flash实现krun固件升级的功能。
当前现状与差距/问题分析:
现状:当前已实现了SPIOverHisport的总线
差距:SPIOverHisport总线提供的是原始单个SPI帧内容发送的Read和Write方法。无法满足当前的使用
1、Flash上的读\写\擦除的功能实现是依赖多个帧命令去实现的,如写操作需要先发送写使能命令,再发送页编程的命令(一般Flash器件单页是256字节),再发送读取状态的命令来判断写操作是否完成,直接通过总线需要多次RPC调用。
2、当前已实现的所有Chip类型都没用擦除的方法
3、Flash器件中存在3字节寻址模式和4字节地址的模式的差异,超过16MByte的地址必须使用4字节寻址模式,需要Chip的读写方法中去设置
关联ISSUE
整体方案
1、支持Flash器件抽象成SPIFlash器件类型,约束当前SPIFlash只能配置在SPIOverHisport总线下使用。
2、SPIFlash器件实现以前的BlockIO中的Read和Write方法,其中该方法具体实现细节由框架进行封装(业务无需感知SPI帧格式以及Flash相关的命令字)
3、Flash器件通用能力读、写、擦除,针对擦除功能需要新增Erase方法。(Flash的存储单元物理结构和写入机制决定了它必须先擦除后再写入,不支持直接覆盖)
4、考虑业务扩展性和Flash命令字的种类很多,针对Flash新增Write和Read方法,用于支持业务自定义封装SPI帧内容并由框架侧进行帧内容透传。
详细描述
评审点1、新增资源协作接口 bmc.kepler.Chip.FlashIO
接口描述 :该接口共提供5个方法,用于提供Flash器件已封装后的读、写、擦除能力和SPI原始写入帧发送和读取帧发送和接收的能力。方法描述如下
方法评审点
| 方法名称 | 请求签名 | 请求参数描述 | 响应签名 | 响应参数描述 | 方法描述 | 访问权限 |
|---|---|---|---|---|---|---|
| Read | uu | Offset: Flash器件上读取的偏移位置 Length: 读取的长度 |
ay | OutData:读取的结果 | 读取操作,按字节读取从芯片的offset偏移位置读取指定长度内容 | BasicSetting |
| Write | uay | Offset: Flash器件上写入的偏移位置 InData:写入的数据内容 |
NA | 写入操作,按字节将指定内容写入芯片的offset偏移位置 | BasicSetting | |
| Erase | uy | Offset: 待擦除区域所在偏移位置 Type:擦除类型,0:扇区擦除, 1:32K块擦除, 2:64K块擦除, 3:芯片擦除 |
NA | 擦除操作,根据Offset所在扇区/块/芯片进行擦除 | BasicSetting | |
| RawRead | uay | Length: 读取的数据长度 InData:读取帧数据,包括命令字及负载数据 |
ay | OutData:读取的结果 | 原始读取操作,支持单个自定义格式帧数据的原始读取操作 | BasicSetting |
| RawWrite | ay | InData:写入帧数据,包括命令字及负载内容 | NA | 原始写入操作,支持单个自定义格式帧数据的原始写入操作 | BasicSetting |
方法实现介绍
| 方法 | bmc.kepler.Chip.FlashIO |
|---|---|
| Read | 描述:读取操作,按字节读取从芯片的offset偏移位置读取指定长度内容,具体实现流程包括 1、发送读状态寄存器命令 – 用于读取当前Flash器件是否正在写操作 2、判断是否需要进行4字节寻址模式切换 3、判断从当前offset开始读取是否需要进行切页操作 4、发送固定读请求命令字 + 读取地址 5、判断是否需要切换回3字节寻址模式 6、将读取的数据内容返回 |
| Write | 描述:写入操作,按字节将指定内容写入芯片的offset偏移位置,具体实现流程包括 1、发送读状态寄存器命令 – 用于读取当前Flash器件是否正在写操作 2、判断是否需要进行4字节寻址模式切换 3、判断从当前offset开始写入是否需要进行切页操作 4、发送写使能命令字 – 每次写命令前都需要发送一次写使能命令字 5、发送固定写请求命令字 + 写入地址 + 写入的数据内容 6、判断是否需要切换回3字节寻址模式 |
| Erase | 描述:擦除操作,根据Offset所在扇区/块/芯片进行擦除,具体实现流程包括 1、发送读状态寄存器命令 – 用于读取当前Flash器件是否正在写操作 2、判断是否需要进行4字节寻址模式切换 3、发送写使能命令字 4、根据擦除类型,发送对应的擦除请求命令字 + 擦除区域的偏移 5、判断是否需要切换回3字节寻址模式 |
| RawRead | 描述:原始读取操作,支持单个自定义格式帧数据的原始读取操作 1、发送数据(由业务拼接 命令字 + 内容) 2、返回响应的数据 |
| RawWrite | 描述:原始写入操作,支持单个自定义格式帧数据的原始写入操作 1、发送数据(由业务拼接 命令字 + 内容) |
资源协作接口bmc.kepler.Chip.FlashIO接口新增path影响
| 路径 | 接口新增影响 | CSR配置影响 | 持久化影响 | 其他影响 |
|---|---|---|---|---|
| /bmc/kepler/Chip/SPIFlash/:Id | 对外提供SPIFlash器件的原始读写命令能力和擦除能力 | 无影响 | 不涉及 | 无 |
对已有接口影响
1、bmc.kepler.Chip接口影响
接口描述
提供器件访问的健康状态、硬件上电状态、硬件自检结果和硬件通道锁定的资源协作属性,和设置器件可访问状态以及硬件通道加锁和解锁的能力。
【mdb_interface中bmc.kepler.Chip定义】
资源协作接口bmc.kepler.Chip接口新增path影响
| 路径 | 接口新增影响 | CSR配置影响 | 持久化影响 | 其他影响 |
|---|---|---|---|---|
| /bmc/kepler/Chip/SPIFlash/:Id | 对外提供SPIFlash器件的健康状态等属性,硬件可访问状态设置能力和硬件通道加锁解锁的能力 | 无影响 | 不涉及 | 无 |
2、bmc.kepler.Release.Chip接口影响
接口描述
提供Release版本下BMC直接读取器件数据的能力。
【mdb_interface中bmc.kepler.Release.Chip定义】
资源协作接口bmc.kepler.Release.Chip接口新增path影响
| 路径 | 接口新增影响 | CSR配置影响 | 持久化影响 | 其他影响 |
|---|---|---|---|---|
| /bmc/kepler/Chip/SPIFlash/:Id | 提供Release版本下读取Flash器件数据的能力 | 无影响 | 不涉及 | 无 |
3、bmc.kepler.Release.TraceChip接口影响
接口描述
提供启动和停止跟踪芯片对象的读写数据的能力。
【mdb_interface中bmc.kepler.Release.TraceChip定义】
资源协作接口bmc.kepler.Release.TraceChip接口新增path影响
| 路径 | 接口新增影响 | CSR配置影响 | 持久化影响 | 其他影响 |
|---|---|---|---|---|
| /bmc/kepler/Chip/SPIFlash/:Id | 提供控制Flash器件的实时数据跟踪能力 | 无影响 | 不涉及 | 无 |
4、bmc.kepler.Chip.BlockIO接口影响
接口描述
提供通用的器件读、写、先写后读、批量写、插件请求等能力。
接口必要性
bmc.kepler.Chip.BlockIO中Read、Write方法实现与bmc.kepler.Chip.FlashIO中Read、Write方法一致,实现该接口是为了保证SPIFlash器件类型也可以使用Scanner、Accessor机制,并与其他器件类型一样具备插件请求、批量写等扩展场景。
【mdb_interface中bmc.kepler.Chip.BlockIO定义】
资源协作接口bmc.kepler.Chip.BlockIO接口新增path影响
| 路径 | 接口新增影响 | CSR配置影响 | 持久化影响 | 其他影响 |
|---|---|---|---|---|
| /bmc/kepler/Chip/SPIFlash/:Id | 提供Flash器件的通用读、写、先写后读、批量写和插件写等能力 | 无影响 | 不涉及 | 无 |
评审结论
1、同意新增协作接口 bmc.kepler.Chip.FlashIO。同意原有资源协作接口bmc.kepler.Chip、bmc.kepler.Release.Chip、bmc.kepler.Release.TraceChip、bmc.kepler.Chip.BlockIO下新增支持SPIFlash器件能力