diff --git a/boards/arm/cxd56xx/drivers/camera/isx012.c b/boards/arm/cxd56xx/drivers/camera/isx012.c index 352439ba5c..1fdd307b26 100644 --- a/boards/arm/cxd56xx/drivers/camera/isx012.c +++ b/boards/arm/cxd56xx/drivers/camera/isx012.c @@ -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; diff --git a/include/nuttx/video/isx012_reg.h b/include/nuttx/video/isx012_reg.h index 121b17679c..15d291e216 100644 --- a/include/nuttx/video/isx012_reg.h +++ b/include/nuttx/video/isx012_reg.h @@ -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) diff --git a/include/nuttx/video/video_controls.h b/include/nuttx/video/video_controls.h index 51a6064554..c2e4c5c7eb 100644 --- a/include/nuttx/video/video_controls.h +++ b/include/nuttx/video/video_controls.h @@ -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)