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

📄 mx88v462.c

📁 此为7寸LCD屏的驱动(88V462)代码
💻 C
字号:
#ifdef UNDER_CE
	#include    <windows.h>
	#include    <nkintr.h>
	#include    <oalintr.h>
#else
	#include <string.h>
#ifdef S2440CPU
	#include "2440lib.h"
#else
	#include "2410lib.h"
#endif
	#include "def.h"
#endif

#include "Includes.h"

#include "mx88v462.h"
#include "SCPUReg.h"

#include "VideoIIC.h"

typedef struct{
		char cReg;
		char cData;
	}MX88V462REG,*PMX88V462REG;

//****************************************************************************
unsigned char	TCON_DATE[0x88] 	= {
//	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, 	// 0x0000
	0x80,0x05,0x0F,0x01,0x01,0x00,0x81,0x00, 0x44,0x7E,0xC0,0x00,0xF5,0x80,0x80,0x80,	// 0x0000
   	0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, 0x00,0xFF,0x40,0x00,0x00,0x00,0x00,0x40,	// 0x0010
   	0x00,0x95,0xCC,0x32,0x68,0x02,0x61,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 	// 0x0020
   	0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00, 0x31,0x00,0x00,0x02,0x0F,0x00,0x17,0x01, 	// 0x0030
   	0x00,0x00,0x01,0x3F,0x03,0x00,0x00,0x7C, 0x02,0x95,0x00,0xD0,0x02,0x20,0x01,0xFD, 	// 0x0040
   	0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x28, 0x00,0x00,0x01,0x00,0x00,0x18,0x18,0x04,	// 0x0050
   	0x10,0x00,0x35,0x08,0x20,0x00,0x00,0x00, 0x00,0x00,0x96,0x00,0x03,0x00,0x00,0x00,	// 0x0060
   	0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00, 0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,	// 0x0070
	0x3A,0x00,0x3A,0x00,0x00,0x00,0x00,0x28												// 0x0080
//	0xaAu,0x01,0xaAu,0x01,0x00,0x00,0x00,0x28												// 0x0080 
	};


unsigned char	VideoSUR_Addr[8] = {
	0x02,	0x03,	0x91,	0x92,	0x93,	0x94,	0x95,	0x96
	};

unsigned char 	VideoSUR_Data[5][8] = {			//Video Source Setting Data array  ---***
	0x6F,	0x00,	0x00,	0x0E,	0x00,	0x04,	0x00,	0x04,	//***---CVBS1	 
	0x6F,	0x00,	0x80,	0x04,	0x00,	0x0E,	0x00,	0x04,	//***---CVBS2	 
 	0x4F,	0x03,	0x20,	0x0E,	0x20,	0x0E,	0x00,	0x04,	//***---S-Video
 	0x4F,	0x00,	0x40,	0x0E,	0x40,	0x0E,	0x40,	0x0E,	//***---YCbCr
 	0x4F,	0x00,	0x70,	0x0D,	0x70,	0x0D,	0x70,	0x0D	//***---RGB
	};
unsigned char VideoSTD_Addr[14] =	{
	0x3F,	0x3F,
	0x00,	0x01,	0x02,	0x0C,	0x18,	0x19,	0x1A,	0x1B,	0x2E,	0x30,	
	0x31,	0x90
	};	
unsigned char VideoSTD_Data[6][14] =	{
	0x01,	0x00,//NTSC
	0x00,	0x09,	0x6F,	0x8A,	0x21,	0xF0,	0x7C,	0x1F,	0x82,	0x22,	
	0x61,	0x5C,
	
	0x01,	0x00,//PAL
	0x32,	0x08,	0x6F,	0x67,	0x2A,	0x09,	0x8A,	0xCB,	0x84,	0x2A,
	0xC1,	0x1C,

	0x01,	0x00,//SECAM 0x01:08,0x90:1C
	/*0x38*/0x18,	0x00,	0x4F,	0x67,	0x28,	0xA3,	0x3B,	0xB3,	0x84,	0x2A,
	0xC1,	0x1C,

	0x01,	0x00,//PAL M 0x01:09,0x90:5C
	0x04,	0x09,	0x6F,	0x8A,	0x21,	0xE6,	0xEF,	0xA4,	0x82,	0x22,
	0x61,	0x5C,

	0x01,	0x00,//NTSC4 0x01:09,0x90:5C
	0x00,	0x09,	0x4F,	0x8A,	0x2A,	0x0A,	0xD1,	0xCB,	0x82,	0x22,
	0x61,	0x5C,

	0x01,	0x00,//PAL N 0x01:08,0x90:1C
	0x36,	0x08,	0x6F,	0x67,	0x21,	0xF6,	0xFF,	0xFF,	0x84,	0x2A,
	0xC1,	0x1C//,
	};



void UpdateIICDate()
{
#if 1

	int i = 0x0;
	for(i = 0x0 ; i< 0x88 ;i ++)
		Video_IIC_Wr(i, TCON_DATE[i]);
	Video_IIC_Wr(0xA7, TCON_DATE[0x87]);
/*
	for(i = 0x0 ; i < 0x08 ; i++)
	{
		//Video_IIC_Wr(VideoSUR_Addr[i], VideoSTD_Data[4][i]);
		Video_IIC_Wr(0xF0, VideoSUR_Addr[i]);
		Video_IIC_Wr(0xF1, VideoSTD_Data[4][i]);
	}
	for(i = 0x0 ; i < 0xe ; i++)
	{
		//Video_IIC_Wr(VideoSTD_Addr[i], VideoSTD_Data[5][i]);
		Video_IIC_Wr(0xF0 , VideoSTD_Addr[i]);
		Video_IIC_Wr(0xF1, VideoSTD_Data[5][i]);
	}
*/
	Uart_Printf("UpdateIICDate ......\n");

#else
	//Video input formatter and power down control
	Video_IIC_Wr(0x00, 0x80);		//Formatter control register 0
	Video_IIC_Wr(0x01, 0x03);		//Formatter control register 1
	Video_IIC_Wr(0x02, 0x0f);		//Power Down Controls

	//OSD control register
	Video_IIC_Wr(0x16, 0xd8);		//OSD blending control register

	//Output display select register
	Video_IIC_Wr(0x1a, 0xe0);		//Output display control
	Video_IIC_Wr(0x1b, 0xff);		//Frame color red

	//PWM (Pulse Width Modulation )register
	Video_IIC_Wr(0x31, 0x1f);		//PWM control register
	//Video_IIC_Wr(0x00, 0x80);
	//Video_IIC_Wr(0x00, 0x80);

	//SCALER
	Video_IIC_Wr(0x38, 0x8f);		//Input image horizontal sample start low byte
	Video_IIC_Wr(0x39, 0x00);		//Input image horizontal sample start high byte
	Video_IIC_Wr(0x3a, 0xc1);		//Input image horizontal sample count low byte
	Video_IIC_Wr(0x3b, 0x02);		//Input image horizontal sample count high byte
	Video_IIC_Wr(0x3c, 0x0d);		//Input image vertical sample start point low byte
	Video_IIC_Wr(0x3d, 0x00);		//Input image vertical sample start point high byte
	Video_IIC_Wr(0x3e, 0xf7);		//Input image vertical sample point count low byte
	Video_IIC_Wr(0x3f, 0x00);		//Input image vertical sample point count high byte
	//Video_IIC_Wr(0x3c, 0x0d);
#endif
}
void Mod_MX88V462(BOOL bUpdate)
{
	gLcdReg.LCDFrameBufBase = FRAMEBUF_DMA_BASE;

//	gLcdReg.LCD_XSize_TFT = 320;		//snowolf edit
//	gLcdReg.LCD_YSize_TFT = 240;

	gLcdReg.LCD_XSize_TFT = 480;		//snowolf edit
	gLcdReg.LCD_YSize_TFT = 234;

	gLcdReg.LineVal_TFT   = (gLcdReg.LCD_YSize_TFT-1);
	gLcdReg.HozVal_TFT    = (gLcdReg.LCD_XSize_TFT-1);
#if 0
	gLcdReg.MVal          = 13 ;
	gLcdReg.MVal_Used     = (0);
	gLcdReg.VBPDVal       = ((30)&0xff);
	gLcdReg.VFPDVal       = ((30)&0xff);
	gLcdReg.VSPWVal       = ((39) &0x3f);

	gLcdReg.HBPDVal       = ((40)&0x7f);
	gLcdReg.HFPDVal       = ((40)&0xff);
	gLcdReg.HSPWVal       = ((49)&0xff);
#else
	gLcdReg.VBPDVal       = ((18)&0xff);
	gLcdReg.VFPDVal       = ((5)&0xff);
	gLcdReg.VSPWVal       = ((2) &0x3f);

	gLcdReg.HBPDVal       = ((50)&0x7f);
	gLcdReg.HFPDVal       = ((28)&0xff);
	gLcdReg.HSPWVal       = ((49)&0xff);
#endif	
	gLcdReg.CLKDivVal     = (6);

	gLcdReg.LCDCON5Val = (0    << 12) |   /* BPP24BL       : LSB valid                        */
	            		 (1    << 11) |   /* FRM565 MODE   : 5:6:5 Format                     */
	            		 (0    << 10) |   /* INVVCLK       : VCLK Falling Edge                */
	            		 (1    <<  9) |   /* INVVLINE      : Inverted Polarity                */
	            		 (0    <<  8) |   /* INVVFRAME     : Inverted Polarity                */
	            		 (0    <<  7) |   /* INVVD         : Normal                           */
	            		 (0    <<  6) |   /* INVVDEN       : Normal                           */
	            		 (0    <<  5) |   /* INVPWREN      : Normal                           */
	            		 (0    <<  4) |   /* INVENDLINE    : Normal                           */
                		 (1    <<  3) |   /* PWREN         : Disable PWREN                    */
                		 (0    <<  2) |   /* ENLEND        : Disable LEND signal              */
                		 (0    <<  1) |   /* BSWP          : Swap Disable                     */
                		 (1    <<  0) ;   /* HWSWP         : Swap Enable                      */
//	Uart_Printf("snowolf mod_ps430 bUpdate = %d\n",bUpdate);
	if( bUpdate )
	{
		UpdateLcdReg( &gLcdReg );
		UpdateIICDate();
	}
	
}


static void MX88V462Reset(void)
{
	int i;
	Video_IIC_Wr( 0x03 , 0 );

	for(i=0; i<0x8000; i++ ) ;

	Video_IIC_Wr( 0x03 , 0x03 );
}

static int MX88V462UpdateReg( PMX88V462REG pReg)
{
	PMX88V462REG pWrReg;

	pWrReg = pReg;

	while( (pWrReg->cReg != (char)-1) && (pWrReg->cData != (char)-1) )
	{
		Video_IIC_Wr( pWrReg->cReg ,pWrReg->cData );

		//PRINTMSG( (_T("  reg:0x%x,Data:0x%x"),SetData[i][0],SetData[i][1]) );

		pWrReg++;
	}

    return 1;
}

void MX88V462PowOff( BOOL bOff)
{
	if( bOff )   // power off
		Video_IIC_Wr( 0x04 , 0x0d);
	else         // power on
		Video_IIC_Wr( 0x04 , 0x08); // dac1 is power off ,other power on
}

void MX88V462_PowerHandle( BOOL bOff)
{
	if( bOff )   // power off
	{
		;
	}
	else     // power on
	{
	    Video_IIC_Init( MX88V462_ADD );

#ifdef UNDER_CE
	    SetInterruptEvent( SYSINTR_AV_DET );
#endif
	}

	    MX88V462PowOff( bOff) ; 
}

BOOL MX88V462_MoveWind( int *pX, int *pY)
{
	int Val;
	unsigned char RegVal;

	// ********** set H(X) Val *********
	if( pX != NULL )
	{
		if( *pX != 0 )
		{
			Val = *pX;

			if( Val < 70 )
				Val = 70;
			if( Val > 150 )
				Val = 150;

			Video_IIC_Wr( 0x23 ,(unsigned char)Val);

			*pX = Val;

			PRINTMSG( (_T("\n  DisMove CHREG_HPR:%d"),Val ) );
		}
		else
		{
			Video_IIC_Rd( 0x23 ,&RegVal);
			*pX = RegVal;
		}
	}

	// ********** set V(Y) Val *********
	if( pY != NULL )
	{
		if( *pY != 0 )
		{
			Val = *pY ;

			if( Val < 40 )
				Val = 40;
			if( Val >= 70 )
				Val = 70;

			Video_IIC_Wr( 0x21 ,(unsigned char)Val);

			*pY = Val;

			PRINTMSG( (_T("\n  DisMove CHREG_VPR:%d"),Val ) );
		}
		else
		{
			Video_IIC_Rd( 0x21 ,&RegVal);
			*pY = RegVal;
		}
	}

	return TRUE;
}

// Range:1~100
int MX88V462_Contrast(int Contrast)
{
	unsigned char Val;

	if( Contrast == 0 )
	{
		Video_IIC_Rd( 0x07 ,(unsigned char *)&Contrast);  // read default
		return Contrast*(0x7f-0x20)/100+0x20;  // 0x20 is min,0x7f is max
	}
	else if( Contrast>100)
		Contrast = 100;

	Val = Contrast*(0x7f-0x20)/100+0x20;  // 0x20 is min,0x7f is max

	Video_IIC_Wr( 0x07, Val );
	pgOSConf->TVContrast = Contrast;

	return Contrast;
}

// Range:1~100
int MX88V462_Brightness(int Brightness)
{
	unsigned char Val;

	if( Brightness == 0 )
	{
		Video_IIC_Rd( 0x08 ,(unsigned char *)&Brightness);  // read default
		return Brightness*(0xff-0x1)/100+0x1;  // 0x1 is min,0xff is max
	}
	else if( Brightness > 100 )
		Brightness = 100;

	Val = Brightness*(0xff-0x1)/100+0x1;  // 0x1 is min,0xff is max

	Video_IIC_Wr( 0x08, Val );
	pgOSConf->TVBrightness = Brightness;

	return Brightness;
}

// Range:1~100
int MX88V462_HScale(int ScaleVal)
{
	unsigned char Val;

	if( ScaleVal == 0 )
	{

		Video_IIC_Rd( 0x1f, &Val );
		ScaleVal = Val;

		Video_IIC_Rd( 0x1e, &Val );
		ScaleVal |= Val<<8;

		return ScaleVal*(0x600-0x400)/100+0x400;  // 0x400 is min,0x600 is max
	}
	else if( ScaleVal > 100 )
		ScaleVal = 100;

	pgOSConf->TvHScale = ScaleVal;

	ScaleVal = ScaleVal*(0x600-0x400)/100+0x400;  // 0x400 is min,0x600 is max

	Video_IIC_Wr( 0x1f, (unsigned char )ScaleVal );
	Video_IIC_Wr( 0x1e, ScaleVal >> 8 );

	return pgOSConf->TvHScale;
}



//***************************************************************
#ifdef UNDER_CE

static DWORD MX88V462_Thread(PVOID pParms)
{
	DWORD  IOVal;
	HANDLE hAVOutDet = NULL;

	hAVOutDet = CreateEvent(NULL, FALSE, TRUE, NULL);
	InterruptInitialize (SYSINTR_AV_DET, hAVOutDet, NULL, 0);

	sCPUIOP->rGPGUP  &=  ~(1<<5);     // Pull up enable
	sCPUIOP->rGPGCON &=  ~(3 << 10);
	sCPUIOP->rGPGCON |=   (2 << 10);   // set as EINT13

	sCPUIOP->rEXTINT1 |= (0xe << 20 );  // Eint13:both edge trigged

	while(1)
	{
		WaitForSingleObject(hAVOutDet, INFINITE);

		do
		{
			IOVal = sCPUIOP->rGPGDAT & (1<<5);
			Sleep(20);
		}while(  IOVal != ( sCPUIOP->rGPGDAT & (1<<5) ) );

		InterruptDone(SYSINTR_AV_DET);

		if( IOVal )  // have AU out
			MX88V462PowOff( FALSE );
		else
			MX88V462PowOff( TRUE );
	}

	return 0;
}

#endif

void MX88V462_Init( void )
{
#ifdef UNDER_CE
	HANDLE  hThread = NULL ;
#endif

	Video_IIC_Init( MX88V462_ADD );
	Uart_Printf("mx88v462 init ......\n");

#ifdef UNDER_CE
	hThread = CreateThread(NULL, 0, MX88V462_Thread, NULL, 0, NULL );
	if (hThread == NULL)
		RETAILMSG(1, (TEXT("MX88V462_Init: MX88V462_Thread init fail\r\n")));
	else
		CloseHandle( hThread );
#endif
}

//*******************************************************************
static void TVRegUpdate( PTV_REG  pTvReg,int ClkPol  )
{
	int i;
	MX88V462REG MX88V462Reg[50];

	//***********************************************************
	i =0;

	//***  set pll( depend on crystal) ************
	MX88V462Reg[i].cReg  = 0x2f;    MX88V462Reg[i++].cData = pTvReg->PLL2f;
	MX88V462Reg[i].cReg  = 0x30;    MX88V462Reg[i++].cData = pTvReg->PLL30;
	MX88V462Reg[i].cReg  = 0x31;    MX88V462Reg[i++].cData = pTvReg->PLL31;

	//***  set P Val ************
	MX88V462Reg[i].cReg  = 0x28;    MX88V462Reg[i++].cData = pTvReg->P28;
	MX88V462Reg[i].cReg  = 0x29;    MX88V462Reg[i++].cData = pTvReg->P29;
	MX88V462Reg[i].cReg  = 0x2a;    MX88V462Reg[i++].cData = pTvReg->P2a;

	//***  set N Val ************
	MX88V462Reg[i].cReg  = 0x2b;    MX88V462Reg[i++].cData = pTvReg->N2b;
	MX88V462Reg[i].cReg  = 0x2c;    MX88V462Reg[i++].cData = pTvReg->N2c;
	MX88V462Reg[i].cReg  = 0x2d;    MX88V462Reg[i++].cData = pTvReg->N2d;

	//***  set T Val ************
	MX88V462Reg[i].cReg  = 0x2e;    MX88V462Reg[i++].cData = pTvReg->T2e;;

	//***  set SCFREQ Val( depend on crystal) ************

	// ***  set Timming Val ************
	MX88V462Reg[i].cReg  = 0x11;    MX88V462Reg[i++].cData = (char)0x91;  // set auto input timing

	// *** common setting **************
	MX88V462Reg[i].cReg  = 0x0e;    MX88V462Reg[i++].cData = 0x01;     // set sync polarity ,amd coms input
	MX88V462Reg[i].cReg  = 0x1d;    MX88V462Reg[i++].cData = (ClkPol<<1) | 0x9c;  // set Clock polarity

	MX88V462Reg[i].cReg  = 0x09;    MX88V462Reg[i++].cData = 6;     // set sharpness
	MX88V462Reg[i].cReg  = 0x10;    MX88V462Reg[i++].cData = 3;     // set flicker filter.
	MX88V462Reg[i].cReg  = 0x1c;    MX88V462Reg[i++].cData = (char)0x81;  // enalbe dot craw reduction
	MX88V462Reg[i].cReg  = 0x63;    MX88V462Reg[i++].cData = 0x2;   // double 75Q

	// ********  set V position and H postion ***********
	MX88V462Reg[i].cReg  = 0x20;    MX88V462Reg[i++].cData = 2;    // V
	MX88V462Reg[i].cReg  = 0x22;    MX88V462Reg[i++].cData = 2;    // H

	//*****  other  set  ********
	MX88V462Reg[i].cReg  = 0x0a;    MX88V462Reg[i++].cData = 0x10| pTvReg->Tv_Mode;  // set ntsc-m mode

	MX88V462Reg[i].cReg  = (char)-1;   MX88V462Reg[i++].cData = (char)-1;

	MX88V462UpdateReg( MX88V462Reg );
}

void MX88V462_TV( PTV_REG pTvReg, int ClkPol )
{
	TVRegUpdate( pTvReg,ClkPol );

	MX88V462_HScale( pgOSConf->TvHScale );
	MX88V462_Contrast( pgOSConf->TVContrast );
	MX88V462_Brightness( pgOSConf->TVBrightness );

	MX88V462PowOff( FALSE );
}


void MX88V462_test(void)
{
	MX88V462_Init();
	Mod_MX88V462(1);	
	while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -