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