• 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_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