diff options
Diffstat (limited to 'isp')
-rw-r--r-- | isp/controls.c | 103 | ||||
-rw-r--r-- | isp/omap3isp-priv.h | 2 | ||||
-rw-r--r-- | isp/omap3isp.h | 2 |
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); |