203 lines
5.7 KiB
C
203 lines
5.7 KiB
C
/**
|
|
* 日期: 2025-11-27
|
|
* 作者: coffee
|
|
* 描述: Flash通用服务模块, 用于保证性Flash操作
|
|
*/
|
|
|
|
|
|
#ifndef __H_FLASH_SERVER_H__
|
|
#define __H_FLASH_SERVER_H__
|
|
|
|
|
|
///< Flash块大小, 按块操作, 2的幂关系
|
|
#ifndef HFLASH_BLOCK_SIZE
|
|
#define HFLASH_BLOCK_SIZE (4096)
|
|
#endif
|
|
|
|
///< 获取缓存内存, 需要大于Flash一块大小
|
|
#ifndef HFLASH_MALLOC
|
|
#define HFLASH_MALLOC(size) malloc(size)
|
|
#endif
|
|
|
|
///< 释放缓存
|
|
#ifndef HFLASH_FREE
|
|
#define HFLASH_FREE(ptr) free(ptr)
|
|
#endif
|
|
|
|
///< 定时器ID
|
|
#ifndef HFLASH_TIMER_ID
|
|
#define HFLASH_TIMER_ID 0
|
|
#endif
|
|
|
|
///< 同步时间ms
|
|
#ifndef HFLASH_SYNC_TIME
|
|
#define HFLASH_SYNC_TIME 2000
|
|
#endif
|
|
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
|
|
///< Flash地址类型
|
|
typedef uint32_t HFlashAddr_t;
|
|
|
|
///< Flash页表信息
|
|
typedef union HFlashPageInfo {
|
|
uint8_t reverse[32]; ///< 每页的信息占用32字节
|
|
struct __attribute__((packed)) {
|
|
HFlashAddr_t addr; ///< 地址
|
|
uint32_t crc32; ///< 使用大小内容的CRC32
|
|
uint32_t size : 24; ///< 大小
|
|
uint32_t useSize : 24; ///< 使用大小
|
|
uint16_t version; ///< 当前页数据的版本
|
|
uint32_t modifyCount; ///< 修改次数
|
|
};
|
|
} HFlashPageInfo;
|
|
|
|
typedef struct HFlashCacheInfo {
|
|
HFlashPageInfo info; ///< 页表信息
|
|
uint32_t pos : 19; ///< 存储页表信息的位置
|
|
uint32_t heat : 4; ///< 热度优先级
|
|
} HFlashCacheInfo;
|
|
|
|
|
|
/**
|
|
* @brief HFlashEraseCallback 擦除回调
|
|
* @param addr Flash地址
|
|
* @return 1: 擦除成功 0: 擦除失败
|
|
*/
|
|
typedef uint8_t (*HFlashEraseCallback)(HFlashAddr_t addr);
|
|
|
|
/**
|
|
* @brief HFlashReadCallback 读取回调
|
|
* @param addr Flash地址
|
|
* @param data Flash读取写入的缓存数据内存
|
|
* @param size 缓存大小
|
|
* @return 1: 读取成功 0: 读取失败
|
|
*/
|
|
typedef uint8_t (*HFlashReadCallback)(HFlashAddr_t addr, uint8_t *data, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashWriteCallback 写入回调
|
|
* @param addr Flash地址
|
|
* @param data Flash读取写入的缓存数据内存
|
|
* @param size 缓存大小
|
|
* @return 1: 写入成功 0: 写入失败
|
|
*/
|
|
typedef uint8_t (*HFlashWriteCallback)(HFlashAddr_t addr, uint8_t *data, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashInitCallback 设置Flash初始化回调
|
|
* @param read 读取回调
|
|
* @param write 写入回调
|
|
* @param erase 擦除回调
|
|
*/
|
|
void HFlashInitCallback(HFlashReadCallback read, HFlashWriteCallback write, HFlashEraseCallback erase);
|
|
|
|
/**
|
|
* @brief HFlashSetPageCache 设置页表缓存, 内部不构建内存, 由外部分配
|
|
* @param pageInfo 页表信息缓存
|
|
* @param size 大小
|
|
*/
|
|
void HFlashSetPageCache(HFlashCacheInfo *pageInfo, uint16_t size);
|
|
|
|
/**
|
|
* @brief HFlashSetPageAddr 设置页表地址
|
|
* @param addr 地址
|
|
* @param size 大小
|
|
*/
|
|
void HFlashSetPageAddr(HFlashAddr_t addr, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashSetPageBackupAddr 设置页表备份地址
|
|
* @param addr 地址
|
|
* @param size 大小, 必须和页表地址大小相同
|
|
*/
|
|
void HFlashSetPageBackupAddr(HFlashAddr_t addr, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashProtectAddr 设置保护地址, 内部会使用双备份区域
|
|
* @param addr 地址
|
|
* @param size 大小
|
|
*/
|
|
void HFlashProtectAddr(HFlashAddr_t addr, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashProtectBackupAddr 设置保护备份地址
|
|
* @param addr 地址
|
|
* @param size 大小, 必须和保护地址大小相同
|
|
*/
|
|
void HFlashProtectBackupAddr(HFlashAddr_t addr, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashInitCheck 在HFlashRegister前需要初始化检查, 用于检查页表是否可用, 不可用则需要初始化
|
|
*/
|
|
void HFlashInitCheck();
|
|
|
|
/**
|
|
* @brief HFlashRegister 注册地址到页表
|
|
* @param addr 地址
|
|
* @param size 该地址占用的大小
|
|
*/
|
|
void HFlashRegister(HFlashAddr_t addr, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashWrite 写入Flash数据
|
|
* @param addr 需要注册的地址
|
|
* @param data 写入数据
|
|
* @param size 写入数据大小
|
|
*/
|
|
void HFlashWrite(HFlashAddr_t addr, void *data, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashWriteOffset 写入从原始地址偏移后的地方写入数据, 如果偏移后的写入大小超过原未使用, 超出部分会自动写入0填充
|
|
* @param addr 需要注册的地址
|
|
* @param offset 地址偏移
|
|
* @param data 写入数据
|
|
* @param size 写入数据大小
|
|
*/
|
|
void HFlashWriteOffset(HFlashAddr_t addr, uint32_t offset, void *data, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashRawWrite 原始写入Flash数据, 不校验任何东西, 正常情况下不建议使用
|
|
* @param addr 地址
|
|
* @param data 写入数据
|
|
* @param size 写入数据大小
|
|
*/
|
|
void HFlashRawWrite(HFlashAddr_t addr, void *data, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashRead 读取Flash数据
|
|
* @param addr 需要注册的地址
|
|
* @param data 读取数据写入的缓存内存
|
|
* @param size 读取数据大小
|
|
* @return 1: 读取成功 0: 读取失败
|
|
*/
|
|
void HFlashRead(HFlashAddr_t addr, void *data, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashReadOffset 读取从原始地址偏移后的地方的数据
|
|
* @param addr 需要注册的地址
|
|
* @param offset 地址偏移
|
|
* @param data 读取数据写入的缓存内存
|
|
* @param size 读取数据大小
|
|
* @return 1: 读取成功 0: 读取失败
|
|
*/
|
|
void HFlashReadOffset(HFlashAddr_t addr, uint32_t offset, void *data, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashRawRead 原始读取Flash数据, 不校验任何东西, 正常情况下不建议使用
|
|
* @param addr 地址
|
|
* @param data 读取数据写入的缓存内存
|
|
* @param size 读取数据大小
|
|
*/
|
|
void HFlashRawRead(HFlashAddr_t addr, void *data, uint32_t size);
|
|
|
|
/**
|
|
* @brief HFlashGetCrc32 获取Flash数据的CRC32值
|
|
* @param addr 需要注册的地址
|
|
* @return CRC32
|
|
*/
|
|
uint32_t HFlashGetCrc32(HFlashAddr_t addr);
|
|
|
|
#endif // __H_FLASH_SERVER_H__
|