media: ov13858: Increase digital gain granularity, range
Previously, possible digital gains were just 1x, 2x and 4x. These coarse gains were not sufficient in fine-tuning the image capture. Now, digital gain range is [0, 16x] with each step 1/1024, default 1x. This is achieved through OV13858 MWB R/G/B gain controls. Signed-off-by: Chiranjeevi Rapolu <chiranjeevi.rapolu@intel.com> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
Родитель
89d8b615f2
Коммит
bfced6d1ec
|
@ -77,13 +77,13 @@
|
|||
#define OV13858_ANA_GAIN_DEFAULT 0x80
|
||||
|
||||
/* Digital gain control */
|
||||
#define OV13858_REG_DIGITAL_GAIN 0x350a
|
||||
#define OV13858_DGTL_GAIN_MASK 0xf3
|
||||
#define OV13858_DGTL_GAIN_SHIFT 2
|
||||
#define OV13858_DGTL_GAIN_MIN 1
|
||||
#define OV13858_DGTL_GAIN_MAX 4
|
||||
#define OV13858_DGTL_GAIN_STEP 1
|
||||
#define OV13858_DGTL_GAIN_DEFAULT 1
|
||||
#define OV13858_REG_B_MWB_GAIN 0x5100
|
||||
#define OV13858_REG_G_MWB_GAIN 0x5102
|
||||
#define OV13858_REG_R_MWB_GAIN 0x5104
|
||||
#define OV13858_DGTL_GAIN_MIN 0
|
||||
#define OV13858_DGTL_GAIN_MAX 16384 /* Max = 16 X */
|
||||
#define OV13858_DGTL_GAIN_DEFAULT 1024 /* Default gain = 1 X */
|
||||
#define OV13858_DGTL_GAIN_STEP 1 /* Each step = 1/1024 */
|
||||
|
||||
/* Test Pattern Control */
|
||||
#define OV13858_REG_TEST_PATTERN 0x4503
|
||||
|
@ -1162,21 +1162,21 @@ static int ov13858_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
|
|||
static int ov13858_update_digital_gain(struct ov13858 *ov13858, u32 d_gain)
|
||||
{
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
if (d_gain == 3)
|
||||
return -EINVAL;
|
||||
|
||||
ret = ov13858_read_reg(ov13858, OV13858_REG_DIGITAL_GAIN,
|
||||
OV13858_REG_VALUE_08BIT, &val);
|
||||
ret = ov13858_write_reg(ov13858, OV13858_REG_B_MWB_GAIN,
|
||||
OV13858_REG_VALUE_16BIT, d_gain);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
val &= OV13858_DGTL_GAIN_MASK;
|
||||
val |= (d_gain - 1) << OV13858_DGTL_GAIN_SHIFT;
|
||||
ret = ov13858_write_reg(ov13858, OV13858_REG_G_MWB_GAIN,
|
||||
OV13858_REG_VALUE_16BIT, d_gain);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return ov13858_write_reg(ov13858, OV13858_REG_DIGITAL_GAIN,
|
||||
OV13858_REG_VALUE_08BIT, val);
|
||||
ret = ov13858_write_reg(ov13858, OV13858_REG_R_MWB_GAIN,
|
||||
OV13858_REG_VALUE_16BIT, d_gain);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ov13858_enable_test_pattern(struct ov13858 *ov13858, u32 pattern)
|
||||
|
|
Загрузка…
Ссылка в новой задаче