📄 saa7114.c
字号:
#include "IIC.H"
#include "8051.H"
#include "stdio.h"
#include "SAA7114.H"
#include "RAM.H"
#include "F63REG.H"
#include "MyDef.H"
#include "MCU.H"
#include "OSD.H"
#include "Scaler.H"
#include "PANEL.H"
#include "sRGB.H"
idata unsigned char MuteFlag;
unsigned char code NTSC_AV[]={//register data
//0x01~0x0f
0x00,0x08,0xc5,0x10,0x90,0x90,0xeb,0xe0,
0xb8,0x40,0x80,0x44,0x40,0x00,0x89,0x2a,
//0x10~0x1f
0x0e,0x00,0x00,0x00,0x00,0x11,0xfe,0x40,
0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
//0x20~0x2f
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x30~0x3f
0xbc,0xdf,0x02,0x00,0xcd,0xcc,0x3a,0x00,
0x03,0x20,0x03,0x00,0x00,0x00,0x00,0x00,
//0x40~0x4f
0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
//0x50~0x5f
0xff,0xff,0xff,0xff,0x5f,0xff,0xff,0xff,
0x00,0x47,0x06,0x83,0x00,0x3e,0x00,0x00,
//0x60~0x6f
0x00,0x05,0xa0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x70~0x7f
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x80~0x8f
0x12,0x00,0x00,0x01,0x01,0x04,0x45,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0x90~0x9f
0x00,0x08,0x09,0x40,0x10,0x00,0xd0,0x02,
0x0a,0x00,0xf0,0x00,0xd0,0x02,0xf0,0x00,
//0xa0~0xaf
0x01,0x00,0x00,0x00,0x80,0x40,0x40,0x00,
0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,
//0xb0~0xbf
0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//0xc0~0xcf
0x00,0x08,0x10,0x81,0x10,0x00,0xd0,0x02,
0x0a,0x00,0x20,0x01,0xd0,0x02,0x20,0x01,
//0xd0~0xdf
0x01,0x00,0x00,0x00,0x80,0x40,0x40,0x00,
0x00,0x04,0x00,0x00,0x00,0x02,0x00,0x00,
//0xe0~0xef
0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void SAA7114Init(void)
{
unsigned char i;
//saa7114 load table
VideoEnable();
ScalerPowerUp();
Sleep(10);
flag1 &= ~BIT_1; //Clear fource to background
ForceToBackground(0);
for(i=0; i<0xf0; i=i+16){
WritePageSAA7114(i,i);
}
WriteIIC_HW(SAA7114,0x88,0xe0);
switch(PowerStatus)
{
case 0x81:
WriteIIC_HW(SAA7114,0x02,0xc5); //SAA7114 AV In
WriteIIC_HW(SAA7114,0x09,0x40); //SAA7114 no YCOMB
WriteIIC_HW(SAA7114,0x14,0x22); //aout=ad2
break;
case 0x82:
WriteIIC_HW(SAA7114,0x02,0xc6); //SAA7114 Y/C In
WriteIIC_HW(SAA7114,0x09,0x40); //SAA7114 no YCOMB
WriteIIC_HW(SAA7114,0x14,0x22); //aout=ad2
break;
case 0x83:
WriteIIC_HW(SAA7114,0x02,0xc4); //SAA7114 TV In
WriteIIC_HW(SAA7114,0x09,0xc0); //SAA7114 YCOMB
WriteIIC_HW(SAA7114,0x14,0x22); //aout=ad1
break;
}
WriteIIC_HW(Scaler_Addr,0x12,0x03);
WriteIIC_HW(Scaler_Addr,0x13,0x33);
WriteIIC_HW(Scaler_Addr,0x00,0x32);
WriteIIC_HW(Scaler_Addr,0xE8,0x00);
R_Gain = 80;
G_Gain = 80;
B_Gain = 80;
sRGB();
Brightness = Read24C16(0xd6); //0xd6 = brightness
Contrast = Read24C16(0xd7); //0xd7 = contrast
Saturation = Read24C16(0xd8); //0xd8 = video saturation
Tint = Read24C16(0xd9); //0xd6 = video hue
Sharpness = Read24C16(0xda); //0xda = Sharpness(video)
SetVideoBrightness();
SetVideoContrast();
SetVideoSaturation();
SetVideoTint();
SetVideoSharpness();
ColorStatus = 0;
flag2 |= 0x07;
// NT68520PowerUp();
// Sleep(100);
// if(((PortC & BIT_0) == 0)&&(PowerStatus > 0x80)){
// Sleep(PowerUpInvTiming);
BackLightOn();
// }
SetVolume();
}
/*
void CheckVideo(void)
{
unsigned char value;
value = ReadIIC_HW(SAA7114,0x1f);
if(((value & 0x41) != 0x01) && ((flag2 & BIT_1) == 0)){
//change to unlocked
flag2 &= ~BIT_0;
flag2 |= BIT_1;
flag1 &= ~BIT_1; //Clear fource to background
ForceToBackground(1);
Timer3 = 100;
if(PowerStatus == 0x83){
AUDIO_MUTE();
}
if((flag3 & BIT_2) != 0x00){
printf("No Video\r\n");
}
}
if(((value & BIT_6) == 0) && ((flag2 & BIT_1) != 0)){
//change to locked
flag2 &= ~BIT_0;
flag2 &= ~BIT_1;
SetAV_System();
Timer3 = 100;
if(PowerStatus == 0x83){
if((flag3 & BIT_4) == 0)
AUDIO_On();
else
AUDIO_MUTE();
}
if((flag3 & BIT_2) != 0x00){
printf("Video again\r\n");
}
}
//check vertical
if(((value & BIT_5) == 0) && ((flag2 & 0x06) == 0x04)){
//change to 50Hz
flag2 &= ~BIT_0;
flag2 &= ~BIT_2;
SetAV_System();
Timer3 = 100;
}
if(((value & BIT_5) != 0) && ((flag2 & 0x06) == 0x00)){
//change to 60Hz
flag2 &= ~BIT_0;
flag2 |= BIT_2;
SetAV_System();
Timer3 = 100;
}
//check color system
if(((value & 0x41) == 0x00)&&((flag2 & BIT_1) == 0)){
CheckColorSystem();
}
}
*/
void CheckVideo(void)
{
unsigned char value;
// if(DecodeDelay==0)
// {
// DecodeDelay=50;
value = ReadIIC_HW(SAA7114,0x1f);
if(((value & BIT_6) != 0x00) && ((flag2 & BIT_1) == 0))
{ //change to unlocked
AUDIO_MUTE(); //AUDIO MUTE
flag2 &= ~BIT_0;
flag2 |= BIT_1;
Timer3 = 100;
// flag1 &= ~BIT_1; //Clear force to background
// ForceToBackground(1);
}
else if(((value & BIT_6) == 0) && ((flag2 & BIT_1) != 0))
{ //change to locked
if((value & BIT_5) == 0)
{ //change to 50Hz
if(Volume !=0) //CANCEL AUDIO MUTE
{ if(MuteFlag != 1)
AUDIO_On();
}
flag2 &= ~BIT_0;
flag2 &= ~BIT_1;
flag2 &= ~BIT_2;
SetAV_System();
Timer3 = 100;
}
if((value & BIT_5) != 0)
{ //change to 60Hz
if(Volume !=0) //CANCEL AUDIO MUTE
{ if(MuteFlag != 1)
AUDIO_On();
}
flag2 &= ~BIT_0;
flag2 &= ~BIT_1;
flag2 |= BIT_2;
SetAV_System();
Timer3 = 100;
}
}
else if(((value & BIT_6) != 0x00) && ((flag2 & BIT_1) != 0))
{ //change to unlocked
AUDIO_MUTE(); //AUDIO MUTE
flag1 &= ~BIT_1; //Clear force to background
ForceToBackground(1);
}
// }
}
void SetAV_System(void)
{
flag1 &= ~BIT_5;
CheckColorSystem();
SetScalerAV();
SetDisplayNormal();
}
void CheckColorSystem(void)
{
unsigned char code tab1[]={
// 0x09,0x29,0x01,0x31,0x21,0x11,0x59
0x81,0x91,0xa1,0xb1,0xc1,0xd0
// 0x01,0x11,0x21,0x31,0x41,0x51
};
unsigned char code tab2[]={
// 0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0xae
// 0x2e,0x2e,0x2e,0x2e,0x2e,0xae
0x2a,0x2a,0x2a,0x2a,0x2a,0x80
};
unsigned char i,value,k;
if((flag1 & BIT_5) != 0)
return;
i = 0;
WriteIIC_HW(SAA7114,0x0e,tab1[i]);
WriteIIC_HW(SAA7114,0x0f,tab2[i]);
k = 3;
while(k != 0){
k--;
value = ReadIIC_HW(SAA7114,0x1f);
if((value & 0x41) != 0x01){
for(i=0; i<6; i++){
WriteIIC_HW(SAA7114,0x0e,tab1[i]);
WriteIIC_HW(SAA7114,0x0f,tab2[i]);
Sleep(100);
value = ReadIIC_HW(SAA7114,0x1f);
if((value & 0x41) == 0x01){
ColorStatus = i;
break;
}
}
}
}
if(i == 0x06){
i = ColorStatus;
WriteIIC_HW(SAA7114,0x0e,tab1[i]);
WriteIIC_HW(SAA7114,0x0f,tab2[i]);
flag1 |= BIT_5;
if((flag3 & BIT_2) != 0x00){
printf("Color system = B/W\r\n");
}
}
else{
flag1 &= ~BIT_5;
if((flag3 & BIT_2) != 0x00){
printf("Color system = %x\r\n",(unsigned short)i);
}
}
WriteIIC_HW(SAA7114,0x0e,tab1[i] & ~BIT_7);
WriteIIC_HW(SAA7114,0x0e,tab1[i]);
i = i * 2;
if(((value & BIT_5) == 0) && ((flag2 & 0x06) == 0x04)){
//change to 50Hz
flag2 &= ~BIT_2;
}
if(((value & BIT_5) != 0) && ((flag2 & 0x06) == 0x00)){
//change to 60Hz
flag2 |= BIT_2;
}
if((flag2 & BIT_2) != 0)
i++;
switch(i){
case 0:
case 3:
case 4:
case 7:
//PAL
value = ReadIIC_HW(SAA7114,0x09);
value &= BIT_7;
value |= BIT_6;
WriteIIC_HW(SAA7114,0x09,value);
value = ReadIIC_HW(SAA7114,0x0e);
value &= ~BIT_3;
WriteIIC_HW(SAA7114,0x0e,value);
WriteIIC_HW(SAA7114,0x0f,0x2a);
WriteIIC_HW(SAA7114,0x10,0x06);
break;
case 1:
case 2:
case 5:
case 6:
case 9:
//NTSC
value = ReadIIC_HW(SAA7114,0x09);
value &= BIT_7;
value |= BIT_6;
WriteIIC_HW(SAA7114,0x09,value);
value = ReadIIC_HW(SAA7114,0x0e);
value |= BIT_3;
WriteIIC_HW(SAA7114,0x0e,value);
WriteIIC_HW(SAA7114,0x0f,0x2a);
WriteIIC_HW(SAA7114,0x10,0x0e);
break;
case 10:
//SECAM
value = ReadIIC_HW(SAA7114,0x09);
value &= BIT_7;
value |= 0x1b;
WriteIIC_HW(SAA7114,0x09,value);
WriteIIC_HW(SAA7114,0x0f,0x80);
WriteIIC_HW(SAA7114,0x10,0x00);
break;
}
}
void WritePageSAA7114(unsigned char addr1,unsigned char addr2)
{
unsigned char i,ch;
/* start bit */
/* transmit device */
INTIIC1_FLG = 0xff;
IIC1_DATA = SAA7114;
IIC1_CLK = 0x20 | IIC_BaudRate;
IIC1_CON = 0x00;
/* transmit addr */
MasterSendByte(addr1);
for(i=0; i<16; i++){
ch = NTSC_AV[addr2 + i];
MasterSendByte(ch);
}
/* transmit dumy data for stop bit */
WaitTx();
/* stop bit */
IIC1_CLK = 0xA0|IIC_BaudRate;
// IIC1_CON = 0x00;
WaitStop();
}
void SetVideoBrightness(void)
{
unsigned char value;
value = Brightness * 2 + 28;
WriteIIC_HW(SAA7114,0x0a,value);
if((flag3 & BIT_2) != 0x00){
printf("Brightness of SAA7114 = %x\r\n",(unsigned short)value);
}
}
void SetVideoContrast(void)
{
unsigned char value;
value = Contrast + 14;
WriteIIC_HW(SAA7114,0x0b,value);
if((flag3 & BIT_2) != 0x00){
printf("Contrast of SAA7114 = %x\r\n",(unsigned short)value);
}
}
void SetVideoSaturation(void)
{
unsigned char value;
value = Saturation + 14;
WriteIIC_HW(SAA7114,0x0c,value);
if((flag3 & BIT_2) != 0x00){
printf("Saturation of SAA7114 = %x\r\n",(unsigned short)value);
}
}
void SetVideoTint(void)
{
unsigned char value;
value = (((unsigned short)Tint * 255 + 50) / 100) - 128;
WriteIIC_HW(SAA7114,0x0d,value);
if((flag3 & BIT_2) != 0x00){
printf("Tint of SAA7114 = %x\r\n",(unsigned short)value);
}
}
void SetVideoSharpness(void)
{
code unsigned char SharpnessTab[]={
// 0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x00,0x07,0x06,0x05,0x04,0x03,0x02,0x01
0x0b,0x0a,0x09,0x08,0x00,0x06,0x04,0x02
};
unsigned char value;
value = ReadIIC_HW(SAA7114,0x09) & 0xf0;
value |= SharpnessTab[Sharpness];
WriteIIC_HW(SAA7114,0x09,value);
if((flag3 & BIT_2) != 0x00){
printf("Sharpness of SAA7114 = %x\r\n",(unsigned short)value);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -