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 #if defined(ISP_HAS_DMA_WRITER_FSM)
22 #include "dma_writer_fsm.h"
23 #endif
24
25
acamera_fsm_mgr_set_param(acamera_fsm_mgr_t * p_fsm_mgr,uint32_t param_id,void * input,uint32_t input_size)26 int acamera_fsm_mgr_set_param(acamera_fsm_mgr_t * p_fsm_mgr, uint32_t param_id, void * input, uint32_t input_size)
27 {
28 int rc = 0;
29
30 if( param_id >= FSM_PARAM_SET_MAX_ID || param_id <= FSM_PARAM_SET_MIN_ID ) {
31 LOG(LOG_CRIT, "Invalid param: param_id: %d, min: %d, max: %d.", param_id, FSM_PARAM_SET_MIN_ID, FSM_PARAM_SET_MAX_ID);
32 return -1;
33 }
34
35 if( FSM_PARAM_SET_SENSOR_START < param_id && param_id < FSM_PARAM_SET_SENSOR_END ) {
36 if( p_fsm_mgr->fsm_arr[FSM_ID_SENSOR]->ops.set_param ) {
37 rc = p_fsm_mgr->fsm_arr[FSM_ID_SENSOR]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_SENSOR]->p_fsm, param_id, input, input_size);
38 } else {
39 LOG(LOG_ERR, "SENSOR FSM doesn't support set_param().");
40 rc = -1;
41 }
42 } else if( FSM_PARAM_SET_CMOS_START < param_id && param_id < FSM_PARAM_SET_CMOS_END ) {
43 if( p_fsm_mgr->fsm_arr[FSM_ID_CMOS]->ops.set_param ) {
44 rc = p_fsm_mgr->fsm_arr[FSM_ID_CMOS]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_CMOS]->p_fsm, param_id, input, input_size);
45 } else {
46 LOG(LOG_ERR, "CMOS FSM doesn't support set_param().");
47 rc = -1;
48 }
49 } else if( FSM_PARAM_SET_CROP_START < param_id && param_id < FSM_PARAM_SET_CROP_END ) {
50 if( p_fsm_mgr->fsm_arr[FSM_ID_CROP]->ops.set_param ) {
51 rc = p_fsm_mgr->fsm_arr[FSM_ID_CROP]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_CROP]->p_fsm, param_id, input, input_size);
52 } else {
53 LOG(LOG_ERR, "CROP FSM doesn't support set_param().");
54 rc = -1;
55 }
56 } else if( FSM_PARAM_SET_GENERAL_START < param_id && param_id < FSM_PARAM_SET_GENERAL_END ) {
57 if( p_fsm_mgr->fsm_arr[FSM_ID_GENERAL]->ops.set_param ) {
58 rc = p_fsm_mgr->fsm_arr[FSM_ID_GENERAL]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_GENERAL]->p_fsm, param_id, input, input_size);
59 } else {
60 LOG(LOG_ERR, "GENERAL FSM doesn't support set_param().");
61 rc = -1;
62 }
63 } else if( FSM_PARAM_SET_AE_START < param_id && param_id < FSM_PARAM_SET_AE_END ) {
64 if( p_fsm_mgr->fsm_arr[FSM_ID_AE]->ops.set_param ) {
65 rc = p_fsm_mgr->fsm_arr[FSM_ID_AE]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_AE]->p_fsm, param_id, input, input_size);
66 } else {
67 LOG(LOG_ERR, "AE FSM doesn't support set_param().");
68 rc = -1;
69 }
70 } else if( FSM_PARAM_SET_AWB_START < param_id && param_id < FSM_PARAM_SET_AWB_END ) {
71 if( p_fsm_mgr->fsm_arr[FSM_ID_AWB]->ops.set_param ) {
72 rc = p_fsm_mgr->fsm_arr[FSM_ID_AWB]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_AWB]->p_fsm, param_id, input, input_size);
73 } else {
74 LOG(LOG_ERR, "AWB FSM doesn't support set_param().");
75 rc = -1;
76 }
77 } else if( FSM_PARAM_SET_COLOR_MATRIX_START < param_id && param_id < FSM_PARAM_SET_COLOR_MATRIX_END ) {
78 if( p_fsm_mgr->fsm_arr[FSM_ID_COLOR_MATRIX]->ops.set_param ) {
79 rc = p_fsm_mgr->fsm_arr[FSM_ID_COLOR_MATRIX]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_COLOR_MATRIX]->p_fsm, param_id, input, input_size);
80 } else {
81 LOG(LOG_ERR, "COLOR_MATRIX FSM doesn't support set_param().");
82 rc = -1;
83 }
84 } else if( FSM_PARAM_SET_IRIDIX_START < param_id && param_id < FSM_PARAM_SET_IRIDIX_END ) {
85 if( p_fsm_mgr->fsm_arr[FSM_ID_IRIDIX]->ops.set_param ) {
86 rc = p_fsm_mgr->fsm_arr[FSM_ID_IRIDIX]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_IRIDIX]->p_fsm, param_id, input, input_size);
87 } else {
88 LOG(LOG_ERR, "IRIDIX FSM doesn't support set_param().");
89 rc = -1;
90 }
91 } else if( FSM_PARAM_SET_SHARPENING_START < param_id && param_id < FSM_PARAM_SET_SHARPENING_END ) {
92 if( p_fsm_mgr->fsm_arr[FSM_ID_SHARPENING]->ops.set_param ) {
93 rc = p_fsm_mgr->fsm_arr[FSM_ID_SHARPENING]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_SHARPENING]->p_fsm, param_id, input, input_size);
94 } else {
95 LOG(LOG_ERR, "SHARPENING FSM doesn't support set_param().");
96 rc = -1;
97 }
98 } else if( FSM_PARAM_SET_MATRIX_YUV_START < param_id && param_id < FSM_PARAM_SET_MATRIX_YUV_END ) {
99 if( p_fsm_mgr->fsm_arr[FSM_ID_MATRIX_YUV]->ops.set_param ) {
100 rc = p_fsm_mgr->fsm_arr[FSM_ID_MATRIX_YUV]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_MATRIX_YUV]->p_fsm, param_id, input, input_size);
101 } else {
102 LOG(LOG_ERR, "MATRIX_YUV FSM doesn't support set_param().");
103 rc = -1;
104 }
105 } else if( FSM_PARAM_SET_GAMMA_MANUAL_START < param_id && param_id < FSM_PARAM_SET_GAMMA_MANUAL_END ) {
106 if( p_fsm_mgr->fsm_arr[FSM_ID_GAMMA_MANUAL]->ops.set_param ) {
107 rc = p_fsm_mgr->fsm_arr[FSM_ID_GAMMA_MANUAL]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_GAMMA_MANUAL]->p_fsm, param_id, input, input_size);
108 } else {
109 LOG(LOG_ERR, "GAMMA_MANUAL FSM doesn't support set_param().");
110 rc = -1;
111 }
112 } else if( FSM_PARAM_SET_MONITOR_START < param_id && param_id < FSM_PARAM_SET_MONITOR_END ) {
113 if( p_fsm_mgr->fsm_arr[FSM_ID_MONITOR]->ops.set_param ) {
114 rc = p_fsm_mgr->fsm_arr[FSM_ID_MONITOR]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_MONITOR]->p_fsm, param_id, input, input_size);
115 } else {
116 LOG(LOG_ERR, "MONITOR FSM doesn't support set_param().");
117 rc = -1;
118 }
119 } else if( FSM_PARAM_SET_SBUF_START < param_id && param_id < FSM_PARAM_SET_SBUF_END ) {
120 if( p_fsm_mgr->fsm_arr[FSM_ID_SBUF]->ops.set_param ) {
121 rc = p_fsm_mgr->fsm_arr[FSM_ID_SBUF]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_SBUF]->p_fsm, param_id, input, input_size);
122 } else {
123 LOG(LOG_ERR, "SBUF FSM doesn't support set_param().");
124 rc = -1;
125 }
126 } else if( FSM_PARAM_SET_DMA_WRITER_START < param_id && param_id < FSM_PARAM_SET_DMA_WRITER_END ) {
127 if( p_fsm_mgr->fsm_arr[FSM_ID_DMA_WRITER]->ops.set_param ) {
128 rc = p_fsm_mgr->fsm_arr[FSM_ID_DMA_WRITER]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_DMA_WRITER]->p_fsm, param_id, input, input_size);
129 } else {
130 LOG(LOG_ERR, "DMA_WRITER FSM doesn't support set_param().");
131 rc = -1;
132 }
133 } else if( FSM_PARAM_SET_METADATA_START < param_id && param_id < FSM_PARAM_SET_METADATA_END ) {
134 if( p_fsm_mgr->fsm_arr[FSM_ID_METADATA]->ops.set_param ) {
135 rc = p_fsm_mgr->fsm_arr[FSM_ID_METADATA]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_METADATA]->p_fsm, param_id, input, input_size);
136 } else {
137 LOG(LOG_ERR, "METADATA FSM doesn't support set_param().");
138 rc = -1;
139 }
140 } else if( FSM_PARAM_SET_AF_START < param_id && param_id < FSM_PARAM_SET_AF_END ) {
141 if( p_fsm_mgr->fsm_arr[FSM_ID_AF]->ops.set_param ) {
142 rc = p_fsm_mgr->fsm_arr[FSM_ID_AF]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_AF]->p_fsm, param_id, input, input_size);
143 } else {
144 LOG(LOG_ERR, "AF FSM doesn't support set_param().");
145 rc = -1;
146 }
147 } else if( FSM_PARAM_SET_AUTOCAP_START < param_id && param_id < FSM_PARAM_SET_AUTOCAP_END ) {
148 if( p_fsm_mgr->fsm_arr[FSM_ID_AUTOCAP]->ops.set_param ) {
149 rc = p_fsm_mgr->fsm_arr[FSM_ID_AUTOCAP]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_AUTOCAP]->p_fsm, param_id, input, input_size);
150 } else {
151 LOG(LOG_ERR, "AUTOCAP FSM doesn't support set_param().");
152 rc = -1;
153 }
154 } else if ( FSM_PARAM_SET_NR_START < param_id && param_id < FSM_PARAM_SET_NR_END ) {
155 if ( p_fsm_mgr->fsm_arr[FSM_ID_NOISE_REDUCTION]->ops.set_param ) {
156 rc = p_fsm_mgr->fsm_arr[FSM_ID_NOISE_REDUCTION]->ops.set_param( p_fsm_mgr->fsm_arr[FSM_ID_NOISE_REDUCTION]->p_fsm, param_id, input, input_size);
157 } else {
158 LOG(LOG_ERR, "NR FSM doesn't support set_param().");
159 rc = -1;
160 }
161 }else {
162 LOG(LOG_CRIT, "Unsupported param_id: %d.", param_id);
163 rc = -1;
164 }
165
166 return rc;
167 }
168
acamera_fsm_mgr_get_param(acamera_fsm_mgr_t * p_fsm_mgr,uint32_t param_id,void * input,uint32_t input_size,void * output,uint32_t output_size)169 int acamera_fsm_mgr_get_param(acamera_fsm_mgr_t * p_fsm_mgr, uint32_t param_id, void * input, uint32_t input_size, void * output, uint32_t output_size)
170 {
171 int rc = 0;
172
173 if( param_id >= FSM_PARAM_GET_MAX_ID || param_id <= FSM_PARAM_GET_MIN_ID ) {
174 LOG(LOG_CRIT, "Invalid param: param_id: %d, min: %d, max: %d.", param_id, FSM_PARAM_GET_MIN_ID, FSM_PARAM_GET_MAX_ID);
175 return -1;
176 }
177
178 if( FSM_PARAM_GET_SENSOR_START < param_id && param_id < FSM_PARAM_GET_SENSOR_END ) {
179 if( p_fsm_mgr->fsm_arr[FSM_ID_SENSOR]->ops.get_param ) {
180 rc = p_fsm_mgr->fsm_arr[FSM_ID_SENSOR]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_SENSOR]->p_fsm, param_id, input, input_size, output, output_size);
181 } else {
182 LOG(LOG_ERR, "SENSOR FSM doesn't support get_param().");
183 rc = -1;
184 }
185 } else if( FSM_PARAM_GET_CMOS_START < param_id && param_id < FSM_PARAM_GET_CMOS_END ) {
186 if( p_fsm_mgr->fsm_arr[FSM_ID_CMOS]->ops.get_param ) {
187 rc = p_fsm_mgr->fsm_arr[FSM_ID_CMOS]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_CMOS]->p_fsm, param_id, input, input_size, output, output_size);
188 } else {
189 LOG(LOG_ERR, "CMOS FSM doesn't support get_param().");
190 rc = -1;
191 }
192 } else if( FSM_PARAM_GET_CROP_START < param_id && param_id < FSM_PARAM_GET_CROP_END ) {
193 if( p_fsm_mgr->fsm_arr[FSM_ID_CROP]->ops.get_param ) {
194 rc = p_fsm_mgr->fsm_arr[FSM_ID_CROP]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_CROP]->p_fsm, param_id, input, input_size, output, output_size);
195 } else {
196 LOG(LOG_ERR, "CROP FSM doesn't support get_param().");
197 rc = -1;
198 }
199 } else if( FSM_PARAM_GET_GENERAL_START < param_id && param_id < FSM_PARAM_GET_GENERAL_END ) {
200 if( p_fsm_mgr->fsm_arr[FSM_ID_GENERAL]->ops.get_param ) {
201 rc = p_fsm_mgr->fsm_arr[FSM_ID_GENERAL]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_GENERAL]->p_fsm, param_id, input, input_size, output, output_size);
202 } else {
203 LOG(LOG_ERR, "GENERAL FSM doesn't support get_param().");
204 rc = -1;
205 }
206 } else if( FSM_PARAM_GET_AE_START < param_id && param_id < FSM_PARAM_GET_AE_END ) {
207 if( p_fsm_mgr->fsm_arr[FSM_ID_AE]->ops.get_param ) {
208 rc = p_fsm_mgr->fsm_arr[FSM_ID_AE]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_AE]->p_fsm, param_id, input, input_size, output, output_size);
209 } else {
210 LOG(LOG_ERR, "AE FSM doesn't support get_param().");
211 rc = -1;
212 }
213 } else if( FSM_PARAM_GET_AWB_START < param_id && param_id < FSM_PARAM_GET_AWB_END ) {
214 if( p_fsm_mgr->fsm_arr[FSM_ID_AWB]->ops.get_param ) {
215 rc = p_fsm_mgr->fsm_arr[FSM_ID_AWB]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_AWB]->p_fsm, param_id, input, input_size, output, output_size);
216 } else {
217 LOG(LOG_ERR, "AWB FSM doesn't support get_param().");
218 rc = -1;
219 }
220 } else if( FSM_PARAM_GET_COLOR_MATRIX_START < param_id && param_id < FSM_PARAM_GET_COLOR_MATRIX_END ) {
221 if( p_fsm_mgr->fsm_arr[FSM_ID_COLOR_MATRIX]->ops.get_param ) {
222 rc = p_fsm_mgr->fsm_arr[FSM_ID_COLOR_MATRIX]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_COLOR_MATRIX]->p_fsm, param_id, input, input_size, output, output_size);
223 } else {
224 LOG(LOG_ERR, "COLOR_MATRIX FSM doesn't support get_param().");
225 rc = -1;
226 }
227 } else if( FSM_PARAM_GET_IRIDIX_START < param_id && param_id < FSM_PARAM_GET_IRIDIX_END ) {
228 if( p_fsm_mgr->fsm_arr[FSM_ID_IRIDIX]->ops.get_param ) {
229 rc = p_fsm_mgr->fsm_arr[FSM_ID_IRIDIX]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_IRIDIX]->p_fsm, param_id, input, input_size, output, output_size);
230 } else {
231 LOG(LOG_ERR, "IRIDIX FSM doesn't support get_param().");
232 rc = -1;
233 }
234 } else if( FSM_PARAM_GET_SHARPENING_START < param_id && param_id < FSM_PARAM_GET_SHARPENING_END ) {
235 if( p_fsm_mgr->fsm_arr[FSM_ID_SHARPENING]->ops.get_param ) {
236 rc = p_fsm_mgr->fsm_arr[FSM_ID_SHARPENING]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_SHARPENING]->p_fsm, param_id, input, input_size, output, output_size);
237 } else {
238 LOG(LOG_ERR, "SHARPENING FSM doesn't support get_param().");
239 rc = -1;
240 }
241 } else if( FSM_PARAM_GET_MATRIX_YUV_START < param_id && param_id < FSM_PARAM_GET_MATRIX_YUV_END ) {
242 if( p_fsm_mgr->fsm_arr[FSM_ID_MATRIX_YUV]->ops.get_param ) {
243 rc = p_fsm_mgr->fsm_arr[FSM_ID_MATRIX_YUV]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_MATRIX_YUV]->p_fsm, param_id, input, input_size, output, output_size);
244 } else {
245 LOG(LOG_ERR, "MATRIX_YUV FSM doesn't support get_param().");
246 rc = -1;
247 }
248 } else if( FSM_PARAM_GET_MONITOR_START < param_id && param_id < FSM_PARAM_GET_MONITOR_END ) {
249 if( p_fsm_mgr->fsm_arr[FSM_ID_MONITOR]->ops.get_param ) {
250 rc = p_fsm_mgr->fsm_arr[FSM_ID_MONITOR]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_MONITOR]->p_fsm, param_id, input, input_size, output, output_size);
251 } else {
252 LOG(LOG_ERR, "MONITOR FSM doesn't support get_param().");
253 rc = -1;
254 }
255 } else if( FSM_PARAM_GET_DMA_WRITER_START < param_id && param_id < FSM_PARAM_GET_DMA_WRITER_END ) {
256 if( p_fsm_mgr->fsm_arr[FSM_ID_DMA_WRITER]->ops.get_param ) {
257 rc = p_fsm_mgr->fsm_arr[FSM_ID_DMA_WRITER]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_DMA_WRITER]->p_fsm, param_id, input, input_size, output, output_size);
258 } else {
259 LOG(LOG_ERR, "DMA_WRITER FSM doesn't support get_param().");
260 rc = -1;
261 }
262 } else if( FSM_PARAM_GET_AF_START < param_id && param_id < FSM_PARAM_GET_AF_END ) {
263 if( p_fsm_mgr->fsm_arr[FSM_ID_AF]->ops.get_param ) {
264 rc = p_fsm_mgr->fsm_arr[FSM_ID_AF]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_AF]->p_fsm, param_id, input, input_size, output, output_size);
265 } else {
266 LOG(LOG_ERR, "AF FSM doesn't support get_param().");
267 rc = -1;
268 }
269 } else if ( FSM_PARAM_GET_NR_START < param_id && param_id < FSM_PARAM_GET_NR_END ) {
270 if ( p_fsm_mgr->fsm_arr[FSM_ID_NOISE_REDUCTION]->ops.get_param ) {
271 rc = p_fsm_mgr->fsm_arr[FSM_ID_NOISE_REDUCTION]->ops.get_param( p_fsm_mgr->fsm_arr[FSM_ID_NOISE_REDUCTION]->p_fsm, param_id, input, input_size, output, output_size);
272 } else {
273 LOG(LOG_ERR, "NR FSM doesn't support get_param().");
274 rc = -1;
275 }
276 } else {
277 LOG(LOG_CRIT, "Unsupported param_id: %d.", param_id);
278 rc = -1;
279 }
280
281 return rc;
282 }
283
acamera_fsm_mgr_dma_writer_update_address_interrupt(acamera_fsm_mgr_t * p_fsm_mgr,uint8_t irq_event)284 void acamera_fsm_mgr_dma_writer_update_address_interrupt( acamera_fsm_mgr_t * p_fsm_mgr, uint8_t irq_event )
285 {
286 #if defined(ISP_HAS_DMA_WRITER_FSM)
287 dma_writer_update_address_interrupt( p_fsm_mgr->fsm_arr[FSM_ID_DMA_WRITER]->p_fsm, irq_event );
288 #endif
289 }
290