Files
lishanpi/bsp/device/flash/flash_driver.h
T

181 lines
4.6 KiB
C++
Raw Normal View History

2026-04-26 16:24:42 +08:00
#ifndef __FLASH_DRIVER_H__
#define __FLASH_DRIVER_H__
#include <cstdint>
#include "common_types.h"
/* Flash类型定义 */
typedef enum {
FLASH_TYPE_INTERNAL = 0, /* 内部Flash(片上Flash */
FLASH_TYPE_EXTERNAL_SPI, /* 外部SPI Flash */
FLASH_TYPE_EXTERNAL_NOR, /* 外部并行NOR Flash(通过EXMC */
FLASH_TYPE_MAX
} flash_type_t;
/* Flash操作模式定义 */
typedef enum {
FLASH_OP_READ = 0, /* 读取操作 */
FLASH_OP_WRITE, /* 写入操作 */
FLASH_OP_ERASE, /* 擦除操作 */
FLASH_OP_READ_STATUS, /* 读取状态寄存器 */
FLASH_OP_WRITE_ENABLE, /* 写使能 */
FLASH_OP_WRITE_DISABLE, /* 写禁用 */
FLASH_OP_MAX
} flash_operation_t;
/* Flash容量信息结构体 */
typedef struct {
uint32_t total_size; /* 总容量(字节) */
uint32_t sector_size; /* 扇区大小(字节) */
uint32_t page_size; /* 页大小(字节) */
uint32_t block_size; /* 块大小(字节) */
uint32_t manufacturer_id; /* 制造商ID */
uint32_t device_id; /* 设备ID */
} flash_info_t;
/* Flash配置结构体 */
typedef struct {
flash_type_t type; /* Flash类型 */
uint32_t base_address; /* 基地址(对于内部Flash是0x08000000 */
uint32_t clock_freq; /* 时钟频率(Hz,仅对外部Flash有效) */
uint32_t cs_pin; /* 片选引脚(仅对外部SPI Flash有效) */
uint32_t spi_port; /* SPI端口(仅对外部SPI Flash有效) */
uint32_t exmc_bank; /* EXMC Bank(仅对外部NOR Flash有效) */
} flash_config_t;
/* Flash句柄结构体 */
typedef struct {
flash_type_t type; /* Flash类型 */
flash_config_t config; /* Flash配置 */
flash_info_t info; /* Flash信息 */
bool initialized; /* 初始化标志 */
void *private_data; /* 私有数据指针 */
} flash_handle_t;
/* 函数声明 */
/**
* @brief 初始化Flash
* @param handle Flash句柄指针
* @return 操作结果
*/
ret_code_t flash_init(flash_handle_t *handle);
/**
* @brief 反初始化Flash
* @param handle Flash句柄指针
* @return 操作结果
*/
ret_code_t flash_deinit(flash_handle_t *handle);
/**
* @brief 读取Flash数据
* @param handle Flash句柄指针
* @param address 地址(绝对地址或相对地址,取决于Flash类型)
* @param buffer 数据缓冲区
* @param length 数据长度(字节)
* @return 操作结果
*/
ret_code_t flash_read(flash_handle_t *handle, uint32_t address, void *buffer, uint32_t length);
/**
* @brief 写入Flash数据
* @param handle Flash句柄指针
* @param address 地址(绝对地址或相对地址,取决于Flash类型)
* @param data 数据指针
* @param length 数据长度(字节)
* @return 操作结果
*/
ret_code_t flash_write(flash_handle_t *handle, uint32_t address, const void *data, uint32_t length);
/**
* @brief 擦除Flash扇区
* @param handle Flash句柄指针
* @param address 扇区起始地址
* @param size 擦除大小(字节),必须为扇区大小的整数倍
* @return 操作结果
*/
ret_code_t flash_erase(flash_handle_t *handle, uint32_t address, uint32_t size);
/**
* @brief 擦除整个Flash
* @param handle Flash句柄指针
* @return 操作结果
*/
ret_code_t flash_erase_all(flash_handle_t *handle);
/**
* @brief 读取Flash状态寄存器
* @param handle Flash句柄指针
* @param status 状态值输出指针
* @return 操作结果
*/
ret_code_t flash_read_status(flash_handle_t *handle, uint32_t *status);
/**
* @brief 写使能
* @param handle Flash句柄指针
* @return 操作结果
*/
ret_code_t flash_write_enable(flash_handle_t *handle);
/**
* @brief 写禁用
* @param handle Flash句柄指针
* @return 操作结果
*/
ret_code_t flash_write_disable(flash_handle_t *handle);
/**
* @brief 读取Flash信息
* @param handle Flash句柄指针
* @param info Flash信息输出指针
* @return 操作结果
*/
ret_code_t flash_get_info(flash_handle_t *handle, flash_info_t *info);
/**
* @brief 验证Flash读写功能
* @param handle Flash句柄指针
* @param test_size 测试数据大小(字节)
* @return 操作结果
*/
ret_code_t flash_self_test(flash_handle_t *handle, uint32_t test_size);
/**
* @brief 默认内部Flash初始化
* @return 操作结果
*/
ret_code_t flash_internal_default_init(void);
/**
* @brief 默认外部SPI Flash初始化
* @return 操作结果
*/
ret_code_t flash_external_spi_default_init(void);
/**
* @brief 获取内部Flash基地址
* @return 内部Flash基地址(0x08000000
*/
uint32_t flash_get_internal_base_address(void);
/**
* @brief 获取内部Flash总大小
* @return 内部Flash总大小(字节)
*/
uint32_t flash_get_internal_total_size(void);
/**
* @brief 获取内部Flash扇区大小
* @return 内部Flash扇区大小(字节)
*/
uint32_t flash_get_internal_sector_size(void);
/**
* @brief 获取默认外部SPI Flash句柄指针
* @return Flash句柄指针,如果未初始化则返回NULL
*/
flash_handle_t *flash_get_external_spi_handle(void);
#endif /* __FLASH_DRIVER_H__ */