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

📄 saa7114.c

📁 saa7114,linux下编程基于3510的视频驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	}

	return 0;
}

static int set_prefilter_prescaler(void)
{
	unsigned char data_tbl[8] = { 0x01, 0x01, 0x01, 0x00, 0x80, 0x40, 0x40, 0x00 };
	unsigned char addr_base = 0xa0;

	unsigned char i = 0;

	for (i=0; i<8; i++)
	{
  		if(hi_i2c_write(I2C_SAA7114,addr_base+i, data_tbl[i])!= 0 )
  			{
			return -1;
  			}
	}

	return 0;
}

static int set_horizontal_scaling(void)
{
	unsigned char data_tbl_n[8] = { 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00 };
	unsigned char addr_base = 0xa8;

	unsigned char i = 0;

	for (i=0; i<8; i++)
	{
  		if(hi_i2c_write(I2C_SAA7114,addr_base+i, data_tbl_n[i]) != 0 )
  			{
			return -1;
  			}
	}

	return 0;
}

static int set_vertical_scaling(void)
{
	unsigned char data0_tbl[16] = { 
							0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
							0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
						   };
	unsigned char data1_tbl_n[28] = { 
							0x00, 0x08, 0xc0, 0x10, 0x90, 0x90, 0xeb, 0xe0,
							0xd8, 0x40, 0x80, 0x44, 0x40, 0x00, 0x09, 0x2a,
							0x0e, 0x00, 0x00, 0x00, 0x00, 0x11, 0xfe, 0x40,
							0x40, 0x80, 0x00, 0x00
						   };
						   
	unsigned char addr0_base = 0xb0;
	unsigned char addr1_base = 0x00;

	unsigned char i = 0;

	for (i=0; i<16; i++)
	{
  		if(hi_i2c_write(I2C_SAA7114,addr0_base+i, data0_tbl[i]) != 0 )
  			{
			return -1;
  			}
	}

	for (i=0; i<28; i++)
	{
  		if(hi_i2c_write(I2C_SAA7114,addr1_base+i, data1_tbl_n[i]) != 0 )
  			{
			return -1;
  			}
	}

	return 0;
}

static int set_power_on(void)
{
	unsigned char data0 = 0x11;
	unsigned char data1 = 0x70;
	unsigned char addr0 = 0x87;
	unsigned char addr1 = 0x88;


  	if(hi_i2c_write(I2C_SAA7114,addr0, data0) != 0 )
  		{
			return -1;
  		}
	if(hi_i2c_write(I2C_SAA7114,addr1, data1) != 0 )
		{
			return -1;
		}

	return 0;
}

static int set_audio_para(void)
{	
	unsigned char data_tbl_n[16] = { 0xde,0x15,0x02,0x00,0xdf,0xa7,0x20,0x00,
						 0x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00};
	
	unsigned char addr_base = 0x30;
	
	unsigned char i = 0;

	for (i=0; i<16; i++)
	{
  		if(hi_i2c_write(I2C_SAA7114,addr_base+i, data_tbl_n[i]) != 0 )
  			{
			return -1;
  			}
	}

	return 0;
}


static int set_scaler(void)
{
	unsigned char data_tbl[8] = { 0x11, 0x00, 0x00, 0x11, 0x40, 0x00, 0x40, 0x31 };
	unsigned char addr_base = 0x80;
	unsigned char i = 0;

	for (i=0; i<8; i++)
	{
  		if(hi_i2c_write(I2C_SAA7114,addr_base+i, data_tbl[i])!= 0 )
  			{

			return -1;
  			}
	}

	return 0;
}
#endif

static int set_saa7114(void)
{
unsigned char i;
	
	for(i=1;i<=TW9910B_CCIR_PAL_DataSet[2];i+=2)
    {
       if(hi_i2c_write(I2C_TW9910, TW9910B_CCIR_PAL_DataSet[i*2], TW9910B_CCIR_PAL_DataSet[i*2+1]))
	   	return -1;
    }

	mdelay(1000);

	return 0;

#if 0
	if(set_scaler()!= 0)
		{
		printk("set_scaler is failed!\n");
		return -1;
		}
 
	if(set_vbi_slicer()!=0)
		{
		printk("set_vbi_slicer is failed!\n");
		return -1;
		}

	if(set_scaler_window()!=0)
		{
		printk("set_scaler_window is failed!\n");
		return -1;
		}

	if(set_prefilter_prescaler()!=0)
		{
		printk("set_prefilter_prescaler is failed!\n");
		return -1;
		}
	if(set_horizontal_scaling()!=0)
		{
		printk("set_horizontal_scaling is failed!\n");
		return -1;
		}
	if(set_vertical_scaling()!=0)
		{
		printk("set_vertical_scaling is failed!\n");
		return -1;
		}
	if(set_power_on()!=0)
		{
		printk("set_power_on is failed!\n");
		return -1;
		}
	if(set_audio_para()!=0)
		{
		printk("set_audio_para is failed!\n");
		return -1;
		}
	return 0;
	
#endif

}


#if 0
void saa7114_write_core(int reg, int value)
{
    init_pal[reg*2+1] = value;
    hi_i2c_write(I2C_SAA7114, init_pal[reg*2], init_pal[reg*2+1]);
}

void saa7114_write_block(int reg, int len)
{
    int i;
    
    for(i=reg;i<(reg+len);i+=2)
    {
        hi_i2c_write(I2C_SAA7114, init_pal[i*2], init_pal[i*2+1]);
    }

}
#endif

int saa7114_reg_init(void)
{

unsigned char i;
	for(i=1;i<=TW9910B_PAL[2];i+=2)
    {
       hi_i2c_write(I2C_TW9910, TW9910B_PAL[i*2], TW9910B_PAL[i*2+1]);
    }
	return 0;
#if 0
    unsigned char i;
    hi_i2c_write(I2C_SAA7114, 0x88, 0xD0);
    mdelay(100);
    
    for (i = 1; i < 0x20; i++)
    {
        hi_i2c_write(I2C_SAA7114, i, m_auc_vi_regtab2[i]);
    }

    for (i = 0; i < 0x10; i++)
    {
        hi_i2c_write(I2C_SAA7114, (0x20 + i), 0);
    }
    
    
    for (i = 0; i < 0x30; i++)
    {
        hi_i2c_write(I2C_SAA7114, (0x30 + i), m_auc_vi_regtab3[i]);
    }
    
    
    
    for (i = 0; i < 0x1d; i++)
    {
        hi_i2c_write(I2C_SAA7114, (0x63 + i), 0);
    }
    
    for (i = 0; i < 0x40; i++)
    {
        hi_i2c_write(I2C_SAA7114, (0x80 + i), m_auc_vi_regtab4[i]);
    }


    hi_i2c_write(I2C_SAA7114, 0x88, 0xF0);
    mdelay(1000);
    
    return 0;
#endif
}


static int saa7114_device_init(void)
{
	int ret_val=0;	
	unsigned char regvalue1,regvalue2;
	
	regvalue1 = hi_i2c_read(I2C_SAA7114,0x02);
	
	hi_i2c_write(I2C_SAA7114,0x02, 0x08);
	
	regvalue2 = hi_i2c_read(I2C_SAA7114,0x02);
	if(regvalue2 != 0x08)
	{
		printk("read saa7114 register is %x\n",regvalue2);
	       printk("check saa7114 error.\n");
		return -EFAULT;        
	}
 	hi_i2c_write(I2C_SAA7114,0x02, regvalue1);
 	
	ret_val = set_saa7114();
	saa7114_reg_init();
		
	return ret_val;

}

int saa7114_open (struct  inode * inode, struct file * file)
{
	
    return 0;
}


int saa7114_close(struct inode * inode, struct file * file)
{
    return 0;
}


ssize_t saa7114_write(struct file * file, const char __user * buf, size_t count, loff_t * offset)
{
    return 0;
}


ssize_t saa7114_read(struct file * file, char __user * buf, size_t count, loff_t * offset)
{
    return 0;
}

static int saa7114_ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg)
{
	unsigned long val;
	unsigned char retval=0;
	void __user *argp = (void __user *)arg;

	switch (cmd) {

	case I2C_RD_REG:	/* read i2c register*/
		if (copy_from_user(&val, argp, sizeof(val)))
			return -EFAULT;
		
		retval=hi_i2c_read(I2C_SAA7114,val&0xff);
		val=(retval<<16)|(val&0xffff);
		return copy_to_user(argp, &val, sizeof(val)) ? -EFAULT : 0;

	case I2C_SET_REG:	/* Set the i2c register */	       

		if (copy_from_user(&val, argp, sizeof(val)))
			return -EFAULT;
		return hi_i2c_write(I2C_SAA7114,val&0xff,(val>>8)&0xff);
      
       case INIT_ENABLE:
         if(saa7114_device_init()!=0)
         {
            printk("SAA7114 init error.\n");
            return -EFAULT;
         }
         break;  
         
	default:
	    break;
	}

	return -EINVAL;
}


static struct file_operations saa7114_fops = {

      .owner      = THIS_MODULE,
      .read        = saa7114_read,
      .write        = saa7114_write,
      .ioctl         = saa7114_ioctl,
      .open        = saa7114_open,
      .release     = saa7114_close,
};

static struct miscdevice saa7114_dev = {

	MISC_DYNAMIC_MINOR,
	"saa7114",
	&saa7114_fops,

};

static int __init saa7114_init(void)
{
	int ret =0;

	ret = misc_register(&saa7114_dev);
	if(ret)
	{
		printk("could not register saa7114 device.\n");
		misc_deregister(&saa7114_dev);      //I think this should be added
		return ret;
	}
    if(init_flag !=0)
    {
    	if(saa7114_device_init()!=0)
    	{
    		misc_deregister(&saa7114_dev);
    		printk("saa7114 driver init fail for device init error !\n");
    		return -1;
    	}
    }
	printk("saa7114 driver init successful !\n");

	return ret;
}

static void __exit  saa7114_exit(void)
{
		misc_deregister(&saa7114_dev);
}


module_init(saa7114_init);
module_exit(saa7114_exit);

#ifdef MODULE
#include <linux/compile.h>
#endif

module_param(init_flag, int, S_IRUGO);

MODULE_INFO(build, UTS_VERSION);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("hisilicon");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -