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_command_api.h"
21
22
23 #include "acamera_command_api_impl.h"
24 #include "acamera.h"
25 #include "acamera_firmware_api.h"
26 #include "acamera_fw.h"
27
28 #if FW_HAS_CONTROL_CHANNEL
29 #include "acamera_ctrl_channel.h"
30 #endif
31
32 extern void * acamera_get_ctx_ptr( uint32_t ctx_id );
33
acamera_command(uint32_t ctx_id,uint8_t command_type,uint8_t command,uint32_t value,uint8_t direction,uint32_t * ret_value)34 uint8_t acamera_command( uint32_t ctx_id, uint8_t command_type, uint8_t command, uint32_t value, uint8_t direction, uint32_t *ret_value){
35 acamera_fsm_mgr_t *instance = &((acamera_context_ptr_t)acamera_get_ctx_ptr(ctx_id))->fsm_mgr;
36 uint8_t ret = NOT_EXISTS;
37 switch (command_type){
38 case TGENERAL:
39 switch (command){
40 case CONTEXT_NUMBER:
41 ret = general_context_number(instance, value, direction, ret_value);
42 break;
43 case ACTIVE_CONTEXT:
44 ret = general_active_context(instance, value, direction, ret_value);
45 break;
46 }//switch (command)
47 break;
48 case TSELFTEST:
49 switch (command){
50 case FW_REVISION:
51 ret = selftest_fw_revision(instance, value, direction, ret_value);
52 break;
53 }//switch (command)
54 break;
55 case TSENSOR:
56 switch (command){
57 case SENSOR_STREAMING:
58 ret = sensor_streaming(instance, value, direction, ret_value);
59 break;
60 case SENSOR_SUPPORTED_PRESETS:
61 ret = sensor_supported_presets(instance, value, direction, ret_value);
62 break;
63 case SENSOR_PRESET:
64 ret = sensor_preset(instance, value, direction, ret_value);
65 break;
66 case SENSOR_WDR_MODE:
67 ret = sensor_wdr_mode(instance, value, direction, ret_value);
68 break;
69 case SENSOR_FPS:
70 ret = sensor_fps(instance, value, direction, ret_value);
71 break;
72 case SENSOR_TESTPATTERN:
73 ret = sensor_test_pattern(instance, value, direction, ret_value);
74 break;
75 case SENSOR_NAME:
76 ret = sensor_name(instance, value, direction, ret_value);
77 break;
78 case SENSOR_WIDTH:
79 ret = sensor_width(instance, value, direction, ret_value);
80 break;
81 case SENSOR_HEIGHT:
82 ret = sensor_height(instance, value, direction, ret_value);
83 break;
84 case SENSOR_EXPOSURES:
85 ret = sensor_exposures(instance, value, direction, ret_value);
86 break;
87 case SENSOR_INFO_PRESET:
88 ret = sensor_info_preset(instance, value, direction, ret_value);
89 break;
90 case SENSOR_INFO_WDR_MODE:
91 ret = sensor_info_wdr_mode(instance, value, direction, ret_value);
92 break;
93 case SENSOR_INFO_FPS:
94 ret = sensor_info_fps(instance, value, direction, ret_value);
95 break;
96 case SENSOR_INFO_WIDTH:
97 ret = sensor_info_width(instance, value, direction, ret_value);
98 break;
99 case SENSOR_INFO_HEIGHT:
100 ret = sensor_info_height(instance, value, direction, ret_value);
101 break;
102 case SENSOR_INFO_EXPOSURES:
103 ret = sensor_info_exposures(instance, value, direction, ret_value);
104 break;
105 case SENSOR_IR_CUT:
106 ret = sensor_ir_cut_set(instance, value, direction, ret_value);
107 break;
108 case SENSOR_HWID:
109 ret = sensor_hw_id(instance, value, direction, ret_value);
110 break;
111 case SENSOR_WDRMODE_ID:
112 ret = sensor_mode_dynamic_switch(instance, value, direction, ret_value);
113 break;
114 case SENSOR_ANTIFLICKER_ID:
115 ret = sensor_antiflicker_switch(instance, value, direction, ret_value);
116 break;
117 }//switch (command)
118 break;
119 case TSYSTEM:
120 switch (command){
121 case SYSTEM_LOGGER_LEVEL:
122 ret = system_logger_level(instance, value, direction, ret_value);
123 break;
124 case SYSTEM_LOGGER_MASK:
125 ret = system_logger_mask(instance, value, direction, ret_value);
126 break;
127 case BUFFER_DATA_TYPE:
128 ret = buffer_data_type(instance, value, direction, ret_value);
129 break;
130 case TEST_PATTERN_ENABLE_ID:
131 ret = test_pattern_enable(instance, value, direction, ret_value);
132 break;
133 case TEST_PATTERN_MODE_ID:
134 ret = test_pattern(instance, value, direction, ret_value);
135 break;
136 case TEMPER_MODE_ID:
137 ret = temper_mode(instance, value, direction, ret_value);
138 break;
139 case SYSTEM_FREEZE_FIRMWARE:
140 ret = system_freeze_firmware(instance, value, direction, ret_value);
141 break;
142 case SYSTEM_MANUAL_EXPOSURE:
143 ret = system_manual_exposure(instance, value, direction, ret_value);
144 break;
145 case SYSTEM_MANUAL_EXPOSURE_RATIO:
146 ret = system_manual_exposure_ratio(instance, value, direction, ret_value);
147 break;
148 case SYSTEM_MANUAL_INTEGRATION_TIME:
149 ret = system_manual_integration_time(instance, value, direction, ret_value);
150 break;
151 case SYSTEM_MANUAL_MAX_INTEGRATION_TIME:
152 ret = system_manual_max_integration_time(instance, value, direction, ret_value);
153 break;
154 case SYSTEM_MANUAL_SENSOR_ANALOG_GAIN:
155 ret = system_manual_sensor_analog_gain(instance, value, direction, ret_value);
156 break;
157 case SYSTEM_MANUAL_SENSOR_DIGITAL_GAIN:
158 ret = system_manual_sensor_digital_gain(instance, value, direction, ret_value);
159 break;
160 case SYSTEM_MANUAL_ISP_DIGITAL_GAIN:
161 ret = system_manual_isp_digital_gain(instance, value, direction, ret_value);
162 break;
163 case SYSTEM_MANUAL_AWB:
164 ret = system_manual_awb(instance, value, direction, ret_value);
165 break;
166 case SYSTEM_MANUAL_SATURATION:
167 ret = system_manual_saturation(instance, value, direction, ret_value);
168 break;
169 case SYSTEM_EXPOSURE:
170 ret = system_exposure(instance, value, direction, ret_value);
171 break;
172 case SYSTEM_EXPOSURE_RATIO:
173 ret = system_exposure_ratio(instance, value, direction, ret_value);
174 break;
175 case SYSTEM_MAX_EXPOSURE_RATIO:
176 ret = system_max_exposure_ratio(instance, value, direction, ret_value);
177 break;
178 case SYSTEM_INTEGRATION_TIME:
179 ret = system_integration_time(instance, value, direction, ret_value);
180 break;
181 case SYSTEM_LONG_INTEGRATION_TIME:
182 ret = system_long_integration_time(instance, value, direction, ret_value);
183 break;
184 case SYSTEM_SHORT_INTEGRATION_TIME:
185 ret = system_short_integration_time(instance, value, direction, ret_value);
186 break;
187 case SYSTEM_MAX_INTEGRATION_TIME:
188 ret = system_max_integration_time(instance, value, direction, ret_value);
189 break;
190 case SYSTEM_SENSOR_ANALOG_GAIN:
191 ret = system_sensor_analog_gain(instance, value, direction, ret_value);
192 break;
193 case SYSTEM_MAX_SENSOR_ANALOG_GAIN:
194 ret = system_max_sensor_analog_gain(instance, value, direction, ret_value);
195 break;
196 case SYSTEM_SENSOR_DIGITAL_GAIN:
197 ret = system_sensor_digital_gain(instance, value, direction, ret_value);
198 break;
199 case SYSTEM_MAX_SENSOR_DIGITAL_GAIN:
200 ret = system_max_sensor_digital_gain(instance, value, direction, ret_value);
201 break;
202 case SYSTEM_ISP_DIGITAL_GAIN:
203 ret = system_isp_digital_gain(instance, value, direction, ret_value);
204 break;
205 case SYSTEM_MAX_ISP_DIGITAL_GAIN:
206 ret = system_max_isp_digital_gain(instance, value, direction, ret_value);
207 break;
208 case SYSTEM_AWB_RED_GAIN:
209 ret = system_awb_red_gain(instance, value, direction, ret_value);
210 break;
211 case SYSTEM_AWB_BLUE_GAIN:
212 ret = system_awb_blue_gain(instance, value, direction, ret_value);
213 break;
214 case SYSTEM_SATURATION_TARGET:
215 ret = system_saturation_target(instance, value, direction, ret_value);
216 break;
217 case SYSTEM_ANTIFLICKER_ENABLE:
218 ret = system_antiflicker_enable(instance, value, direction, ret_value);
219 break;
220 case SYSTEM_ANTI_FLICKER_FREQUENCY:
221 ret = system_anti_flicker_frequency(instance, value, direction, ret_value);
222 break;
223 case CALIBRATION_UPDATE:
224 ret = calibration_update(instance, value, direction, ret_value);
225 break;
226 }//switch (command)
227 break;
228 case TISP_MODULES:
229 switch (command){
230 case ISP_MODULES_MANUAL_IRIDIX:
231 ret = isp_modules_manual_iridix(instance, value, direction, ret_value);
232 break;
233 case ISP_MODULES_MANUAL_SINTER:
234 ret = isp_modules_manual_sinter(instance, value, direction, ret_value);
235 break;
236 case ISP_MODULES_MANUAL_TEMPER:
237 ret = isp_modules_manual_temper(instance, value, direction, ret_value);
238 break;
239 case ISP_MODULES_MANUAL_AUTO_LEVEL:
240 ret = isp_modules_manual_auto_level(instance, value, direction, ret_value);
241 break;
242 case ISP_MODULES_MANUAL_FRAME_STITCH:
243 ret = isp_modules_manual_frame_stitch(instance, value, direction, ret_value);
244 break;
245 case ISP_MODULES_MANUAL_RAW_FRONTEND:
246 ret = isp_modules_manual_raw_frontend(instance, value, direction, ret_value);
247 break;
248 case ISP_MODULES_MANUAL_BLACK_LEVEL:
249 ret = isp_modules_manual_black_level(instance, value, direction, ret_value);
250 break;
251 case ISP_MODULES_MANUAL_SHADING:
252 ret = isp_modules_manual_shading(instance, value, direction, ret_value);
253 break;
254 case ISP_MODULES_MANUAL_DEMOSAIC:
255 ret = isp_modules_manual_demosaic(instance, value, direction, ret_value);
256 break;
257 case ISP_MODULES_MANUAL_CNR:
258 ret = isp_modules_manual_cnr(instance, value, direction, ret_value);
259 break;
260 case ISP_MODULES_MANUAL_SHARPEN:
261 ret = isp_modules_manual_sharpen(instance, value, direction, ret_value);
262 break;
263 }//switch (command)
264 break;
265 case TSTATUS:
266 switch (command){
267 case STATUS_INFO_EXPOSURE_LOG2_ID:
268 ret = status_info_exposure_log2(instance, value, direction, ret_value);
269 break;
270 case STATUS_INFO_GAIN_ONES_ID:
271 ret = status_info_gain_ones(instance, value, direction, ret_value);
272 break;
273 case STATUS_INFO_GAIN_LOG2_ID:
274 ret = status_info_gain_log2(instance, value, direction, ret_value);
275 break;
276 case STATUS_INFO_AWB_MIX_LIGHT_CONTRAST:
277 ret = status_info_awb_mix_light_contrast(instance, value, direction, ret_value);
278 break;
279 case STATUS_INFO_AF_LENS_POS:
280 ret = status_info_af_lens_pos(instance, value, direction, ret_value);
281 break;
282 case STATUS_INFO_AF_FOCUS_VALUE:
283 ret = status_info_af_focus_value(instance, value, direction, ret_value);
284 break;
285 }//switch (command)
286 break;
287 case TIMAGE:
288 switch (command){
289 case DMA_READER_OUTPUT_ID:
290 ret = dma_reader_output(instance, value, direction, ret_value);
291 break;
292 case FR_FORMAT_BASE_PLANE_ID:
293 ret = fr_format_base_plane(instance, value, direction, ret_value);
294 break;
295 case DS1_FORMAT_BASE_PLANE_ID:
296 ret = ds1_format_base_plane(instance, value, direction, ret_value);
297 break;
298 case ORIENTATION_VFLIP_ID:
299 ret = orientation_vflip(instance, value, direction, ret_value);
300 break;
301 case ORIENTATION_HFLIP_ID:
302 ret = orientation_hflip(instance, value, direction, ret_value);
303 break;
304 case IMAGE_RESIZE_TYPE_ID:
305 ret = image_resize_type(instance, value, direction, ret_value);
306 break;
307 case IMAGE_RESIZE_ENABLE_ID:
308 ret = image_resize_enable(instance, value, direction, ret_value);
309 break;
310 case IMAGE_RESIZE_WIDTH_ID:
311 ret = image_resize_width(instance, value, direction, ret_value);
312 break;
313 case IMAGE_RESIZE_HEIGHT_ID:
314 ret = image_resize_height(instance, value, direction, ret_value);
315 break;
316 case IMAGE_CROP_XOFFSET_ID:
317 ret = image_crop_xoffset(instance, value, direction, ret_value);
318 break;
319 case IMAGE_CROP_YOFFSET_ID:
320 ret = image_crop_yoffset(instance, value, direction, ret_value);
321 break;
322 }//switch (command)
323 break;
324 case TALGORITHMS:
325 switch (command){
326 case AF_LENS_STATUS:
327 ret = af_lens_status(instance, value, direction, ret_value);
328 break;
329 case AF_MODE_ID:
330 ret = af_mode(instance, value, direction, ret_value);
331 break;
332 case AF_RANGE_LOW_ID:
333 ret = af_range_low(instance, value, direction, ret_value);
334 break;
335 case AF_RANGE_HIGH_ID:
336 ret = af_range_high(instance, value, direction, ret_value);
337 break;
338 case AF_ROI_ID:
339 ret = af_roi(instance, value, direction, ret_value);
340 break;
341 case AF_MANUAL_CONTROL_ID:
342 ret = af_manual_control(instance, value, direction, ret_value);
343 break;
344 case AE_MODE_ID:
345 ret = ae_mode(instance, value, direction, ret_value);
346 break;
347 case AE_SPLIT_PRESET_ID:
348 ret = ae_split_preset(instance, value, direction, ret_value);
349 break;
350 case AE_GAIN_ID:
351 ret = ae_gain(instance, value, direction, ret_value);
352 break;
353 case AE_EXPOSURE_ID:
354 ret = ae_exposure(instance, value, direction, ret_value);
355 break;
356 case AE_ROI_ID:
357 ret = ae_roi(instance, value, direction, ret_value);
358 break;
359 case AE_COMPENSATION_ID:
360 ret = ae_compensation(instance, value, direction, ret_value);
361 break;
362 case AWB_MODE_ID:
363 ret = awb_mode(instance, value, direction, ret_value);
364 break;
365 case AWB_TEMPERATURE_ID:
366 ret = awb_temperature(instance, value, direction, ret_value);
367 break;
368 case ANTIFLICKER_MODE_ID:
369 ret = antiflicker_mode(instance, value, direction, ret_value);
370 break;
371 case AE_ZONE_WEIGHT:
372 ret = ae_zone_weight(instance, value, direction, ret_value);
373 break;
374 case AWB_ZONE_WEIGHT:
375 ret = awb_zone_weight(instance, value, direction, ret_value);
376 break;
377 case DEFOG_MODE_ID:
378 ret = defog_alg_mode(instance, value, direction, ret_value);
379 break;
380 case DEFOG_RATIO_DELTA:
381 ret = defog_alg_ratio_delta(instance, value, direction, ret_value);
382 break;
383 case DEFOG_BLACK_PERCENTAGE:
384 ret = defog_alg_black_pctg(instance, value, direction, ret_value);
385 break;
386 case DEFOG_WHITE_PERCENTAGE:
387 ret = defog_alg_white_pctg(instance, value, direction, ret_value);
388 break;
389 }//switch (command)
390 break;
391 case TSCENE_MODES:
392 switch (command){
393 case COLOR_MODE_ID:
394 ret = color_mode(instance, value, direction, ret_value);
395 break;
396 case BRIGHTNESS_STRENGTH_ID:
397 ret = brightness_strength(instance, value, direction, ret_value);
398 break;
399 case CONTRAST_STRENGTH_ID:
400 ret = contrast_strength(instance, value, direction, ret_value);
401 break;
402 case SATURATION_STRENGTH_ID:
403 ret = saturation_strength(instance, value, direction, ret_value);
404 break;
405 case SHARPENING_STRENGTH_ID:
406 ret = sharpening_strength(instance, value, direction, ret_value);
407 break;
408 case HUE_THETA_ID:
409 ret = hue_theta(instance, value, direction, ret_value);
410 break;
411 case SNR_MANUAL_ID:
412 ret = snr_manual(instance, value, direction, ret_value);
413 break;
414 case SNR_STRENGTH_ID:
415 ret = snr_strength(instance, value, direction, ret_value);
416 break;
417 case TNR_MANUAL_ID:
418 ret = tnr_manual(instance, value, direction, ret_value);
419 break;
420 case TNR_OFFSET_ID:
421 ret = tnr_offset(instance, value, direction, ret_value);
422 break;
423 }//switch (command)
424 break;
425 case TREGISTERS:
426 switch (command){
427 case REGISTERS_ADDRESS_ID:
428 ret = register_address(instance, value, direction, ret_value);
429 break;
430 case REGISTERS_SIZE_ID:
431 ret = register_size(instance, value, direction, ret_value);
432 break;
433 case REGISTERS_SOURCE_ID:
434 ret = register_source(instance, value, direction, ret_value);
435 break;
436 case REGISTERS_VALUE_ID:
437 ret = register_value(instance, value, direction, ret_value);
438 break;
439 }//switch (command)
440 break;
441 #if ISP_HAS_DS2
442 case TAML_SCALER:
443 switch (command) {
444 case SCALER_WIDTH:
445 ret = scaler_width(instance, value, direction, ret_value);
446 break;
447 case SCALER_HEIGHT:
448 ret = scaler_height(instance, value, direction, ret_value);
449 break;
450 case SCALER_SRC_WIDTH:
451 ret = scaler_src_width(instance, value, direction, ret_value);
452 break;
453 case SCALER_SRC_HEIGHT:
454 ret = scaler_src_height(instance, value, direction, ret_value);
455 break;
456 case SCALER_OUTPUT_MODE:
457 ret = scaler_output_mode(instance, value, direction, ret_value);
458 break;
459 case SCALER_STREAMING_ON:
460 scaler_streaming_on();
461 break;
462 case SCALER_STREAMING_OFF:
463 scaler_streaming_off();
464 break;
465 }//switch (command)
466 break;
467 #endif
468 }//switch (command_type)
469
470 #if FW_HAS_CONTROL_CHANNEL
471 if (ret == SUCCESS)
472 ctrl_channel_handle_command( ctx_id, command_type, command, value, direction );
473 #endif
474
475 if (ret == IMPLEMENTED)
476 ret = SUCCESS;
477
478 if (ret != SUCCESS) {
479 LOG(LOG_WARNING,"API COMMAND FAILED: type %d, cmd %d, value %lu, direction %d, ret_value %lu, result %d",command_type, command, (unsigned long)value, direction, (unsigned long)*ret_value, ret);
480 } else {
481 LOG(LOG_NOTICE,"API type %d, cmd %d, value %lu, direction %d, ret_value %lu, result %d",command_type, command, (unsigned long)value, direction, (unsigned long)*ret_value, ret);
482 }
483
484 return ret;
485 }
486