📄 fe2p_app.c
字号:
/*
********************************************************************************
*
* LCD控制程序
*
* 这是于FE2P功能相关的应用程序
*
* 文件名 : FE2P_APP.C
* 设计者 : Terry
********************************************************************************
* 功 能 描 述
*
********************************************************************************
*/
#include "global.h"
#define RamOffset_EDID 0x000
#define RamOffset_ADC 0x080
#define RamOffset_COLOR 0x086
#define RamOffset_VGAMODE 0x0A0
#define RamOffset_SYSPAR 0x1E0
bit IsEdidHeader(uint8 *EdidBuf);
void CheckEdidSum(uint8 *EdidBuf);
bit IsAllFF(uint8 *buf, uint8 Len);
bit IsFlashSave(uint8 *Buf);
uint8 xdata Fe2pBuffer[512];
uint8 code SaveFlag[] = {'T', 'e', 'r', 'r', 'y'};
uint8 code EdidHeader[] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00};
uint8 code DEF_EDID[] = {
////////////////////////////////////////////////////////////////////////////////
// 保存的是用于DVI的EDID数据
////////////////////////////////////////////////////////////////////////////////
//====================志朋电子厂===========================
#if PanelWidth == 1280 && PanelHeight == 800
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x3D,0x8D,0x9A,0x00,0x0A,0x00,0x00,0x00,
0x23,0x10,0x01,0x03,0x0F,0x21,0x15,0x78,0xEA,0xF0,0x64,0x98,0x57,0x51,0x91,0x27,
0x21,0x4F,0x54,0xA1,0x0C,0x00,0x81,0x80,0x81,0x8A,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x9A,0x20,0x00,0x90,0x51,0x20,0x1C,0x30,0x40,0x88,
0x13,0x00,0x4B,0xCF,0x10,0x00,0x00,0x1E,0x00,0x00,0x00,0xFF,0x00,0x30,0x30,0x30,
0x30,0x31,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0xFD,0x00,0x32,
0x47,0x1F,0x50,0x0E,0x00,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0xFC,
0x00,0x4F,0x4C,0x4D,0x2D,0x31,0x35,0x34,0x44,0x31,0x0A,0x20,0x20,0x20,0x00,0x9A,
#elif PanelWidth == 1440 && PanelHeight == 900
// 威海大宇的EDID数据 19寸16:10 最大分辨率是1440 * 900
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x3A,0x80,0x65,0x06,0x01,0x00,0x00,0x00,
0x12,0x11,0x01,0x03,0x6C,0x34,0x21,0x78,0xEA,0x5A,0xD5,0xA7,0x56,0x4B,0x9B,0x24,
0x13,0x50,0x54,0xBD,0xEF,0x80,0x81,0xC0,0x81,0x00,0x95,0x00,0x90,0x40,0x01,0x01,
0x01,0x01,0x81,0x00,0x01,0x01,0x8F,0x2F,0x78,0xD0,0x51,0x1A,0x22,0x40,0x58,0x90,
0x34,0x00,0x9E,0x01,0x11,0x00,0x00,0x1C,0x9A,0x29,0xA0,0xD0,0x51,0x84,0x22,0x30,
0x50,0x98,0x36,0x00,0x9E,0x01,0x11,0x00,0x00,0x1C,0x00,0x00,0x00,0xFC,0x00,0x4C,
0x43,0x44,0x2D,0x4D,0x4F,0x4E,0x49,0x54,0x4F,0x52,0x0A,0x0A,0x00,0x00,0x00,0xFC,
0x00,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x00,0x1A,
#elif PanelWidth == 1280 && PanelHeight == 1024 //add
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x4D,0x64,0xAA,0x00,0x01,0x00,0x00,0x00,
0x23,0x10,0x01,0x03,0x0F,0x26,0x1E,0x6E,0xEA,0xF0,0x64,0x98,0x57,0x51,0x91,0x27,
0x21,0x4F,0x54,0xBF,0xCF,0x00,0x81,0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x2A,0x00,0x98,0x51,0x00,0x2A,0x40,0x30,0x70,
0x13,0x00,0x51,0x0E,0x11,0x00,0x00,0x1E,0x00,0x00,0x00,0xFF,0x00,0x30,0x30,0x30,
0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x00,0x00,0x00,0xFC,0x00,0x4C,
0x43,0x44,0x20,0x4D,0x4F,0x4E,0x49,0x54,0x4F,0x52,0x0A,0x20,0x00,0x00,0x00,0xFD,
0x00,0x31,0x4C,0x1E,0x50,0x0E,0x00,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0xBC,
#elif PanelWidth == 1680 && PanelHeight == 1050 //modify
// 老胡客户发过来的数据,最大分辨率1680 * 1050
0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x30,0x64,0x75,0x17,0x00,0x00,0x00,0x00,
0x0C,0x10,0x01,0x03,0x08,0x2B,0x1B,0x78,0xEA,0xCF,0xE5,0xA3,0x5A,0x49,0xA0,0x24,
0x13,0x50,0x54,0xBF,0xEF,0x80,0x90,0x40,0x90,0x4F,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x21,0x39,0x90,0x30,0x62,0x1A,0x27,0x40,0x68,0xB0,
0x36,0x00,0xB1,0x0F,0x11,0x00,0x00,0x1E,0x00,0x00,0x00,0xFD,0x00,0x38,0x56,0x1F,
0x54,0x13,0x00,0x0A,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0xFF,0x00,0x31,
0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x00,0x00,0x00,0xFC,
0x00,0x4C,0x43,0x44,0x20,0x4D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x0A,0x0A,0x00,0x10,
#elif PanelWidth == 1920 && PanelHeight == 1200
0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0a,0x11,0x01,0x03,0x08,0x00,0x00,0x78,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xa3,0x08,0x00,0x81,0x80,0x95,0x00,0x90,0x40,0xb3,0x00,0xa9,0x40,
0x01,0x01,0x01,0x01,0x01,0x01,0x28,0x3c,0x80,0xa0,0x70,0xb0,0x23,0x40,0x30,0x20,
0x36,0x00,0x20,0xd3,0x84,0x00,0x00,0x1a,0x00,0x00,0x00,0xfd,0x00,0x37,0x4c,0x0e,
0x5a,0x14,0x00,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0xff,0x00,0x30,
0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x00,0x00,0x00,0xfc,
0x00,0x4c,0x43,0x44,0x20,0x4d,0x4f,0x4e,0x49,0x54,0x4f,0x52,0x0a,0x20,0x00,0x35,
#else
0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x3a,0xd4,0x3a,0x56,0x00,0x00,0x00,0x00,
0x1c,0x0e,0x01,0x03,0x0e,0x26,0x1e,0x78,0xe8,0x2c,0x9d,0xa6,0x58,0x4a,0x9a,0x26,
0x21,0x52,0x56,0xbf,0xef,0x80,0x81,0x80,0x81,0x8a,0x81,0x8c,0x71,0x4f,0x45,0x4a,
0x01,0x01,0x01,0x01,0x01,0x01,0xbc,0x34,0x00,0x98,0x51,0x00,0x2a,0x40,0x30,0x70,
0x13,0x00,0x7c,0x2c,0x11,0x00,0x00,0x06,0xd6,0x09,0x80,0xa0,0x20,0x5e,0x63,0x10,
0x10,0x60,0x52,0x08,0x7c,0x2c,0x11,0x00,0x00,0x02,0x00,0x00,0x00,0xfd,0x00,0x32,
0x4b,0x1e,0x50,0x0e,0x00,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0xfc,
0x00,0x4e,0x6f,0x76,0x61,0x74,0x65,0x6b,0x20,0x20,0x35,0x36,0x33,0x41,0x00,0x75,
#endif
};
SYSPAR code DEF_SYSPAR = {
DEF_INPUTSOURCE, // InputSource 选择输入源
DEF_FLAG, // Flag 系统的控制标记
0x00, // BackEndSharpness SCALAR的锐利度控制,高四为是垂直锐利度,低四位是水平
DEF_POWERSAVETIME, // PowerSaveTime 从无信号输入到进入省电管理的时间间隔
(BF_OFF<<4)+DEF_IMAGEMODE, // ImageMode 图像模式控制,高四位表示颜色管理窗口的状态
DEF_BRIGHTNESS, // Brightness 亮度
DEF_CONTRAST, // Contrast 对比度
DEF_BACKLIGHT, // Backlight 背光
DEF_COLORTEMP, // ColorTemp 色温的指针
50, // Osd_Hpos OSD的水平位置
50, // Osd_Vpos OSD的垂直位置
DEF_OSDTIMEOUT, // Osd_Timeout OSD显示的时间
DEF_LANGUAGE, // Osd_Attr 高四位是OSD窗口的透明度,低四位是OSD语言
DEF_VIDEOSAT, // Saturation 饱和度
DEF_VIDEOHUE, // Hue 色调
DEF_AUDIOMODE, // AudioMode 音频的模式:标准/新闻/音乐/剧院/记忆等
DEF_VOLUME, // Volume 音量
0x00, // 显示模式相关参数的当前保存位置
0xFF,0xFF,0xFF, // 目前还没有定义的部分
0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,
'T','e','r','r','y',// 该块是否有效的标志
};
uint8 code DEF_ADC_COLOR[32] = {
DEF_RADCCLAMP, // clampR;
DEF_RADCGAIN, // gainR;
DEF_GADCCLAMP, // clampG;
DEF_GADCGAIN, // gainG;
DEF_BADCCLAMP, // clampB;
DEF_BADCGAIN, // gainB;
DEF_9300R, DEF_9300G, DEF_9300B, // 第1组值
DEF_6500R, DEF_6500G, DEF_6500B, // 第2组值
DEF_USERR, DEF_USERG, DEF_USERB, // 第3组值
DEF_USERR, DEF_USERG, DEF_USERB, // 第4组值
DEF_USERR, DEF_USERG, DEF_USERB, // 第5组值
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,
};
/*
********************************************************************************
* 函 数 名: IsEdidHeader
* 功能描述: 返回一个数据的头是不是一个EDID数据块的头
* 输 入: EdidBuf : EDID数据块的指针
* 返 回: 如果是EDID数据块,那么返回1,否则返回0
********************************************************************************
*/
bit IsEdidHeader(uint8 *EdidBuf)
{
uint8 i;
i = 8;
do{
i--;
if (*(EdidBuf+i) != EdidHeader[i]) return 0;
}while(i);
return 1;
}
/*
********************************************************************************
* 函 数 名: CheckEdidSum
* 功能描述: 检查EDID数据块的校验和是否正确,如果不正确,那么则填入正确的校验和
* 而且可以检查和处理两块数据块
* 输 入: EdidBuf : EDID数据块的指针
* 返 回: 如果是EDID数据块,那么返回1,否则返回0
********************************************************************************
*/
void CheckEdidSum(uint8 *EdidBuf)
{
uint8 i, sum, block;
block = *(EdidBuf + 126) + 1;
if (block > 2) block = 2;
while (block--) {
sum = 0;
for (i = 0; i < 127; i++) {
sum += *(EdidBuf++);
}
sum = ~sum;
sum += 1;
if (sum != *EdidBuf) *EdidBuf = sum;
EdidBuf++;
}
}
/*
********************************************************************************
* 函 数 名: LoadEdid
* 功能描述: 从缓冲区中载入EDID数据到双端口DDC RAM当中
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void LoadEdid(void)
{
uint8 xdata *DdcRamPtr;
uint8 i;
// 禁止DDC功能
//XFR_DDC_CTL0 = 0x00;
//XFR_DDC_CTL1 = 0x00;
DdcRamPtr = 0xF800;
if (IsEdidHeader(Fe2pBuffer)) {
for (i = 0; i < 128; i++) *(DdcRamPtr + i) = Fe2pBuffer[i];
}
// 如果缓冲区中的数据不正确,那么将加载默认的数据
else {
for (i = 0; i < 128; i++) *(DdcRamPtr + i) = DEF_EDID[i];
}
// 重新计算EDID数据的校验和
CheckEdidSum(DdcRamPtr);
XFR_DDC_SWAP = 0x00;
// 启动DDC功能, EDID允许访问的长度是128
// XFR_DDC_CTL0 = (xB_EN_DDC|xB_CLR_UPD|xB_CLR_PTR);
XFR_DDC_CTL0 = (xB_EN_DDC|xB_CLR_UPD|xB_CLR_PTR);
// XFR_DDC_CTL0 = (xB_CLR_UPD|xB_CLR_PTR);
//XFR_DDC_CTL1 = (xB_EN_DDC|xB_CLR_UPD|xB_CLR_PTR);
// 启动DDC功能, EDID允许访问的长度是256
//XFR_DDC_CTL0 = (xB_EN_DDC|xB_LEN_EDID|xB_CLR_UPD|xB_CLR_PTR);
//XFR_DDC_CTL1 = (xB_EN_DDC|xB_LEN_EDID|xB_CLR_UPD|xB_CLR_PTR);
}
/*
********************************************************************************
* 函 数 名: SaveEdid
* 功能描述: 把EDID数据保存到FE2P的SECTOR0中
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void SaveEdid(void)
{
uint8 xdata *DdcRamPtr;
uint8 i;
if (!GetState_EDID()) return;
DdcRamPtr = 0xF800;
if (!IsEdidHeader(DdcRamPtr)) return;
CheckEdidSum(DdcRamPtr);
for (i = 0; i < 128; i++) Fe2pBuffer[i] = *(DdcRamPtr + i);
SetTimerEvent(EVENT_WRITEFLASH, 0x01);
ClearState_EDID();
}
/*
********************************************************************************
* 函 数 名: LoadDefModePar
* 功能描述: 在ModePar中载入默认的数据,其实就是直接从表格中载入
* 输 入: mode :需要处理的显示模式顺序号
* 返 回: 无
********************************************************************************
*/
void LoadDefModePar(uint8 mode)
{
ModePar.flag = 0x00;
ModePar.hstart = ModeAttr[mode].Hstart;
ModePar.vstart = ModeAttr[mode].Vstart;
ModePar.hoffset = 0x00;
ModePar.voffset = 0x00;
ModePar.htotal = ModeAttr[mode].Htotal;
ModePar.phase = DEF_PHASE;
}
/*
********************************************************************************
* 函 数 名: LoadRelPar
* 功能描述: 从FE2P区域中的SECTOR_VGAMODE1和SECTOR_VGAMODE2中读取与VGA显示模式
* 相关的参数。如果存储器中保存有正确的数据,将读取该正确的数据否则
* 将读取默认的数据
* 输 入: mode :需要处理的显示模式顺序号
* 返 回: 无
********************************************************************************
*/
void LoadRelPar(uint8 mode)
{
MODEREL *ModeIdx;
uint8 i;
for (i = 0; i < MaxVgaMode; i++) {
ModeIdx = (MODEREL *)(Fe2pBuffer + RamOffset_VGAMODE + i * sizeof(MODEREL));
if (ModeIdx->mode == mode) {
ModePar = *ModeIdx;
return;
}
}
LoadDefModePar(mode);
}
/*
********************************************************************************
* 函 数 名: SaveRelPar
* 功能描述: 将与显示模式相关的参数保存到FE2P区域中,即SECTOR_VGAMODE1和
* SECTOR_VGAMODE2开始的两个扇区,交替进行保存。
* 输 入: mode :需要处理的显示模式顺序号
* 返 回: 无
********************************************************************************
*/
void SaveRelPar(uint8 mode)
{
MODEREL *ModeIdx;
uint8 i;
if (!GetState_VGAMODE()) return;
for (i = 0; i < MaxVgaMode; i++) {
ModeIdx = (MODEREL *)(Fe2pBuffer + RamOffset_VGAMODE + i * sizeof(MODEREL));
if (ModeIdx->mode == mode) break;
}
if (i >= MaxVgaMode) {
ModeIdx = (MODEREL *)(Fe2pBuffer + RamOffset_VGAMODE + SysPar.ModeSavePos * sizeof(MODEREL));
SysPar.ModeSavePos++;
if (SysPar.ModeSavePos >= MaxVgaMode) SysPar.ModeSavePos = 0x00;
}
ModePar.mode = mode;
ModePar.flag = 0x01;
*ModeIdx = ModePar;
SetTimerEvent(EVENT_WRITEFLASH, 0x0A);
ClearState_VGAMODE();
}
/*
********************************************************************************
* 函 数 名: LoadDefDataToBuffer
* 功能描述: 将在内存开辟的FE2P区域的缓冲区初始化成默认值
* 输 入: 无
* 返 回: 无
********************************************************************************
*/
void LoadDefDataToBuffer(void)
{
uint8 i;
SYSPAR *Ptr;
for (i = 0; i < 128; i++) Fe2pBuffer[i] = DEF_EDID[i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -