Merge pull request #819 from kwagyeman/kwabea/fix_bayer_issues

Fix bayer vflip on OV7725 and OV7690
This commit is contained in:
Ibrahim Abd Elkader 2020-05-30 21:15:58 +02:00 committed by GitHub
commit 8526f88a61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 4 deletions

View File

@ -265,15 +265,21 @@ static int set_pixformat(sensor_t *sensor, pixformat_t pixformat)
static int set_framesize(sensor_t *sensor, framesize_t framesize)
{
uint8_t reg;
int ret=0;
uint16_t w = resolution[framesize][0];
uint16_t h = resolution[framesize][1];
bool vflip;
if (((w > 640) || (h > 480))
|| (sensor->pixformat && (sensor->pixformat == PIXFORMAT_BAYER) && (framesize != FRAMESIZE_VGA))) { // bayer for vga only
return -1;
}
// Sample VFLIP
ret |= cambus_readb(&sensor->i2c, sensor->slv_addr, REG0C, &reg);
vflip = !(reg & 0x80);
if ((w <= 320) && (h <= 240)) {
// Set QVGA Resolution
uint8_t reg;
@ -282,7 +288,7 @@ static int set_framesize(sensor_t *sensor, framesize_t framesize)
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REG12, reg);
// Set QVGA Window Size
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REG19, 0x03);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REG19, 0x03 - vflip);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REGC8, 0x02);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REGC9, 0x80);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REGCA, 0x00);
@ -295,7 +301,7 @@ static int set_framesize(sensor_t *sensor, framesize_t framesize)
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REG12, reg);
// Set VGA Window Size
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REG19, 0x0b);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REG19, 0x0b - vflip);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REGC8, 0x02);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REGC9, 0x80);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REGCA, 0x01);
@ -546,6 +552,8 @@ static int set_vflip(sensor_t *sensor, int enable)
uint8_t reg;
int ret = cambus_readb(&sensor->i2c, sensor->slv_addr, REG0C, &reg);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, REG0C, (reg & 0x7F) | ((enable == 0) << 7));
// Apply new vertical flip setting.
ret |= set_framesize(sensor, sensor->framesize);
return ret;
}

View File

@ -224,9 +224,11 @@ static int set_pixformat(sensor_t *sensor, pixformat_t pixformat)
static int set_framesize(sensor_t *sensor, framesize_t framesize)
{
uint8_t reg;
int ret=0;
uint16_t w = resolution[framesize][0];
uint16_t h = resolution[framesize][1];
bool vflip;
// Write MSBs
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, HOUTSIZE, w>>2);
@ -235,6 +237,12 @@ static int set_framesize(sensor_t *sensor, framesize_t framesize)
// Write LSBs
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, EXHCH, ((w&0x3) | ((h&0x1) << 2)));
// Sample VFLIP
ret |= cambus_readb(&sensor->i2c, sensor->slv_addr, COM3, &reg);
vflip = reg & COM3_VFLIP;
ret |= cambus_readb(&sensor->i2c, sensor->slv_addr, HREF, &reg);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, HREF, (reg & 0xBF) | (vflip ? 0x40 : 0x00));
if ((w <= 320) && (h <= 240)) {
// Set QVGA Resolution
uint8_t reg;
@ -245,7 +253,7 @@ static int set_framesize(sensor_t *sensor, framesize_t framesize)
// Set QVGA Window Size
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, HSTART, 0x3F);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, HSIZE, 0x50);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, VSTART, 0x03);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, VSTART, 0x03 - vflip);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, VSIZE, 0x78);
// Enable auto-scaling/zooming factors
@ -260,7 +268,7 @@ static int set_framesize(sensor_t *sensor, framesize_t framesize)
// Set VGA Window Size
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, HSTART, 0x23);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, HSIZE, 0xA0);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, VSTART, 0x07);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, VSTART, 0x07 - vflip);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, VSIZE, 0xF0);
// Disable auto-scaling/zooming factors
@ -539,6 +547,8 @@ static int set_vflip(sensor_t *sensor, int enable)
uint8_t reg;
int ret = cambus_readb(&sensor->i2c, sensor->slv_addr, COM3, &reg);
ret |= cambus_writeb(&sensor->i2c, sensor->slv_addr, COM3, COM3_SET_FLIP(reg, enable));
// Apply new vertical flip setting.
ret |= set_framesize(sensor, sensor->framesize);
return ret;
}