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