Flash Controller
Flash Controller 为 R128 内置的一个 Nor Flash 读写控制器,用于控制命令的收发、数据读写和执行 XIP,兼容 Standard SPI/Dual SPI/Quad SPI。R128 既可以通过 SPI 控制器与Nor Flash 芯片通讯,也可以通过 Flash 控制器与之通讯。在 Flash Controller 前一级加入了 Flash Encryption 模块。Flash Encryption 模块在向Flash 写数据时进行 AES 加密,从 Flash 中读数据时进行解密。Flash Controller 与 Flash Encryption 组合称为 FlashC_Enc。
模块介绍
FlashC_Enc 的主要特性如下:
- 支持不同时钟频率,最大支持 96MHz
- 支持 SPI 1/2/4 线收发,支持 SPI Model 0/1/2/3
- 可灵活配置 4 段虚拟地址区间,支持 DMA 读写、Nor Flash XIP 操作
- 最大 2ˆ32Bytes 容量的 Nor Flash,常见有 64Mb,128Mb,256Mb
- 可对 Flash 进行加密,最大可配置 6 段独立的加密区间
- 支持在读写数据时进行实时 AES 加解密
模块配置
Drivers Options --->
soc related device drivers --->
FlashControler Devices --->
[*] enable flashc driver # FlashC 驱动,选中表示使用 FlashC 与 Flash 通讯
[*] enable flashc test command # FlashC 测试用例,测试 FlashC 相关功能
[*] enable flashc xip # 支持 XIP
[*] enable flashc enc # FlashEnc 驱动,需要加密功能时选中
[*] enable flash enc hal APIs test command # FlashEnc 测试用例,测试 FlashEnc 相关功能
源码结构
FlashC_Enc 模块源码结构如下所示:
rtos-hal/
|--hal/source/flash_mcu/hal_flashctrl_rom.c // FlashC相关驱动
|--hal/source/flash_mcu/hal_flashctrl.h // FlashC相关驱动头文件
|--hal/source/flash_mcu/hal_flash_rom.c // Flash 初始化、读写相关API
|--hal/source/flash_mcu/hal_flash.h // Flash 初始化、读写相关API头文件
|--hal/source/flash_mcu/flashchip/ // Flash 芯片相关驱动
|--hal/source/flashc/hal_flashc_enc.c // FlashEnc相关API
|--include/hal/hal_flashc_enc.h // 头文件
模块接口说明
Flash_Init 接口
先初始化 FlashC 控制器模块,然后初始化 NOR Flash
HAL_Status HAL_Flash_Init(uint32_t flash, FlashBoardCfg *cfg)
参数:
- flash:Flash 设备号,即 g_flash_cfg 结构体数组索引
- cfg:Flash 设备的板级配置信息,即 g_flash_cfg 结构体数组
返回值:
- HAL_OK:代表成功
- HAL_ERROR:错误
- HAL_BUSY:设备忙
- HAL_TIMEOUT:超时
- HAL_INVALID:无效参数
Flash_Deinit 接口
反初始化
HAL_Status HAL_Flash_Deinit(uint32_t flash, FlashBoardCfg *cfg)
参数:
- flash:Flash 设备号,即 g_flash_cfg 结构体数组索引
- cfg:Flash 设备的板级配置信息,即 g_flash_cfg 结构体数组
返回值:
- HAL_OK:代表成功
Flash_Open 接口
打开一个 Flash 设备,拿互斥锁,如果已经打开则无法再打开。
HAL_Status HAL_Flash_Open(uint32_t flash, uint32_t timeout_ms)
参数:
- flash:Flash 设备号,即 g_flash_cfg 结构体数组索引
- timeout_ms:等待打开 Flash 的时间,单位 ms
返回值:
- HAL_OK:代表成功
Flash_Close 接口
关闭一个 Flash 设备,释放互斥锁
HAL_Status HAL_Flash_Close(uint32_t flash)
参数:
- flash:Flash 设备号,即 g_flash_cfg 结构体数组索引
返回值:
- HAL_OK:代表成功
Flash_Read 接口
从 Flash 中读取指定长度的数据
HAL_Status HAL_Flash_Read(uint32_t flash, uint32_t addr, uint8_t *data, uint32_t size)
参数:
- flash:Flash 设备号,即 g_flash_cfg 结构体数组索引
- addr:读取的起始地址
- data:读到的数据存放地址
- size:读数据长度
返回值:
- HAL_OK:代表成功
Flash_Write 接口
写一段数据到 Flash 中指定的地址,写之前需要确保该区间已经被擦除过
HAL_Status HAL_Flash_Write(uint32_t flash, uint32_t addr, const uint8_t *data, uint32_t size)
参数:
- flash:Flash 设备号,即 g_flash_cfg 结构体数组索引
- addr:要写入的起始地址
- data:要写的数据存放地址
- size:写数据长度
返回值:
- HAL_OK:代表成功
Flash_Overwrite 接口
写一段数据到 Flash 中指定的地址,写之前不需要关心该区间是否已经被擦除过(只在4K 擦除模式有效)
HAL_Status HAL_Flash_Overwrite(uint32_t flash, uint32_t addr, const uint8_t *data, uint32_t size)
参数:
- flash:Flash 设备号,即 g_flash_cfg 结构体数组索引
- addr:要写入的起始地址
- data:要写的数据存放地址
- size:写数据长度
返回值:
- HAL_OK:代表成功
Flash_erase 接口
擦除 Flash 中指定地址和大小的区间,擦除地址需要与擦除大小对齐。
HAL_Status HAL_Flash_Erase(uint32_t flash, FlashEraseMode blk_size, uint32_t addr, uint32_t blk_cnt)
参数:
- flash:Flash 设备号,即 g_flash_cfg 结构体数组索引
- blk_size:擦除大小,如 4k/32k/64k/chip
- addr:擦除的起始地址
- blk_cnt:需要擦除的扇区块数
返回值:
- HAL_OK:代表成功
Flash_Ioctl 接口
擦除 Flash 中指定地址和大小的区间,擦除地址需要与擦除大小对齐。
HAL_Status HAL_Flash_Ioctl(uint32_t flash, FlashControlCmd attr, uint32_t arg)
参数:
- flash:Flash 设备号,即 g_flash_cfg 结构体数组索引
- attr:功能操作行为类型
- arg:实际功能的参数
返回值:
- HAL_OK:代表成功
Flash_MemoryOf 接口
计算输入地址所处的可擦除 Block 首地址
HAL_Status HAL_Flash_MemoryOf(uint32_t flash, FlashEraseMode size, uint32_t addr, uint32_t *start)
参数:
- flash:Flash 设备号,即 g_flash_cfg 结构体数组索引
- addr:要擦除的起始地址
- start:返回的 Block 首地址
返回值:
- HAL_OK:代表成功
Flash_Check 接口
检查被写区域是否需要先擦除
int HAL_Flash_Check(uint32_t flash, uint32_t addr, uint8_t *data, uint32_t size)
参数:
- flash:Flash 设备号,即 g_flash_cfg 结构体数组索引
- addr:要写入的起始地址
- data:要写的数据存放地址
- size:写数据长度
返回值:
- -1:检查失败
- 0:数据相同,不需要擦写
- 1:可直接写,不需要擦除
- 2:需要先擦除再写
Flash_Enc 初始化接口
初始化 Flash_Enc 模块
int hal_flashc_enc_init(uint32_t max_addr)
参数:
- max_addr:对应 Flash 的最大容量
- addr:要擦 除的起始地址
- start:返回的 Block 首地址
返回值:
- 0:代表成功
- -1:失败
Flash_Enc 申请加密通道接口
申请一个加密通道,Flash_Enc 支持最多 6 段加密区间的设置,一个通道代表一个区间,对某个 Flash 区间设置加密前需先申请一个通道。
int hal_flashc_enc_alloc_ch(void)
参数:
- 无
返回值 :
- 0~5:申请到的加密通道号
- -1:失败
Flash_Enc 设置加密接口
对一个 Flash 区间进行加密设置。
int hal_set_flashc_enc(const Flashc_Enc_Set *enc_set)
参数:
- enc_set:加密配置,如起始地址、密钥等
返回值:
- 0:代表成功
- -1:失败
Flash_Enc 使能加密接口
使能一个加密区间。
int hal_flashc_enc_enable(const Flashc_Enc_Set *enc_set)
参数:
- enc_set:加密配置,如起始地址、密钥等
返回值:
- 0:代表成功
- -1:失败
Flash_Enc 失能加密接口
失能一个加密区间。
int hal_flashc_enc_disable(const Flashc_Enc_Set *enc_set)
参数:
- enc_set:加密配置,如起始地址、密钥等
返回值:
- 0:代表成功
- -1:失败