| From: Frank Schaefer <fschaefer.oss@googlemail.com> |
| Date: Sun, 16 Apr 2017 14:35:45 -0300 |
| Subject: [media] ov2640: fix vflip control |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit 7f140fc2064bcd23e0490d8210650e2ef21c1c89 upstream. |
| |
| Enabling vflip currently causes wrong colors. |
| It seems that (at least with the current sensor setup) REG04_VFLIP_IMG only |
| changes the vertical readout direction. |
| Because pixels are arranged RGRG... in odd lines and GBGB... in even lines, |
| either a one line shift or even/odd line swap is required, too, but |
| apparently this doesn't happen. |
| |
| I finally figured out that this can be done manually by setting |
| REG04_VREF_EN. |
| Looking at hflip, it turns out that bit REG04_HREF_EN is set there |
| permanetly, but according to my tests has no effect on the pixel readout |
| order. |
| So my conclusion is that the current documentation of sensor register 0x04 |
| is wrong (has changed after preliminary datasheet version 2.2). |
| |
| I'm pretty sure that automatic vertical line shift/switch can be enabled, |
| too, but until anyone finds ot how this works, we have to stick with manual |
| switching. |
| |
| Signed-off-by: Frank Schรคfer <fschaefer.oss@googlemail.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com> |
| [bwh: Backported to 3.2: adjust filename] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/media/video/ov2640.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/media/video/ov2640.c |
| +++ b/drivers/media/video/ov2640.c |
| @@ -687,8 +687,10 @@ static int ov2640_s_ctrl(struct v4l2_ctr |
| |
| switch (ctrl->id) { |
| case V4L2_CID_VFLIP: |
| - val = ctrl->val ? REG04_VFLIP_IMG : 0x00; |
| - return ov2640_mask_set(client, REG04, REG04_VFLIP_IMG, val); |
| + val = ctrl->val ? REG04_VFLIP_IMG | REG04_VREF_EN : 0x00; |
| + return ov2640_mask_set(client, REG04, |
| + REG04_VFLIP_IMG | REG04_VREF_EN, val); |
| + /* NOTE: REG04_VREF_EN: 1 line shift / even/odd line swap */ |
| case V4L2_CID_HFLIP: |
| val = ctrl->val ? REG04_HFLIP_IMG : 0x00; |
| return ov2640_mask_set(client, REG04, REG04_HFLIP_IMG, val); |