1/*
2 *
3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/*!
19 * \file      exynos_gscaler.h
20 * \brief     header file for Gscaler HAL
21 * \author    ShinWon Lee (shinwon.lee@samsung.com)
22 * \date      2012/01/09
23 *
24 * <b>Revision History: </b>
25 * - 2012/01/09 : ShinWon Lee(shinwon.lee@samsung.com) \n
26 *   Create
27 *
28 * - 2012/02/07 : ShinWon Lee(shinwon.lee@samsung.com) \n
29 *   Change file name to exynos_gscaler.h
30 *
31 * - 2012/02/09 : Sangwoo, Parkk(sw5771.park@samsung.com) \n
32 *   Use Multiple Gscaler by Multiple Process
33 *
34 * - 2012/02/20 : Sangwoo, Park(sw5771.park@samsung.com) \n
35 *   Add exynos_gsc_set_rotation() API
36 *
37 * - 2012/02/20 : ShinWon Lee(shinwon.lee@samsung.com) \n
38 *   Add size constrain
39 *
40 */
41
42/*!
43 * \defgroup exynos_gscaler
44 * \brief API for gscaler
45 * \addtogroup Exynos
46 */
47#include "Exynos_log.h"
48
49#ifndef EXYNOS_GSCALER_H_
50#define EXYNOS_GSCALER_H_
51
52#ifdef __cplusplus
53extern "C" {
54#endif
55
56//#define EXYNOS_GSC_TRACE 0
57#ifdef EXYNOS_GSC_TRACE
58#define EXYNOS_GSC_LOG_TAG "Exynos_gscaler"
59#define Exynos_gsc_In() Exynos_Log(EXYNOS_DEV_LOG_DEBUG, EXYNOS_GSC_LOG_TAG, "%s In , Line: %d", __FUNCTION__, __LINE__)
60#define Exynos_gsc_Out() Exynos_Log(EXYNOS_DEV_LOG_DEBUG, EXYNOS_GSC_LOG_TAG, "%s Out , Line: %d", __FUNCTION__, __LINE__)
61#else
62#define Exynos_gsc_In() ((void *)0)
63#define Exynos_gsc_Out() ((void *)0)
64#endif
65
66typedef struct {
67    uint32_t x;
68    uint32_t y;
69    uint32_t w;
70    uint32_t h;
71    uint32_t fw;
72    uint32_t fh;
73    uint32_t format;
74    uint32_t yaddr;
75    uint32_t uaddr;
76    uint32_t vaddr;
77    uint32_t rot;
78    uint32_t cacheable;
79    uint32_t drmMode;
80    uint32_t narrowRgb;
81    int      acquireFenceFd;
82    int      releaseFenceFd;
83} exynos_gsc_img;
84
85/*
86 * Create libgscaler handle.
87 * Gscaler dev_num is dynamically changed.
88 *
89 * \ingroup exynos_gscaler
90 *
91 * \return
92 *   libgscaler handle
93 */
94void *exynos_gsc_create(
95    void);
96
97/*!
98 * Create exclusive libgscaler handle.
99 * Other module can't use dev_num of Gscaler.
100 *
101 * \ingroup exynos_gscaler
102 *
103 * \param dev_num
104 *   gscaler dev_num[in]
105 * \param gsc_mode
106 *It should be set to GSC_M2M_MODE or GSC_OUTPUT_MODE.
107 *
108 *\param out_mode
109 *It should be set to GSC_OUT_FIMD or GSC_OUT_TV.
110 *
111 * \return
112 *   libgscaler handle
113 */
114void *exynos_gsc_create_exclusive(
115    int dev_num,
116    int gsc_mode,
117    int out_mode,
118    int allow_drm);
119
120/*!
121 * Destroy libgscaler handle
122 *
123 * \ingroup exynos_gscaler
124 *
125 * \param handle
126 *   libgscaler handle[in]
127 */
128void exynos_gsc_destroy(
129    void *handle);
130
131/*!
132 * Set source format.
133 *
134 * \ingroup exynos_gscaler
135 *
136 * \param handle
137 *   libgscaler handle[in]
138 *
139 * \param width
140 *   image width[in]
141 *
142 * \param height
143 *   image height[in]
144 *
145 * \param crop_left
146 *   image left crop size[in]
147 *
148 * \param crop_top
149 *   image top crop size[in]
150 *
151 * \param crop_width
152 *   cropped image width[in]
153 *
154 * \param crop_height
155 *   cropped image height[in]
156 *
157 * \param v4l2_colorformat
158 *   color format[in]
159 *
160 * \param cacheable
161 *   ccacheable[in]
162 *
163 * \param mode_drm
164 *   mode_drm[in]
165 *
166 * \return
167 *   error code
168 */
169int exynos_gsc_set_src_format(
170    void        *handle,
171    unsigned int width,
172    unsigned int height,
173    unsigned int crop_left,
174    unsigned int crop_top,
175    unsigned int crop_width,
176    unsigned int crop_height,
177    unsigned int v4l2_colorformat,
178    unsigned int cacheable,
179    unsigned int mode_drm);
180
181/*!
182 * Set destination format.
183 *
184 * \ingroup exynos_gscaler
185 *
186 * \param handle
187 *   libgscaler handle[in]
188 *
189 * \param width
190 *   image width[in]
191 *
192 * \param height
193 *   image height[in]
194 *
195 * \param crop_left
196 *   image left crop size[in]
197 *
198 * \param crop_top
199 *   image top crop size[in]
200 *
201 * \param crop_width
202 *   cropped image width[in]
203 *
204 * \param crop_height
205 *   cropped image height[in]
206 *
207 * \param v4l2_colorformat
208 *   color format[in]
209 *
210 * \param cacheable
211 *   ccacheable[in]
212 *
213 * \param mode_drm
214 *   mode_drm[in]
215 *
216 * \param narrowRgb
217 *   narrow RGB range[in]
218 *
219 * \return
220 *   error code
221 */
222int exynos_gsc_set_dst_format(
223    void        *handle,
224    unsigned int width,
225    unsigned int height,
226    unsigned int crop_left,
227    unsigned int crop_top,
228    unsigned int crop_width,
229    unsigned int crop_height,
230    unsigned int v4l2_colorformat,
231    unsigned int cacheable,
232    unsigned int mode_drm,
233    unsigned int narrowRgb);
234
235/*!
236 * Set rotation.
237 *
238 * \ingroup exynos_gscaler
239 *
240 * \param handle
241 *   libgscaler handle[in]
242 *
243 * \param rotation
244 *   image rotation. It should be multiple of 90[in]
245 *
246 * \param flip_horizontal
247 *   image flip_horizontal[in]
248 *
249 * \param flip_vertical
250 *   image flip_vertical[in]
251 *
252 * \return
253 *   error code
254 */
255int exynos_gsc_set_rotation(
256    void *handle,
257    int   rotation,
258    int   flip_horizontal,
259    int   flip_vertical);
260
261/*!
262 * Set source buffer
263 *
264 * \ingroup exynos_gscaler
265 *
266 * \param handle
267 *   libgscaler handle[in]
268 *
269 * \param addr
270 *   buffer pointer array[in]
271 *
272 * \param acquireFenceFd
273 *   acquire fence fd for the buffer or -1[in]
274 *
275 * \return
276 *   error code
277 */
278int exynos_gsc_set_src_addr(
279    void *handle,
280    void *addr[3],
281    int acquireFenceFd);
282
283/*!
284 * Set destination buffer
285 *
286 * \param handle
287 *   libgscaler handle[in]
288 *
289 * \param addr
290 *   buffer pointer array[in]
291 *
292 * \param acquireFenceFd
293 *   acquire fence fd for the buffer or -1[in]
294 *
295 * \return
296 *   error code
297 */
298int exynos_gsc_set_dst_addr(
299    void *handle,
300    void *addr[3],
301    int acquireFenceFd);
302
303/*!
304 * Convert color space with presetup color format
305 *
306 * \ingroup exynos_gscaler
307 *
308 * \param handle
309 *   libgscaler handle[in]
310 *
311 * \return
312 *   error code
313 */
314int exynos_gsc_convert(
315    void *handle);
316
317/*!
318 * api for local path gscaler. Not yet support.
319 *
320 * \ingroup exynos_gscaler
321 */
322int exynos_gsc_connect(
323    void *handle,
324    void *hw);
325
326/*!
327 * api for local path gscaler. Not yet support.
328 *
329 * \ingroup exynos_gscaler
330 */
331int exynos_gsc_disconnect(
332    void *handle,
333    void *hw);
334
335/*!
336 * api for reserving a specific gscaler.
337 * This API could be used from any module that
338 *wants to control the gscalar privately. By calling this function any
339 *module can let the libgscaler know that GSC is used privately.
340 *
341 * \ingroup exynos_gsc_reserve
342 */
343 void *exynos_gsc_reserve
344    (int dev_num);
345
346
347/*!
348 * api for releasing the gscaler that was reserved with
349 *exynos_gsc_reserve.
350 * \ingroup exynos_gsc_reserve
351 */
352void exynos_gsc_release
353    (void *handle);
354
355
356/*
357*api for setting the GSC config.
358It configures the GSC for given config
359*/
360int exynos_gsc_config_exclusive(
361    void *handle,
362    exynos_gsc_img *src_img,
363    exynos_gsc_img *dst_img);
364
365/*
366*api for GSC-OUT run.
367It queues the srcBuf to GSC and deques a buf from driver.
368It should be called after configuring the GSC.
369*/
370int exynos_gsc_run_exclusive(
371    void *handle,
372    exynos_gsc_img *src_img,
373    exynos_gsc_img *dst_img);
374
375/*
376 * Blocks until the current frame is done processing.
377 */
378int exynos_gsc_wait_frame_done_exclusive
379(void *handle);
380
381/*
382*api for GSC stop.
383It stops the GSC OUT streaming.
384*/
385int exynos_gsc_stop_exclusive
386(void *handle);
387
388enum {
389    GSC_M2M_MODE = 0,
390    GSC_OUTPUT_MODE,
391    GSC_CAPTURE_MODE,
392    GSC_RESERVED_MODE,
393};
394
395/*flag info */
396enum {
397    GSC_DUMMY = 0,
398    GSC_OUT_FIMD,
399    GSC_OUT_TV,
400    GSC_RESERVED,
401};
402
403enum {
404    GSC_DONE_CNG_CFG = 0,
405    GSC_NEED_CNG_CFG,
406};
407
408#ifdef __cplusplus
409}
410#endif
411
412#endif /*EXYNOS_GSCALER_H_*/
413