/*
********************************************************************************
* (c) Copyright 2006, Vineyard Technologies, Inc.
*
* Filename : tw2815.c
* Programmer(s): Steve KyeongHyeon Lee
* Created : 2006/11/22
********************************************************************************
*/
#include "types.h"
#include "i2c.h"
#include "tw2815.h"
#include "tw9910.h"
BYTE tw2815_init_val_per_ch[2][15] =
{
// Mike asked to change
// [0x08]:0x80 --> 0x76
/* ---- 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f */
/* 0x00 */ {0x00,0xC8,0x20,0xD0,0x06,0xF0,0x08,0x80,0x76,0x80,0x80,0x02,0x06,0x00,0x11}, // NTSC
/* 0x00 */ {0x00,0x88,0x20,0xD0,0x05,0x20,0x28,0x80,0x80,0x80,0x80,0x82,0x06,0x00,0x11} // PAL
};
BYTE tw2815_init_val_common[54] = /* Note: Kiman asked me to change 4d:80->88 */
{
/* ---- 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f */
/* 0x40 */ 0x00,0x00,0x00,0x80,0x45,0xA0,0xD0,0x2F,0x64,0x80,0x80,0x82,0x82,0x00,0x00,0x00, // 0x4d: 0x88=>0x00 (Mike) Step 26, 2007
/* 0x50 */ 0x00,0x0F,0x05,0x00,0x00,0x80,0x06,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,
/* 0x60 */ 0x88,0x88,0xC1,0x00,0x10,0x32,0x54,0x76,0x98,0xBA,0xDC,0xFE,0x41,0x1f,0x88,0x88,
/* 0x70 */ 0x88,0x11,0x40,0x88,0x88,0x00
};
BYTE tw2815_i2c_id[4] = {
I2C_BUS1_ADDR_TW2815,
I2C_BUS2_ADDR_TW2815,
I2C_BUS3_ADDR_TW2815,
I2C_BUS4_ADDR_TW2815
};
//===============================================================================
//
//===============================================================================
void tw2815_init(BYTE id, BYTE ntsc_pal)
{
BYTE reg_off=0;
BYTE reg_adr;
BYTE ch;
BYTE i;
BYTE bus_id;
#if (MAXVIDCH==4)
tw2815_init_val_common[0x0d]=0x88; // 0x4d: keep 0x88 at 4ch DVR
#endif
#if (MAXVIDCH==16)
tw2815_init_val_common[0x0d]=0x04; // 0x4d: 0x04 at 16ch DVR : Kiman recommended
#endif
#if (MAXAUDCH==4)
tw2815_init_val_common[0x23]=0x01; // for recording 4 channel audio
#endif
#if defined(VY_FPGA_KM_01) && (MAXAUDCH==4)
tw2815_init_val_common[0x24]=0x00; // aud_in0->rec_ch0, aud_in0->rec_ch1
tw2815_init_val_common[0x25]=0x11; // aud_in1->rec_ch2, aud_in1->rec_ch3
#endif
//---------------------------
tw2815_init_val_common[0x1c]=0x2f;//-----------------------------------------
//--------------------------
bus_id = tw2815_i2c_id[id];
if(i2c_check_device(bus_id)==FALSE)
{
printf("\n\rtw2815 [0x%02x] does not exist!", bus_id); FLUSHOUT;
return;
}
for(ch=0;ch<4;ch++){
if (ch==0) reg_adr = 0x00;
else if(ch==1) reg_adr = 0x10;
else if(ch==2) reg_adr = 0x20;
else reg_adr = 0x30;
for(reg_off=reg_adr,i=0x00; i<0x0F ;reg_off++,i++)
tw2815_write(id, reg_off, tw2815_init_val_per_ch[ntsc_pal][i]);
}
for(reg_off=0x40,i=0; reg_off<0x76; reg_off++,i++)
{
if(reg_off==0x5D||reg_off==0x5E||reg_off==0x5F)
continue;
tw2815_write(id, reg_off, tw2815_init_val_common[i]);
}
}
BYTE tw2815_read(BYTE id, BYTE idx)
{
BYTE ipr_data_in=0;
ipr_data_in=i2c_pkt_read(tw2815_i2c_id[id],idx);
return ipr_data_in;
}
//===============================================================================
//
//===============================================================================
BYTE tw2815_write(BYTE id, BYTE idx, BYTE val)
{
i2c_pkt_write(tw2815_i2c_id[id],idx,val);
return 0;
}
//===============================================================================
// Mute all audio channel
//===============================================================================
void tw2815_audio_mute(BYTE id)
{
tw2815_write(id, 0x6d, 0x1f);
#ifdef DEBUG_TW2815_AUDIO
printf("\n\rtw2815_audio_mute");
FLUSHOUT;
#endif
}
//===============================================================================
// Turn on the audio channel (0-1), 0x10->Playback channel
//===============================================================================
void tw2815_audio_on(BYTE id, BYTE aud_ch_num)
{
BYTE val;
#if defined(VY_FPGA_KM_01) && (MAXAUDCH==4)
if(aud_ch_num!=0x10) aud_ch_num = (BYTE)(aud_ch_num / 2);
#endif
if(aud_ch_num==0x10) val = 0x0f;
else val = (BYTE) ((~(0x01<<aud_ch_num)) &0x1F) ;
tw2815_write(id, 0x6d, val );
#ifdef DEBUG_TW2815_AUDIO
if(aud_ch_num==0x10)
printf("\n\rtw2815_audio_on( playback )");
else
printf("\n\rtw2815_audio_on( ch=%d ) [%02x]", (int)aud_ch_num, val );
FLUSHOUT;
#endif
}
void YUV_SetBrightness(BYTE ch, WORD bBrightness)
{
// bBrightness ^= 0x80;
BYTE value,id=0;
#if (MAXVIDCH==9) ||(MAXVIDCH==4)
if(ch<4)
id=0;
else if(ch<8)
id=1;
#endif
#if(MAXVIDCH==16)
else if(ch<12)
id=2;
else
id=3;
#endif
bBrightness = bBrightness*255 /100; //------128 as default-------2815---------
value = bBrightness;
#if (MAXVIDCH==16) ||(MAXVIDCH==4)
tw2815_write(id,0x0a+0x10*(ch%4),value);
#endif
#if (MAXVIDCH==9)
if(ch==9)
tw9910_write(ch,0x10,value);
#endif
}
void YUV_SetContrast(BYTE ch, WORD bContrast)
{
BYTE value,id=0;
#if (MAXVIDCH==9) ||(MAXVIDCH==4)
if(ch<4)
id=0;
else if(ch<8)
id=1;
#endif
#if(MAXVIDCH==16)
else if(ch<12)
id=2;
else
id=3;
#endif
bContrast = bContrast*255 /100; //------128 as default-------2815---------
value = bContrast;
#if (MAXVIDCH==16) ||(MAXVIDCH==4)
tw2815_write(id,0x09+0x10*(ch%4),value);
#endif
#if (MAXVIDCH==9)
if(ch==9)
tw9910_write(ch,0x11,value);
#endif
}
void YUV_SetSaturation(BYTE ch, WORD bSaturation)
{
BYTE value,id=0;
#if (MAXVIDCH==9) ||(MAXVIDCH==4)
if(ch<4)
id=0;
else if(ch<8)
id=1;
#endif
#if(MAXVIDCH==16)
else if(ch<12)
id=2;
else
id=3;
#endif
bSaturation = bSaturation*255 /100; //------128 as default-------2815---------
value = bSaturation;
#if (MAXVIDCH==16) ||(MAXVIDCH==4)
tw2815_write(id,0x08+0x10*(ch%4),value);
#endif
#if (MAXVIDCH==9)
if(ch==9)
{
tw9910_write(ch,0x13,value);
tw9910_write(ch,0x14,value);
}
#endif
}
void YUV_SetHue(BYTE ch, WORD bHue)
{
BYTE value,id=0;
#if (MAXVIDCH==9) ||(MAXVIDCH==4)
if(ch<4)
id=0;
else if(ch<8)
id=1;
#endif
#if(MAXVIDCH==16)
else if(ch<12)
id=2;
else
id=3;
#endif
bHue = bHue*255 /100; //------128 as default-------2815---------
value = bHue;
#if (MAXVIDCH==16) ||(MAXVIDCH==4)
tw2815_write(id,0x07+0x10*(ch%4),value);
#endif
#if (MAXVIDCH==9)
if(ch==9)
tw9910_write(ch,0x15,value);
#endif
}
#ifdef TW2865_DECODER_ENCODER_VIDEO
//-------------define the tw2865 i2c address-----------------------
#define I2C_BUS1_ADDR_TW2865 0x50
#define I2C_BUS2_ADDR_TW2865 0x52
#define I2C_BUS3_ADDR_TW2865 0x54
#define I2C_BUS4_ADDR_TW2865 0x56
//-------------define the valid and the functions---------------------
BYTE tw2865_init_val_per_ch[2][16] =
{
/* ---- 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f */
/* 0x00 */ {0x02,0x00,0x64,0x11,0x80,0x80,0x00,0x02,0x12,0xf0,0x0c,0xd0,0x00,0x00,0x07,0x7f}, // NTSC
/* 0x00 */ {0x02,0x00,0x64,0x11,0x80,0x80,0x00,0x12,0x18,0x20,0x0c,0xd0,0x00,0x00,0x07,0x7f} // PAL
};
BYTE tw2865_init_val_audio_com[32] =
{
/* ---- 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f */
/* 0xd0 */0x88,0x88,0x41,0x10,0x32,0x10,0x32,0x10,0x32,0x10,0x32,0xc9,0x1f,0x00,0x00,0xa0,
/* 0xe0*/ 0x14,0xc0,0xaa,0xaa,0x00,0x11,0x00,0x00,0x11,0x00,0x00,0x11,0x00,0x00,0x11,0x00
};
BYTE tbl_pal_ntsc_tw2865_8KHz[2][6] = {
0x83,0xB5,0x09,0x78,0x85,0x00, //...0xF0~0xF5 ntsc
0x83,0xB5,0x09,0x00,0xA0,0x00 //...0xF0~0xF5 pal
};
BYTE tbl_pal_ntsc_tw2865_16KHz[2][6] = {
0x07,0x6B,0x13,0xEF,0x0A,0x01, //...0xF0~0xF5 ntsc
0x07,0x6B,0x13,0x00,0x40,0x01 //...0xF0~0xF5 pal
};
BYTE tw2865_i2c_id[4] = {
I2C_BUS1_ADDR_TW2865,
I2C_BUS2_ADDR_TW2865,
I2C_BUS3_ADDR_TW2865,
I2C_BUS4_ADDR_TW2865
};
//=========