www.pudn.com > ucosii_demo.rar > hv7131.c, change:2007-06-15,size:4844b
/*
* HV7131 CMOS camera sensor initialization
*/
#include "camera.h"
/*
* hv7131 registers
*/
#define DEVID 0x00 /* Dev ID */
#define SCTRA 0x01 /* Sensor Control A */
#define SCTRB 0x02 /* Sensor Control B */
#define OUTIV 0x03 /* Output Inversion */
#define RSAU 0x10 /* Row Start Address Upper */
#define RSAL 0x11 /* Row Start Address Lower */
#define CSAU 0x12 /* Col Start Address Upper */
#define CSAL 0x13 /* Col Start Address Lower */
#define WIHU 0x14 /* Window Height Upper */
#define WIHL 0x15 /* Window Height Lower */
#define WIWU 0x16 /* Window Width Upper */
#define WIWL 0x17 /* Window Width Lower */
#define HBLU 0x20 /* HBLANK Time Upper */
#define HBLL 0x21 /* HBLANK Time Lower */
#define VBLU 0x22 /* VBLANK Time Upper */
#define VBLL 0x23 /* VBLANK Time Lower */
#define INTH 0x25 /* Integration Time High */
#define INTM 0x26 /* Integration Time Middle */
#define INTL 0x27 /* Integration Time Low */
#define PAG 0x30 /* Pre-amp Gain */
#define RCG 0x31 /* Red Color Gain */
#define GCG 0x32 /* Green Color Gain */
#define BCG 0x33 /* Blue Color Gain */
#define ACTRA 0x34 /* Analog Bias Control A */
#define ACTRB 0x35 /* Analog Bias Control B */
#define BLCTH 0x40 /* Black Level Threshod */
#define ORedI 0x41 /* Initial ADC Offset Red */
#define OGrnI 0x42 /* Initial ADC Offset Green */
#define OBluI 0x43 /* Initial ADC Offset Blue */
/*
* Define the starting (x, y)
*/
/* cam2 */
#define XSTART 0x02
#define YSTART 0x02
#define VAL_INT_TIME 35
#define VAL_PAG 0x30
#define VAL_DIV 2
/* cam2 */
/* integration time */
//static unsigned int integration_time = 35; /* unit: ms */
static unsigned int integration_time = VAL_INT_TIME; /* unit: ms */
/* master clock and video clock */
static unsigned int mclk_hz = 25000000; /* 25 MHz */
//static unsigned int vclk_div = 2; /* VCLK = MCLK/vclk_div: 2,4,8,16,32 */
static unsigned int vclk_div = VAL_DIV; /* VCLK = MCLK/vclk_div: 2,4,8,16,32 */
/* left, top, width, height */
static void set_window(int l, int t, int w, int h)
{
l = (l/2)*2;
t = (t/2)*2;
/* Set the column start address */
sensor_write_reg(CSAU, (l >> 8) & 0xff);
sensor_write_reg(CSAL, l & 0xff);
/* Set the row start address */
sensor_write_reg(RSAU, (t >> 8) & 0xff);
sensor_write_reg(RSAL, t & 0xff);
/* Set the image window width*/
sensor_write_reg(WIWU, (w >> 8) & 0xff);
sensor_write_reg(WIWL, w & 0xff);
/* Set the image window height*/
sensor_write_reg(WIHU, (h >> 8) & 0xff);
sensor_write_reg(WIHL, h & 0xff);
}
static void set_blanking_time(unsigned short hb_time, unsigned short vb_time)
{
hb_time = (hb_time 0xd0)? 0xd0 : hb_time;
vb_time = (vb_time 0x08)? 0x08 : vb_time;
sensor_write_reg(HBLU, (hb_time >> 8) & 0xff);
sensor_write_reg(HBLL, hb_time & 0xff);
sensor_write_reg(VBLU, (vb_time >> 8) & 0xff);
sensor_write_reg(VBLL, vb_time & 0xff);
}
static void set_integration_time(void)
{
unsigned int regval;
if (vclk_div == 0) vclk_div = 2;
regval = (integration_time * mclk_hz)/ (1000*vclk_div); /* default: 0x065b9a */
sensor_write_reg(INTH, (regval & 0xff0000) >> 16);
sensor_write_reg(INTM, (regval & 0xff00) >> 8);
sensor_write_reg(INTL, regval & 0xff);
}
/* VCLK = MCLK/div */
static void set_hv7131_clock(int div)
{
#define ABLC_EN (1 < 3)
/* ABLC enable */
switch (div) {
case 2:
sensor_write_reg(SCTRA, ABLC_EN | 0x01); // DCF=MCLK
break;
case 4:
sensor_write_reg(SCTRA, ABLC_EN | 0x11); // DCF=MCLK/2
break;
case 8:
sensor_write_reg(SCTRA, ABLC_EN | 0x21); // DCF=MCLK/4
break;
case 16:
sensor_write_reg(SCTRA, ABLC_EN | 0x31); // DCF=MCLK/8
break;
case 32:
sensor_write_reg(SCTRA, ABLC_EN | 0x41); // DCF=MCLK/16
break;
default:
break;
}
}
void init_hv7131(void)
{
//sensor_open();
//sensor_set_addr(0x22);
//sensor_set_clk(100000);
//sensor_write_reg(SCTRB, 0x05); // VsHsEn, HSYNC mode
sensor_write_reg(SCTRB, 0x15); // VsHsEn, HSYNC mode
sensor_write_reg(BLCTH, 0xff); // set black level threshold
sensor_write_reg(OUTIV, 0x01); /*modified, Wolfwang */
sensor_write_reg(PAG, VAL_PAG); /*modified, Wolfwang */
sensor_write_reg(RCG, 0x08);
sensor_write_reg(GCG, 0x08);
sensor_write_reg(BCG, 0x08);
sensor_write_reg(ACTRA, 0x17);
sensor_write_reg(ACTRB, 0x7f);
sensor_write_reg(ORedI, 0x7f);
sensor_write_reg(OGrnI, 0x7f);
sensor_write_reg(OBluI, 0x7f);
set_hv7131_clock(vclk_div);
set_window(XSTART, YSTART, IMG_WIDTH, IMG_HEIGHT);
set_integration_time();
//set_blanking_time(0xd0, 0x04); // default
set_blanking_time(0xff, 0x08); // ZK value
//sensor_close();
}