1 /*
2 * sensor_descriptor.h - sensor descriptor
3 *
4 * Copyright (c) 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 "sensor_descriptor.h"
22 #include <math.h>
23
24 namespace XCam {
25
SensorDescriptor()26 SensorDescriptor::SensorDescriptor ()
27 {
28 xcam_mem_clear (_sensor_data);
29 }
30
~SensorDescriptor()31 SensorDescriptor::~SensorDescriptor ()
32 {
33 }
34
35 bool
is_ready()36 SensorDescriptor::is_ready ()
37 {
38 return (_sensor_data.line_length_pck > 0);
39 }
40
41 void
set_sensor_data(struct atomisp_sensor_mode_data & data)42 SensorDescriptor::set_sensor_data (struct atomisp_sensor_mode_data &data)
43 {
44 _sensor_data = data;
45 }
46
47 bool
exposure_time_to_integration(int32_t exposure_time,uint32_t & coarse_time,uint32_t & fine_time)48 SensorDescriptor::exposure_time_to_integration (
49 int32_t exposure_time, uint32_t &coarse_time, uint32_t &fine_time)
50 {
51 if (exposure_time < 0 || !is_ready ())
52 return false;
53
54 uint32_t pixel_periods = ((uint64_t)exposure_time) * _sensor_data.vt_pix_clk_freq_mhz / XCAM_SECONDS_2_TIMESTAMP (1);
55
56 coarse_time = pixel_periods / _sensor_data.line_length_pck;
57 fine_time = pixel_periods % _sensor_data.line_length_pck;
58 return true;
59 }
60
61 bool
exposure_integration_to_time(uint32_t coarse_time,uint32_t fine_time,int32_t & exposure_time)62 SensorDescriptor::exposure_integration_to_time (
63 uint32_t coarse_time, uint32_t fine_time, int32_t &exposure_time)
64 {
65 if (!is_ready ())
66 return false;
67
68 uint64_t pixel_periods = coarse_time * _sensor_data.line_length_pck + fine_time;
69 exposure_time = pixel_periods * XCAM_SECONDS_2_TIMESTAMP(1) / _sensor_data.vt_pix_clk_freq_mhz;
70 return true;
71 }
72
73 bool
exposure_gain_to_code(double analog_gain,double digital_gain,int32_t & analog_code,int32_t & digital_code)74 SensorDescriptor::exposure_gain_to_code (
75 double analog_gain, double digital_gain,
76 int32_t &analog_code, int32_t &digital_code)
77 {
78 XCAM_ASSERT (digital_gain == 1.0);
79 double db = log10 (analog_gain * digital_gain) * 20;
80 if (db > 48)
81 db = 48;
82 analog_code = (uint32_t) (db * 160.0 / 48);
83 digital_code = 0;
84 return true;
85 }
86
87 bool
exposure_code_to_gain(int32_t analog_code,int32_t digital_code,double & analog_gain,double & digital_gain)88 SensorDescriptor::exposure_code_to_gain (
89 int32_t analog_code, int32_t digital_code,
90 double &analog_gain, double &digital_gain)
91 {
92 XCAM_UNUSED (digital_code);
93 double db = analog_code * 48.0 / 160.0;
94 analog_gain = pow (10.0, db / 20.0);
95 digital_gain = 1.0;
96
97 return true;
98 }
99
100 };
101