Files
lishanpi/bsp/device/flash/flash_driver.h
T
hm fc10ef2e10 Initial commit: LSPi (LiangShanPi) project
GD32F470ZGT6 based project with full peripheral support:
- SDRAM (W9825G6KH) via EXMC
- LCD NT35510 (480x800) via EXMC NOR/PSRAM
- Flash (W25Q64) via SPI
- UART (USART0) debug console
- LED indicators
- CMSIS-DAP debug interface
- CMake + ARM GCC toolchain build system
2026-04-26 16:24:42 +08:00

181 lines
4.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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__ */