#pragma once
#include "Type.h"
// 需è¦åœ¨è‡ªå·±é¡¹ç›®å†…补充。 ConfigBase_t åªæä¾›è¯»å†™ä¿å˜ã€‚
#include "Config.h"
// Config 有效性 å–决于 锿•°å’Œ Crc32
typedef struct
{
// 锿•° 内部使用。 外部ä¸è¦ç¢°
// 默认为 : 'M' 'a' 'g' '&' 0x4D616726
uint MagicNum;
// 实际é…置长度。
// 为了åšé…ç½®å‘åŽå…¼å®¹ã€‚ 必须有。
uint Length;
// é…置实际内容。
Config_t Config;
// æ ¡éªŒ 内部使用。 外部ä¸è¦ç¢°
uint Crc32;
}ConfigBase_t;
// 获å–é…ç½®
bool GetConfig(Config_t* cfg, uint addr);
// ä¿å˜é…ç½®
bool SetConfig(Config_t* cfg, uint addr);
// åˆ é™¤é…置内容
bool CleanConfig(uint addr);
/***************************************************************/
/*
写很多份é…置的驱动。
NOR FLASH 作为å˜å‚¨è½½ä½“。
多擦除å—设计。
处ç†å†™å…¥æ—¶æ–电问题。
*/
// å—:擦除å—
typedef struct
{
// FLASH 写
bool (*FlashWrite)(uint address, byte* buf, int len);
// å¯ä»¥ç›´æŽ¥é€šè¿‡æŒ‡é’ˆè®¿é—®çš„ addr ,æ¤å‡½æ•°ä¸º NULL。
bool (*FlashRead)(uint address, byte* buf, int len);
// FLASH 擦å—
bool (*FlashErase)(uint address);
}NorFlash_t;
// 对象
typedef struct
{
// 内当剿œ€æ–°é…置,用于对比是å¦éœ€è¦å†™å…¥ã€‚
Config_t CurrCfg;
// NOR FLASH 接å£
NorFlash_t FApi;
// FLASH Section åœ°å€æ•°ç»„,数组长度是 FlashSecCnt
uint* FSecAddrs;
// FLASH Section å—个数。 个数 FlashSecCnt = (1 << FSecBit)
byte FSecBit;
// FLASH Section å˜ Config_t 的份数 = (1 << FSecCfgBit)
byte FSecCfgBit;
// 当å‰ä½¿ç”¨çš„ IDEX ã€‚ä¹Ÿæ˜¯å˜æ”¾ä½ç½®ã€‚
ushort CurrIndex;
}FCfgCtrl_t;
/*
// FLASH 擦除å—地å€
const uint secAddr[] =
{
0 + 0x8000000 + (48 * 1024),
1024 + 0x8000000 + (48 * 1024),
2048 + 0x8000000 + (48 * 1024),
4096 + 0x8000000 + (48 * 1024)
};
// å•片机内部 NOR FLASH
NorFlash_t nfunc =
{
.FlashWrite = XXX
.FlashRead = NULL,
.FlashErase = XXX,
};
// 直接定义
FCfgCtrl_t FCtl =
{
.FlashWrite = xxx,
.FlashErase = xxx,
.BaseAddrs = secAddr,
.FSecCnt = 2, // (1<<2) 有4å—
.FSecCfgCnt = 3, // (1<<3) å˜8份
.CfgIndex = 0,
};
使用 FCfgInit 函数é…ç½®
FCfgInit(&FCtl, &nfunc, secAddr, ArrayLength(secAddr), 8);
*/
/**
* @brief åˆå§‹åŒ–
* @param ctl
* @param api NOR FLASH 接å£
* @param sad FLASH å—åœ°å€æ•°ç»„
* @param sadlen å—æ•°ç»„长度
* @param ccnt å—内 å˜æ”¾é…置的份数
* @return 0 æ— é”™
*/
int FCfgInit(FCfgCtrl_t* ctl, NorFlash_t* api, uint* sad, byte sadlen, byte ccnt);
/**
* @brief æ‰«ææ•´ä¸ª FLASH å˜å‚¨åŒºï¼Œæ‰¾åˆ°æœ€æ–°ä¸”有效的é…ç½®å–出æ¥
* @param ctl
* @param cfg
*/
bool FCfgLoad(FCfgCtrl_t* ctl, Config_t* cfg);
/**
* @brief ä¿å˜é…ç½®
* @param ctl
* @param cfg
*/
bool FCfgSave(FCfgCtrl_t* ctl, Config_t* cfg);
/**
* @brief åˆ é™¤ä¸€ä¸ªé…置,应该用ä¸åˆ°
* @param ctl
* @param idx
*/
bool FCfgClean(FCfgCtrl_t* ctl, int idx);
/**
* @brief 擦除所有 FLASH 区域,一个ä¸ç•™
* @param ctl
*/
bool FCfgCleanAll(FCfgCtrl_t* ctl);
|