/** * m5mols_get_version - retrieve full revisions information of M-5MOLS * * The version information includes revisions of hardware and firmware, * AutoFocus alghorithm version and the version string. */ static int m5mols_get_version(struct v4l2_subdev *sd) { struct m5mols_info *info = to_m5mols(sd); struct m5mols_version *ver = &info->ver; u8 *str = ver->str; int i; int ret; ret = m5mols_read_u8(sd, SYSTEM_VER_CUSTOMER, &ver->customer); if (!ret) ret = m5mols_read_u8(sd, SYSTEM_VER_PROJECT, &ver->project); if (!ret) ret = m5mols_read_u16(sd, SYSTEM_VER_FIRMWARE, &ver->fw); if (!ret) ret = m5mols_read_u16(sd, SYSTEM_VER_HARDWARE, &ver->hw); if (!ret) ret = m5mols_read_u16(sd, SYSTEM_VER_PARAMETER, &ver->param); if (!ret) ret = m5mols_read_u16(sd, SYSTEM_VER_AWB, &ver->awb); if (!ret) ret = m5mols_read_u8(sd, AF_VERSION, &ver->af); if (ret) return ret; for (i = 0; i < VERSION_STRING_SIZE; i++) { ret = m5mols_read_u8(sd, SYSTEM_VER_STRING, &str[i]); if (ret) return ret; } ver->fw = be16_to_cpu(ver->fw); ver->hw = be16_to_cpu(ver->hw); ver->param = be16_to_cpu(ver->param); ver->awb = be16_to_cpu(ver->awb); v4l2_info(sd, "Manufacturer\t[%s]\n", is_manufacturer(info, REG_SAMSUNG_ELECTRO) ? "Samsung Electro-Machanics" : is_manufacturer(info, REG_SAMSUNG_OPTICS) ? "Samsung Fiber-Optics" : is_manufacturer(info, REG_SAMSUNG_TECHWIN) ? "Samsung Techwin" : "None"); v4l2_info(sd, "Customer/Project\t[0x%02x/0x%02x]\n", info->ver.customer, info->ver.project); if (!is_available_af(info)) v4l2_info(sd, "No support Auto Focus on this firmware\n"); return ret; }
/** * m5mols_capture_info - Gather captured image information * * For now it gathers only EXIF information and file size. */ static int m5mols_capture_info(struct m5mols_info *info) { struct m5mols_exif *exif = &info->cap.exif; struct v4l2_subdev *sd = &info->sd; int ret; ret = m5mols_read_rational(sd, EXIF_INFO_EXPTIME_NU, EXIF_INFO_EXPTIME_DE, &exif->exposure_time); if (ret) return ret; ret = m5mols_read_rational(sd, EXIF_INFO_TV_NU, EXIF_INFO_TV_DE, &exif->shutter_speed); if (ret) return ret; ret = m5mols_read_rational(sd, EXIF_INFO_AV_NU, EXIF_INFO_AV_DE, &exif->aperture); if (ret) return ret; ret = m5mols_read_rational(sd, EXIF_INFO_BV_NU, EXIF_INFO_BV_DE, &exif->brightness); if (ret) return ret; ret = m5mols_read_rational(sd, EXIF_INFO_EBV_NU, EXIF_INFO_EBV_DE, &exif->exposure_bias); if (ret) return ret; ret = m5mols_read_u16(sd, EXIF_INFO_ISO, &exif->iso_speed); if (!ret) ret = m5mols_read_u16(sd, EXIF_INFO_FLASH, &exif->flash); if (!ret) ret = m5mols_read_u16(sd, EXIF_INFO_SDR, &exif->sdr); if (!ret) ret = m5mols_read_u16(sd, EXIF_INFO_QVAL, &exif->qval); if (ret) return ret; if (!ret) ret = m5mols_read_u32(sd, CAPC_IMAGE_SIZE, &info->cap.main); if (!ret) ret = m5mols_read_u32(sd, CAPC_THUMB_SIZE, &info->cap.thumb); if (!ret) info->cap.total = info->cap.main + info->cap.thumb; return ret; }
static int m5mols_init_controls(struct m5mols_info *info) { struct v4l2_subdev *sd = &info->sd; u16 max_exposure; u16 step_zoom; int ret; /* Determine value's range & step of controls for various FW version */ ret = m5mols_read_u16(sd, AE_MAX_GAIN_MON, &max_exposure); if (!ret) step_zoom = is_manufacturer(info, REG_SAMSUNG_OPTICS) ? 31 : 1; if (ret) return ret; v4l2_ctrl_handler_init(&info->handle, 6); info->autowb = v4l2_ctrl_new_std(&info->handle, &m5mols_ctrl_ops, V4L2_CID_AUTO_WHITE_BALANCE, 0, 1, 1, 0); info->saturation = v4l2_ctrl_new_std(&info->handle, &m5mols_ctrl_ops, V4L2_CID_SATURATION, 1, 5, 1, 3); info->zoom = v4l2_ctrl_new_std(&info->handle, &m5mols_ctrl_ops, V4L2_CID_ZOOM_ABSOLUTE, 1, 70, step_zoom, 1); info->exposure = v4l2_ctrl_new_std(&info->handle, &m5mols_ctrl_ops, V4L2_CID_EXPOSURE, 0, max_exposure, 1, (int)max_exposure/2); info->colorfx = v4l2_ctrl_new_std_menu(&info->handle, &m5mols_ctrl_ops, V4L2_CID_COLORFX, 4, (1 << V4L2_COLORFX_BW), V4L2_COLORFX_NONE); info->autoexposure = v4l2_ctrl_new_std_menu(&info->handle, &m5mols_ctrl_ops, V4L2_CID_EXPOSURE_AUTO, 1, 0, V4L2_EXPOSURE_MANUAL); sd->ctrl_handler = &info->handle; if (info->handle.error) { v4l2_err(sd, "Failed to initialize controls: %d\n", ret); v4l2_ctrl_handler_free(&info->handle); return info->handle.error; } v4l2_ctrl_cluster(2, &info->autoexposure); return 0; }