Files
TAIXIN/sdk/lib/bus/iic/sensor/sensor_ov7670.c

433 lines
6.2 KiB
C
Raw Normal View History

#include "sys_config.h"
#include "typesdef.h"
#include "lib/video/dvp/cmos_sensor/csi.h"
#include "tx_platform.h"
#include "list.h"
#include "dev.h"
#include "hal/i2c.h"
#if DEV_SENSOR_OV7670
SENSOR_INIT_SECTION static const unsigned char OV7670InitTable[CMOS_INIT_LEN]=
{
#if 1
0x12,0x80,
0x09,0x10,
0xc1,0x7f,
0x11,0x80,
0x3a,0x0c,
0x3d,0xc0,
0x12,0x02,
0x15,0x40,
0x17,0x13,
0x18,0x01,
0x32,0xbf,
0x19,0x02,
0x1a,0x7a,
0x03,0x0a,
0x0c,0x00,
0x3e,0x00,
0x70,0x3a,
0x71,0x35,
0x72,0x11,
0x73,0xf0,
0xa2,0x02,
0x7a,0x20,
0x7b,0x03,
0x7c,0x0a,
0x7d,0x1a,
0x7e,0x3f,
0x7f,0x4e,
0x80,0x5b,
0x81,0x68,
0x82,0x75,
0x83,0x7f,
0x84,0x89,
0x85,0x9a,
0x86,0xa6,
0x87,0xbd,
0x88,0xd3,
0x89,0xe8,
0x13,0xe0,
0x00,0x00,
0x10,0x00,
0x0d,0x40,
0x14,0x28,
0xa5,0x02,
0xab,0x02,
0x24,0x68,
0x25,0x58,
0x26,0xc2,
0x9f,0x78,
0xa0,0x68,
0xa1,0x03,
0xa6,0xd8,
0xa7,0xd8,
0xa8,0xf0,
0xa9,0x90,
0xaa,0x14,
0x13,0xe5,
0x0e,0x61,
0x0f,0x4b,
0x16,0x02,
0x1e,0x07,
0x21,0x02,
0x22,0x91,
0x29,0x07,
0x33,0x0b,
0x35,0x0b,
0x37,0x1d,
0x38,0x71,
0x39,0x2a,
0x3c,0x78,
0x4d,0x40,
0x4e,0x20,
0x69,0x00,
0x6b,0x0a,
0x74,0x10,
0x8d,0x4f,
0x8e,0x00,
0x8f,0x00,
0x90,0x00,
0x91,0x00,
0x96,0x00,
0x9a,0x80,
0xb0,0x84,
0xb1,0x0c,
0xb2,0x0e,
0xb3,0x82,
0xb8,0x0a,
0x43,0x0a,
0x44,0xf2,
0x45,0x39,
0x46,0x62,
0x47,0x3d,
0x48,0x55,
0x59,0x83,
0x5a,0x0d,
0x5b,0xcd,
0x5c,0x8c,
0x5d,0x77,
0x5e,0x16,
0x6c,0x0a,
0x6d,0x65,
0x6e,0x11,
0x6f,0x9e,
0x6a,0x40,
0x01,0x56,
0x02,0x44,
0x13,0xe7,
0x4f,0x88,
0x50,0x8b,
0x51,0x04,
0x52,0x11,
0x53,0x8c,
0x54,0x9d,
0x55,0x00,
0x56,0x40,
0x57,0x80,
0x58,0x9a,
0x41,0x08,
0x3f,0x00,
0x75,0x04,
0x76,0x60,
0x4c,0x00,
0x77,0x01,
0x3d,0xc2,
0x4b,0x09,
0xc9,0x30,
0x41,0x38,
0x56,0x40,
0x34,0x11,
0x3b,0x12,
0xa4,0x88,
0x96,0x00,
0x97,0x30,
0x98,0x20,
0x99,0x30,
0x9a,0x84,
0x9b,0x29,
0x9c,0x03,
0x9d,0x99,
0x9e,0x7f,
0x78,0x04,
0x79,0x01,
0xc8,0xf0,
0x79,0x0f,
0xc8,0x00,
0x79,0x10,
0xc8,0x7e,
0x79,0x0a,
0xc8,0x80,
0x79,0x0b,
0xc8,0x01,
0x79,0x0c,
0xc8,0x0f,
0x79,0x0d,
0xc8,0x20,
0x79,0x09,
0xc8,0x80,
0x79,0x02,
0xc8,0xc0,
0x79,0x03,
0xc8,0x40,
0x79,0x05,
0xc8,0x30,
0x79,0x26,
0x62,0x00,
0x63,0x00,
0x64,0x06,
0x65,0x00,
0x66,0x05,
0x94,0x05,
0x95,0x09,
0x2a,0x10,
0x2b,0xc2,
0x15,0x02,
0x3a,0x04,
0x3d,0xc3,
0x19,0x03,
0x1a,0x7b,
0x2a,0x00,
0x2b,0x00,
0x18,0x01,
0x66,0x05,
0x62,0x10,
0x63,0x0b,
0x65,0x07,
0x64,0x0f,
0x94,0x0e,
0x95,0x10,
0x4f,0x87,
0x50,0x68,
0x51,0x1e,
0x52,0x15,
0x53,0x7c,
0x54,0x91,
0x58,0x1e,
0x41,0x38,
0x76,0xe0,
0x24,0x40,
0x25,0x38,
0x26,0x91,
0x7a,0x09,
0x7b,0x0c,
0x7c,0x16,
0x7d,0x28,
0x7e,0x48,
0x7f,0x57,
0x80,0x64,
0x81,0x71,
0x82,0x7e,
0x83,0x89,
0x84,0x94,
0x85,0xa8,
0x86,0xba,
0x87,0xd7,
0x88,0xec,
0x89,0xf9,
0x09,0x00,
-1,-1
#else
0x12, 0x80,
//udelay(20000,
0x11, 0x00,
0x92, 0x66,
0x93, 0x00,
0x9d, 0x4c,
0x9e, 0x3f,
0x3b, 0x0a,
0x13, 0xf0,
0x10, 0x00,
0x00, 0x00,
// 0x00, 0xff, // modified by me
// 0x07, 0x3f, // added by me
0x01, 0x80,
0x02, 0x80,
0x13, 0xf5,
//
0x12, 0x00,
0x04, 0x00,
0x18, 0x01,
0x17, 0x13,
0x32, 0x92,
0x19, 0x02,
0x1a, 0x7a,
0x03, 0x00,
//
0x0e, 0x84,
0x0f, 0x62,
0x15, 0x02,
0x16, 0x02,
0x1b, 0x01,
0x1e, 0x01,
0x29, 0x3c,
0x33, 0x00,
0x34, 0x07,
0x35, 0x84,
0x36, 0x00,
0x38, 0x13,
0x39, 0x43,
0x3a, 0x00,
0x3c, 0x6c,
0x3d, 0x90,
0x3f, 0x29,
0x40, 0xc1,
0x41, 0x20,
0x6b, 0x0a,
0xa1, 0xc8,
//
0x69, 0x80,
0x43, 0xf0,
0x44, 0x10,
0x45, 0x78,
0x46, 0xa8,
0x47, 0x60,
0x48, 0x80,
0x59, 0xba,
0x5a, 0x9a,
0x5b, 0x22,
0x5c, 0xb9,
0x5d, 0x9b,
0x5e, 0x10,
0x5f, 0xe0,
0x60, 0x85,
0x61, 0x60,
0x9f, 0x9d,
0xa0, 0xa0,
//
0x4f, 0x66,
0x50, 0x6b,
0x51, 0x05,
0x52, 0x19,
0x53, 0x40,
0x54, 0x59,
0x55, 0x40,
0x56, 0x40,
0x57, 0x40,
0x58, 0x0d,
//
0x8b, 0xcc,
0x8c, 0xcc,
0x8d, 0xcf,
//
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,
//
0x14, 0x1a,
0x24, 0x78,
0x25, 0x6c,
0x62, 0x00,
0x63, 0x00,
0x64, 0x18,
0x65, 0x30,
0x66, 0x05,
0x94, 0x18,
0x95, 0x1c,
//udelay(8000,
0x13, 0xf7,
-1,-1,
#endif
};
extern struct i2c_device *iic_test;
static void OV7670_rotate(uint32 r)
{
unsigned char buf[2];
buf[0] = 0x1e;
buf[1] = (r<<4)|0x07;
// sensor_iic_enable();
// sensor_iic_info();
//i2c_sensor_write(iic_test,buf,1,1,0x42,0x43);
//i2c_write(iic_test,(int8 *)&t[i][0],1,(int8 *)&t[i][1],1);
i2c_write(iic_test,(int8 *)buf,1,(int8 *)&buf[1],1);
// sensor_iic_diable();
}
uint32 OV7670_hvblank(int8 dh,int8 dv)
{
uint32 i;
#define HBLANK_BASE 0//0xb0UL//0x80UL//0xb0UL
#define VBLANK_BASE 0//0x20UL//0x0AUL//0x20UL
int32 h = (int32)HBLANK_BASE + dh; if(h < 0) h = 0;
int32 v = (int32)VBLANK_BASE + dv; if(v < 0) v = 0;
const uint8 t[][2] = {
{0x2A,(h >> 8)<<4},//HB[11:8]
{0x2B,h & 0xff},//HB[7:0]
{0x2D,v & 0xff},//VB[11:8]
{0x2E,v >> 8},//VB[7:0]
};
for(i=0;i<4;i++)
//i2c_sensor_write(iic_test,(u8 *)&t[i][0],1,1,0x42,0x43);
i2c_write(iic_test,(int8 *)&t[i][0],1,(int8 *)&t[i][1],1);
return (h<<16)|v;
}
SENSOR_OP_SECTION const _Sensor_Adpt_ ov7670_cmd =
{
.typ = 1, //YUV
.pixelw = 640,
.pixelh= 480,
.hsyn = 1,
.vsyn = 1,
.rduline = 0,//
.rawwide = 1,//10bit
.colrarray = 2,//0:_RGRG_ 1:_GRGR_,2:_BGBG_,3:_GBGB_
.init = (uint8 *)OV7670InitTable,
.rotate_adapt = {0},
.hvb_adapt = {0,0,0,0},
. mclk = 4000000,
.p_fun_adapt = {OV7670_rotate,OV7670_hvblank,NULL},
.p_xc7016_adapt = {NULL},
};
const _Sensor_Ident_ ov7670_init=
{
0x76,0x42,0x43,0x01,0x01,0x0a
};
#endif