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