📄 fe2p_app.c
字号:
for (i = 0; i < 32; i++) Fe2pBuffer[RamOffset_ADC + i] = DEF_ADC_COLOR[i];
for (i = 0; i < 160; i++) {
Fe2pBuffer[RamOffset_VGAMODE + i] = 0xFF;
Fe2pBuffer[RamOffset_VGAMODE + 160 + i] = 0xFF;
}
Ptr = (SYSPAR *)(Fe2pBuffer + RamOffset_SYSPAR);
*Ptr = DEF_SYSPAR;
}
/*
********************************************************************************
* 函 数 名: LoadFlashToBuffer
* 功能描述: 将FLASH中的值载入到缓冲区中
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void LoadFlashToBuffer(void)
{
uint8 i, Start, End, valid[16];
uint16 Addr;
// 搜寻非空区的起始位置,Start指向这个位置
Addr = 0x1F0; // 496
Start = 0;
for (i = 0; i < 16; i++) {
Fe2p_PageRead(Addr, valid, 16);
if (!IsAllFF(valid, 16)) {
Start = i;
break;
}
Addr += 512;
}
// 搜寻非空区的结束位置,End指向的是非空区结束的下一个位置
End = 16;
Addr = ((uint16)Start << 9) + 0x1F0;
for (i = Start; i < 16; i++) {
Fe2p_PageRead(Addr, valid, 16);
if (IsAllFF(valid, 16)) {
End = i;
break;
}
Addr += 512;
}
// 从非空区结束的位置开始,向后搜寻最后一个有合法标志的存储区,并把数据读出来
// 如果没有任何合法的数据则装载默认的数据
Addr = ((uint16)End << 9) + 507;
for (i = End; i > Start; i--) {
Addr -= 512;
Fe2p_PageRead(Addr, valid, 5);
if (IsFlashSave(valid)) {
Addr -= 507;
Fe2p_PageRead(Addr, Fe2pBuffer, 512);
return;
}
}
// 如果是全空的区域或者非全空,但是数据是非法的区域,那么将载入默认的数值
LoadDefDataToBuffer();
}
/*
********************************************************************************
* 函 数 名: SaveBufferToFlash
* 功能描述: 将缓冲区的数据保存到FLASH当中
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void SaveBufferToFlash(void)
{
uint8 i, Start, End, valid[16];
uint16 Addr;
// 搜寻非空区的起始位置,Start指向这个位置
Addr = 0x1F0; // 496
Start = 0;
for (i = 0; i < 16; i++) {
Fe2p_PageRead(Addr, valid, 16);
if (!IsAllFF(valid, 16)) {
Start = i;
break;
}
Addr += 512;
}
// 搜寻非空区的结束位置,End指向的是非空区结束的下一个位置
End = 16;
Addr = ((uint16)Start << 9) + 0x1F0;
for (i = Start; i < 16; i++) {
Fe2p_PageRead(Addr, valid, 16);
if (IsAllFF(valid, 16)) {
End = i;
break;
}
Addr += 512;
}
if (End >= 16) {
// 如果Start = 0, 而End = 16那么,说明整个存储区都是满的,需要全部擦除
if (!Start) {
Fe2p_SectorErase(0x0000);
Fe2p_SectorErase(0x1000);
}
End = 0x00;
}
Addr = ((uint16)End<<9);
for (i = 0; i < 5; i++) Fe2pBuffer[507 + i] = SaveFlag[i];
Fe2p_WriteEnable();
Fe2p_PageWrite(Addr, (uint16)Fe2pBuffer, 256);
Fe2p_WriteEnable();
Fe2p_PageWrite(Addr + 256, (uint16)(Fe2pBuffer + 256), 256);
if ((End % 8) == 0) {
if (Start && End == 8){
Fe2p_WriteEnable();
Fe2p_SectorErase(0x0000);
}
else if (Start > End && End == 0) {
Fe2p_WriteEnable();
Fe2p_SectorErase(0x1000);
}
}
}
/*
********************************************************************************
* 函 数 名: LoadAllPar
* 功能描述: 从FE2P中载入所有参数,不过EDID以及显示模式相关的参数除外
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void LoadAllPar(void)
{
uint8 i;
LoadSysPar(&SysPar);
LoadAdcPar();
/*
================================================================================
= 载入与显示模式无关的参数,并且做容错处理
================================================================================
*/
for (i = 0; i < GetSourceCount(); i++) {
if (SysPar.InputSource == MenuSource[i]) break;
}
if (i >= GetSourceCount()) SysPar.InputSource = SOURCE_VGA;
Language = SysPar.Osd_Attr & 0x0F;
if (!(Language >= ENGLISH && Language <= RUSSIAN)) Language = DEF_LANGUAGE;
AdjLanguage(HIDE, 0);
if (!(SysPar.ColorTemp >= MIN_COLORTEMP && SysPar.ColorTemp <= MAX_COLORTEMP))
SysPar.ColorTemp = DEF_COLORTEMP;
if (!(SysPar.Osd_Timeout >= MIN_OSDTIMEOUT && SysPar.Osd_Timeout <= MAX_OSDTIMEOUT))
SysPar.Osd_Timeout = DEF_OSDTIMEOUT;
if (!(SysPar.PowerSaveTime >= MIN_POWERSAVETIME && SysPar.PowerSaveTime <= MAX_POWERSAVETIME))
SysPar.PowerSaveTime = DEF_POWERSAVETIME;
InputSource = SysPar.InputSource;
LoadColorPar();
#if EN_ACEROSD
#if EN_DDC_CI
AdjDDC_CI(HIDE, 0);
#endif
#endif
}
/*
********************************************************************************
* 函 数 名: SaveAllPar
* 功能描述: 保存所有的参数, 但是参数仅仅是保存到缓冲区当中
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void SaveAllPar(void)
{
SetTimerEvent(EVENT_SAVEPAR, 0x00);
SaveEdid();
SaveSysPar();
SaveAdcPar();
SaveColorPar();
SaveRelPar(ModePar.mode);
ClearParAdjState();
}
/*
********************************************************************************
* 函 数 名: IsAllFF
* 功能描述: 判断整个数据块是不是都是0xFF
* 输 入: buf : 数据块的起始地址
* Len : 数据块的大小
* 返 回: 如果全是0xFF,那么返回1,否则返回0
********************************************************************************
*/
bit IsAllFF(uint8 *buf, uint8 Len)
{
do{
if (*(buf + (--Len)) != 0xFF) return 0;
}while(Len);
return 1;
}
/*
********************************************************************************
* 函 数 名: IsFlashSave
* 功能描述: 指定的地址开始的五个字节,是否是FLASH保存的标志
* 输 入: Buf : 地址指针
* 返 回: 如果是,那么返回1,否则返回0
********************************************************************************
*/
bit IsFlashSave(uint8 *Buf)
{
uint8 i;
i = 5;
do{
--i;
if (*(Buf+i) != SaveFlag[i]) return 0;
}while(i);
return 1;
}
/*
********************************************************************************
* 函 数 名: LoadSysPar
* 功能描述: 载入系统频繁变更的参数,这些参数压缩成51个字节,分成100个区域
* 分别保存在SECTOR_SYSPAR起始的FE2P区域中
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void LoadSysPar(SYSPAR *Sys)
{
SYSPAR *SysIdx;
if (IsAllFF(Fe2pBuffer + RamOffset_SYSPAR, 32)) {
*Sys = DEF_SYSPAR;
}
if (!IsFlashSave(Fe2pBuffer + 507)) {
*Sys = DEF_SYSPAR;
}
SysIdx = (SYSPAR *)(Fe2pBuffer + RamOffset_SYSPAR);
*Sys = *SysIdx;
}
/*
********************************************************************************
* 函 数 名: SaveSysPar
* 功能描述: 保存系统频繁变更的参数,这些参数压缩成51个字节,分成100个区域
* 分别保存在SECTOR_SYSPAR起始的FE2P区域中
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void SaveSysPar(void)
{
SYSPAR *SysIdx;
if (!GetState_SYSPAR()) return;
SysIdx = (SYSPAR *)(Fe2pBuffer + RamOffset_SYSPAR);
*SysIdx = SysPar;
SetTimerEvent(EVENT_WRITEFLASH, 0x0A);
ClearState_SYSPAR();
}
/*
********************************************************************************
* 函 数 名: LoadAdcPar
* 功能描述: 载入ADC的参数
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void LoadAdcPar(void)
{
ADCPAR *Adc;
Adc = (ADCPAR *)(Fe2pBuffer + RamOffset_ADC);
AdcPar = *Adc;
}
/*
********************************************************************************
* 函 数 名: SaveAdcPar
* 功能描述: 保存ADC的参数
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void SaveAdcPar(void)
{
ADCPAR *Adc;
if (!GetState_ADCPAR()) return;
Adc = (ADCPAR *)(Fe2pBuffer + RamOffset_ADC);
*Adc = AdcPar;
SetTimerEvent(EVENT_WRITEFLASH, 0x0A);
ClearState_ADCPAR();
}
/*
********************************************************************************
* 函 数 名: LoadColorPar
* 功能描述: 加载色温参数
* 输 入: 无
* 返 回: 无
* 注 意: 在调用这个函数以前,要先调用LoadSysPar
********************************************************************************
*/
void LoadColorPar(void)
{
COLOR *Cor;
Cor = (COLOR *)(Fe2pBuffer + RamOffset_COLOR + SysPar.ColorTemp * sizeof(COLOR));
Color = *Cor;
}
/*
********************************************************************************
* 函 数 名: SaveAdcPar
* 功能描述: 保存色温参数
* 输 入: 无
* 返 回: 无
* 注 意: 在调用这个函数以前,要先调用LoadSysPar
********************************************************************************
*/
void SaveColorPar(void)
{
COLOR *Cor;
if (!GetState_COLOR()) return;
Cor = (COLOR *)(Fe2pBuffer + RamOffset_COLOR + SysPar.ColorTemp * sizeof(COLOR));
*Cor = Color;
SetTimerEvent(EVENT_WRITEFLASH, 0x0A);
ClearState_COLOR();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -