⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tw2834.c

📁 TW2834 的Linux驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	{	
		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 + -