Fix Support for OV7725

This commit is contained in:
me-no-dev
2019-06-14 12:26:43 +02:00
parent bd617234a7
commit 1d555b4b2e
3 changed files with 91 additions and 8 deletions

View File

@@ -28,8 +28,8 @@ static const uint8_t default_regs[][2] = {
{COM3, COM3_SWAP_YUV},
{COM7, COM7_RES_QVGA | COM7_FMT_YUV},
{COM4, 0x01}, /* bypass PLL */
{CLKRC, 0xC0}, /* Res/Bypass pre-scalar */
{COM4, 0x01 | 0x00}, /* bypass PLL (0x00:off, 0x40:4x, 0x80:6x, 0xC0:8x) */
{CLKRC, 0x80 | 0x03}, /* Res/Bypass pre-scalar (0x40:bypass, 0x00-0x3F:prescaler PCLK=XCLK/(prescaler + 1)/2 ) */
// QVGA Window Size
{HSTART, 0x3F},
@@ -41,9 +41,9 @@ static const uint8_t default_regs[][2] = {
// Scale down to QVGA Resolution
{HOUTSIZE, 0x50},
{VOUTSIZE, 0x78},
{EXHCH, 0x00},
{COM12, 0x03},
{EXHCH, 0x00},
{TGT_B, 0x7F},
{FIXGAIN, 0x09},
{AWB_CTRL0, 0xE0},
@@ -148,6 +148,7 @@ static int reset(sensor_t *sensor)
static int set_pixformat(sensor_t *sensor, pixformat_t pixformat)
{
int ret=0;
sensor->pixformat = pixformat;
// Read register 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;
uint16_t w = resolution[framesize][0];
uint16_t h = resolution[framesize][1];
uint8_t reg = SCCB_Read(sensor->slv_addr, COM7);
sensor->status.framesize = framesize;
// Write MSBs
ret |= SCCB_Write(sensor->slv_addr, HOUTSIZE, w>>2);
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
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) {
// Enable auto-scaling/zooming factors
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 {
// Disable auto-scaling/zooming factors
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, SCAL1, 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
@@ -208,6 +230,7 @@ static int set_colorbar(sensor_t *sensor, int enable)
{
int ret=0;
uint8_t reg;
sensor->status.colorbar = enable;
// Read reg COM3
reg = SCCB_Read(sensor->slv_addr, COM3);
@@ -231,6 +254,7 @@ static int set_whitebal(sensor_t *sensor, int enable)
// Read register COM8
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
sensor->status.awb = enable;
// Set white bal on/off
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)
{
sensor->status.agc = enable;
// Read register 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)
{
sensor->status.aec = enable;
// Read register 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)
{
sensor->status.hmirror = enable;
// Read register 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)
{
sensor->status.vflip = enable;
// Read register 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);
}
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)
{
// Set function pointers
sensor->reset = reset;
sensor->init_status = init_status;
sensor->set_pixformat = set_pixformat;
sensor->set_framesize = set_framesize;
sensor->set_colorbar = set_colorbar;
@@ -299,6 +341,34 @@ int ov7725_init(sensor_t *sensor)
sensor->set_hmirror = set_hmirror;
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
sensor->id.MIDH = SCCB_Read(sensor->slv_addr, REG_MIDH);
sensor->id.MIDL = SCCB_Read(sensor->slv_addr, REG_MIDL);