summaryrefslogtreecommitdiff
path: root/isp/controls.c
diff options
context:
space:
mode:
Diffstat (limited to 'isp/controls.c')
-rw-r--r--isp/controls.c103
1 files changed, 75 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
*/