mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Merge pull request #819 from kwagyeman/kwabea/fix_bayer_issues
Fix bayer vflip on OV7725 and OV7690
This commit is contained in:
commit
8526f88a61
@ -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, ®);
|
||||
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, ®);
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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, ®);
|
||||
vflip = reg & COM3_VFLIP;
|
||||
ret |= cambus_readb(&sensor->i2c, sensor->slv_addr, HREF, ®);
|
||||
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, ®);
|
||||
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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user