• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 *
3 * SPDX-License-Identifier: GPL-2.0
4 *
5 * Copyright (C) 2011-2018 ARM or its affiliates
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 *
18 */
19 
20 #include "acamera_fw.h"
21 
22 #if defined( ISP_HAS_AWB_MESH_NBP_FSM )
23 #include "awb_mesh_NBP_fsm.h"
24 #elif defined( ISP_HAS_AWB_MANUAL_FSM )
25 #include "awb_manual_fsm.h"
26 #endif
27 
28 #if defined( ISP_HAS_AF_LMS_FSM )
29 #include "af_lms_fsm.h"
30 #elif defined( ISP_HAS_AF_MANUAL_FSM )
31 #include "af_manual_fsm.h"
32 #endif
33 
34 #include "acamera_lens_api.h"
35 
36 #ifndef _SHARED_BUFFER_H_
37 #define _SHARED_BUFFER_H_
38 
39 /* shared buffer max size */
40 #define SBUF_STATS_ARRAY_SIZE 4
41 
42 #define SBUF_DEV_FORMAT "ac_sbuf%d"
43 #define SBUF_DEV_NAME_LEN 16
44 #define SBUF_DEV_PATH_FORMAT "/dev/" SBUF_DEV_FORMAT
45 #define SBUF_DEV_PATH_LEN ( SBUF_DEV_NAME_LEN )
46 
47 enum sbuf_status {
48     SBUF_STATUS_DATA_EMPTY,
49     SBUF_STATUS_DATA_PREPARE,
50     SBUF_STATUS_DATA_DONE,
51     SBUF_STATUS_DATA_USING,
52     SBUF_STATUS_MAX,
53 };
54 
55 enum sbuf_type {
56     SBUF_TYPE_AE,
57     SBUF_TYPE_AWB,
58     SBUF_TYPE_AF,
59     SBUF_TYPE_GAMMA,
60     SBUF_TYPE_IRIDIX,
61     SBUF_TYPE_MAX,
62 };
63 
64 struct sbuf_idx_set {
65     uint8_t ae_idx;
66     uint8_t ae_idx_valid;
67 
68     uint8_t awb_idx;
69     uint8_t awb_idx_valid;
70 
71     uint8_t af_idx;
72     uint8_t af_idx_valid;
73 
74     uint8_t gamma_idx;
75     uint8_t gamma_idx_valid;
76 
77     uint8_t iridix_idx;
78     uint8_t iridix_idx_valid;
79 };
80 
81 struct sbuf_item {
82     uint32_t buf_idx;
83     uint32_t buf_status;
84     uint32_t buf_type;
85     void *buf_base;
86 };
87 
88 // NOTE: This struct should exactly match the definition of LookupTable in acamera_types.h
89 //       except the const qualifier.
90 //       'const' keyword needs to be removed to construct sbuf calibration data.
91 struct sbuf_lookup_table {
92     void *ptr;
93     uint16_t rows;
94     uint16_t cols;
95     uint16_t width;
96 };
97 
98 /* kernel-FW information */
99 struct cmos_info {
100     int32_t max_exposure_log2;
101     int32_t total_gain_log2;
102 };
103 
104 struct af_info {
105     int32_t lens_driver_ok;
106     lens_param_t lens_param;
107 };
108 
109 struct sensor_info {
110     uint32_t cur_mode;
111     uint32_t modes_num;
112     sensor_mode_t modes[ISP_MAX_SENSOR_MODES];
113 };
114 
115 struct calibration_info {
116     uint8_t is_fetched;
117     uint8_t cali_data[ISP_MAX_CALIBRATION_DATA_SIZE];
118 };
119 
120 struct kf_info {
121     struct cmos_info cmos_info;
122     struct af_info af_info;
123     struct sensor_info sensor_info;
124 
125     struct calibration_info cali_info;
126 };
127 
128 #if defined( ISP_HAS_AE_BALANCED_FSM ) || defined( ISP_HAS_AE_MANUAL_FSM )
129 typedef struct sbuf_ae {
130     // KF -> UF: Data shared from kernel-FW to user-FW
131     uint32_t stats_data[ISP_FULL_HISTOGRAM_SIZE];
132     uint32_t histogram_sum;
133 
134     // UF -> KF: Data shared from user-FW to kernel-FW
135     int32_t ae_exposure;
136     uint32_t ae_exposure_ratio;
137 
138     uint32_t frame_id;
139 } sbuf_ae_t;
140 #endif
141 
142 #if defined( ISP_HAS_AWB_MESH_FSM ) || defined( ISP_HAS_AWB_MESH_NBP_FSM ) || defined( ISP_HAS_AWB_MANUAL_FSM )
143 typedef struct sbuf_awb {
144     // KF -> UF: Data shared from kernel-FW to user-FW
145     awb_zone_t stats_data[MAX_AWB_ZONES];
146     uint32_t curr_AWB_ZONES;
147 
148     // UF -> KF: Data shared from user-FW to kernel-FW
149     uint32_t awb_red_gain;
150     uint32_t awb_blue_gain;
151     int32_t temperature_detected;
152     uint8_t p_high;
153     uint8_t light_source_candidate;
154     int32_t awb_warming[3];
155     uint32_t mix_light_contrast;
156 
157     uint32_t frame_id;
158 } sbuf_awb_t;
159 #endif
160 
161 #if defined( ISP_HAS_AF_LMS_FSM ) || defined( ISP_HAS_AF_MANUAL_FSM )
162 typedef struct sbuf_af {
163     // KF -> UF: Data shared from kernel-FW to user-FW
164     uint32_t stats_data[AF_ZONES_COUNT_MAX][2];
165     uint32_t frame_num;
166     uint8_t skip_cur_frame;
167 
168     // UF -> KF: Data shared from user-FW to kernel-FW
169     uint8_t frame_to_skip;
170     uint16_t af_position;
171     int32_t af_last_sharp;
172 } sbuf_af_t;
173 #endif
174 
175 #if defined( ISP_HAS_GAMMA_CONTRAST_FSM ) || defined( ISP_HAS_GAMMA_MANUAL_FSM )
176 typedef struct sbuf_gamma {
177     // KF -> UF: Data shared from kernel-FW to user-FW
178     uint32_t stats_data[ISP_FULL_HISTOGRAM_SIZE];
179     uint32_t fullhist_sum;
180 
181     // UF -> KF: Data shared from user-FW to kernel-FW
182     uint32_t gamma_gain;
183     uint32_t gamma_offset;
184 
185     uint32_t frame_id;
186 } sbuf_gamma_t;
187 #endif
188 
189 #if defined( ISP_HAS_IRIDIX_HIST_FSM ) || defined( ISP_HAS_IRIDIX8_FSM ) || defined( ISP_HAS_IRIDIX_MANUAL_FSM ) || defined( ISP_HAS_IRIDIX8_MANUAL_FSM )
190 typedef struct sbuf_iridix {
191     // KF -> UF: Data shared from kernel-FW to user-FW
192     // no output data from KF to UF
193 
194     // UF -> KF: Data shared from user-FW to kernel-FW
195     uint16_t strength_target;
196 
197     // iridix8
198     uint16_t iridix_dark_enh;
199     uint16_t iridix_global_DG;
200     uint32_t iridix_contrast;
201 
202     uint32_t frame_id;
203 } sbuf_iridix_t;
204 #endif
205 
206 struct fw_sbuf {
207     struct kf_info kf_info;
208 
209 #if defined( ISP_HAS_AE_BALANCED_FSM ) || defined( ISP_HAS_AE_MANUAL_FSM )
210     sbuf_ae_t ae_sbuf[SBUF_STATS_ARRAY_SIZE];
211 #endif
212 
213 #if defined( ISP_HAS_AWB_MESH_FSM ) || defined( ISP_HAS_AWB_MESH_NBP_FSM ) || defined( ISP_HAS_AWB_MANUAL_FSM )
214     sbuf_awb_t awb_sbuf[SBUF_STATS_ARRAY_SIZE];
215 #endif
216 
217 #if defined( ISP_HAS_AF_LMS_FSM ) || defined( ISP_HAS_AF_MANUAL_FSM )
218     sbuf_af_t af_sbuf[SBUF_STATS_ARRAY_SIZE];
219 #endif
220 
221 #if defined( ISP_HAS_GAMMA_CONTRAST_FSM ) || defined( ISP_HAS_GAMMA_MANUAL_FSM )
222     sbuf_gamma_t gamma_sbuf[SBUF_STATS_ARRAY_SIZE];
223 #endif
224 
225 #if defined( ISP_HAS_IRIDIX_HIST_FSM ) || defined( ISP_HAS_IRIDIX8_FSM ) || defined( ISP_HAS_IRIDIX_MANUAL_FSM ) || defined( ISP_HAS_IRIDIX8_MANUAL_FSM )
226     sbuf_iridix_t iridix_sbuf[SBUF_STATS_ARRAY_SIZE];
227 #endif
228 };
229 
230 /**
231  * sbuf_get_item - get a sbuf item from sbuf_mgr to use
232  *
233  * @item: target item to be get
234  *    OUT uint32_t buf_idx;
235  *    IN  uint32_t buf_status: Only SBUF_STATUS_DATA_EMPTY and SBUF_STATUS_DATA_DONE are valid.
236  *    IN  uint32_t buf_type: values in enum sbuf_type
237  *    OUT void *   buf_base;
238  *
239  * Return 0 when succeed, buf_idx and buf_base will be filled, other values failed.
240  */
241 int sbuf_get_item( int fw_id, struct sbuf_item *item );
242 
243 /**
244  * sbuf_set_item - set a sbuf item to sbuf_mgr
245  *
246  * @item: target item to be get
247  *    IN  uint32_t buf_idx;
248  *    IN  uint32_t buf_status: Only SBUF_STATUS_DATA_EMPTY and SBUF_STATUS_DATA_DONE are valid.
249  *    IN  uint32_t buf_type: values in enum sbuf_type
250  *    IN void *   buf_base;
251  *
252  * Return 0 when succeed, other values failed.
253  */
254 int sbuf_set_item( int fw_id, struct sbuf_item *item );
255 
is_idx_set_has_valid_item(struct sbuf_idx_set * p_idx_set)256 static int inline is_idx_set_has_valid_item( struct sbuf_idx_set *p_idx_set )
257 {
258     if ( p_idx_set->ae_idx_valid ||
259          p_idx_set->awb_idx_valid ||
260          p_idx_set->af_idx_valid ||
261          p_idx_set->gamma_idx_valid ||
262          p_idx_set->iridix_idx_valid ) {
263         return 1;
264     } else {
265         return 0;
266     }
267 }
268 
269 #endif /* #ifndef _SHARED_BUFFER_H_ */
270