• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * isp_controller.cpp - isp controller
3  *
4  *  Copyright (c) 2014-2015 Intel Corporation
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * Author: Wind Yuan <feng.yuan@intel.com>
19  */
20 
21 #include "isp_controller.h"
22 #include "v4l2_device.h"
23 #include "x3a_statistics_queue.h"
24 #include "x3a_isp_config.h"
25 
26 #include <linux/atomisp.h>
27 
28 namespace XCam {
29 
IspController(SmartPtr<V4l2Device> & device)30 IspController::IspController (SmartPtr<V4l2Device> & device)
31     : _device (device)
32 {
33 }
~IspController()34 IspController::~IspController ()
35 {
36 }
37 
38 void
init_sensor_mode_data(struct atomisp_sensor_mode_data * sensor_mode_data)39 IspController::init_sensor_mode_data (struct atomisp_sensor_mode_data *sensor_mode_data)
40 {
41     sensor_mode_data->coarse_integration_time_min = 1;
42     sensor_mode_data->coarse_integration_time_max_margin = 1;
43     sensor_mode_data->fine_integration_time_min = 0;
44     sensor_mode_data->fine_integration_time_max_margin = 0;
45     sensor_mode_data->fine_integration_time_def = 0;
46     sensor_mode_data->frame_length_lines = 1125;
47     sensor_mode_data->line_length_pck = 1320;
48     sensor_mode_data->read_mode = 0;
49     sensor_mode_data->vt_pix_clk_freq_mhz = 37125000;
50     sensor_mode_data->crop_horizontal_start = 0;
51     sensor_mode_data->crop_vertical_start = 0;
52     sensor_mode_data->crop_horizontal_end = 1920;
53     sensor_mode_data->crop_vertical_end = 1080;
54     sensor_mode_data->output_width = 1920;
55     sensor_mode_data->output_height = 1080;
56     sensor_mode_data->binning_factor_x = 1;
57     sensor_mode_data->binning_factor_y = 1;
58 }
59 
60 
61 XCamReturn
get_sensor_mode_data(struct atomisp_sensor_mode_data & sensor_mode_data)62 IspController::get_sensor_mode_data (struct atomisp_sensor_mode_data &sensor_mode_data)
63 {
64     init_sensor_mode_data (&sensor_mode_data);
65     if (_device->io_control (ATOMISP_IOC_G_SENSOR_MODE_DATA, &sensor_mode_data) < 0) {
66         XCAM_LOG_WARNING (" get ISP sensor mode data failed, use initialized sensor mode data");
67     }
68     return XCAM_RETURN_NO_ERROR;
69 }
70 
71 XCamReturn
get_isp_parameter(struct atomisp_parm & parameters)72 IspController::get_isp_parameter (struct atomisp_parm &parameters)
73 {
74     if ( _device->io_control (ATOMISP_IOC_G_ISP_PARM, &parameters) < 0) {
75         XCAM_LOG_WARNING (" get ISP parameters failed");
76         return XCAM_RETURN_ERROR_IOCTL;
77     }
78     return XCAM_RETURN_NO_ERROR;
79 }
80 
81 XCamReturn
get_3a_statistics(SmartPtr<X3aIspStatistics> & stats)82 IspController::get_3a_statistics (SmartPtr<X3aIspStatistics> &stats)
83 {
84     struct atomisp_3a_statistics *isp_stats = NULL;
85 
86     XCAM_ASSERT (stats.ptr());
87     XCAM_FAIL_RETURN (WARNING, stats.ptr(),
88                       XCAM_RETURN_ERROR_PARAM, "stats empty");
89 
90     isp_stats =  stats->get_isp_stats ();
91 
92     if ( _device->io_control (ATOMISP_IOC_G_3A_STAT, isp_stats) < 0) {
93         XCAM_LOG_WARNING (" get 3a stats failed from ISP");
94         return XCAM_RETURN_ERROR_IOCTL;
95     }
96     return XCAM_RETURN_NO_ERROR;
97 }
98 
99 XCamReturn
set_3a_config(X3aIspConfig * config)100 IspController::set_3a_config (X3aIspConfig *config)
101 {
102     struct atomisp_parameters &isp_config = config->get_isp_configs ();
103     if ( _device->io_control (ATOMISP_IOC_S_PARAMETERS, &isp_config) < 0) {
104         XCAM_LOG_WARNING (" set 3a config failed to ISP");
105         return XCAM_RETURN_ERROR_IOCTL;
106     }
107 
108     return XCAM_RETURN_NO_ERROR;
109 }
110 
111 XCamReturn
set_3a_exposure(X3aIspExposureResult * res)112 IspController::set_3a_exposure (X3aIspExposureResult *res)
113 {
114     const struct atomisp_exposure &exposure = res->get_isp_config ();
115     return set_3a_exposure (exposure);
116 
117     return XCAM_RETURN_NO_ERROR;
118 }
119 
120 XCamReturn
set_3a_exposure(const struct atomisp_exposure & exposure)121 IspController::set_3a_exposure (const struct atomisp_exposure &exposure)
122 {
123     if ( _device->io_control (ATOMISP_IOC_S_EXPOSURE, (struct atomisp_exposure*)(&exposure)) < 0) {
124         XCAM_LOG_WARNING (" set exposure result failed to device");
125         return XCAM_RETURN_ERROR_IOCTL;
126     }
127     XCAM_LOG_DEBUG ("isp set exposure result, integration_time:%d, gain code:%d",
128                     exposure.integration_time[0], exposure.gain[0]);
129 
130     return XCAM_RETURN_NO_ERROR;
131 }
132 
133 XCamReturn
set_3a_focus(const XCam3aResultFocus & focus)134 IspController::set_3a_focus (const XCam3aResultFocus &focus)
135 {
136     int position = focus.position;
137     struct v4l2_control control;
138 
139     xcam_mem_clear (control);
140     control.id = V4L2_CID_FOCUS_ABSOLUTE;
141     control.value = position;
142 
143     if (_device->io_control (VIDIOC_S_CTRL, &control) < 0) {
144         XCAM_LOG_WARNING (" set focus result failed to device");
145         return XCAM_RETURN_ERROR_IOCTL;
146     }
147     return XCAM_RETURN_NO_ERROR;
148 }
149 
150 
151 };
152