📄 saa7114.c
字号:
}
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 + -