⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fe2p_app.c

📁 NT68617源程序代码集合
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
********************************************************************************
*
*	                                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 + -