ov9650摄像头设备驱动

1、ov965x.h

/*******************************************************************************************
 #  Display resolution standards #

    QCIF: 176 x 144
    CIF: 352 x 288
    QVGA: 320 x 240
    VGA: 640 x 480 
    SVGA: 800 x 600 
    XGA: 1024 x 768 
    WXGA: 1280 x 800 
    QVGA: 1280 x 960 
    SXGA: 1280 x 1024 
    SXGA+: 1400 x 1050 
    WSXGA+: 1680 x 1050 
    UXGA: 1600 x 1200 
    WUXGA: 1920 x 1200 
    QXGA: 2048 x 1536
********************************************************************************************/

#ifndef _OV965X_H_
#define _OV965X_H_

#define CHIP_DELAY 0xFF

typedef struct s3c_fimc_i2c_value {
    u8 subaddr;
    u8 value;
} OV965X_t;

/* init */
#if defined(CONFIG_OV965X_VGA)
OV965X_t OV965X_init_reg[] =
{
    {0x12, 0x80},    // Camera Soft reset. Self cleared after reset.
    {CHIP_DELAY, 10},
    //{0x11,0x80},
    {0x6a,0x3e},
    {0x3b,0x09},//09
    {0x13,0x8f},//e0//8f
    {0x01,0x80},
    {0x02,0x80},
    {0x00,0x00},
    {0x10,0x00},    
    {0x35,0x91},
    {0x0e,0xa0},
    {0x1e,0x34},//14
    {0xA8,0x80},    
    //////////////VGA//////////
    {0x04,0x00},
    {0x0c,0x04},
    {0x0d,0x80},
    {0x11,0x81},
    {0x12,0x40},
    {0x37,0x91},
    {0x38,0x12},
    {0x39,0x43},
    /////////////END///Square_Chiu
    {0x18,0xc6},
    {0x17,0x26},
    {0x32,0xad},
    {0x03,0x00},
    {0x1a,0x3d},
    {0x19,0x01},
    {0x3f,0xa6},
    {0x14,0x2e},
    {0x15,0x10},
    {0x41,0x02},
    {0x42,0x08},
    {0x1b,0x00},
    {0x16,0x06},
    {0x33,0xe2},
    {0x34,0xbf},
    {0x96,0x04},
    {0x3a,0x00},
    {0x8e,0x00},
    {0x3c,0x77},
    {0x8B,0x06},
    {0x94,0x88},
    {0x95,0x88},
    {0x40,0xc1},
    {0x29,0x3f},
    {0x0f,0x42},
    {0x3d,0x92},
    {0x69,0x40},
    {0x5C,0xb9},
    {0x5D,0x96},
    {0x5E,0x10},
    {0x59,0xc0},
    {0x5A,0xaf},
    {0x5B,0x55},
    {0x43,0xf0},
    {0x44,0x10},
    {0x45,0x68},
    {0x46,0x96},
    {0x47,0x60},
    {0x48,0x80},
    {0x5F,0xe0},
    {0x60,0x8c},
    {0x61,0x20},
    {0xa5,0xd9},
    {0xa4,0x74},
    {0x8d,0x02},
    //{0x13,0xe7},
    {0x4f,0x3a},
    {0x50,0x3d},
    {0x51,0x03},
    {0x52,0x12},
    {0x53,0x26},
    {0x54,0x36},
    {0x55,0x45},
    {0x56,0x40},
    {0x57,0x40},
    {0x58,0x0d},
    {0x8C,0x23},
    {0x3E,0x02},
    {0xa9,0xb8},
    {0xaa,0x92},
    {0xab,0x0a},
    {0x8f,0xdf},
    {0x90,0x00},
    {0x91,0x00},
    {0x9f,0x00},
    {0xa0,0x00},
    {0x3A,0x01},
    {0x24,0x70},
    {0x25,0x64},
    {0x26,0xc3},
    {0x2a,0x00},
    {0x2b,0x00},
    {0x6c,0x40},
    {0x6d,0x30},
    {0x6e,0x4b},
    {0x6f,0x60},
    {0x70,0x70},
    {0x71,0x70},
    {0x72,0x70},
    {0x73,0x70},
    {0x74,0x60},
    {0x75,0x60},
    {0x76,0x50},
    {0x77,0x48},
    {0x78,0x3a},
    {0x79,0x2e},
    {0x7a,0x28},
    {0x7b,0x22},
    {0x7c,0x04},
    {0x7d,0x07},
    {0x7e,0x10},
    {0x7f,0x28},
    {0x80,0x36},
    {0x81,0x44},
    {0x82,0x52},
    {0x83,0x60},
    {0x84,0x6c},
    {0x85,0x78},
    {0x86,0x8c},
    {0x87,0x9e},
    {0x88,0xbb},
    {0x89,0xd2},
    {0x8a,0xe6},
    //{0x15, 0x12},    // PCLK reverse

};
#elif defined(CONFIG_OV965X_QVGA)
OV965X_t OV965X_init_reg[] =
{
    {0x12, 0x80},    // Camera Soft reset. Self cleared after reset.
    {CHIP_DELAY, 10},
    {0x11,0x80},
    {0x6a,0x3e},
    {0x3b,0x09},//09
    {0x13,0x8f},//e0//8f
    {0x01,0x80},
    {0x02,0x80},
    {0x00,0x00},
    {0x10,0x00},
    {0x39,0x43},
    {0x38,0x12},
    {0x37,0x00},
    {0x35,0x91},
    {0x0e,0xa0},
    {0x1e,0x14},
    {0xA8,0x80},
    {0x12,0x40},
    {0x04,0x00},
    {0x0c,0x04},
    {0x0d,0x80},
    {0x18,0xc6},
    {0x17,0x26},
    {0x32,0xad},
    {0x03,0x00},
    {0x1a,0x3d},
    {0x19,0x01},
    {0x3f,0xa6},
    {0x14,0x2e},
    {0x15,0x10},
    {0x41,0x02},
    {0x42,0x08},
    {0x1b,0x00},
    {0x16,0x06},
    {0x33,0xe2},
    {0x34,0xbf},
    {0x96,0x04},
    {0x3a,0x00},
    {0x8e,0x00},
    {0x3c,0x77},
    {0x8B,0x06},
    {0x94,0x88},
    {0x95,0x88},
    {0x40,0xc1},
    {0x29,0x3f},
    {0x0f,0x42},
    {0x3d,0x92},
    {0x69,0x40},
    {0x5C,0xb9},
    {0x5D,0x96},
    {0x5E,0x10},
    {0x59,0xc0},
    {0x5A,0xaf},
    {0x5B,0x55},
    {0x43,0xf0},
    {0x44,0x10},
    {0x45,0x68},
    {0x46,0x96},
    {0x47,0x60},
    {0x48,0x80},
    {0x5F,0xe0},
    {0x60,0x8c},
    {0x61,0x20},
    {0xa5,0xd9},
    {0xa4,0x74},
    {0x8d,0x02},
    //{0x13,0xe7},
    {0x4f,0x3a},
    {0x50,0x3d},
    {0x51,0x03},
    {0x52,0x12},
    {0x53,0x26},
    {0x54,0x36},
    {0x55,0x45},
    {0x56,0x40},
    {0x57,0x40},
    {0x58,0x0d},
    {0x8C,0x23},
    {0x3E,0x02},
    {0xa9,0xb8},
    {0xaa,0x92},
    {0xab,0x0a},
    {0x8f,0xdf},
    {0x90,0x00},
    {0x91,0x00},
    {0x9f,0x00},
    {0xa0,0x00},
    {0x3A,0x01},
    {0x24,0x70},
    {0x25,0x64},
    {0x26,0xc3},
    {0x2a,0x00},
    {0x2b,0x00},
    {0x6c,0x40},
    {0x6d,0x30},
    {0x6e,0x4b},
    {0x6f,0x60},
    {0x70,0x70},
    {0x71,0x70},
    {0x72,0x70},
    {0x73,0x70},
    {0x74,0x60},
    {0x75,0x60},
    {0x76,0x50},
    {0x77,0x48},
    {0x78,0x3a},
    {0x79,0x2e},
    {0x7a,0x28},
    {0x7b,0x22},
    {0x7c,0x04},
    {0x7d,0x07},
    {0x7e,0x10},
    {0x7f,0x28},
    {0x80,0x36},
    {0x81,0x44},
    {0x82,0x52},
    {0x83,0x60},
    {0x84,0x6c},
    {0x85,0x78},
    {0x86,0x8c},
    {0x87,0x9e},
    {0x88,0xbb},
    {0x89,0xd2},
    {0x8a,0xe6},
    //{0x15, 0x12},    // PCLK reverse
};
#elif defined(CONFIG_OV965X_SVGA)
OV965X_t OV965X_init_reg[] =
{
    /* Only for VGA Mode */
    {0x25,0x64},
    {0x26,0xc3},
    {0x2a,0x00},
    {0x2b,0x00},
    {0x6c,0x40},
    {0x6d,0x30},
    {0x6e,0x4b},
    {0x6f,0x60},
    {0x70,0x70},
    {0x71,0x70},
    {0x72,0x70},
    {0x73,0x70},
    {0x74,0x60},
    {0x75,0x60},
    {0x76,0x50},
    {0x77,0x48},
    {0x78,0x3a},
    {0x79,0x2e},
    {0x7a,0x28},
    {0x7b,0x22},
        //YONGKAL
};
#elif defined(CONFIG_OV965X_SXGA)
OV965X_t OV965X_init_reg[] =
{
    {0x25,0x64},
    {0x26,0xc3},
    {0x2a,0x00},
    {0x2b,0x00},
    {0x6c,0x40},
    {0x6d,0x30},
    {0x6e,0x4b},
    {0x6f,0x60},
    {0x70,0x70},
    {0x71,0x70},
    {0x72,0x70},
    {0x73,0x70},
    {0x74,0x60},
    {0x75,0x60},
    {0x76,0x50},
    {0x77,0x48},
    {0x78,0x3a},
    {0x79,0x2e},
    {0x7a,0x28},
    {0x7b,0x22},
};
#endif

#define OV965X_INIT_REGS    (sizeof(OV965X_init_reg) / sizeof(OV965X_init_reg[0]))

#endif

2、ov965x.c(IIC接口)
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/i2c.h>
#include <linux/i2c-id.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/init.h>
#include <asm/io.h>

#include "s3c_fimc.h"
#include "ov965x.h"

/* I2C Device ID table */
static const struct i2c_device_id ov965x_id[] = {
    { "ov965x", 0 },
    { }
};
MODULE_DEVICE_TABLE(i2c,ov965x_id);

const static u16 ignore[] = { I2C_CLIENT_END };
static struct i2c_driver ov965x_i2c_driver;

static struct s3c_fimc_camera ov965x_data = {
    .id         = CONFIG_VIDEO_FIMC_CAM_CH,
    .type        = CAM_TYPE_ITU,
    .mode        = ITU_601_YCBCR422_8BIT,
    .order422    = CAM_ORDER422_8BIT_YCBYCR,//YCRYCB,
    .clockrate    = 24000000,
    .width        = 640,//800,
    .height        = 480,//600,
    .offset        = {
        .h1 = 0,
        .h2 = 0,
        .v1 = 0,
        .v2 = 0,
    },

    .polarity    = {
        .pclk    = 0,
        .vsync    = 1,
        .href    = 0,
        .hsync    = 0,
    },

    .initialized    = 0,
};

static int ov965x_probe(struct i2c_client *c, const struct i2c_device_id *id)
{
    int i;
    int ret;

    ov965x_data.client = c;
    s3c_fimc_register_camera(&ov965x_data);

    for (i = 0; i < OV965X_INIT_REGS; i++) {
        ret = i2c_smbus_write_byte_data(c, OV965X_init_reg[i].subaddr, OV965X_init_reg[i].value);
    }


    return 0;
}

static int ov965x_remove(struct i2c_client *c)
{
    return 0;
}

static struct i2c_driver ov965x_i2c_driver = {
    .driver = {
        .name        = "ov965x",
        .owner        = THIS_MODULE,
    },
    .probe        = ov965x_probe,
    .remove        = ov965x_remove,
    .id_table    = ov965x_id,
};

static __init int ov965x_init(void)
{
    info("info ov965x_init\n");
    return i2c_add_driver(&ov965x_i2c_driver);
}

static __init void ov965x_exit(void)
{
    i2c_del_driver(&ov965x_i2c_driver);
}

module_init(ov965x_init)
module_exit(ov965x_exit)

MODULE_AUTHOR("Jinsung, Yang <[email protected]>");
MODULE_DESCRIPTION("Samsung ov965x I2C based CMOS Image Sensor driver");
MODULE_LICENSE("GPL");

猜你喜欢

转载自blog.csdn.net/xiezhi123456/article/details/81611346