📄 tw2834.c
字号:
{
if(decoder->norm == PAL_STD)
{
subaddr = 0x03+ch_no*0x40; /* position and blank boundary */
tw2834_write(client, 0, subaddr, 0x30);
tw2834_write(client, 0, subaddr+0x06, 0x07);
}
else
{
subaddr = 0x03+ch_no*0x40; /* position and blank boundary */
tw2834_write(client, 0, subaddr, 0x30);
tw2834_write(client, 0, subaddr+0x06, 0x10);
}
subaddr = 0x14+ch_no*0x40;
tw2834_write(client, 0, subaddr++, 0x00);
tw2834_write(client, 0, subaddr++, 0x30);
tw2834_write(client, 0, subaddr++, 0x00);
tw2834_write(client, 0, subaddr, 0x10);
subaddr = 0x20+ch_no*0x40;
tw2834_write(client, 0, subaddr, 0x57);
//printk("split num is %d\n",split_num);
}
if(split_num == 16 )
{
if(decoder->norm == PAL_STD)
{
subaddr = 0x03+ch_no*0x40; /* position and blank boundary */
tw2834_write(client, 0, subaddr, 0x30);
tw2834_write(client, 0, subaddr+0x06, 0x07);
}
else
{
subaddr = 0x03+ch_no*0x40; /* position and blank boundary */
tw2834_write(client, 0, subaddr, 0x30);
tw2834_write(client, 0, subaddr+0x06, 0x10);
}
subaddr = 0x14+ch_no*0x40;
tw2834_write(client, 0, subaddr++, 0x36);
tw2834_write(client, 0, subaddr++, 0x33);
tw2834_write(client, 0, subaddr++, 0x00);
tw2834_write(client, 0, subaddr, 0x10);
subaddr = 0x20+ch_no*0x40;
tw2834_write(client, 0, subaddr, 0x7f);
}
subaddr = 0x10+ch_no*8; /*don't call this two times,or the video will't work well !*/
tw2834_write(client, 1, subaddr, 0x80+ch_no); /* CH_EN: enable ch_no */
}
static void tw2834_set_standard(struct i2c_client * client, u8 standard)
{
int i;
int temp;
/************************* initialize page0 **********************************/
if(standard == NTSC_STD) //NTSC
{
for(i=0; i<4; i++)
{
tw2834_write_block(client, 0, 0x40*i, tbl_ntsc_page0_common, sizeof(tbl_ntsc_page0_common));
tw2834_write(client, 0, (0x22+0x40*i) ,i); /* DEC_PATH_X */
}
tw2834_write_block(client, 0, 0x38, tbl_ntsc_page0_sfr1, sizeof(tbl_ntsc_page0_sfr1));
tw2834_write_block(client, 0, 0x78, tbl_ntsc_page0_sfr2, sizeof(tbl_ntsc_page0_sfr2));
tw2834_write_block(client, 0, 0xb8, tbl_ntsc_page0_sfr3, sizeof(tbl_ntsc_page0_sfr3));
tw2834_write_block(client, 0, 0xf8, tbl_ntsc_page0_sfr4, sizeof(tbl_ntsc_page0_sfr4));
//
tw2834_write(client,0,0x05,0x16);
tw2834_write(client,0,0x45,0x1b);
tw2834_write(client,0,0x85,0x16);
tw2834_write(client,0,0xc5,0x1b);
tw2834_write(client,0,0x0b,0x02);
tw2834_write(client,0,0x4b,0x02);
tw2834_write(client,0,0x8b,0x07);
tw2834_write(client,0,0xcb,0x07);
}
else //PAL
{
for(i=0; i<4; i++)
{
tw2834_write_block(client, 0, 0x40*i, tbl_pal_page0_common, sizeof(tbl_pal_page0_common));
tw2834_write(client, 0, (0x22+0x40*i) ,i); /* DEC_PATH_X */
}
tw2834_write_block(client, 0, 0x38, tbl_pal_page0_sfr1, sizeof(tbl_pal_page0_sfr1));
tw2834_write_block(client, 0, 0x78, tbl_pal_page0_sfr2, sizeof(tbl_pal_page0_sfr2));
tw2834_write_block(client, 0, 0xb8, tbl_pal_page0_sfr3, sizeof(tbl_pal_page0_sfr3));
tw2834_write_block(client, 0, 0xf8, tbl_pal_page0_sfr4, sizeof(tbl_pal_page0_sfr4));
//the boundary of Y path from network
tw2834_write(client,0,0x05,0x2b);
tw2834_write(client,0,0x85,0x2b);
tw2834_write(client,0,0x45,0x2b);
tw2834_write(client,0,0xc5,0x2c);
tw2834_write(client,0,0x0b,0x04);
tw2834_write(client,0,0x4b,0x04);
tw2834_write(client,0,0x8b,0x04);
tw2834_write(client,0,0xcb,0x04);
}
// initialize page1 **************************************************************/
tw2834_write_block(client, 1, 0x01, tbl_page1_x_com, sizeof(tbl_page1_x_com));
tw2834_write_block(client, 1, 0x10, tbl_page1_x_ch_nrml, sizeof(tbl_page1_x_ch_nrml));
tw2834_write_block(client, 1, 0x50, tbl_page1_y_com, sizeof(tbl_page1_y_com));
tw2834_write_block(client, 1, 0x60, tbl_page1_y_ch_nrml_pic_quad, sizeof(tbl_page1_y_ch_nrml_pic_quad));
tw2834_write_block(client, 1, 0x70, tbl_page1_cas_popup, sizeof(tbl_page1_cas_popup));
if(standard == NTSC_STD) //NTSC
{
tw2834_write_block(client, 1, 0x30, tbl_ntsc_page1_x_pic_quad, sizeof(tbl_ntsc_page1_x_pic_quad));
tw2834_write_block(client, 1, 0x40, tbl_ntsc_page1_dumy, sizeof(tbl_ntsc_page1_dumy));
/* 2007.11.28 1x7d is for ntsc,phase inverte;or the color cannot work very well! for x y path all*/
tw2834_write(client,1,0x7d,0x22);
tw2834_write_block(client, 1, 0x80, tbl_ntsc_page1_enc, sizeof(tbl_ntsc_page1_enc));
tw2834_write(client,1,0x8e,0x00); //2006.12.13 by wangdy
temp=tw2834_read(client,1,0x00);
tw2834_write(client,1,0x00,temp&0x7f); /*20061206:NTSC, LINK_EN_X = 1, LINK_NUM = 0, LINK_LAST_X = 0 */
}
else //PAL
{
tw2834_write_block(client, 1, 0x30, tbl_pal_page1_x_pic_quad, sizeof(tbl_pal_page1_x_pic_quad));
tw2834_write_block(client, 1, 0x40, tbl_pal_page1_dumy, sizeof(tbl_pal_page1_dumy));
tw2834_write_block(client, 1, 0x80, tbl_pal_page1_enc, sizeof(tbl_pal_page1_enc));
tw2834_write(client,1,0x8e,0x00);
tw2834_write(client,1,0x7d,0x00);
temp=tw2834_read(client,1,0x00);
tw2834_write(client,1,0x00,temp|0x80); /*20061206:PAL, LINK_EN_X = 1, LINK_NUM = 0, LINK_LAST_X = 0 */
}
tw2834_write_block(client, 1, 0xc0, tbl_page1_channel_id_ctrl, sizeof(tbl_page1_channel_id_ctrl));
tw2834_write(client,1,0x7f,0x21); //REG_CLK_CTL
tw2834_write(client,1,0xba,0x08); //20061207,add by huangym
temp=tw2834_read(client,1,0x7f);
if(standard == NTSC_STD) //NTSC
tw2834_write(client,1,0x7e,0x00); //REG_MCLK_CTL
else
tw2834_write(client,1,0x7e,0xaa); //REG_MCLK_CTL
tw2834_write(client,1,0x7f,0x80|temp); //MEM_INI
//tw2834_write(client,1,0x7f,0xA1); //MEM_INIT
tw2834_write(client,1,0x50,0xb0); //REG_MPP_SET
for(i=0;i<4;i++)
tw2834_write(client,1,0x59,0x00); //REG_QUE_DATA
for(i=0;i<4;i++)
tw2834_write(client,1,0x5a,0x00);//0x80|i); //REG_QUE_ADDR
tw2834_write(client,1,0xba,0x02); //vip 006.12.25****************************
// initialize page2 ******************************************************/
tw2834_write_block(client, 2, 0, tbl_page2_cur_3d_box, sizeof(tbl_page2_cur_3d_box));
tw2834_write_block(client, 2, 0x60, tbl_pal_page2_ary_box, sizeof(tbl_pal_page2_ary_box));
for(i=0; i<4; i++)
{
tw2834_write_block(client, 2, (0x80+0x20*i), tbl_page2_motn_sens, sizeof(tbl_page2_motn_sens));
tw2834_write_block(client, 2, (0x86+0x20*i), tbl_page2_motn_mask, sizeof(tbl_page2_motn_mask));
}
}
static inline void tw2834_set_parameter(struct i2c_client * client,
int device_no,
unsigned int base_addr,
unsigned int val)
{
unsigned int subadd;
if(device_no ==0 ||device_no ==1 ||device_no ==2 ||device_no ==3)
{
subadd = base_addr + 0x40*device_no;
tw2834_write(client, 0, subadd, val);
}
else
{
printk("Waring : the channel is out of range!");
return;
}
}
static void tw2834_set_brightness(struct i2c_client * client,
int device_no,
unsigned int val)
{
unsigned int setval;
if (val > 255)
return;
setval =val;
tw2834_set_parameter(client, device_no, 0x12, setval); /* brightness's base addr is 0x12 */
}
static void tw2834_set_contrast(struct i2c_client * client,
int device_no,
unsigned int val)
{
unsigned int setval;
if (val > 255)
return;
setval =val;
tw2834_set_parameter(client, device_no, 0x11, setval); /* contrast's base addr is 0x11 */
}
/**************** hue,sat,cont,brt are all from 0 to 255(from 0% to 100%) ******************/
static void tw2834_set_hue(struct i2c_client * client,
int device_no,
unsigned int val)
{
unsigned int setval;
if (val > 255)
return;
setval =val;
tw2834_set_parameter(client, device_no, 0x0f, setval); /* hue's base addr is 0x0f */
}
static void tw2834_set_saturation(struct i2c_client * client,
int device_no,
unsigned int val)
{
unsigned int setval;
if (val > 255)
return;
setval =val;
tw2834_set_parameter(client, device_no, 0x10, setval); /* Saturation's base addr is 0x10 */
}
/*********************************************************************************
founction:set page REG value: device_no,base_addr,val;
**********************************************************************************/
static void tw2834_set_register(struct i2c_client * client,
int device_no,
unsigned int val,
unsigned int base_addr)
{
printk( "tw2834 set page 0x%x register 0x%x. with 0x%x\n ", device_no,base_addr,val);
tw2834_write( client, device_no,base_addr, val);
}
/********************************************************************************
founction:detect and configue each chips
0x00:7 6 5 4 3 2 1 0
sys_5060 overlay | link-lastx link-lasty |link_exn_x y link_num
pal:1 | 0:master or middle slaver |0:disable cascade 0,1,2,3
ntsc:0 | 1:the lowest slaver |1:enable cascade 0:master
only master:0x80
cascade: master0:0x8C
*********************************************************************************/
static inline int
tw2834_chip_config(void)
{
unsigned char temp;
struct tw2834 *decoder;
decoder = i2c_get_clientdata(tw2834_client);
if (decoder->norm == PAL_STD)
{
height = PAL_V;
dprintk(1, KERN_DEBUG "this is pal\n");
temp=0xff;
}
else
{
height = NTSC_V;
temp=0x7f;
dprintk(1, KERN_DEBUG "this is ntsc\n");
}
dprintk(1, KERN_DEBUG "height is 0x%x\n",height);
dprintk(1, KERN_DEBUG "chip_number is %d\n",chip_number);
if(chip_number ==0)
{
tw2834_client->addr = master0_addr >> 1;
dprintk(1, KERN_DEBUG "This is only one chip : the master chip!(0x%02x)\n",tw2834_client->addr << 1);
set_standard(tw2834_client);
tw2834_write(tw2834_client,1,0x00,0x80&temp);
tw2834_write(tw2834_client,1,0x8C,0x08);
tw2834_write(tw2834_client,1,0x8D,0x66);
tw2834_only_master_chip();
}
else{
tw2834_client->addr = master0_addr >> 1;
dprintk(1, KERN_DEBUG "This is first chip : the master0 chip!(0x%02x)\n",tw2834_client->addr << 1);
set_standard(tw2834_client);
tw2834_write(tw2834_client,1,0x00,(0x88&temp));
tw2834_write(tw2834_client,1,0x8C,0x08);
tw2834_write(tw2834_client,1,0x8D,0x66);
}
if(chip_number == 1) // two chips
{
tw2834_client->addr = slaver1_addr >> 1;
dprintk(1, KERN_DEBUG "This is the second chip : the slaver1 chip!(0x%02x)\n",tw2834_client->addr << 1);
set_standard(tw2834_client);
tw2834_write(tw2834_client,1,0x00,(0xb9&temp));
tw2834_write(tw2834_client,1,0x8C,0x88);
tw2834_write(tw2834_client,1,0x8D,0x62);
tw2834_tow_chip();
}
if(chip_number == 2) //three chips
{
tw2834_client->addr = slaver1_addr >> 1;
dprintk(1, KERN_DEBUG "This is the second chip : the slaver1 chip!(0x%02x)\n",tw2834_client->addr << 1);
set_standard(tw2834_client);
tw2834_write(tw2834_client,1,0x00,(0x89&temp));
tw2834_write(tw2834_client,1,0x8C,0x88);
tw2834_write(tw2834_client,1,0x8D,0x62);
tw2834_client->addr = slaver2_addr >> 1;
dprintk(1, KERN_DEBUG "This is the third chip : the slaver2 chip!(0x%02x)\n",tw2834_client->addr << 1);
set_standard(tw2834_client);
tw2834_write(tw2834_client,1,0x00,(0xba&temp));
tw2834_write(tw2834_client,1,0x8C,0x88);
tw2834_write(tw2834_client,1,0x8D,0x62);
tw2834_three_chip();
}
if(chip_number == 3) //four chips
{
tw2834_client->addr = slaver1_addr >> 1;
dprintk(1, KERN_DEBUG "This is the second chip : the slaver1 chip!(0x%02x)\n",tw2834_client->addr << 1);
set_standard(tw2834_client);
tw2834_write(tw2834_client,1,0x00,(0x89&temp));
tw2834_write(tw2834_client,1,0x8C,0x88);
tw2834_write(tw2834_client,1,0x8D,0x62);
tw2834_client->addr = slaver2_addr >> 1;
dprintk(1, KERN_DEBUG "This is the third chip : the slaver2 chip!(0x%02x)\n",tw2834_client->addr << 1);
set_standard(tw2834_client);
tw2834_write(tw2834_client,1,0x00,(0x8a&temp));
tw2834_write(tw2834_client,1,0x8C,0x88);
tw2834_write(tw2834_client,1,0x8D,0x62);
tw2834_client->addr = slaver3_addr >> 1;
dprintk(1, KERN_DEBUG "This is the forth chip : the slaver3 chip!(0x%02x)\n",tw2834_client->addr << 1);
set_standard(tw2834_client);
tw2834_write(tw2834_client,1,0x00,(0xbb&temp));
tw2834_write(tw2834_client,1,0x8C,0x88);
tw2834_write(tw2834_client,1,0x8D,0x62);
tw2834_three_chip();
tw2834_four_chip();
}
return 0;
}
static inline void tw2834_default_split(void)
{
int i;
for(i=0; i<chip_number+1;i++)
{
tw2834_client->addr =( master0_addr + i*2 )>> 1;
tw2834_all_channel_disable(tw2834_client); //disable all channels
}
if(chip_number == 0)
tw2834_only_master_chip();
if(chip_number == 1)
tw2834_tow_chip();
if(chip_number == 2)
tw2834_three_chip();
if(chip_number == 3)
{
tw2834_three_chip();
tw2834_four_chip();
}
// for(i=0; i<chip_number+1;i++)
// {
// tw2834_client->addr =( master0_addr + i*2 )>> 1; //this is for only the addr from low to high,or will wrong
// tw2834_all_channel_enable(tw2834_client); //enable all channels
// }
}
static inline void tw2834_only_master_chip(void)
{
// standard one chip:
tw2834_set_xpath_position_table(tw2834_client, 0,4,0);
tw2834_set_xpath_position_table(tw2834_client, 1,4,1);
tw2834_set_xpath_position_table(tw2834_client, 2,4,2);
tw2834_set_xpath_position_table(tw2834_client, 3,4,3);
}
static inline void tw2834_tow_chip(void)
{
//standard tow chip:
//master0
tw2834_client->addr = master0_addr >> 1;
tw2834_set_xpath_position_table(tw2834_client, 0,9,0);
tw2834_set_xpath_position_table(tw2834_client, 1,9,1);
tw2834_set_xpath_position_table(tw2834_client, 2,9,2);
tw2834_set_xpath_position_table(tw2834_client, 3,9,3);
//slaver1:
tw2834_client->addr = slaver1_addr >> 1;
tw2834_set_xpath_position_table(tw2834_client, 0,9,4);
tw2834_set_xpath_position_table(tw2834_client, 1,9,5);
tw2834_set_xpath_position_table(tw2834_client, 2,9,6);
tw2834_set_xpath_position_table(tw2834_client, 3,9,7);
}
static inline void tw2834_three_chip(void)
{
//standard there chip:
//master0
tw2834_client->addr = master0_addr >> 1;
tw2834_set_xpath_position_table(tw2834_client, 0,16,0);
tw2834_set_xpath_position_table(tw2834_client, 1,16,1);
tw2834_set_xpath_position_table(tw2834_client, 2,16,2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -