drivers/video: Add 3A parameter control

Provide functions which get and set the 3A (Auto white balance/Auto
exposure/Auto
focus) parameters.
These are achieved by the ioctl request codes VIDIOC_G_EXT_CTRLS and
VIDIOC_S_EXT_CTRLS which have the following settings:

 1. ctrl_class = V4L2_CTRL_CLASS_CAMERA
 2. id         = V4L2_CID_3A_PARAMETER

Also, provide function which get the 3A adjustment status.
This is achieved by the ioctl request codes VIDIOC_G_EXT_CTRLS which has the
following settings:

 1. ctrl_class = V4L2_CTRL_CLASS_CAMERA
 2. id         = V4L2_CID_3A_STATUS
This commit is contained in:
SPRESENSE 2020-07-27 13:54:26 +09:00 committed by Alin Jerpelea
parent 28ba7f4a1e
commit 45e9c2c8f5
3 changed files with 150 additions and 3 deletions

View File

@ -2385,6 +2385,29 @@ static int isx012_get_range_of_ctrlval(FAR struct v4l2_query_ext_ctrl *range)
break;
case V4L2_CID_3A_PARAMETER:
range->type = V4L2_CTRL_TYPE_U16;
range->minimum = 0;
range->maximum = 65535;
range->step = 1;
range->elems = 3;
strncpy(range->name,
"AWB/AE parameter",
sizeof(range->name));
break;
case V4L2_CID_3A_STATUS:
range->type = V4L2_CTRL_TYPE_INTEGER;
range->minimum = 0;
range->maximum = 3;
range->step = 1;
strncpy(range->name,
"AWB/AE status",
sizeof(range->name));
break;
default: /* Unsupported control id */
return -EINVAL;
@ -2505,6 +2528,7 @@ static int isx012_get_ctrlval(uint16_t ctrl_class,
FAR struct isx012_dev_s *priv = &g_isx012_private;
int16_t readvalue;
uint8_t cnt;
uint8_t threea_enable;
uint16_t read_src;
uint16_t *read_dst;
int ret = -EINVAL;
@ -2825,6 +2849,76 @@ static int isx012_get_ctrlval(uint16_t ctrl_class,
control->value = g_isx012_supported_photometry[cnt].v4l2;
break;
case V4L2_CID_3A_PARAMETER:
if (control->p_u16 == NULL)
{
return -EINVAL;
}
/* Get AWB parameter */
control->p_u16[0] = isx012_getreg(priv,
RATIO_R,
2);
control->p_u16[1] = isx012_getreg(priv,
RATIO_B,
2);
/* Get AE parameter */
control->p_u16[2] = isx012_getreg(priv,
AELEVEL,
2);
break;
case V4L2_CID_3A_STATUS:
/* Initialize returned status */
control->value = V4L2_3A_STATUS_STABLE;
/* Get AWB/AE enable or not */
threea_enable = isx012_getreg(priv,
CPUEXT,
1);
/* Check AWB */
if ((threea_enable & REGVAL_CPUEXT_BIT_AWBSTOP)
!= REGVAL_CPUEXT_BIT_AWBSTOP)
{
/* Check AWB status */
readvalue = isx012_getreg(priv,
AWBSTS,
1);
if (readvalue != REGVAL_AWBSTS_STOP) /* AWB is not stopped */
{
control->value |= V4L2_3A_STATUS_AWB_OPERATING;
}
}
/* Check AE */
if ((threea_enable & REGVAL_CPUEXT_BIT_AESTOP)
!= REGVAL_CPUEXT_BIT_AESTOP)
{
/* Check AE status */
readvalue = isx012_getreg(priv,
AESTS,
1);
if (readvalue != REGVAL_AESTS_STOP) /* AE is not stopped */
{
control->value |= V4L2_3A_STATUS_AE_OPERATING;
}
}
break;
default: /* Unsupported control id */
return -EINVAL;
@ -3385,6 +3479,39 @@ static int isx012_set_ctrlval(uint16_t ctrl_class,
break;
case V4L2_CID_3A_PARAMETER:
/* AWB parameter : red */
ret = isx012_putreg(priv,
INIT_CONT_INR,
control->p_u16[0],
2);
ret = isx012_putreg(priv,
INIT_CONT_OUTR,
control->p_u16[0],
2);
/* AWB parameter : blue */
ret = isx012_putreg(priv,
INIT_CONT_INB,
control->p_u16[1],
2);
ret = isx012_putreg(priv,
INIT_CONT_OUTB,
control->p_u16[1],
2);
/* AE parameter */
ret = isx012_putreg(priv,
AE_START_LEVEL,
control->p_u16[2],
2);
break;
default: /* Unsupported control id */
return -EINVAL;

View File

@ -681,12 +681,17 @@
#define AESPEED_INIT (AE_BASE+0x0031)
#define AESPEED_FAST (AE_BASE+0x0032)
#define FASTMOVE_TIMEOUT (AE_BASE+0x003D)
#define AE_START_LEVEL (AE_BASE+0x0040)
/* AWB OFFSET */
#define ATW_INITMASK (AWB_BASE+0x0004)
#define INIT_GAINS (AWB_BASE+0x0023)
#define INIT_SFTLMT (AWB_BASE+0x002C)
#define INIT_CONT_INR (AWB_BASE+0x0038)
#define INIT_CONT_INB (AWB_BASE+0x003A)
#define INIT_CONT_OUTR (AWB_BASE+0x003C)
#define INIT_CONT_OUTB (AWB_BASE+0x003E)
/* AF OFFSET */
@ -803,6 +808,7 @@
/* AUTOCOM OFFSET */
#define MIPIOUT_EN (AUTOCOM_BASE+0x0031)
#define AELEVEL (AUTOCOM_BASE+0x0099)
/* VFRMPARA OFFSET */
@ -1258,6 +1264,10 @@
/* SOUT OFFSET */
#define AESTS (SOUT_BASE+0x0000)
#define AWBSTS (SOUT_BASE+0x0024)
#define RATIO_R (SOUT_BASE+0x002E)
#define RATIO_B (SOUT_BASE+0x0030)
#define CAP_END_F (SOUT_BASE+0x0078)
#define AF_STATE (SOUT_BASE+0x018A)
#define AF_RESULT (SOUT_BASE+0x018B)
@ -1338,6 +1348,9 @@
#define REGVAL_CPUEXT_BIT_AESTOP (0x02)
#define REGVAL_CPUEXT_BIT_AWBSTOP (0x04)
#define REGVAL_AESTS_STOP (0)
#define REGVAL_AWBSTS_STOP (2)
#define REGVAL_READVECT_BIT_V (0x01)
#define REGVAL_READVECT_BIT_H (0x02)

View File

@ -201,15 +201,22 @@ enum v4l2_scene_mode
#define V4L2_CID_3A_LOCK (17) /**< Lock 3A */
#define V4L2_LOCK_EXPOSURE (1 << 0) /**< Exposure bit for
V4L2_CID_3A_LOCK */
* V4L2_CID_3A_LOCK */
#define V4L2_LOCK_WHITE_BALANCE (1 << 1) /**< White balance bit for
V4L2_CID_3A_LOCK */
* V4L2_CID_3A_LOCK */
#define V4L2_LOCK_FOCUS (1 << 2) /**< Focus bit for
V4L2_CID_3A_LOCK */
* V4L2_CID_3A_LOCK */
#define V4L2_CID_AUTO_FOCUS_START (18) /**< Start single AF */
#define V4L2_CID_AUTO_FOCUS_STOP (19) /**< Stop single AF */
#define V4L2_CID_3A_PARAMETER (20) /**< 3A parameter */
#define V4L2_CID_3A_STATUS (21) /**< 3A status */
#define V4L2_3A_STATUS_STABLE (0) /**< 3A is stable */
#define V4L2_3A_STATUS_AE_OPERATING (1 << 0) /**< AE is operating */
#define V4L2_3A_STATUS_AWB_OPERATING (1 << 1) /**< AWB is operating */
#define V4L2_3A_STATUS_AF_OPERATING (1 << 2) /**< AF is operating */
/** Flash and privacy (indicator) light controls */
#define V4L2_CID_FLASH_LED_MODE (0)