• 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 "sharpening_fsm.h"
22 
23 #ifdef LOG_MODULE
24 #undef LOG_MODULE
25 #define LOG_MODULE LOG_MODULE_SHARPENING
26 #endif
27 
sharpening_fsm_clear(sharpening_fsm_t * p_fsm)28 void sharpening_fsm_clear( sharpening_fsm_t *p_fsm )
29 {
30     p_fsm->sharpening_mult = 128;
31     p_fsm->api_value = 128;
32 }
33 
sharpening_fsm_init(void * fsm,fsm_init_param_t * init_param)34 void sharpening_fsm_init( void *fsm, fsm_init_param_t *init_param )
35 {
36     sharpening_fsm_t *p_fsm = (sharpening_fsm_t *)fsm;
37     p_fsm->cmn.p_fsm_mgr = init_param->p_fsm_mgr;
38     p_fsm->cmn.isp_base = init_param->isp_base;
39     p_fsm->p_fsm_mgr = init_param->p_fsm_mgr;
40 
41     sharpening_fsm_clear( p_fsm );
42 
43     sharpening_initialize( p_fsm );
44     fsm_raise_event( p_fsm, event_id_sharp_lut_update );
45 }
46 
47 
sharpening_fsm_set_param(void * fsm,uint32_t param_id,void * input,uint32_t input_size)48 int sharpening_fsm_set_param( void *fsm, uint32_t param_id, void *input, uint32_t input_size )
49 {
50     int rc = 0;
51     sharpening_fsm_t *p_fsm = (sharpening_fsm_t *)fsm;
52 
53     switch ( param_id ) {
54     case FSM_PARAM_SET_SHARPENING_MULT: {
55         if ( !input || input_size != sizeof( uint32_t ) ) {
56             LOG( LOG_ERR, "Inavlid param, param_id: %d.", param_id );
57             rc = -1;
58             break;
59         }
60 
61         p_fsm->sharpening_mult = *(uint32_t *)input;
62         break;
63     }
64 
65     case FSM_PARAM_SET_SHARPENING_STRENGTH: {
66         if ( !input || input_size != sizeof( uint32_t ) ) {
67             LOG( LOG_ERR, "Inavlid param, param_id: %d.", param_id );
68             rc = -1;
69             break;
70         }
71 
72         p_fsm->api_value = *(uint32_t *)input;
73 
74         if ( p_fsm->api_value <= 128 ) {
75             p_fsm->sharpening_mult = p_fsm->api_value;
76         } else {
77             uint32_t store;
78             // 4th power seems to be a good fit for this
79             // as alt_d/ud are O(10) and max is 255
80             store = ( p_fsm->api_value * p_fsm->api_value * p_fsm->api_value * p_fsm->api_value );
81             store /= 0x200000;
82             p_fsm->sharpening_mult = store;
83         }
84 
85         break;
86     }
87 
88     default:
89         rc = -1;
90         break;
91     }
92 
93     return rc;
94 }
95 
96 
sharpening_fsm_get_param(void * fsm,uint32_t param_id,void * input,uint32_t input_size,void * output,uint32_t output_size)97 int sharpening_fsm_get_param( void *fsm, uint32_t param_id, void *input, uint32_t input_size, void *output, uint32_t output_size )
98 {
99     int rc = 0;
100     sharpening_fsm_t *p_fsm = (sharpening_fsm_t *)fsm;
101 
102     switch ( param_id ) {
103     case FSM_PARAM_GET_SHARPENING_STRENGTH: {
104         if ( !output || output_size != sizeof( uint32_t ) ) {
105             LOG( LOG_ERR, "Invalid param, param_id: %d.", param_id );
106             rc = -1;
107             break;
108         }
109 
110         *(uint32_t *)output = p_fsm->api_value;
111 
112         break;
113     }
114 
115     default:
116         rc = -1;
117         break;
118     }
119 
120     return rc;
121 }
122 
123 
sharpening_fsm_process_event(sharpening_fsm_t * p_fsm,event_id_t event_id)124 uint8_t sharpening_fsm_process_event( sharpening_fsm_t *p_fsm, event_id_t event_id )
125 {
126     uint8_t b_event_processed = 0;
127     switch ( event_id ) {
128     default:
129         break;
130 
131     case event_id_frame_end:
132         sharpening_update( p_fsm );
133         b_event_processed = 1;
134         break;
135 
136     case event_id_update_sharp_lut:
137 
138         break;
139     }
140 
141     return b_event_processed;
142 }
143