summaryrefslogtreecommitdiff
path: root/isp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2012-02-08 00:48:21 +0100
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2012-04-16 23:44:56 +0200
commit8c867710ea62e8f371246624621d2e8d84a773f6 (patch)
tree5ad6e4c67f9d37a0429e5381c91a33bc69f5434b /isp
parentda54993ac62ca19f1bff3b1bb2a035a637e75a60 (diff)
controls: Add preview engine digital gain and white balance support
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'isp')
-rw-r--r--isp/controls.c103
-rw-r--r--isp/omap3isp-priv.h2
-rw-r--r--isp/omap3isp.h2
3 files changed, 79 insertions, 28 deletions
diff --git a/isp/controls.c b/isp/controls.c
index 299be5d..421b4bf 100644
--- a/isp/controls.c
+++ b/isp/controls.c
@@ -211,34 +211,6 @@ static const struct matrix omap3isp_preview_rgb2rgb = {
},
};
-int omap3_isp_preview_setup(struct omap3_isp_device *isp)
-{
- struct omap3isp_prev_update_config config;
- struct omap3isp_prev_rgbtorgb rgb2rgb;
- struct omap3isp_prev_csc csc;
- int ret;
-
- memset(&config, 0, sizeof config);
- config.update = OMAP3ISP_PREV_RGB2RGB | OMAP3ISP_PREV_COLOR_CONV;
- config.flag = OMAP3ISP_PREV_RGB2RGB | OMAP3ISP_PREV_COLOR_CONV;
- config.rgb2rgb = &rgb2rgb;
- config.csc = &csc;
-
- memset(&rgb2rgb, 0, sizeof rgb2rgb);
- matrix_float_to_s12q8(rgb2rgb.matrix, &omap3isp_preview_rgb2rgb);
-
- memset(&csc, 0, sizeof csc);
- matrix_float_to_s10q8(csc.matrix, &omap3isp_preview_csc);
-
- v4l2_subdev_open(isp->preview.entity);
-
- ret = ioctl(isp->preview.entity->fd, VIDIOC_OMAP3ISP_PRV_CFG, &config);
- if (ret < 0)
- return -errno;
-
- return ret;
-}
-
int omap3_isp_preview_set_contrast(struct omap3_isp_device *isp, unsigned int value)
{
int contrast = value;
@@ -283,6 +255,81 @@ int omap3_isp_preview_set_saturation(struct omap3_isp_device *isp, float value)
return ret;
}
+int omap3_isp_preview_update_white_balance(struct omap3_isp_device *isp)
+{
+ struct omap3isp_prev_update_config config;
+ int ret;
+
+ memset(&config, 0, sizeof config);
+ config.update = OMAP3ISP_PREV_WB;
+ config.flag = OMAP3ISP_PREV_WB;
+ config.wbal = &isp->preview.wbal;
+
+ ret = ioctl(isp->preview.entity->fd, VIDIOC_OMAP3ISP_PRV_CFG, &config);
+ if (ret < 0) {
+ printf("%s: %s (%d)\n", __func__, strerror(errno), errno);
+ return -errno;
+ }
+
+ return ret;
+}
+
+int omap3_isp_preview_set_gain(struct omap3_isp_device *isp, float gain)
+{
+ isp->preview.wbal.dgain = (__u16)(gain * (1 << 8)) & 0x3ff;
+
+ return omap3_isp_preview_update_white_balance(isp);
+}
+
+int omap3_isp_preview_set_white_balance(struct omap3_isp_device *isp, float gains[4])
+{
+ isp->preview.wbal.coef0 = (__u8)clamp(gains[0] * (1 << 5), 0.0, 255.0);
+ isp->preview.wbal.coef1 = (__u8)clamp(gains[1] * (1 << 5), 0.0, 255.0);
+ isp->preview.wbal.coef2 = (__u8)clamp(gains[2] * (1 << 5), 0.0, 255.0);
+ isp->preview.wbal.coef3 = (__u8)clamp(gains[3] * (1 << 5), 0.0, 255.0);
+
+ return omap3_isp_preview_update_white_balance(isp);
+}
+
+int omap3_isp_preview_setup(struct omap3_isp_device *isp)
+{
+ struct omap3isp_prev_update_config config;
+ struct omap3isp_prev_rgbtorgb rgb2rgb;
+ struct omap3isp_prev_csc csc;
+ int ret;
+
+ memset(&config, 0, sizeof config);
+ config.update = OMAP3ISP_PREV_WB | OMAP3ISP_PREV_RGB2RGB
+ | OMAP3ISP_PREV_COLOR_CONV;
+ config.flag = OMAP3ISP_PREV_WB | OMAP3ISP_PREV_RGB2RGB
+ | OMAP3ISP_PREV_COLOR_CONV;
+ config.wbal = &isp->preview.wbal;
+ config.rgb2rgb = &rgb2rgb;
+ config.csc = &csc;
+
+ isp->preview.wbal.dgain = 1 << 8;
+ isp->preview.wbal.coef0 = 1 << 5;
+ isp->preview.wbal.coef1 = 1 << 5;
+ isp->preview.wbal.coef2 = 1 << 5;
+ isp->preview.wbal.coef3 = 1 << 5;
+
+ memset(&rgb2rgb, 0, sizeof rgb2rgb);
+ matrix_float_to_s12q8(rgb2rgb.matrix, &omap3isp_preview_rgb2rgb);
+
+ memset(&csc, 0, sizeof csc);
+ matrix_float_to_s10q8(csc.matrix, &omap3isp_preview_csc);
+
+ v4l2_subdev_open(isp->preview.entity);
+
+ ret = ioctl(isp->preview.entity->fd, VIDIOC_OMAP3ISP_PRV_CFG, &config);
+ if (ret < 0) {
+ printf("%s: %s (%d)\n", __func__, strerror(errno), errno);
+ return -errno;
+ }
+
+ return ret;
+}
+
/* -----------------------------------------------------------------------------
* Sensor parameters configuration
*/
diff --git a/isp/omap3isp-priv.h b/isp/omap3isp-priv.h
index 4b3f1bd..e1ee179 100644
--- a/isp/omap3isp-priv.h
+++ b/isp/omap3isp-priv.h
@@ -23,6 +23,7 @@
#ifndef __OMAP3ISP_PRIV_H
#define __OMAP3ISP_PRIV_H
+#include <linux/omap3isp.h>
#include <linux/v4l2-mediabus.h>
#include "omap3isp.h"
@@ -133,6 +134,7 @@ struct omap3_isp_device {
} ccdc;
struct {
struct media_entity *entity;
+ struct omap3isp_prev_wbal wbal;
} preview;
struct v4l2_mbus_framefmt sensor_format;
diff --git a/isp/omap3isp.h b/isp/omap3isp.h
index 9da53fd..23a5577 100644
--- a/isp/omap3isp.h
+++ b/isp/omap3isp.h
@@ -79,6 +79,8 @@ int omap3_isp_ccdc_set_black_level(struct omap3_isp_device *isp, unsigned int va
int omap3_isp_preview_set_contrast(struct omap3_isp_device *isp, unsigned int value);
int omap3_isp_preview_set_saturation(struct omap3_isp_device *isp, float value);
+int omap3_isp_preview_set_gain(struct omap3_isp_device *isp, float gain);
+int omap3_isp_preview_set_white_balance(struct omap3_isp_device *isp, float gains[4]);
int omap3_isp_sensor_get_exposure(struct omap3_isp_device *isp,
unsigned int *exposure);