📄 ov9653.c
字号:
}
if((regvalue & 0x02) == 0x02)
{
pmode->vsync_neg = DC_VSYNC_NEGATIVE;
}
else if((regvalue & 0x02) == 0x00)
{
pmode->vsync_neg = DC_VSYNC_NORMAL;
}
if((regvalue & 0x01) == 0x01)
{
pmode->hsync_neg = DC_HSYNC_NEGATIVE;
}
else if((regvalue & 0x01) == 0x00)
{
pmode->hsync_neg = DC_HSYNC_NORMAL;
}
return pmode;
}
/*
* registers initialise for ov9653's YCbCr output routine.
* YCbCr output 640*480
* fps =25
*
*/
void ov9653_vga_init(void)
{
// gpio_i2c_write(I2C_OV9653, DC_COM7, 0x80);
gpio_i2c_write(I2C_OV9653, 0x11, 0x80);
gpio_i2c_write(I2C_OV9653, 0x6a, 0x3e);
gpio_i2c_write(I2C_OV9653, 0x3b, 0x09);
gpio_i2c_write(I2C_OV9653, 0x13, 0xe0);
gpio_i2c_write(I2C_OV9653, 0x01, 0x80);
gpio_i2c_write(I2C_OV9653, 0x02, 0x80);
gpio_i2c_write(I2C_OV9653, 0x00, 0x00);
gpio_i2c_write(I2C_OV9653, 0x10, 0x00);
gpio_i2c_write(I2C_OV9653, 0x13, 0xe5);
gpio_i2c_write(I2C_OV9653, 0x39, 0x50);
gpio_i2c_write(I2C_OV9653, 0x38, 0x92);
gpio_i2c_write(I2C_OV9653, 0x37, 0x00);
gpio_i2c_write(I2C_OV9653, 0x35, 0x81);
gpio_i2c_write(I2C_OV9653, 0x0e, 0xa0);
gpio_i2c_write(I2C_OV9653, 0x1e, 0x14);
gpio_i2c_write(I2C_OV9653, 0xa8, 0x80);
gpio_i2c_write(I2C_OV9653, 0x12, 0x40); /* output VGA */
// gpio_i2c_write(I2C_OV9653, 0x12, 0x10);/* output QVGA */
gpio_i2c_write(I2C_OV9653, 0x04, 0x00);
gpio_i2c_write(I2C_OV9653, 0x0c, 0x04);
gpio_i2c_write(I2C_OV9653, 0x0d, 0x80);
gpio_i2c_write(I2C_OV9653, 0x18, 0xc6);
gpio_i2c_write(I2C_OV9653, 0x17, 0x26);
gpio_i2c_write(I2C_OV9653, 0x32, 0xad);
gpio_i2c_write(I2C_OV9653, 0x03, 0x00);
gpio_i2c_write(I2C_OV9653, 0x1a, 0x3d);
gpio_i2c_write(I2C_OV9653, 0x19, 0x01);
gpio_i2c_write(I2C_OV9653, 0x3f, 0xa6);
gpio_i2c_write(I2C_OV9653, 0x14, 0x2e);
gpio_i2c_write(I2C_OV9653, 0x15, 0x02);
gpio_i2c_write(I2C_OV9653, 0x41, 0x02);
gpio_i2c_write(I2C_OV9653, 0x42, 0x08);
gpio_i2c_write(I2C_OV9653, 0x1b, 0x00);
gpio_i2c_write(I2C_OV9653, 0x16, 0x06);
gpio_i2c_write(I2C_OV9653, 0x33, 0xe2);
gpio_i2c_write(I2C_OV9653, 0x34, 0xbf);
gpio_i2c_write(I2C_OV9653, 0x96, 0x04);
gpio_i2c_write(I2C_OV9653, 0x3a, 0x0c);
gpio_i2c_write(I2C_OV9653, 0x8e, 0x00);
gpio_i2c_write(I2C_OV9653, 0x3c, 0x77);
gpio_i2c_write(I2C_OV9653, 0x8b, 0x06);
gpio_i2c_write(I2C_OV9653, 0x94, 0x88);
gpio_i2c_write(I2C_OV9653, 0x95, 0x88);
gpio_i2c_write(I2C_OV9653, 0x40, 0xc1);
gpio_i2c_write(I2C_OV9653, 0x29, 0x3f);
gpio_i2c_write(I2C_OV9653, 0x0f, 0x42);
gpio_i2c_write(I2C_OV9653, 0x3d, 0x92);
gpio_i2c_write(I2C_OV9653, 0x69, 0x40);
gpio_i2c_write(I2C_OV9653, 0x5c, 0xb9);
gpio_i2c_write(I2C_OV9653, 0x5d, 0x96);
gpio_i2c_write(I2C_OV9653, 0x5e, 0x10);
gpio_i2c_write(I2C_OV9653, 0x59, 0xc0);
gpio_i2c_write(I2C_OV9653, 0x5a, 0xaf);
gpio_i2c_write(I2C_OV9653, 0x5b, 0x55);
gpio_i2c_write(I2C_OV9653, 0x43, 0xf0);
gpio_i2c_write(I2C_OV9653, 0x44, 0x10);
gpio_i2c_write(I2C_OV9653, 0x45, 0x68);
gpio_i2c_write(I2C_OV9653, 0x46, 0x96);
gpio_i2c_write(I2C_OV9653, 0x47, 0x60);
gpio_i2c_write(I2C_OV9653, 0x48, 0x80);
gpio_i2c_write(I2C_OV9653, 0x5f, 0xe0);
gpio_i2c_write(I2C_OV9653, 0x60, 0x8c);
gpio_i2c_write(I2C_OV9653, 0x61, 0x20);
gpio_i2c_write(I2C_OV9653, 0xa5, 0xd9);
gpio_i2c_write(I2C_OV9653, 0xa4, 0x74);
gpio_i2c_write(I2C_OV9653, 0x8d, 0x02);
gpio_i2c_write(I2C_OV9653, 0x13, 0xe7);
gpio_i2c_write(I2C_OV9653, 0x4f, 0x3a);
gpio_i2c_write(I2C_OV9653, 0x50, 0x3d);
gpio_i2c_write(I2C_OV9653, 0x51, 0x03);
gpio_i2c_write(I2C_OV9653, 0x52, 0x12);
gpio_i2c_write(I2C_OV9653, 0x53, 0x26);
gpio_i2c_write(I2C_OV9653, 0x54, 0x38);
gpio_i2c_write(I2C_OV9653, 0x55, 0x40);
gpio_i2c_write(I2C_OV9653, 0x56, 0x40);
gpio_i2c_write(I2C_OV9653, 0x57, 0x40);
gpio_i2c_write(I2C_OV9653, 0x58, 0x0d);
gpio_i2c_write(I2C_OV9653, 0x8c, 0x23);
gpio_i2c_write(I2C_OV9653, 0x3e, 0x02);
gpio_i2c_write(I2C_OV9653, 0xa9, 0xb8);
gpio_i2c_write(I2C_OV9653, 0xaa, 0x92);
gpio_i2c_write(I2C_OV9653, 0xab, 0x0a);
gpio_i2c_write(I2C_OV9653, 0x8f, 0xdf);
gpio_i2c_write(I2C_OV9653, 0x90, 0x00);
gpio_i2c_write(I2C_OV9653, 0x91, 0x00);
gpio_i2c_write(I2C_OV9653, 0x9f, 0x00);
gpio_i2c_write(I2C_OV9653, 0xa0, 0x00);
gpio_i2c_write(I2C_OV9653, 0x3a, 0x0d);
gpio_i2c_write(I2C_OV9653, 0x24, 0x70);
gpio_i2c_write(I2C_OV9653, 0x25, 0x64);
gpio_i2c_write(I2C_OV9653, 0x26, 0xc3);
/*Here change */
gpio_i2c_write(I2C_OV9653, 0x2a, 0x20);
gpio_i2c_write(I2C_OV9653, 0x2b, 0x30);
/* gamma*/
gpio_i2c_write(I2C_OV9653, 0x6c, 0x40);
gpio_i2c_write(I2C_OV9653, 0x6d, 0x30);
gpio_i2c_write(I2C_OV9653, 0x6e, 0x4b);
gpio_i2c_write(I2C_OV9653, 0x6f, 0x60);
gpio_i2c_write(I2C_OV9653, 0x70, 0x70);
gpio_i2c_write(I2C_OV9653, 0x71, 0x70);
gpio_i2c_write(I2C_OV9653, 0x72, 0x70);
gpio_i2c_write(I2C_OV9653, 0x73, 0x70);
gpio_i2c_write(I2C_OV9653, 0x74, 0x60);
gpio_i2c_write(I2C_OV9653, 0x75, 0x60);
gpio_i2c_write(I2C_OV9653, 0x76, 0x50);
gpio_i2c_write(I2C_OV9653, 0x77, 0x48);
gpio_i2c_write(I2C_OV9653, 0x78, 0x3a);
gpio_i2c_write(I2C_OV9653, 0x79, 0x2e);
gpio_i2c_write(I2C_OV9653, 0x7a, 0x28);
gpio_i2c_write(I2C_OV9653, 0x7b, 0x22);
gpio_i2c_write(I2C_OV9653, 0x7c, 0x04);
gpio_i2c_write(I2C_OV9653, 0x7d, 0x07);
gpio_i2c_write(I2C_OV9653, 0x7e, 0x10);
gpio_i2c_write(I2C_OV9653, 0x7f, 0x28);
gpio_i2c_write(I2C_OV9653, 0x80, 0x36);
gpio_i2c_write(I2C_OV9653, 0x81, 0x44);
gpio_i2c_write(I2C_OV9653, 0x82, 0x52);
gpio_i2c_write(I2C_OV9653, 0x83, 0x60);
gpio_i2c_write(I2C_OV9653, 0x84, 0x6c);
gpio_i2c_write(I2C_OV9653, 0x85, 0x78);
gpio_i2c_write(I2C_OV9653, 0x86, 0x8c);
gpio_i2c_write(I2C_OV9653, 0x87, 0x9e);
gpio_i2c_write(I2C_OV9653, 0x88, 0xbb);
gpio_i2c_write(I2C_OV9653, 0x89, 0xd2);
gpio_i2c_write(I2C_OV9653, 0x8a, 0xe6);
}
/*
* registers initialise for ov9653's RawData output routine.
* RawData output 1280*1024
* fps =15
*
*/
void ov9653_sxga_init(void)
{
gpio_i2c_write(I2C_OV9653, DC_COM7, 0x80);
gpio_i2c_write(I2C_OV9653, 0x13, 0x00);
gpio_i2c_write(I2C_OV9653, 0x10, 0xf0);
// gpio_i2c_write(I2C_OV9653, 0x12, 0x05);
gpio_i2c_write(I2C_OV9653, 0x12, 0x00);
gpio_i2c_write(I2C_OV9653, 0x0c, 0x00);
gpio_i2c_write(I2C_OV9653, 0x0d, 0x00);
gpio_i2c_write(I2C_OV9653, 0x16, 0x06);
gpio_i2c_write(I2C_OV9653, 0x33, 0xc0);
gpio_i2c_write(I2C_OV9653, 0x34, 0xbf);
gpio_i2c_write(I2C_OV9653, 0xa8, 0x81);
gpio_i2c_write(I2C_OV9653, 0x41, 0x00);
gpio_i2c_write(I2C_OV9653, 0x96, 0x04);
gpio_i2c_write(I2C_OV9653, 0x3d, 0x19);
gpio_i2c_write(I2C_OV9653, 0x1b, 0x00);
gpio_i2c_write(I2C_OV9653, 0x18, 0xbb);
gpio_i2c_write(I2C_OV9653, 0x17, 0x1b);
gpio_i2c_write(I2C_OV9653, 0x6b, 0x0a);
gpio_i2c_write(I2C_OV9653, 0x8b, 0x06);
gpio_i2c_write(I2C_OV9653, 0x8e, 0x00);
gpio_i2c_write(I2C_OV9653, 0x8f, 0xdf);
gpio_i2c_write(I2C_OV9653, 0x29, 0x3f);
gpio_i2c_write(I2C_OV9653, 0x40, 0xc1);
gpio_i2c_write(I2C_OV9653, 0x0f, 0x42);
gpio_i2c_write(I2C_OV9653, 0x3c, 0x73);
gpio_i2c_write(I2C_OV9653, 0x03, 0x12);
gpio_i2c_write(I2C_OV9653, 0x94, 0x88);
gpio_i2c_write(I2C_OV9653, 0x95, 0x88);
gpio_i2c_write(I2C_OV9653, 0x3a, 0x0d);
gpio_i2c_write(I2C_OV9653, 0xa5, 0x80);
gpio_i2c_write(I2C_OV9653, 0xa9, 0xb8);
gpio_i2c_write(I2C_OV9653, 0xaa, 0x92);
gpio_i2c_write(I2C_OV9653, 0xab, 0x0a);
// gpio_i2c_write(I2C_OV9653, 0x1e, 0x34);
gpio_i2c_write(I2C_OV9653, 0x1e, 0x14);
gpio_i2c_write(I2C_OV9653, 0x11, 0x80);
gpio_i2c_write(I2C_OV9653, 0x39, 0x50);
gpio_i2c_write(I2C_OV9653, 0x38, 0x93);
gpio_i2c_write(I2C_OV9653, 0x37, 0x00);
gpio_i2c_write(I2C_OV9653, 0x35, 0x81);
gpio_i2c_write(I2C_OV9653, 0x0e, 0xa0);
gpio_i2c_write(I2C_OV9653, 0x69, 0x40);
gpio_i2c_write(I2C_OV9653, 0x60, 0x8c);
gpio_i2c_write(I2C_OV9653, 0x14, 0x4e);
gpio_i2c_write(I2C_OV9653, 0x15, 0x02);
gpio_i2c_write(I2C_OV9653, 0x66, 0x05);
gpio_i2c_write(I2C_OV9653, 0x64, 0x0a);
gpio_i2c_write(I2C_OV9653, 0x65, 0x80);
gpio_i2c_write(I2C_OV9653, 0x9d, 0x0c);
gpio_i2c_write(I2C_OV9653, 0x9e, 0x10);
gpio_i2c_write(I2C_OV9653, 0x2b, 0x00);
gpio_i2c_write(I2C_OV9653, 0x04, 0x00);
}
/*
* ov9653 open routine.
* do nothing.
*
*/
int ov9653_open(struct inode * inode, struct file * file)
{
return 0;
}
/*
* ov9653 close routine.
* do nothing.
*
*/
int ov9653_close(struct inode * inode, struct file * file)
{
return 0;
}
/*
* ov9653 ioctl routine.
* @param inode: pointer of the node;
* @param file: pointer of the file;
*
* @param cmd: command from the app:
* DC_MODE_SET(1):set ov9653's output format;
* DC_MODE_GET(2):get ov9653's output format;
* DC_ZOOM_SET(3):set ov9653's output drive capability;
* DC_ZOOM_GET(4):get ov9653's output drive capability;
* DC_MIRROR_SET(5):set ov9653's mirror enable or disable;
* DC_MIRROR_GET(6):get ov9653's mirror enable or disable;;
* DC_NIGHTMODE_SET(7):set ov9653's night mode;
* DC_NIGHTMODE_GET(8):get ov9653's night mode;
* DC_SYNCMODE_SET(9):set ov9653's sync mode;
* DC_SYNCMODE_GET(a):get ov9653's sync mode;
*
* @param arg:arg from app layer.
*
* @return value:0-- set success; 1-- set error.
*
*/
int ov9653_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
void __user *argp = (void __user *)arg;
switch (cmd)
{
case DC_MODE_SET:
{
dc_output_set s_mode = arg;
if(dc_mode_set(s_mode) != 0)
return -1;
break;
}
case DC_MODE_GET:
{
unsigned long reg_mode1;
reg_mode1 = dc_mode_get();
if(copy_to_user(argp,®_mode1,sizeof(reg_mode1)))
return -1;
break;
}
case DC_ZOOM_SET:
{
dc_output_zoom s_zoom = arg;
if(dc_zoom_set(s_zoom) != 0)
return -1;
break;
}
case DC_ZOOM_GET:
{
unsigned long reg_zoom1;
reg_zoom1 = dc_zoom_get();
if(copy_to_user(argp,®_zoom1,sizeof(reg_zoom1)))
return -1;
break;
}
case DC_MIRROR_SET:
{
dc_output_mirror s_mirror = arg;
if(dc_mirror_set(s_mirror) != 0)
return -1;
break;
}
case DC_MIRROR_GET:
{
unsigned long reg_mirror1;
reg_mirror1 = dc_mirror_get();
if(copy_to_user(argp,®_mirror1,sizeof(reg_mirror1)))
return -1;
break;
}
case DC_NIGHTMODE_SET:
{
dc_output_nightmode s_nightmode = arg;
if(dc_nightmode_set(s_nightmode) != 0)
return -1;
break;
}
case DC_NIGHTMODE_GET:
{
unsigned long reg_nightmode1;
reg_nightmode1 = dc_nightmode_get();
if(copy_to_user(argp,®_nightmode1,sizeof(reg_nightmode1)))
return -1;
break;
}
case DC_SYNCMODE_SET:
{
struct dc_sync_mode sync_param;
if(copy_from_user(&sync_param, argp,sizeof(sync_param)))
return -EFAULT;
if(dc_syncset(sync_param.href_or_hsync,
sync_param.pclk_mode,
sync_param.pclk_reverse,
sync_param.href_reverse,
sync_param.vsync_neg,
sync_param.hsync_neg) != 0)
return -1;
break;
}
case DC_SYNCMODE_GET:
{
struct dc_sync_mode *psync_param;
psync_param = dc_syncget();
if(copy_to_user(argp,psync_param,sizeof(struct dc_sync_mode)))
return -1;
break;
}
case DC_VGA_MODE:
{
ov9653_vga_init();
break;
}
case DC_SXGA_MODE:
{
ov9653_sxga_init();
break;
}
default:
return -1;
}
return 0;
}
#if 0
void gpio_i2c_test(void)
{
unsigned char regvalue,loop1;
regvalue = gpio_sccb_read(I2C_OV9653, DC_COM2);
printk("zoom regvalue = %x\n",regvalue);
for(loop1=0;loop1<=0x7f;loop1++)
{
gpio_i2c_write(I2C_OV9653, DC_COM7, loop1);
regvalue = gpio_sccb_read(I2C_OV9653, DC_COM7);
printk("after write, regvalue = %x\n",regvalue);
}
}
#endif
/*
* The various file operations we support.
*/
static struct file_operations ov9653_fops = {
.owner = THIS_MODULE,
.ioctl = ov9653_ioctl,
.open = ov9653_open,
.release = ov9653_close
};
static struct miscdevice ov9653_dev = {
MISC_DYNAMIC_MINOR,
"ov9653",
&ov9653_fops,
};
static int ov9653_device_init(void)
{
unsigned char regvalue,loop1;
/* reset */
gpio_i2c_write(I2C_OV9653, DC_COM7, 0x80);
// gpio_i2c_test(); /* test */
for(loop1=0;loop1 < 10;loop1++)
{
;
}
regvalue = gpio_sccb_read(I2C_OV9653, DC_COM7);
// printk("after write, regvalue = %x\n",regvalue);
regvalue &=0x7f;
gpio_i2c_write(I2C_OV9653, DC_COM7, regvalue);
regvalue = gpio_sccb_read(I2C_OV9653,DC_PID);
// printk("after write, regvalue = %x\n",regvalue);
loop1 = gpio_sccb_read(I2C_OV9653,DC_VER);
// printk("after write, loop1 = %x\n",loop1);
if((regvalue != 0x96)&&(loop1 != 0x52))
{
printk("read Prodect ID Number MSB is %x\n",regvalue);
printk("read Prodect ID Number LSB is %x\n",loop1);
printk("check ov9653 ID error.\n");
return -EFAULT;
}
if(out_mode == 1)
ov9653_sxga_init();
else
ov9653_vga_init();
return 0;
}
static int __init ov9653_init(void)
{
int ret = 0;
ret = misc_register(&ov9653_dev);
if(ret)
{
printk("could not register ov9653 devices. \n");
return ret;
}
if(ov9653_device_init()<0){
misc_deregister(&ov9653_dev);
printk("ov9653 driver init fail for device init error!\n");
return -1;
}
printk("ov9653 driver init successful!\n");
return ret;
}
static void __exit ov9653_exit(void)
{
misc_deregister(&ov9653_dev);
}
module_init(ov9653_init);
module_exit(ov9653_exit);
#ifdef MODULE
#include <linux/compile.h>
#endif
module_param(out_mode, int, S_IRUGO);
MODULE_INFO(build, UTS_VERSION);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("hisilicon");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -