466 lines
12 KiB
C
466 lines
12 KiB
C
#include "FreeRTOS.h"
|
|
#include "board.h"
|
|
#include "chip.h"
|
|
|
|
#ifdef VIDEO_DECODER_RN6752
|
|
|
|
#define RN6752_RST_GPIO 7
|
|
#define RN6752_SLAVE_ADDR (0x58 >> 1)
|
|
|
|
|
|
/*-----------------------------------------------------------*/
|
|
|
|
static int rn6752_i2c_write (struct i2c_adapter *adap, unsigned int addr, unsigned int data)
|
|
{
|
|
struct i2c_msg msg;
|
|
int ret = -1;
|
|
u8 retries = 0;
|
|
u8 buf[2];
|
|
|
|
buf[0] = (addr & 0xFF);
|
|
buf[1] = (data & 0xFF);
|
|
|
|
msg.flags = !I2C_M_RD;
|
|
msg.addr = RN6752_SLAVE_ADDR;
|
|
msg.len = sizeof(buf);
|
|
msg.buf = buf;
|
|
|
|
while(retries < 5)
|
|
{
|
|
ret = i2c_transfer(adap, &msg, 1);
|
|
if (ret == 1)
|
|
break;
|
|
retries++;
|
|
}
|
|
|
|
if (retries >= 5)
|
|
{
|
|
printf("%s timeout\n", __FUNCTION__);
|
|
return -1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* static unsigned int rn6752_i2c_read(struct i2c_adapter *adap, unsigned int addr)
|
|
{
|
|
struct i2c_msg msgs[2];
|
|
int retries = 0;
|
|
int ret = -1;
|
|
u8 buf;
|
|
|
|
buf = addr & 0xFF;
|
|
|
|
msgs[0].flags = !I2C_M_RD;
|
|
msgs[0].addr = RN6752_SLAVE_ADDR;
|
|
msgs[0].len = 1;
|
|
msgs[0].buf = &buf;
|
|
msgs[1].flags = I2C_M_RD;
|
|
msgs[1].addr = RN6752_SLAVE_ADDR;
|
|
msgs[1].len = 1;
|
|
msgs[1].buf = &buf;
|
|
|
|
while(retries < 5)
|
|
{
|
|
ret = i2c_transfer(adap, msgs, 2);
|
|
if(ret == 2)
|
|
break;
|
|
retries++;
|
|
}
|
|
|
|
if (retries >= 5)
|
|
{
|
|
printf( "%s timeout\n", __FUNCTION__);
|
|
return 0;
|
|
}
|
|
|
|
return buf;
|
|
} */
|
|
|
|
static void rn6752_reset(void)
|
|
{
|
|
gpio_direction_output(RN6752_RST_GPIO, 1);
|
|
vTaskDelay(10);
|
|
gpio_direction_output(RN6752_RST_GPIO, 0);
|
|
vTaskDelay(10);
|
|
gpio_direction_output(RN6752_RST_GPIO, 1);
|
|
vTaskDelay(100);
|
|
|
|
}
|
|
|
|
typedef struct _RXCCHIPstaticPara
|
|
{
|
|
unsigned int addr;
|
|
unsigned int dat;
|
|
} RXCHIPstaticPara;
|
|
|
|
#if VIDEO_IN_FORMAT == VIN_AHD_720P_25
|
|
const RXCHIPstaticPara rn6752m_720p_25_staticPara[]=
|
|
{
|
|
//RN6752M-601-720P(°üÀ¨Í¬Öá¿ØÖÆ)
|
|
// 720P@25 BT601
|
|
// Slave address is 0x58
|
|
// Register, data
|
|
|
|
// if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
|
|
//0xD2, 0x85, // disable auto clock detect
|
|
//0xD6, 0x37, // 27MHz default
|
|
//0xD8, 0x18, // switch to 26MHz clock
|
|
//delay(100), // delay 100ms
|
|
|
|
{0x81, 0x01}, // turn on video decoder
|
|
{0xA3, 0x04},
|
|
{0xDF, 0xFE}, // enable HD format
|
|
{0x88, 0x40}, // disable SCLK0B out
|
|
{0xF6, 0x40}, // disable SCLK3A out
|
|
|
|
// ch0
|
|
{0xFF, 0x00}, // switch to ch0 (default; optional)
|
|
{0x2C, 0x30},
|
|
{0x2D, 0xF0},
|
|
{0x00, 0x20}, // internal use*
|
|
{0x06, 0x08}, // internal use*
|
|
{0x07, 0x63}, // HD format
|
|
{0x2A, 0x01}, // filter control
|
|
{0x3A, 0x00}, // No Insert Channel ID in SAV/EAV code
|
|
{0x3F, 0x10}, // channel ID
|
|
{0x4C, 0x37}, // equalizer
|
|
{0x4F, 0x03}, // sync control
|
|
{0x50, 0x02}, // 720p resolution
|
|
{0x56, 0x05}, // BT 72M mode and BT601 mode
|
|
{0x5F, 0x40}, // blank level
|
|
{0x63, 0xF5}, // filter control
|
|
{0x59, 0x00}, // extended register access
|
|
{0x5A, 0x42}, // data for extended register
|
|
{0x58, 0x01}, // enable extended register write
|
|
{0x59, 0x33}, // extended register access
|
|
{0x5A, 0x23}, // data for extended register
|
|
{0x58, 0x01}, // enable extended register write
|
|
{0x51, 0xE1}, // scale factor1
|
|
{0x52, 0x88}, // scale factor2
|
|
{0x53, 0x12}, // scale factor3
|
|
{0x5B, 0x07}, // H-scaling control
|
|
{0x5E, 0x08}, // enable H-scaling control
|
|
{0x6A, 0x82}, // H-scaling control
|
|
{0x28, 0x92}, // cropping
|
|
{0x01, 0x08}, // brightness
|
|
{0x02, 0x80}, // contrast
|
|
{0x03, 0x80}, // saturation
|
|
{0x04, 0x80}, // hue
|
|
{0x05, 0x03}, // sharpness
|
|
{0x09, 0xC8}, // EQ
|
|
{0x34, 0x02}, // OB
|
|
{0x57, 0x15}, // black/white stretch
|
|
{0x68, 0x32}, // coring
|
|
|
|
{0x00, 0x20}, // internal use*
|
|
{0x0D, 0x20}, // cagc initial value
|
|
//{0x2D, 0xF2}, // cagc adjust
|
|
{0x37, 0X33},
|
|
{0x61, 0X6C},
|
|
|
|
//{0x30, 0X30},// V30H_0836_NEW
|
|
//{0x0d, 0X50},
|
|
|
|
//{0x3A, 0x04},
|
|
//{0x3E, 0x32},
|
|
{0x3A, 0x02},//P-MOS
|
|
{0x3E, 0xf6},//ͬÖáÓ³Éäµ½AVID½Å
|
|
|
|
{0x40, 0x04},
|
|
{0x46, 0x23},
|
|
|
|
{0x47, 0x30},
|
|
|
|
//{0x49, 0x84},//85
|
|
{0x6d, 0x00},
|
|
|
|
{0x8E, 0x00}, // single channel output for VP
|
|
{0x8F, 0x80}, // 720p mode for VP
|
|
{0x8D, 0x31}, // enable VP out
|
|
{0x89, 0x09}, // select 72MHz for SCLK
|
|
{0x88, 0x41}, // enable SCLK out
|
|
|
|
{0x96, 0x00}, // select AVID & VBLK as status indicator
|
|
{0x97, 0x0B}, // enable status indicator out on AVID,VBLK & VSYNC
|
|
{0x98, 0x00}, // video timing pin status
|
|
{0x9A, 0x40}, // select AVID & VBLK as status indicator
|
|
{0x9B, 0xE1}, // enable status indicator out on HSYNC
|
|
{0x9C, 0x00}, // video timing pin status
|
|
|
|
//{0x00, 0xC0},//test bar color
|
|
};
|
|
#endif
|
|
|
|
#if VIDEO_IN_FORMAT == VIN_AHD_720P_30
|
|
const RXCHIPstaticPara rn6752m_720p_30_staticPara[]=
|
|
{
|
|
// 720P@30 BT601
|
|
// Slave address is 0x58
|
|
// Register, data
|
|
|
|
// if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
|
|
//0xD2, 0x85, // disable auto clock detect
|
|
//0xD6, 0x37, // 27MHz default
|
|
//0xD8, 0x18, // switch to 26MHz clock
|
|
//delay(100), // delay 100ms
|
|
0x49,0x01,
|
|
0x19,0x07,
|
|
0x81, 0x01, // turn on video decoder
|
|
0xA3, 0x04,
|
|
0xDF, 0xFE, // enable HD format
|
|
0x88, 0x40, // disable SCLK0B out
|
|
0xF6, 0x40, // disable SCLK3A out
|
|
|
|
// ch0
|
|
0xFF, 0x00, // switch to ch0 (default; optional)
|
|
0x00, 0x20, // internal use*
|
|
0x06, 0x08, // internal use*
|
|
0x07, 0x63, // HD format
|
|
0x2A, 0x01, // filter control
|
|
0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
|
|
0x3F, 0x10, // channel ID
|
|
0x4C, 0x37, // equalizer
|
|
0x4F, 0x03, // sync control
|
|
0x50, 0x02, // 720p resolution
|
|
0x56, 0x05, // BT 72M mode and BT601 mode
|
|
0x5F, 0x40, // blank level
|
|
0x63, 0xF5, // filter control
|
|
0x59, 0x00, // extended register access
|
|
0x5A, 0x44, // data for extended register
|
|
0x58, 0x01, // enable extended register write
|
|
0x59, 0x33, // extended register access
|
|
0x5A, 0x23, // data for extended register
|
|
0x58, 0x01, // enable extended register write
|
|
0x51, 0xE1, // scale factor1
|
|
0x52, 0x88, // scale factor2
|
|
0x53, 0x12, // scale factor3
|
|
0x5B, 0x07, // H-scaling control
|
|
0x5E, 0x0B, // enable H-scaling control
|
|
0x6A, 0x82, // H-scaling control
|
|
0x28, 0x92, // cropping
|
|
0x03, 0x80, // saturation
|
|
0x04, 0x80, // hue
|
|
0x05, 0x00, // sharpness
|
|
0x57, 0x23, // black/white stretch
|
|
0x68, 0x32, // coring
|
|
0x3A, 0x04,
|
|
0x3E, 0x32,
|
|
0x40, 0x04,
|
|
0x46, 0x23,
|
|
|
|
0x8E, 0x00, // single channel output for VP
|
|
0x8F, 0x80, // 720p mode for VP
|
|
0x8D, 0x31, // enable VP out
|
|
0x89, 0x09, // select 72MHz for SCLK
|
|
0x88, 0x41, // enable SCLK out
|
|
|
|
0XD3,0X00,//channel 0 0x00 channel 1 0X01
|
|
|
|
0x96, 0x00, // select AVID & VBLK as status indicator
|
|
0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
|
|
0x98, 0x00, // video timing pin status
|
|
0x9A, 0x40, // select AVID & VBLK as status indicator
|
|
0x9B, 0xE1, // enable status indicator out on HSYNC
|
|
0x9C, 0x00, // video timing pin status
|
|
};
|
|
#endif
|
|
|
|
#if VIDEO_IN_FORMAT == VIN_CVBS_NTSC
|
|
const RXCHIPstaticPara rn6752m_cvbs_ntsc_staticPara[]=
|
|
{
|
|
// if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
|
|
//0xD2, 0x85, // disable auto clock detect
|
|
//0xD6, 0x37, // 27MHz default
|
|
//0xD8, 0x18, // switch to 26MHz clock
|
|
//delay(100), // delay 100ms
|
|
|
|
0x81, 0x01, // turn on video decoder
|
|
0xA3, 0x00,
|
|
0xDF, 0xFF, // enable CVBS format
|
|
|
|
// ch0
|
|
0xFF, 0x00, // switch to ch0 (default; optional)
|
|
0x00, 0x00, // internal use*
|
|
0x06, 0x08, // internal use*
|
|
0x07, 0x63, // HD format
|
|
0x2A, 0x81, // filter control
|
|
0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
|
|
0x3F, 0x10, // channel ID
|
|
0x4C, 0x37, // equalizer
|
|
0x4F, 0x00, // sync control
|
|
0x50, 0x00, // D1 resolution
|
|
0x56, 0x04, // 27M mode and BT601 mode
|
|
0x5F, 0x00, // blank level
|
|
0x63, 0x75, // filter control
|
|
0x59, 0x00, // extended register access
|
|
0x5A, 0x00, // data for extended register
|
|
0x58, 0x01, // enable extended register write
|
|
0x59, 0x33, // extended register access
|
|
0x5A, 0x02, // data for extended register
|
|
0x58, 0x01, // enable extended register write
|
|
0x5B, 0x00, // H-scaling control
|
|
0x5E, 0x01, // enable H-scaling control
|
|
0x6A, 0x00, // H-scaling control
|
|
0x28, 0xB2, // cropping
|
|
0x20, 0x24,
|
|
0x23, 0x11,
|
|
0x24, 0x05,
|
|
0x25, 0x11,
|
|
0x26, 0x00,
|
|
0x42, 0x00,
|
|
0x03, 0x80, // saturation
|
|
0x04, 0x80, // hue
|
|
0x05, 0x03, // sharpness
|
|
0x57, 0x20, // black/white stretch
|
|
0x68, 0x32, // coring
|
|
0x3A, 0x04,
|
|
0x3E, 0x32,
|
|
0x40, 0x04,
|
|
0x46, 0x23,
|
|
|
|
|
|
0x8E, 0x00, // single channel output for VP
|
|
0x8F, 0x00, // D1 mode for VP
|
|
0x8D, 0x31, // enable VP out
|
|
0x89, 0x00, // select 27MHz for SCLK
|
|
0x88, 0x41, // enable SCLK out
|
|
|
|
0x96, 0x00, // select AVID & VBLK as status indicator
|
|
0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
|
|
0x98, 0x00, // video timing pin status
|
|
0x9A, 0x40, // select AVID & VBLK as status indicator
|
|
0x9B, 0xE1, // enable status indicator out on HSYNC
|
|
0x9C, 0x00, // video timing pin status
|
|
};
|
|
#endif
|
|
|
|
#if VIDEO_IN_FORMAT == VIN_CVBS_PAL
|
|
const RXCHIPstaticPara rn6752m_cvbs_pal_staticPara[]=
|
|
{
|
|
// cvbs@25 BT601
|
|
// Slave address is 0x58
|
|
// Register, data
|
|
|
|
// if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
|
|
//0xD2, 0x85, // disable auto clock detect
|
|
//0xD6, 0x37, // 27MHz default
|
|
//0xD8, 0x18, // switch to 26MHz clock
|
|
//delay(100), // delay 100ms
|
|
0x49,0x01,
|
|
0x19,0x07,
|
|
0x81, 0x01, // turn on video decoder
|
|
0xA3, 0x04,
|
|
0xDF, 0x0F, // enable CVBS format
|
|
|
|
0x88, 0x40, // disable SCLK0B out
|
|
0xF6, 0x40, // disable SCLK3A out
|
|
|
|
// ch0
|
|
0xFF, 0x00, // switch to ch0 (default; optional)
|
|
0x00, 0x00, // internal use*
|
|
0x06, 0x08, // internal use*
|
|
0x07, 0x62, // HD format
|
|
0x2A, 0x81, // filter control
|
|
0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
|
|
0x3F, 0x10, // channel ID
|
|
0x4C, 0x37, // equalizer
|
|
0x4F, 0x00, // sync control
|
|
0x50, 0x00, // 720p resolution
|
|
0x56, 0x05, // 72M mode and BT601 mode
|
|
0x5F, 0x00, // blank level
|
|
0x63, 0x75, // filter control
|
|
0x59, 0x00, // extended register access
|
|
0x5A, 0x00, // data for extended register
|
|
0x58, 0x01, // enable extended register write
|
|
0x59, 0x33, // extended register access
|
|
0x5A, 0x02, // data for extended register
|
|
0x58, 0x01, // enable extended register write
|
|
0x5B, 0x00, // H-scaling control
|
|
0x5E, 0x01, // enable H-scaling control
|
|
0x6A, 0x00, // H-scaling control
|
|
0x28, 0xB2, // cropping
|
|
0x20, 0x24,
|
|
0x23, 0x17,
|
|
0x24, 0x37,
|
|
0x25, 0x17,
|
|
0x26, 0x00,
|
|
0x42, 0x00,
|
|
0x03, 0x80, // saturation
|
|
0x04, 0x80, // hue
|
|
0x05, 0x03, // sharpness
|
|
0x57, 0x20, // black/white stretch
|
|
0x68, 0x32, // coring
|
|
0x3A, 0x04,
|
|
0x3E, 0x32,
|
|
0x40, 0x04,
|
|
0x46, 0x23,
|
|
|
|
0x8E, 0x00, // single channel output for VP
|
|
0x8F, 0x80, // 720p mode for VP
|
|
0x8D, 0x31, // enable VP out
|
|
0x89, 0x09, // select 72MHz for SCLK
|
|
0x88, 0x41, // enable SCLK out
|
|
|
|
0x96, 0x00, // select AVID & VBLK as status indicator
|
|
0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
|
|
0x98, 0x00, // video timing pin status
|
|
0x9A, 0x40, // select AVID & VBLK as status indicator
|
|
0x9B, 0xE1, // enable status indicator out on HSYNC
|
|
0x9C, 0x00, // video timing pin status
|
|
};
|
|
#endif
|
|
|
|
static void rn6752_config(struct i2c_adapter *adap)
|
|
{
|
|
int i;
|
|
//int val;
|
|
#if VIDEO_IN_FORMAT == VIN_CVBS_PAL
|
|
for (i = 0; i < sizeof(rn6752m_cvbs_pal_staticPara) / sizeof(RXCHIPstaticPara); i++)
|
|
{
|
|
rn6752_i2c_write(adap, rn6752m_cvbs_pal_staticPara[i].addr,
|
|
rn6752m_cvbs_pal_staticPara[i].dat);
|
|
|
|
}
|
|
#elif VIDEO_IN_FORMAT == VIN_CVBS_NTSC
|
|
for (i = 0; i < sizeof(rn6752m_cvbs_ntsc_staticPara) / sizeof(RXCHIPstaticPara); i++)
|
|
{
|
|
rn6752_i2c_write(adap, rn6752m_cvbs_ntsc_staticPara[i].addr,
|
|
rn6752m_cvbs_ntsc_staticPara[i].dat);
|
|
|
|
}
|
|
#elif VIDEO_IN_FORMAT == VIN_AHD_720P_25
|
|
for (i = 0; i < sizeof(rn6752m_720p_25_staticPara) / sizeof(RXCHIPstaticPara); i++)
|
|
{
|
|
rn6752_i2c_write(adap, rn6752m_720p_25_staticPara[i].addr,
|
|
rn6752m_720p_25_staticPara[i].dat);
|
|
|
|
}
|
|
#elif VIDEO_IN_FORMAT == VIN_AHD_720P_30
|
|
for (i = 0; i < sizeof(rn6752m_720p_30_staticPara) / sizeof(RXCHIPstaticPara); i++)
|
|
{
|
|
rn6752_i2c_write(adap, rn6752m_720p_30_staticPara[i].addr,
|
|
rn6752m_720p_30_staticPara[i].dat);
|
|
|
|
}
|
|
#endif
|
|
}
|
|
|
|
int rn6752_init(void)
|
|
{
|
|
struct i2c_adapter *adap = NULL;
|
|
|
|
rn6752_reset();
|
|
|
|
if (!(adap = i2c_open("i2c1"))) {
|
|
printf("open i2c1 fail.\n");
|
|
return -1;
|
|
}
|
|
|
|
rn6752_config(adap);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|