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

📄 ov9653.c

📁 嵌入式linux系统下hi3510平台的osd开发源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
    
    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,&reg_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,&reg_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,&reg_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,&reg_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 + -