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 <jsgood.yang@samsung.com>");
MODULE_DESCRIPTION("Samsung ov965x I2C based CMOS Image Sensor driver");
MODULE_LICENSE("GPL");