📄 mx88v462.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 + -