|
|
@ -28,8 +28,8 @@ static const uint8_t default_regs[][2] = { |
|
|
|
{COM3, COM3_SWAP_YUV}, |
|
|
|
{COM3, COM3_SWAP_YUV}, |
|
|
|
{COM7, COM7_RES_QVGA | COM7_FMT_YUV}, |
|
|
|
{COM7, COM7_RES_QVGA | COM7_FMT_YUV}, |
|
|
|
|
|
|
|
|
|
|
|
{COM4, 0x01}, /* bypass PLL */ |
|
|
|
{COM4, 0x01 | 0x00}, /* bypass PLL (0x00:off, 0x40:4x, 0x80:6x, 0xC0:8x) */ |
|
|
|
{CLKRC, 0xC0}, /* Res/Bypass pre-scalar */ |
|
|
|
{CLKRC, 0x80 | 0x03}, /* Res/Bypass pre-scalar (0x40:bypass, 0x00-0x3F:prescaler PCLK=XCLK/(prescaler + 1)/2 ) */ |
|
|
|
|
|
|
|
|
|
|
|
// QVGA Window Size
|
|
|
|
// QVGA Window Size
|
|
|
|
{HSTART, 0x3F}, |
|
|
|
{HSTART, 0x3F}, |
|
|
@ -41,9 +41,9 @@ static const uint8_t default_regs[][2] = { |
|
|
|
// Scale down to QVGA Resolution
|
|
|
|
// Scale down to QVGA Resolution
|
|
|
|
{HOUTSIZE, 0x50}, |
|
|
|
{HOUTSIZE, 0x50}, |
|
|
|
{VOUTSIZE, 0x78}, |
|
|
|
{VOUTSIZE, 0x78}, |
|
|
|
|
|
|
|
{EXHCH, 0x00}, |
|
|
|
|
|
|
|
|
|
|
|
{COM12, 0x03}, |
|
|
|
{COM12, 0x03}, |
|
|
|
{EXHCH, 0x00}, |
|
|
|
|
|
|
|
{TGT_B, 0x7F}, |
|
|
|
{TGT_B, 0x7F}, |
|
|
|
{FIXGAIN, 0x09}, |
|
|
|
{FIXGAIN, 0x09}, |
|
|
|
{AWB_CTRL0, 0xE0}, |
|
|
|
{AWB_CTRL0, 0xE0}, |
|
|
@ -148,6 +148,7 @@ static int reset(sensor_t *sensor) |
|
|
|
static int set_pixformat(sensor_t *sensor, pixformat_t pixformat) |
|
|
|
static int set_pixformat(sensor_t *sensor, pixformat_t pixformat) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int ret=0; |
|
|
|
int ret=0; |
|
|
|
|
|
|
|
sensor->pixformat = pixformat; |
|
|
|
// Read register COM7
|
|
|
|
// Read register COM7
|
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM7); |
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM7); |
|
|
|
|
|
|
|
|
|
|
@ -177,17 +178,31 @@ static int set_framesize(sensor_t *sensor, framesize_t framesize) |
|
|
|
int ret=0; |
|
|
|
int ret=0; |
|
|
|
uint16_t w = resolution[framesize][0]; |
|
|
|
uint16_t w = resolution[framesize][0]; |
|
|
|
uint16_t h = resolution[framesize][1]; |
|
|
|
uint16_t h = resolution[framesize][1]; |
|
|
|
|
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM7); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sensor->status.framesize = framesize; |
|
|
|
|
|
|
|
|
|
|
|
// Write MSBs
|
|
|
|
// Write MSBs
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, HOUTSIZE, w>>2); |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, HOUTSIZE, w>>2); |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, VOUTSIZE, h>>1); |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, VOUTSIZE, h>>1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, HSIZE, w>>2); |
|
|
|
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, VSIZE, h>>1); |
|
|
|
|
|
|
|
|
|
|
|
// Write LSBs
|
|
|
|
// Write LSBs
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, EXHCH, ((w&0x3) | ((h&0x1) << 2))); |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, HREF, ((w&0x3) | ((h&0x1) << 2))); |
|
|
|
|
|
|
|
|
|
|
|
if (framesize < FRAMESIZE_VGA) { |
|
|
|
if (framesize < FRAMESIZE_VGA) { |
|
|
|
// Enable auto-scaling/zooming factors
|
|
|
|
// Enable auto-scaling/zooming factors
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, DSPAUTO, 0xFF); |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, DSPAUTO, 0xFF); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, HSTART, 0x3F); |
|
|
|
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, VSTART, 0x03); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, COM7, reg | COM7_RES_QVGA); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, CLKRC, 0x80 | 0x01); |
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
} else { |
|
|
|
// Disable auto-scaling/zooming factors
|
|
|
|
// Disable auto-scaling/zooming factors
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, DSPAUTO, 0xF3); |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, DSPAUTO, 0xF3); |
|
|
@ -196,6 +211,13 @@ static int set_framesize(sensor_t *sensor, framesize_t framesize) |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, SCAL0, 0x00); |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, SCAL0, 0x00); |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, SCAL1, 0x00); |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, SCAL1, 0x00); |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, SCAL2, 0x00); |
|
|
|
ret |= SCCB_Write(sensor->slv_addr, SCAL2, 0x00); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, HSTART, 0x23); |
|
|
|
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, VSTART, 0x07); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, COM7, reg & ~COM7_RES_QVGA); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret |= SCCB_Write(sensor->slv_addr, CLKRC, 0x80 | 0x03); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Delay
|
|
|
|
// Delay
|
|
|
@ -208,6 +230,7 @@ static int set_colorbar(sensor_t *sensor, int enable) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int ret=0; |
|
|
|
int ret=0; |
|
|
|
uint8_t reg; |
|
|
|
uint8_t reg; |
|
|
|
|
|
|
|
sensor->status.colorbar = enable; |
|
|
|
|
|
|
|
|
|
|
|
// Read reg COM3
|
|
|
|
// Read reg COM3
|
|
|
|
reg = SCCB_Read(sensor->slv_addr, COM3); |
|
|
|
reg = SCCB_Read(sensor->slv_addr, COM3); |
|
|
@ -231,6 +254,7 @@ static int set_whitebal(sensor_t *sensor, int enable) |
|
|
|
// Read register COM8
|
|
|
|
// Read register COM8
|
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8); |
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sensor->status.awb = enable; |
|
|
|
// Set white bal on/off
|
|
|
|
// Set white bal on/off
|
|
|
|
reg = COM8_SET_AWB(reg, enable); |
|
|
|
reg = COM8_SET_AWB(reg, enable); |
|
|
|
|
|
|
|
|
|
|
@ -240,6 +264,7 @@ static int set_whitebal(sensor_t *sensor, int enable) |
|
|
|
|
|
|
|
|
|
|
|
static int set_gain_ctrl(sensor_t *sensor, int enable) |
|
|
|
static int set_gain_ctrl(sensor_t *sensor, int enable) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
sensor->status.agc = enable; |
|
|
|
// Read register COM8
|
|
|
|
// Read register COM8
|
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8); |
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8); |
|
|
|
|
|
|
|
|
|
|
@ -252,6 +277,7 @@ static int set_gain_ctrl(sensor_t *sensor, int enable) |
|
|
|
|
|
|
|
|
|
|
|
static int set_exposure_ctrl(sensor_t *sensor, int enable) |
|
|
|
static int set_exposure_ctrl(sensor_t *sensor, int enable) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
sensor->status.aec = enable; |
|
|
|
// Read register COM8
|
|
|
|
// Read register COM8
|
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8); |
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8); |
|
|
|
|
|
|
|
|
|
|
@ -264,6 +290,7 @@ static int set_exposure_ctrl(sensor_t *sensor, int enable) |
|
|
|
|
|
|
|
|
|
|
|
static int set_hmirror(sensor_t *sensor, int enable) |
|
|
|
static int set_hmirror(sensor_t *sensor, int enable) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
sensor->status.hmirror = enable; |
|
|
|
// Read register COM3
|
|
|
|
// Read register COM3
|
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM3); |
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM3); |
|
|
|
|
|
|
|
|
|
|
@ -276,6 +303,7 @@ static int set_hmirror(sensor_t *sensor, int enable) |
|
|
|
|
|
|
|
|
|
|
|
static int set_vflip(sensor_t *sensor, int enable) |
|
|
|
static int set_vflip(sensor_t *sensor, int enable) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
sensor->status.vflip = enable; |
|
|
|
// Read register COM3
|
|
|
|
// Read register COM3
|
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM3); |
|
|
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM3); |
|
|
|
|
|
|
|
|
|
|
@ -286,10 +314,24 @@ static int set_vflip(sensor_t *sensor, int enable) |
|
|
|
return SCCB_Write(sensor->slv_addr, COM3, reg); |
|
|
|
return SCCB_Write(sensor->slv_addr, COM3, reg); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int init_status(sensor_t *sensor) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
sensor->status.awb = 0;//get_reg_bits(sensor, BANK_DSP, CTRL1, 3, 1);
|
|
|
|
|
|
|
|
sensor->status.aec = 0; |
|
|
|
|
|
|
|
sensor->status.agc = 0; |
|
|
|
|
|
|
|
sensor->status.hmirror = 0; |
|
|
|
|
|
|
|
sensor->status.vflip = 0; |
|
|
|
|
|
|
|
sensor->status.colorbar = 0; |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int set_dummy(sensor_t *sensor, int val){ return -1; } |
|
|
|
|
|
|
|
|
|
|
|
int ov7725_init(sensor_t *sensor) |
|
|
|
int ov7725_init(sensor_t *sensor) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Set function pointers
|
|
|
|
// Set function pointers
|
|
|
|
sensor->reset = reset; |
|
|
|
sensor->reset = reset; |
|
|
|
|
|
|
|
sensor->init_status = init_status; |
|
|
|
sensor->set_pixformat = set_pixformat; |
|
|
|
sensor->set_pixformat = set_pixformat; |
|
|
|
sensor->set_framesize = set_framesize; |
|
|
|
sensor->set_framesize = set_framesize; |
|
|
|
sensor->set_colorbar = set_colorbar; |
|
|
|
sensor->set_colorbar = set_colorbar; |
|
|
@ -299,6 +341,34 @@ int ov7725_init(sensor_t *sensor) |
|
|
|
sensor->set_hmirror = set_hmirror; |
|
|
|
sensor->set_hmirror = set_hmirror; |
|
|
|
sensor->set_vflip = set_vflip; |
|
|
|
sensor->set_vflip = set_vflip; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//not supported
|
|
|
|
|
|
|
|
sensor->set_brightness= set_dummy; |
|
|
|
|
|
|
|
sensor->set_saturation= set_dummy; |
|
|
|
|
|
|
|
sensor->set_quality = set_dummy; |
|
|
|
|
|
|
|
sensor->set_gainceiling = set_dummy; |
|
|
|
|
|
|
|
sensor->set_gain_ctrl = set_dummy; |
|
|
|
|
|
|
|
sensor->set_exposure_ctrl = set_dummy; |
|
|
|
|
|
|
|
sensor->set_hmirror = set_dummy; |
|
|
|
|
|
|
|
sensor->set_vflip = set_dummy; |
|
|
|
|
|
|
|
sensor->set_whitebal = set_dummy; |
|
|
|
|
|
|
|
sensor->set_aec2 = set_dummy; |
|
|
|
|
|
|
|
sensor->set_aec_value = set_dummy; |
|
|
|
|
|
|
|
sensor->set_special_effect = set_dummy; |
|
|
|
|
|
|
|
sensor->set_wb_mode = set_dummy; |
|
|
|
|
|
|
|
sensor->set_ae_level = set_dummy; |
|
|
|
|
|
|
|
sensor->set_dcw = set_dummy; |
|
|
|
|
|
|
|
sensor->set_bpc = set_dummy; |
|
|
|
|
|
|
|
sensor->set_wpc = set_dummy; |
|
|
|
|
|
|
|
sensor->set_awb_gain = set_dummy; |
|
|
|
|
|
|
|
sensor->set_agc_gain = set_dummy; |
|
|
|
|
|
|
|
sensor->set_raw_gma = set_dummy; |
|
|
|
|
|
|
|
sensor->set_lenc = set_dummy; |
|
|
|
|
|
|
|
sensor->set_sharpness = set_dummy; |
|
|
|
|
|
|
|
sensor->set_denoise = set_dummy; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Retrieve sensor's signature
|
|
|
|
// Retrieve sensor's signature
|
|
|
|
sensor->id.MIDH = SCCB_Read(sensor->slv_addr, REG_MIDH); |
|
|
|
sensor->id.MIDH = SCCB_Read(sensor->slv_addr, REG_MIDH); |
|
|
|
sensor->id.MIDL = SCCB_Read(sensor->slv_addr, REG_MIDL); |
|
|
|
sensor->id.MIDL = SCCB_Read(sensor->slv_addr, REG_MIDL); |
|
|
|