📄 camera.c
字号:
#include "config.h"
#include "LPC2294.h"
OS_EVENT *CamMbox = NULL; // 摄像头消息邮箱
#define LED1 (1<<28)
#define LED2 (1<<29)
#define Led_on1(void) (IO2CLR |= LED1)
#define Led_on2(void) (IO2CLR |= LED2)
/*XCLK时钟设置*/
#define CYCLE_DATA 100
#define DUTY_CYCLE_DATA 50
#define udelay(x) Delay(x/50)
#define mdelay(x) Delay((x)*8)
#define min(x1,x2) (((x1)<(x2))? (x1):(x2))
#define max(x1,x2) (((x1)>(x2))? (x1):(x2))
/* refer to OV9650 datasheet */
static unsigned char sccb_id = 0x60; //OV9650
#define OV9650_SCCB_ID sccb_id //0x42 /* CS[2:0] = 000 */ //hzh, use variable
#define OV9650_MAX_CLK 24000000 // 24MHz
#define OV9650_PRODUCT_ID 0x7FA2
#define OV9650_SCCB_DELAY 100
#define OV9650_SCCB_DELAY2 100
#define read_gpio_bit(x) ((IO1PIN & (1<<(x))) ? 1 : 0)
#define write_gpio_bit_set(x) (IO1SET |= 1<<(x))
#define write_gpio_bit_clear(x) (IO1CLR |= 1<<(x))
#define SIO_C (20)
#define SIO_D (21)
#define BIT_READ(x) read_gpio_bit(x)
#define MAKE_HIGH(x) write_gpio_bit_set(x)
#define MAKE_LOW(x) write_gpio_bit_clear(x)
#define YCbCrtoR(Y,Cb,Cr) (1000*Y + 1371*(Cr-128))/1000
#define YCbCrtoG(Y,Cb,Cr) (1000*Y - 336*(Cb-128) - 698*(Cr-128))/1000
#define YCbCrtoB(Y,Cb,Cr) (1000*Y + 1732*(Cb-128))/1000
#define SCR_XSIZE_TFT_240320 (240)
#define SCR_YSIZE_TFT_240320 (320)
unsigned char Cam_outY[100000];
unsigned char Cam_outU[100000];
unsigned char Cam_outV[100000];
unsigned short RGBBuffer[200000];
int Preview_size;
#if OV9650_SCCB_DELAY > 0
#define WAIT_CYL udelay(OV9650_SCCB_DELAY)
#else
#define WAIT_CYL (void)(0)
#endif
#if OV9650_SCCB_DELAY2 > 0
#define WAIT_STAB udelay(OV9650_SCCB_DELAY2)
#else
#define WAIT_STAB (void)(0)
#endif
//***************************[ ov9650 reg ]***************************************************
#define CAMERA_WRITE (0x60 + 0)
#define CAMERA_READ (0x60 + 1)
#define CHIP_DELAY 0xFF
struct ov9650_t
{
int subaddr;
int value;
};
struct ov9650_t ov9650_reg[] =
{
{0x12, 0x80}, // Camera Soft reset. Self cleared after reset.
{CHIP_DELAY, 10},
{0x11,0x07},{0x6a,0x3e},{0x3b,0x09},{0x13,0xe0},{0x01,0x80},{0x02,0x80},{0x00,0x00},{0x10,0x00},
{0x13,0xe5},{0x39,0x43},{0x38,0x12},{0x37,0x00},{0x35,0x91},{0x0e,0xa0},{0x1e,0x04},{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,0x38},
{0x55,0x40},{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},
};
#define OV9650_REGS (sizeof(ov9650_reg)/sizeof(ov9650_reg[0]))
//***************************[ SYSTEM ]***************************************************
void Delay(int time)
{
uint32 i;
for(; time>0; time--)
{ for(i=0; i<100; i++);
}
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入:
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_Init(void)
{
PINSEL1 = PINSEL1 &0xfffffff7; /* 选择管脚p1.20,P1.21为GPIO,输出高 */
IO1DIR=IO1DIR | 0x00300000;
IO1SET=IO1SET | 0x00300000;
IO2DIR=IO2DIR | 0x30000000; /* 选择管脚p2.28,P2.29为GPIO,输出高 */
IO2SET=IO2SET | 0x30000000;
mdelay(10);
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入:
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_Write(void)
{
IO1DIR=IO1DIR | 0x00200000; /* 选择管脚p1.21输出 */
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入:
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_Read(void)
{
IO1DIR=IO1DIR & 0xFFDFFFFF; /* 选择管脚p1.21输入 */
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入:
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
/* 2-wire SCCB */
void __inline ov9650_sccb_start(void)
{
MAKE_HIGH(SIO_C);
MAKE_HIGH(SIO_D);
WAIT_STAB;
MAKE_LOW(SIO_D);
WAIT_STAB;
MAKE_LOW(SIO_C);
WAIT_STAB;
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入:
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
/* 2-wire SCCB */
void __inline ov9650_sccb_end(void)
{
MAKE_LOW(SIO_D);
WAIT_STAB;
MAKE_HIGH(SIO_C);
WAIT_STAB;
MAKE_HIGH(SIO_D);
WAIT_STAB;
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入:
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_sccb_write_bit(unsigned char bit)
{
if (bit)
MAKE_HIGH(SIO_D);
else
MAKE_LOW(SIO_D);
WAIT_STAB;
MAKE_HIGH(SIO_C);
WAIT_CYL;
MAKE_LOW(SIO_C);
WAIT_STAB;
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入:
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
int __inline ov9650_sccb_read_bit(void)
{
int tmp = 0;
MAKE_HIGH(SIO_C);
WAIT_CYL;
tmp = BIT_READ(SIO_D);
MAKE_LOW(SIO_C);
WAIT_STAB;
return tmp;
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入:
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_sccb_writechar(unsigned char data)
{
int i = 0;
/* data */
for (i = 0; i < 8; i++ ) {
ov9650_sccb_write_bit(data & 0x80);
data <<= 1;
}
/* 9th bit - Don't care */
ov9650_sccb_write_bit(1);
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入:
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
void __inline ov9650_sccb_readchar(unsigned char *val)
{
int i;
int tmp = 0;
ov9650_Read();
for (i = 7; i >= 0; i--)
tmp |= ov9650_sccb_read_bit() << i;
ov9650_Write();
/* 9th bit - N.A. */
ov9650_sccb_write_bit(1);
*val = tmp & 0xff;
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入:
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
static void ov9650_sccb_sendbyte(unsigned char subaddr, unsigned char data)
{
// down(&dev.bus_lock);
ov9650_sccb_start();
ov9650_sccb_writechar(OV9650_SCCB_ID);
ov9650_sccb_writechar(subaddr);
ov9650_sccb_writechar(data);
ov9650_sccb_end();
mdelay(7);
// up(&dev.bus_lock);
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入:
**
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************************/
/* 2-phase read */
static unsigned char ov9650_sccb_receivebyte(unsigned char subaddr)
{
unsigned char value;
// down(&dev.bus_lock);
/* 2-phase write */
ov9650_sccb_start();
ov9650_sccb_writechar(OV9650_SCCB_ID);
ov9650_sccb_writechar(subaddr);
ov9650_sccb_end();
/* 2-phase read */
ov9650_sccb_start();
ov9650_sccb_writechar(OV9650_SCCB_ID | 0x01);
ov9650_sccb_readchar(&value);
ov9650_sccb_end();
mdelay(7);
// up(&dev.bus_lock);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -