sfc_v2
SFC (Serial Flash Controller) 提供对串行 Flash 的初始化配置、读写擦除操作及 DMA (Direct Memory Access) 传输功能,支持标准/双线/四线 SPI (Serial Peripheral Interface) 模式与连续读模式。
头文件清单
接口清单
| 接口名称 | 功能简述 |
|---|---|
| uapi_sfc_init | 初始化并配置SFC,设置Flash读写模式与映射参数 |
| uapi_sfc_deinit | 去初始化SFC,释放资源 |
| uapi_sfc_read | 以寄存器模式读取Flash数据 |
| uapi_sfc_write | 以寄存器模式写入Flash数据 |
| uapi_sfc_erase | 以寄存器模式擦除Flash指定区域 |
| uapi_sfc_erase_chip | 以寄存器模式擦除整片Flash |
| uapi_sfc_other_flash_opt | 以寄存器模式读写Flash属性 |
| uapi_sfc_get_flash_info | 获取Flash属性信息 |
| uapi_sfc_dma_read | 以DMA模式读取Flash数据 |
| uapi_sfc_dma_write | 以DMA模式写入Flash数据 |
| uapi_sfc_suspend | 挂起SFC控制器 |
| uapi_sfc_resume | 恢复SFC控制器 |
| uapi_sfc_enable_continue_read | 使能连续读模式 |
| uapi_sfc_disable_continue_read | 去使能连续读模式 |
| uapi_sfc_read_unique_id | 读取Flash唯一ID |
Functions
uapi_sfc_init
头文件清单
功能说明
- 初始化并配置SFC控制器,设置Flash读写SPI模式与映射地址参数
- 未识别的Flash默认采用单线读写512KB的配置
- 初始化时会读取Flash ID并匹配对应操作参数,若Flash不在支持列表中则回退默认配置
前置条件
- 调用时序约束:当前接口必须在SFC模块尚未初始化时调用,重复调用返回ERRCODE_SFC_ALREADY_INIT
- 依赖关系:入参config不为NULL,且指向的sfc_flash_config_t结构体成员已正确赋值
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sfc_id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
| config | sfc_flash_config_t * | 初始化参数,包含读写SPI类型、映射地址与大小 | 非NULL,参考sfc_flash_config_t |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | SFC初始化成功 |
| ERRCODE_SFC_INVALID_PARAM(0x8000133F) | 参数无效 | sfc_id超出范围或config为NULL |
| ERRCODE_SFC_ALREADY_INIT(0x8000134A) | 已初始化 | 重复初始化 |
| ERRCODE_SFC_ADDRESS_OVERSTEP(0x80001342) | 地址越界 | mapping地址超出SFC总线空间 |
| ERRCODE_SFC_CMD_NOT_SUPPORT(0x80001346) | 命令不支持 | Flash不支持指定的读写SPI模式 |
| ERRCODE_SFC_FLASH_NOT_SUPPORT(0x80001341) | Flash不支持 | Flash不在支持列表中,回退默认配置 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SFC_SUPPORT_COMPLECT | 特性宏 | 支持SFC补全特性 | n |
| CONFIG_SFC_SUPPORT_LPM | 特性宏 | 支持SFC低功耗模式特性 | n |
| CONFIG_SFC_ALREADY_INIT | 特性宏 | 支持SFC已初始化特性 | n |
uapi_sfc_deinit
头文件清单
功能说明
- 去初始化SFC控制器,释放已占用的资源
- 若连续读模式已使能,会先禁用连续读模式再执行去初始化
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sfc_id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SUPPORT_SFC_CONTINUE_READ | 特性宏 | 支持SFC连续读特性 | n |
| CONFIG_SFC_ALREADY_INIT | 特性宏 | 支持SFC已初始化特性 | n |
uapi_sfc_read
errcode_t uapi_sfc_read(uint8_t sfc_id, uint32_t flash_addr, uint8_t *read_buffer, uint32_t read_size)
头文件清单
功能说明
- 以寄存器模式从Flash读取数据,按字节存入read_buffer中
- 读取数据按ASSIGN_BYTES对齐分段循环读取
- 不允许在中断中调用
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用
- 依赖关系:入参read_buffer不为NULL,且指向内存空间已申请成功,长度不小于read_size
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sfc_id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
| flash_addr | uint32_t | 数据所在的Flash首地址 | [0, flash_len) |
| read_buffer | uint8_t * | 用于接收数据的buffer | 非NULL |
| read_size | uint32_t | 读取的字节数 | > 0,且flash_addr + read_size不超过Flash大小 |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 读取数据成功 |
| ERRCODE_SFC_INVALID_PARAM(0x8000133F) | 参数无效 | sfc_id超出范围 |
| ERRCODE_SFC_NOT_INIT(0x80001340) | 未初始化 | SFC模块未初始化 |
| ERRCODE_INVALID_PARAM(0x80000001) | 地址越界 | flash_addr + read_size超出Flash范围 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
参考案例
src/bootloader/provision_3322/boot/main.c#uapi_sfc_readsrc/bootloader/flashboot_3322/upgrade.c#uapi_sfc_readsrc/middleware/chips/3322/update/common/upg_common_porting.c#uapi_sfc_read
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SUPPORT_SFC_CONTINUE_READ | 特性宏 | 支持SFC连续读特性 | n |
uapi_sfc_write
errcode_t uapi_sfc_write(uint8_t sfc_id, uint32_t flash_addr, uint8_t *write_data, uint32_t write_size)
头文件清单
功能说明
- 以寄存器模式向Flash写入数据,按字节从write_data写入
- 自动处理非对齐地址与跨页写入
- 不允许在中断中调用
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用
- 依赖关系:入参write_data不为NULL,且指向内存空间已申请成功,长度不小于write_size;Flash对应区域已执行擦除操作
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sfc_id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
| flash_addr | uint32_t | 目标Flash首地址 | [0, flash_len) |
| write_data | uint8_t * | 预计写入的数据 | 非NULL |
| write_size | uint32_t | 写入数据的字节数 | > 0,且flash_addr + write_size不超过Flash大小 |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 写入数据成功 |
| ERRCODE_SFC_INVALID_PARAM(0x8000133F) | 参数无效 | sfc_id超出范围 |
| ERRCODE_SFC_NOT_INIT(0x80001340) | 未初始化 | SFC模块未初始化 |
| ERRCODE_INVALID_PARAM(0x80000001) | 地址越界 | flash_addr + write_size超出Flash范围 |
| ERRCODE_SFC_CMD_NOT_SUPPORT(0x80001346) | 命令不支持 | Flash不支持当前写操作命令 |
| ERRCODE_SFC_IN_CONTINUE_READ(0x8000134C) | 连续读模式中 | 连续读模式已使能时调用 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
参考案例
src/application/3322/3322_recovery/app_os_init.c#uapi_sfc_writesrc/middleware/chips/3322/update/common/upg_common_porting.c#uapi_sfc_write
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SUPPORT_SFC_CONTINUE_READ | 特性宏 | 支持SFC连续读特性 | n |
| CONFIG_SUPPORT_DATA_CACHE | 特性宏 | 支持数据缓存特性 | n |
uapi_sfc_erase
头文件清单
功能说明
- 以寄存器模式擦除Flash指定区域,采用贪心算法选择最优擦除粒度
- 未使能写回时强制要求地址和大小按扇区(4KB)对齐
- 使能写回时自动备份并回写非对齐区域数据
- 不允许在中断中调用
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用
- 依赖关系:flash_addr与erase_size需在Flash有效地址范围内
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sfc_id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
| flash_addr | uint32_t | 擦除的首地址 | [0, flash_len),未使能写回时需4KB对齐 |
| erase_size | uint32_t | 擦除的Flash空间大小 | > 0,未使能写回时需4KB对齐 |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 擦除成功 |
| ERRCODE_SFC_INVALID_PARAM(0x8000133F) | 参数无效 | sfc_id超出范围 |
| ERRCODE_SFC_NOT_INIT(0x80001340) | 未初始化 | SFC模块未初始化 |
| ERRCODE_INVALID_PARAM(0x80000001) | 地址越界 | flash_addr + erase_size超出Flash范围或未对齐 |
| ERRCODE_SFC_IN_CONTINUE_READ(0x8000134C) | 连续读模式中 | 连续读模式已使能时调用 |
| ERRCODE_SFC_ERASE_FORM_ERROR(0x80001347) | 擦除格式错误 | 擦除区域无法匹配任何擦除命令 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
参考案例
src/bootloader/provision_3322/boot/main.c#uapi_sfc_erasesrc/middleware/chips/3322/update/common/upg_common_porting.c#uapi_sfc_eraseNV 适配层调用 uapi_sfc_erase
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SFC_ALLOW_ERASE_WRITEBACK | 特性宏 | 支持SFC擦除写回特性 | n |
| CONFIG_SFC_SUPPORT_COMPLECT | 特性宏 | 支持SFC补全特性 | n |
| CONFIG_SUPPORT_DATA_CACHE | 特性宏 | 支持数据缓存特性 | n |
| CONFIG_SUPPORT_SFC_CONTINUE_READ | 特性宏 | 支持SFC连续读特性 | n |
uapi_sfc_erase_chip
头文件清单
功能说明
- 以寄存器模式对整片Flash进行擦除
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用,且连续读模式未使能
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sfc_id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 整片擦除成功 |
| ERRCODE_SFC_INVALID_PARAM(0x8000133F) | 参数无效 | sfc_id超出范围 |
| ERRCODE_SFC_NOT_INIT(0x80001340) | 未初始化 | SFC模块未初始化 |
| ERRCODE_SFC_IN_CONTINUE_READ(0x8000134C) | 连续读模式中 | 连续读模式已使能时调用 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
参考案例
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SUPPORT_SFC_CONTINUE_READ | 特性宏 | 支持SFC连续读特性 | n |
| CONFIG_SUPPORT_DATA_CACHE | 特性宏 | 支持数据缓存特性 | n |
uapi_sfc_other_flash_opt
errcode_t uapi_sfc_other_flash_opt(uint8_t sfc_id, sfc_flash_op_t cmd_type, uint8_t cmd, uint8_t *buffer, uint32_t length)
头文件清单
功能说明
- 以寄存器模式对Flash属性进行读写操作
- 可用于读取或配置Flash状态寄存器等属性
- 不允许在中断中调用
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用
- 依赖关系:入参buffer不为NULL
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sfc_id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
| cmd_type | sfc_flash_op_t | 设置指令的读写类型 | READ_TYPE(0x0) / WRITE_TYPE(0x1) |
| cmd | uint8_t | SPI指令 | 有效的Flash SPI指令 |
| buffer | uint8_t * | 数据缓冲区 | 非NULL |
| length | uint32_t | 读/写的数据长度 | < 4 |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 操作成功 |
| ERRCODE_SFC_INVALID_PARAM(0x8000133F) | 参数无效 | sfc_id超出范围或buffer为NULL |
| ERRCODE_SFC_NOT_INIT(0x80001340) | 未初始化 | SFC模块未初始化 |
| ERRCODE_SFC_IN_CONTINUE_READ(0x8000134C) | 连续读模式中 | 连续读模式已使能时调用 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SUPPORT_SFC_CONTINUE_READ | 特性宏 | 支持SFC连续读特性 | n |
uapi_sfc_get_flash_info
头文件清单
功能说明
- 获取Flash属性信息,包括Flash ID和Flash大小
- 会读取Flash ID并返回当前配置的Flash大小
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用
- 依赖关系:入参info不为NULL
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
| info | sfc_info_t * | 获取到的Flash属性信息 | 非NULL,参考sfc_info_t |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| info | sfc_info_t * | 返回Flash ID和Flash大小 |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 获取信息成功 |
| ERRCODE_SFC_INVALID_PARAM(0x8000133F) | 参数无效 | id超出范围或info为NULL |
| ERRCODE_SFC_IN_CONTINUE_READ(0x8000134C) | 连续读模式中 | 连续读模式已使能时调用 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SUPPORT_SFC_CONTINUE_READ | 特性宏 | 支持SFC连续读特性 | n |
uapi_sfc_dma_read
errcode_t uapi_sfc_dma_read(uint8_t sfc_id, uint32_t flash_addr, uint8_t *read_buffer, uint32_t read_size)
头文件清单
功能说明
- 以DMA模式从Flash读取数据,按字节存入read_buffer中
- 不允许在中断中调用
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用
- 依赖关系:入参read_buffer不为NULL,且指向内存空间已申请成功,长度不小于read_size
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sfc_id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
| flash_addr | uint32_t | 数据所在的Flash首地址 | [0, flash_len) |
| read_buffer | uint8_t * | 用于接收数据的buffer | 非NULL |
| read_size | uint32_t | 读取的字节数 | > 0,且flash_addr + read_size不超过Flash大小 |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 读取数据成功 |
| ERRCODE_SFC_INVALID_PARAM(0x8000133F) | 参数无效 | sfc_id超出范围 |
| ERRCODE_SFC_NOT_INIT(0x80001340) | 未初始化 | SFC模块未初始化 |
| ERRCODE_INVALID_PARAM(0x80000001) | 地址越界 | flash_addr + read_size超出Flash范围 |
| ERRCODE_SFC_IN_CONTINUE_READ(0x8000134C) | 连续读模式中 | 连续读模式已使能时调用 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SFC_SUPPORT_DMA | 功能宏 | 支持SFC DMA模式 | y |
uapi_sfc_dma_write
errcode_t uapi_sfc_dma_write(uint8_t sfc_id, uint32_t flash_addr, uint8_t *write_buffer, uint32_t write_size)
头文件清单
功能说明
- 以DMA模式向Flash写入数据,按字节从write_buffer写入
- 不允许在中断中调用
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用
- 依赖关系:入参write_buffer不为NULL,且指向内存空间已申请成功,长度不小于write_size;Flash对应区域已执行擦除操作
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sfc_id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
| flash_addr | uint32_t | 目标Flash首地址 | [0, flash_len) |
| write_buffer | uint8_t * | 预计写入的数据 | 非NULL |
| write_size | uint32_t | 写入数据的字节数 | > 0,且flash_addr + write_size不超过Flash大小 |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 写入数据成功 |
| ERRCODE_SFC_INVALID_PARAM(0x8000133F) | 参数无效 | sfc_id超出范围 |
| ERRCODE_SFC_NOT_INIT(0x80001340) | 未初始化 | SFC模块未初始化 |
| ERRCODE_INVALID_PARAM(0x80000001) | 地址越界 | flash_addr + write_size超出Flash范围 |
| ERRCODE_SFC_CMD_NOT_SUPPORT(0x80001346) | 命令不支持 | Flash不支持当前写操作命令 |
| ERRCODE_SFC_IN_CONTINUE_READ(0x8000134C) | 连续读模式中 | 连续读模式已使能时调用 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SFC_SUPPORT_DMA | 功能宏 | 支持SFC DMA模式 | y |
| CONFIG_SUPPORT_DATA_CACHE | 特性宏 | 支持数据缓存特性 | n |
uapi_sfc_suspend
头文件清单
功能说明
- 挂起SFC控制器,用于低功耗模式场景
- 挂起后SFC控制器停止工作
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用
- 依赖关系:已使能CONFIG_SFC_SUPPORT_LPM
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sfc_id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
| arg | uintptr_t | 挂起预留参数 | 预留,当前未使用 |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 挂起成功 |
| Other | 其他错误码,参考errcode_t | 挂起失败 |
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SFC_SUPPORT_LPM | 功能宏 | 支持SFC低功耗模式 | n |
uapi_sfc_resume
头文件清单
功能说明
- 恢复SFC控制器,从低功耗模式恢复工作
- 恢复时会重新配置Flash四线模式并执行4字节地址模式切换
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_suspend()成功返回后调用
- 依赖关系:已使能CONFIG_SFC_SUPPORT_LPM
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| sfc_id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
| arg | uintptr_t | 恢复预留参数 | 预留,当前未使用 |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 恢复成功 |
| Other | 其他错误码,参考errcode_t | 恢复失败 |
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SFC_SUPPORT_LPM | 功能宏 | 支持SFC低功耗模式 | n |
uapi_sfc_enable_continue_read
头文件清单
功能说明
- 使能连续读模式,使能后只能通过总线读Flash,不允许有其他Flash操作
- 要求Flash当前读模式为Dual I/O或Quad I/O SPI模式
- 要求Flash支持连续读特性
- 不允许在中断中调用
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用,且Flash读模式为Dual I/O或Quad I/O SPI模式
- 依赖关系:Flash支持连续读特性;已使能CONFIG_SUPPORT_SFC_CONTINUE_READ
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 使能连续读成功 |
| ERRCODE_SFC_INVALID_PARAM(0x8000133F) | 参数无效 | id超出范围 |
| ERRCODE_SFC_NOT_INIT(0x80001340) | 未初始化 | SFC模块未初始化 |
| ERRCODE_SFC_CMD_NOT_SUPPORT(0x80001346) | 命令不支持 | Flash读模式不是Dual I/O或Quad I/O,或不支持连续读特性 |
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SUPPORT_SFC_CONTINUE_READ | 功能宏 | 支持SFC连续读模式 | n |
uapi_sfc_disable_continue_read
头文件清单
功能说明
- 去使能连续读模式,恢复Flash的正常读写操作
- 不允许在中断中调用
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_enable_continue_read()使能连续读模式后调用
- 依赖关系:已使能CONFIG_SUPPORT_SFC_CONTINUE_READ
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| CONFIG_SUPPORT_SFC_CONTINUE_READ | 功能宏 | 支持SFC连续读模式 | n |
uapi_sfc_read_unique_id
头文件清单
功能说明
- 读取Flash唯一ID(Unique ID)
- 首次读取时会通过SPI命令读取Flash Unique ID并缓存,后续调用直接返回缓存值
- 不允许在中断中调用
前置条件
- 调用时序约束:当前接口必须在uapi_sfc_init()成功返回后调用
- 依赖关系:入参unique_id不为NULL,入参len不为NULL;Flash支持Unique ID读取
- 调用上下文约束:需在主线程调用,禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| id | uint8_t | SFC控制器编号 | SFC_ID_0(0) / SFC_ID_MAX(1) |
| unique_id | uintptr_t * | Unique ID存储地址指针 | 非NULL |
| len | uint16_t * | Unique ID长度指针 | 非NULL |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| unique_id | uintptr_t * | 返回Flash Unique ID的存储地址 |
| len | uint16_t * | 返回Unique ID的长度 |
返回值
- 返回类型:errcode_t
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x00) | 执行成功 | 读取Unique ID成功 |
| ERRCODE_SFC_NOT_INIT(0x80001340) | 未初始化 | SFC模块未初始化 |
| ERRCODE_SFC_IN_CONTINUE_READ(0x8000134C) | 连续读模式中 | 连续读模式已使能时调用 |
| ERRCODE_SFC_FLASH_NOT_SUPPORT(0x80001341) | Flash不支持 | Flash不支持Unique ID读取 |
| Other | 其他错误码,参考errcode_t | 执行失败 |
Kconfig配置
| 配置项 | 宏类型 | 说明 | 默认值 |
|---|---|---|---|
| SUPPORT_SFC_READ_UNIQUE_ID | 功能宏 | 支持SFC读取Flash唯一ID | n |
| CONFIG_SUPPORT_SFC_CONTINUE_READ | 特性宏 | 支持SFC连续读特性 | n |
| CONFIG_SFC_SUPPORT_COMPLECT | 特性宏 | 支持SFC补全特性 | n |
Enumerations
sfc_read_if_t
typedef enum sfc_read_if {
STANDARD_READ = 0x0, /*!< 以标准SPI模式执行读操作(指令一般为0x03)。 */
FAST_READ = 0x1, /*!< 以标准SPI模式执行快速读操作(指令一般为0x0B)。 */
FAST_READ_DUAL_OUTPUT = 0x2, /*!< 以双线Out SPI模式执行读操作(指令一般为0x3B)。 */
FAST_READ_DUAL_IO = 0x3, /*!< 以双线In/Out SPI模式执行读操作(指令一般为0xBB)。 */
FAST_READ_QUAD_OUTPUT = 0x4, /*!< 以四线Out SPI模式执行读操作(指令一般为0x6B)。 */
FAST_READ_QUAD_IO = 0x5 /*!< 以四线In/Out SPI模式执行读操作(指令一般为0xEB)。 */
} sfc_read_if_t;
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| STANDARD_READ | 0x0 | 标准SPI模式读操作 |
| FAST_READ | 0x1 | 标准SPI快速读操作 |
| FAST_READ_DUAL_OUTPUT | 0x2 | 双线Output SPI模式读操作 |
| FAST_READ_DUAL_IO | 0x3 | 双线I/O SPI模式读操作 |
| FAST_READ_QUAD_OUTPUT | 0x4 | 四线Output SPI模式读操作 |
| FAST_READ_QUAD_IO | 0x5 | 四线I/O SPI模式读操作 |
sfc_write_if_t
typedef enum sfc_write_if {
WRITE_DISABLE = 0x0, /*!< 写操作禁止。 */
PAGE_PROGRAM = 0x1, /*!< 以标准SPI模式执行写操作。 */
DUAL_INPUT_PAGE_PROGRAM = 0x2, /*!< 以双线In SPI模式执行写操作。 */
DUAL_IO_PAGE_PROGRAM = 0x3, /*!< 以双线I/O SPI模式执行写操作。 */
QUAD_INPUT_PAGE_PROGRAM = 0x4, /*!< 以四线In SPI模式执行写操作。 */
QUAD_IO_PAGE_PROGRAM = 0x5 /*!< 以四线In/Out SPI模式执行写操作。 */
} sfc_write_if_t;
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| WRITE_DISABLE | 0x0 | 写操作禁止 |
| PAGE_PROGRAM | 0x1 | 标准SPI模式写操作 |
| DUAL_INPUT_PAGE_PROGRAM | 0x2 | 双线Input SPI模式写操作 |
| DUAL_IO_PAGE_PROGRAM | 0x3 | 双线I/O SPI模式写操作 |
| QUAD_INPUT_PAGE_PROGRAM | 0x4 | 四线Input SPI模式写操作 |
| QUAD_IO_PAGE_PROGRAM | 0x5 | 四线I/O SPI模式写操作 |
sfc_id_t
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| SFC_ID_0 | 0 | SFC控制器0 |
| SFC_ID_MAX | 1 | SFC控制器数量上限 |
sfc_flash_op_t
typedef enum sfc_flash_op {
READ_TYPE = 0x0, /*!< 读取Flash相关信息。 */
WRITE_TYPE = 0x1 /*!< 配置Flash状态。 */
} sfc_flash_op_t;
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| READ_TYPE | 0x0 | 读取Flash属性 |
| WRITE_TYPE | 0x1 | 配置Flash状态 |
Structures
sfc_flash_config_t
typedef struct sfc_flash_config {
sfc_read_if_t read_type; /*!< 读操作SPI类型。 */
sfc_write_if_t write_type; /*!< 写操作SPI类型。 */
uint32_t mapping_addr; /*!< Flash映射基地址,对应为Flash的0地址。
* 需要映射在SFC内部总线空间,仅高16位有效。 */
uint32_t mapping_size; /*!< Flash映射的大小,可自定义映射空间。
* 参数形式必须为64KB * 2^n,其中n >= 0。
* 尾地址需要在SFC内部总线空间。
* 超出了表单配置的Flash大小时会将大小置为表单中配置的大小。 */
} sfc_flash_config_t;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| read_type | sfc_read_if_t | 读操作SPI类型 |
| write_type | sfc_write_if_t | 写操作SPI类型 |
| mapping_addr | uint32_t | Flash映射基地址,仅高16位有效 |
| mapping_size | uint32_t | Flash映射大小,格式为64KB * 2^n,n >= 0,最小64KB |
sfc_info_t
typedef struct {
uint32_t flash_id; /*!< Flash ID。 */
uint32_t flash_size; /*!< Flash大小。 */
} sfc_info_t;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| flash_id | uint32_t | Flash ID |
| flash_size | uint32_t | Flash大小 |
Type definitions
errcode_t [SDK公共基础类型]
使用说明
作为SFC模块对外接口的通用返回值类型,0表示成功,非0表示失败。