找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1810|回复: 0
收起左侧

GC032_DVP驱动文件 MT62xx

[复制链接]
ID:795512 发表于 2020-7-2 20:37 | 显示全部楼层 |阅读模式
/*****************************************************************************
*
* Filename:
* ---------
*   usbvideo_attr_GC032A.c
*
* Project:
* --------
*   Maui_sw
*
* Description:
* ------------
*   Image sensor webcam driver function
*
* Author:
* -------
*  ------- ---- (--------)
*
*============================================================================
*             HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* $Revision:$
* $Modtime:$
* $Log:$
*
* Initial revision.
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*============================================================================
****************************************************************************/
#include "drv_comm.h"
#include "stdio.h"
#include "isp_if.h"
#include "image_sensor.h"
#include "mm_comm_def.h"
#include "sensor_comm_def.h"
#include "usbvideo_custom.h"
#include "jpeg_enum.h"

#if (defined(WEBCAM_SUPPORT))
MM_ERROR_CODE_ENUM GC032AWebcamFeatureCtrl(kal_uint32 Id, void *In, void *Out, kal_uint32 OutLen, kal_uint32 *RealOutLen)
{
  /* supported feature list */
  static const USBVideo_Attr_Info GC032A_ATTR_INFO[] =
  {
    {USBVIDEO_ATTRIBUTE_BRIGHTNESS, KAL_TRUE, KAL_TRUE},
    {USBVIDEO_ATTRIBUTE_CONTRAST, KAL_TRUE, KAL_TRUE},
    {USBVIDEO_ATTRIBUTE_HUE, KAL_FALSE, KAL_FALSE},
    {USBVIDEO_ATTRIBUTE_HUE_AUTO, KAL_FALSE, KAL_FALSE},
    {USBVIDEO_ATTRIBUTE_SATURATION, KAL_FALSE, KAL_FALSE},
    {USBVIDEO_ATTRIBUTE_POWER_LINE_FREQUENCY, KAL_TRUE, KAL_TRUE},
    {USBVIDEO_ATTRIBUTE_SHARPNESS, KAL_FALSE, KAL_FALSE},
    {USBVIDEO_ATTRIBUTE_BACKLIGHT_COMPENSATION, KAL_FALSE, KAL_FALSE},
    {USBVIDEO_ATTRIBUTE_GAMMA, KAL_FALSE, KAL_FALSE},
    {USBVIDEO_ATTRIBUTE_WHITE_BALANCE_TMP, KAL_TRUE, KAL_TRUE},
    {USBVIDEO_ATTRIBUTE_WHITE_BALANCE_TMP_AUTO, KAL_TRUE, KAL_TRUE},
  };
  /* supported video size list */
  static const USBVideo_Video_Size_Info GC032A_VIDEO_SIZE[] =
  {
    {USBVIDEO_VIDEO_SIZE_1, 160, 120, 0xC000, 912382, 38012, 500000, 500000, 500000, 0},
    {USBVIDEO_VIDEO_SIZE_2, 320, 240, 0xC000, 912384, 38016, 500000, 500000, 500000, 0},
#if (defined(__JPEG_HW_SUPPORTED__))
    {USBVIDEO_VIDEO_SIZE_3, 640, 480, 0x18000, 912384, 38016, 500000, 500000, 500000, 0},
#else
    {USBVIDEO_VIDEO_SIZE_3, 640, 480, 0xC000, 912384, 38016, 500000, 500000, 500000, 0},
#endif
  };
  /* supported still image size list */
  static const USBVideo_Still_Size_Info GC032A_STILL_SIZE[] =
  {
    {USBVIDEO_STILL_SIZE_1, 160, 120, 0xC000},
    {USBVIDEO_STILL_SIZE_2, 320, 240, 0xC000},
#if (defined(__JPEG_HW_SUPPORTED__))
    {USBVIDEO_STILL_SIZE_3, 640, 480, 0x18000},
#else
    {USBVIDEO_STILL_SIZE_3, 640, 480, 0xC000},
#endif
  };
  /* supported compression type list*/
  static const USBVideo_Compression_Info GC032A_STILL_COMPRESSION[] =
  {
    /* {USBVIDEO_COMPRESSION_1, JPEG_ENCODE_QUALITY_GOOD}, */
    {USBVIDEO_COMPRESSION_1, JPEG_ENCODE_QUALITY_LOW},
    {USBVIDEO_COMPRESSION_2, JPEG_ENCODE_QUALITY_FAIR}
  };
  static const USBVIDEO_VIDEO_SIZE_TYPE GC032A_g_default_video_size = USBVIDEO_VIDEO_SIZE_1;
  static const USBVIDEO_STILL_SIZE_TYPE GC032A_g_default_still_size = USBVIDEO_STILL_SIZE_1;
  static const USBVIDEO_COMPRESSION_TYPE GC032A_g_default_compression = USBVIDEO_COMPRESSION_1;
  static const usbvideo_attr_struct GC032AWebcamAttrPara =
  {
    /* min,max,res,def */
    {
      {0,      4,    1,    0  },  /*0  USBVIDEO_ATTRIBUTE_BACKLIGHT_COMPENSATION*/
      {0,      8,    1,    4 },  /*1  USBVIDEO_ATTRIBUTE_BRIGHTNESS*/
      {0,      2,    1,    1  },  /*2  USBVIDEO_ATTRIBUTE_CONTRAST*/
      {0,      255,  1,    127 },  /*3  USBVIDEO_ATTRIBUTE_GAIN*/
      {0,      2,    1,    1  },  /*4  USBVIDEO_ATTRIBUTE_POWER_LINE_FREQUENCY, 0:Disable, 1:50, 2:60*/
      {0,      360,  1 ,      0  },  /*5  USBVIDEO_ATTRIBUTE_HUE*/
      {0,      255,  1,    64  },  /*6  USBVIDEO_ATTRIBUTE_SATURATION*/
      {0,      15,   1,    0  },  /*7  USBVIDEO_ATTRIBUTE_SHARPNESS*/
      {100,    220,  60,      160 },  /*8  USBVIDEO_ATTRIBUTE_GAMMA*/
      {2500,   6500, 500,  5500},  /*9 USBVIDEO_ATTRIBUTE_WHITE_BALANCE_TMP*/
      {0,      1,    1,    1  },  /*10 USBVIDEO_ATTRIBUTE_WHITE_BALANCE_TMP_AUTO*/
      {0,      0,    0,    0  },  /*11 USBVIDEO_ATTRIBUTE_WHITE_BALANCE_COMP, NOT SUPPORT*/
      {0,      1,    1,    1  },  /*12 USBVIDEO_ATTRIBUTE_WHITE_BALANCE_COMP_AUTO*/
      {0,      0,    1,    0  },  /*13 USBVIDEO_ATTRIBUTE_DIGITAL_MULTIPLIER, NOT SUPPORT*/
      {0,      0,    1,    0  },  /*14 USBVIDEO_ATTRIBUTE_DIGITAL_MULTIPLIER_LIMIT, NOT SUPPORT*/
      {0,      1,    1,    0  },  /*15 USBVIDEO_ATTRIBUTE_HUE_AUTO*/
      {0,      0,    0,    0  }  /*16 USBVIDEO_ATTRIBUTE_MAX_MULTIPLIER, NOT SUPPORT*/
    }
  };
  MM_ERROR_CODE_ENUM ErrCode = MM_ERROR_NONE;

  switch(Id)
  {
  case CAL_FEATURE_WEBCAM_GET_ATTR:
    {
      USBVideo_Attr_Value *pWebCamAttr = (USBVideo_Attr_Value *)Out;
      USBVIDEO_ATTRIBUTE_TYPE AttrType = pWebCamAttr->type;

      if (AttrType <= USBVIDEO_ATTRIBUTE_CT_MAX)
      {
        pWebCamAttr->value = 0; /* CT currently is not support */
      }
      else
      {
        if (AttrType >= ATTR_PU_START)
        {
          switch(pWebCamAttr->req_type)
          {
          case USBVIDEO_REQUEST_GET_CUR:
            ASSERT(0); /* current value is maintained in ISP driver */
            break;
          case USBVIDEO_REQUEST_GET_MIN:
            pWebCamAttr->value = GC032AWebcamAttrPara.attr_info[GET_ATTR_PU_IDX(AttrType)].min;
            break;
          case USBVIDEO_REQUEST_GET_MAX:
            pWebCamAttr->value = GC032AWebcamAttrPara.attr_info[GET_ATTR_PU_IDX(AttrType)].max;
            break;
          case USBVIDEO_REQUEST_GET_DEF:
            pWebCamAttr->value = GC032AWebcamAttrPara.attr_info[GET_ATTR_PU_IDX(AttrType)].def;
            break;
          case USBVIDEO_REQUEST_GET_RES:
            pWebCamAttr->value = GC032AWebcamAttrPara.attr_info[GET_ATTR_PU_IDX(AttrType)].res;
            break;
          default:
            EXT_ASSERT(0, (kal_uint32)pWebCamAttr->req_type, 0, 0);
            break;
          }
        }
        else
        {
          ASSERT(0);
        }
      }
    }
    break;
  case CAL_FEATURE_WEBCAM_SET_ATTR:
    {
      const USBVIDEO_ATTRIBUTE_TYPE AttrType = ((USBVideo_Attr_Value *)In)->type;
      const kal_uint32 AttrValue = ((USBVideo_Attr_Value *)In)->value;
      CAL_FEATURE_CTRL_STRUCT FeatureCtrlPara;
      P_IMAGE_SENSOR_FUNCTION_STRUCT pfSensorFunc;

      /* Sensor Attributes Set */
      /* update attr PU current value */
      /* usbvideo_attr_PU_value_list[GET_ATTR_PU_IDX(AttrType)] = AttrValue; */
      GC032ASensorFunc(&pfSensorFunc);
      FeatureCtrlPara.FeatureCtrlCode = CAL_FEATURE_SET_OPERATION;
      switch(AttrType)
      {
      case USBVIDEO_ATTRIBUTE_POWER_LINE_FREQUENCY:
        FeatureCtrlPara.FeatureSetValue = (1 == AttrValue ? CAM_BANDING_50HZ : CAM_BANDING_60HZ);
        ErrCode = pfSensorFunc->SensorFeatureCtrl(CAL_FEATURE_CAMERA_BANDING_FREQ, &FeatureCtrlPara, NULL, 0, NULL);
        break;
      case USBVIDEO_ATTRIBUTE_BRIGHTNESS:
        FeatureCtrlPara.FeatureSetValue = AttrValue;
        ErrCode = pfSensorFunc->SensorFeatureCtrl(CAL_FEATURE_CAMERA_EV_VALUE, &FeatureCtrlPara, NULL, 0, NULL);
        break;
      case USBVIDEO_ATTRIBUTE_CONTRAST:
        FeatureCtrlPara.FeatureSetValue = AttrValue;
        ErrCode = pfSensorFunc->SensorFeatureCtrl(CAL_FEATURE_CAMERA_CONTRAST, &FeatureCtrlPara, NULL, 0, NULL);
        break;
      case USBVIDEO_ATTRIBUTE_WHITE_BALANCE_TMP_AUTO:
        if (AttrValue > 0) /* auto */
        {
          FeatureCtrlPara.FeatureSetValue = CAM_WB_AUTO;
          ErrCode = pfSensorFunc->SensorFeatureCtrl(CAL_FEATURE_CAMERA_WB, &FeatureCtrlPara, NULL, 0, NULL);
        }
        else
        {
          /* Bin: dothing, because will set by USBVIDEO_ATTRIBUTE_WHITE_BALANCE_TMP */
        }
        break;
      case USBVIDEO_ATTRIBUTE_WHITE_BALANCE_TMP:        
        if (AttrValue > 5800)
        {
          FeatureCtrlPara.FeatureSetValue = CAM_WB_DAYLIGHT;
        }
        else if (AttrValue >= 4800)   
        {
          FeatureCtrlPara.FeatureSetValue = CAM_WB_INCANDESCENCE;
        }
        else if (AttrValue >= 3800)                                 
        {
          FeatureCtrlPara.FeatureSetValue = CAM_WB_FLUORESCENT;
        }
        else /* if (AttrValue >= 2800) */
        {
          FeatureCtrlPara.FeatureSetValue = CAM_WB_TUNGSTEN;
        }
        ErrCode = pfSensorFunc->SensorFeatureCtrl(CAL_FEATURE_CAMERA_WB, &FeatureCtrlPara, NULL, 0, NULL);
        break;
      default:
        break;
      }
    }
    break;
  case CAL_FEATURE_WEBCAM_GET_ATTR_INFO:
    ((P_CAL_FEATURE_WEBCAM_GET_ATTR_INFO_STRUCT)Out)->pWebCamAttrInfo = GC032A_ATTR_INFO;
    ((P_CAL_FEATURE_WEBCAM_GET_ATTR_INFO_STRUCT)Out)->WebCamAttrInfoNum = sizeof(GC032A_ATTR_INFO) / sizeof(GC032A_ATTR_INFO[0]);
    break;
  case CAL_FEATURE_WEBCAM_GET_VIDEO_SIZE:
    ((P_CAL_FEATURE_WEBCAM_GET_VIDEO_SIZE_STRUCT)Out)->pWebCamVideoSizeInfo = GC032A_VIDEO_SIZE;
    ((P_CAL_FEATURE_WEBCAM_GET_VIDEO_SIZE_STRUCT)Out)->WebCamVideoSizeInfoNum = sizeof(GC032A_VIDEO_SIZE) / sizeof(GC032A_VIDEO_SIZE[0]);
    break;
  case CAL_FEATURE_WEBCAM_GET_STILL_SIZE:
    ((P_CAL_FEATURE_WEBCAM_GET_STILL_SIZE_STRUCT)Out)->pWebCamStillSizeInfo = GC032A_STILL_SIZE;
    ((P_CAL_FEATURE_WEBCAM_GET_STILL_SIZE_STRUCT)Out)->WebCamStillSizeInfoNum = sizeof(GC032A_STILL_SIZE) / sizeof(GC032A_STILL_SIZE[0]);
    break;
  case CAL_FEATURE_WEBCAM_GET_COMPRESSION:
    ((P_CAL_FEATURE_WEBCAM_GET_COMPRESSION_STRUCT)Out)->pWebCamCompressionInfo = GC032A_STILL_COMPRESSION;
    ((P_CAL_FEATURE_WEBCAM_GET_COMPRESSION_STRUCT)Out)->WebCamCompressionInfoNum = sizeof(GC032A_STILL_COMPRESSION) / sizeof(GC032A_STILL_COMPRESSION[0]);
    break;
  case CAL_FEATURE_WEBCAM_GET_DEFAULT_IDX:
    ((P_CAL_FEATURE_WEBCAM_GET_DEFAULT_IDX_STRUCT)Out)->WebCamVideoSizeIdx = GC032A_g_default_video_size;
    ((P_CAL_FEATURE_WEBCAM_GET_DEFAULT_IDX_STRUCT)Out)->WebCamStillSizeIdx = GC032A_g_default_still_size;
    ((P_CAL_FEATURE_WEBCAM_GET_DEFAULT_IDX_STRUCT)Out)->WebCamCompressionIdx = GC032A_g_default_compression;
    break;
  default:
    ErrCode = MM_ERROR_INVALID_PARAMETER;
    break;
  }
  return ErrCode;
}

#else
MM_ERROR_CODE_ENUM GC032AWebcamFeatureCtrl(kal_uint32 Id, void *In, void *Out, kal_uint32 OutLen, kal_uint32 *RealOutLen)
{
  return MM_ERROR_NONE;
}
#endif


MT62xx_GC032A(DVP)_Driver_20170323.rar

173.56 KB, 下载次数: 10, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表