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 #include "matrix_yuv_fsm.h"
22
23 #ifdef LOG_MODULE
24 #undef LOG_MODULE
25 #define LOG_MODULE LOG_MODULE_MATRIX_YUV
26 #endif
27
matrix_yuv_fsm_clear(matrix_yuv_fsm_t * p_fsm)28 void matrix_yuv_fsm_clear( matrix_yuv_fsm_t *p_fsm )
29 {
30 p_fsm->hue_theta = 0;
31 p_fsm->saturation_strength = 128;
32 p_fsm->contrast_strength = 128;
33 p_fsm->brightness_strength = 128;
34 p_fsm->fr_pipe_output_format = FW_FR_OUTPUT_FORMAT_PIPE;
35 #if ISP_HAS_DS1
36 p_fsm->ds1_pipe_output_format = FW_DS1_OUTPUT_FORMAT_PIPE;
37 #endif
38 }
39
matrix_yuv_request_interrupt(matrix_yuv_fsm_ptr_t p_fsm,system_fw_interrupt_mask_t mask)40 void matrix_yuv_request_interrupt( matrix_yuv_fsm_ptr_t p_fsm, system_fw_interrupt_mask_t mask )
41 {
42 acamera_isp_interrupts_disable( ACAMERA_FSM2MGR_PTR( p_fsm ) );
43 p_fsm->mask.irq_mask |= mask;
44 acamera_isp_interrupts_enable( ACAMERA_FSM2MGR_PTR( p_fsm ) );
45 }
46
matrix_yuv_fsm_init(void * fsm,fsm_init_param_t * init_param)47 void matrix_yuv_fsm_init( void *fsm, fsm_init_param_t *init_param )
48 {
49 matrix_yuv_fsm_t *p_fsm = (matrix_yuv_fsm_t *)fsm;
50 p_fsm->cmn.p_fsm_mgr = init_param->p_fsm_mgr;
51 p_fsm->cmn.isp_base = init_param->isp_base;
52 p_fsm->p_fsm_mgr = init_param->p_fsm_mgr;
53
54 matrix_yuv_fsm_clear( p_fsm );
55
56 matrix_yuv_initialize( p_fsm );
57 matrix_yuv_update( p_fsm );
58 matrix_yuv_request_interrupt( p_fsm, ACAMERA_IRQ_MASK( ACAMERA_IRQ_FRAME_END ) );
59 }
60
61
matrix_yuv_fsm_set_param(void * fsm,uint32_t param_id,void * input,uint32_t input_size)62 int matrix_yuv_fsm_set_param( void *fsm, uint32_t param_id, void *input, uint32_t input_size )
63 {
64 int rc = 0;
65 matrix_yuv_fsm_t *p_fsm = (matrix_yuv_fsm_t *)fsm;
66
67 switch ( param_id ) {
68 case FSM_PARAM_SET_MATRIX_YUV_FR_OUT_FMT:
69 if ( !input || input_size != sizeof( uint32_t ) ) {
70 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
71 rc = -1;
72 break;
73 }
74
75 p_fsm->fr_pipe_output_format = *(uint32_t *)input;
76 matrix_yuv_update( p_fsm );
77 break;
78
79 #if ISP_HAS_DS1
80 case FSM_PARAM_SET_MATRIX_YUV_DS1_OUT_FMT:
81 if ( !input || input_size != sizeof( uint32_t ) ) {
82 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
83 rc = -1;
84 break;
85 }
86
87 p_fsm->ds1_pipe_output_format = *(uint32_t *)input;
88 matrix_yuv_update( p_fsm );
89 break;
90 #endif
91
92 case FSM_PARAM_SET_MATRIX_YUV_SATURATION_STRENGTH:
93 if ( !input || input_size != sizeof( uint32_t ) ) {
94 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
95 rc = -1;
96 break;
97 }
98
99 p_fsm->saturation_strength = *(uint32_t *)input;
100 matrix_yuv_update( p_fsm );
101
102 break;
103
104 case FSM_PARAM_SET_MATRIX_YUV_HUE_THETA:
105 if ( !input || input_size != sizeof( uint16_t ) ) {
106 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
107 rc = -1;
108 break;
109 }
110
111 p_fsm->hue_theta = *(uint16_t *)input;
112 matrix_yuv_update( p_fsm );
113 break;
114
115 case FSM_PARAM_SET_MATRIX_YUV_BRIGHTNESS_STRENGTH:
116 if ( !input || input_size != sizeof( uint32_t ) ) {
117 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
118 rc = -1;
119 break;
120 }
121
122 p_fsm->brightness_strength = *(uint32_t *)input;
123 matrix_yuv_update( p_fsm );
124 break;
125
126 case FSM_PARAM_SET_MATRIX_YUV_CONTRAST_STRENGTH:
127 if ( !input || input_size != sizeof( uint32_t ) ) {
128 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
129 rc = -1;
130 break;
131 }
132
133 p_fsm->contrast_strength = *(uint32_t *)input;
134 matrix_yuv_update( p_fsm );
135 break;
136
137 case FSM_PARAM_SET_MATRIX_YUV_COLOR_MODE:
138 if ( !input || input_size != sizeof( uint32_t ) ) {
139 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
140 rc = -1;
141 break;
142 }
143
144 p_fsm->color_mode = *(uint32_t *)input;
145 matrix_yuv_update( p_fsm );
146 break;
147
148 default:
149 rc = -1;
150 break;
151 }
152
153 return rc;
154 }
155
156
matrix_yuv_fsm_get_param(void * fsm,uint32_t param_id,void * input,uint32_t input_size,void * output,uint32_t output_size)157 int matrix_yuv_fsm_get_param( void *fsm, uint32_t param_id, void *input, uint32_t input_size, void *output, uint32_t output_size )
158 {
159 int rc = 0;
160 matrix_yuv_fsm_t *p_fsm = (matrix_yuv_fsm_t *)fsm;
161
162 switch ( param_id ) {
163 case FSM_PARAM_GET_MATRIX_YUV_FR_OUT_FMT:
164 if ( !output || output_size != sizeof( uint32_t ) ) {
165 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
166 rc = -1;
167 break;
168 }
169
170 *(uint32_t *)output = p_fsm->fr_pipe_output_format;
171 break;
172
173 #if ISP_HAS_DS1
174 case FSM_PARAM_GET_MATRIX_YUV_DS1_OUT_FMT:
175 if ( !output || output_size != sizeof( uint32_t ) ) {
176 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
177 rc = -1;
178 break;
179 }
180
181 *(uint32_t *)output = p_fsm->ds1_pipe_output_format;
182 break;
183 #endif
184
185 case FSM_PARAM_GET_MATRIX_YUV_SATURATION_STRENGTH:
186 if ( !output || output_size != sizeof( uint32_t ) ) {
187 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
188 rc = -1;
189 break;
190 }
191
192 *(uint32_t *)output = p_fsm->saturation_strength;
193 break;
194
195 case FSM_PARAM_GET_MATRIX_YUV_HUE_THETA:
196 if ( !output || output_size != sizeof( uint32_t ) ) {
197 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
198 rc = -1;
199 break;
200 }
201
202 *(uint32_t *)output = p_fsm->hue_theta;
203 break;
204
205 case FSM_PARAM_GET_MATRIX_YUV_BRIGHTNESS_STRENGTH:
206 if ( !output || output_size != sizeof( uint32_t ) ) {
207 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
208 rc = -1;
209 break;
210 }
211
212 *(uint32_t *)output = p_fsm->brightness_strength;
213 break;
214
215 case FSM_PARAM_GET_MATRIX_YUV_CONTRAST_STRENGTH:
216 if ( !output || output_size != sizeof( uint32_t ) ) {
217 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
218 rc = -1;
219 break;
220 }
221
222 *(uint32_t *)output = p_fsm->contrast_strength;
223 break;
224
225 case FSM_PARAM_GET_MATRIX_YUV_COLOR_MODE:
226 if ( !output || output_size != sizeof( uint32_t ) ) {
227 LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
228 rc = -1;
229 break;
230 }
231
232 *(uint32_t *)output = p_fsm->color_mode;
233 break;
234
235 default:
236 rc = -1;
237 break;
238 }
239
240 return rc;
241 }
242
243
matrix_yuv_fsm_process_event(matrix_yuv_fsm_t * p_fsm,event_id_t event_id)244 uint8_t matrix_yuv_fsm_process_event( matrix_yuv_fsm_t *p_fsm, event_id_t event_id )
245 {
246 uint8_t b_event_processed = 0;
247 switch ( event_id ) {
248 default:
249 break;
250
251 case event_id_frame_end:
252 // no function is called here, reason is unknown.
253 b_event_processed = 1;
254 break;
255 case event_id_sensor_ready:
256 matrix_yuv_request_interrupt( p_fsm, ACAMERA_IRQ_MASK( ACAMERA_IRQ_FRAME_END ) );
257 b_event_processed = 1;
258 break;
259 }
260
261 return b_event_processed;
262 }
263