1 /* Copyright(c) 2011 Samsung Electronics Co, Ltd.
2  *
3  * This program is free software; you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License version 2 as
5  * published by the Free Software Foundation.
6  *
7  * Alternatively, Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18 */
19 
20 #ifndef _S5P_FIMC_H_
21 #define _S5P_FIMC_H_
22 
23 #include <linux/videodev2.h>
24 #include <linux/videodev2_exynos_media.h>
25 
26 /*
27  * G E N E R A L S
28  *
29 */
30 
31 /*
32  * P I X E L   F O R M A T   G U I D E
33  *
34  * The 'x' means 'DO NOT CARE'
35  * The '*' means 'FIMC SPECIFIC'
36  * For some fimc formats, we couldn't find equivalent format in the V4L2 FOURCC.
37  *
38  * FIMC TYPE    PLANES  ORDER       V4L2_PIX_FMT
39  * ---------------------------------------------------------
40  * RGB565   x   x       V4L2_PIX_FMT_RGB565
41  * RGB888   x   x       V4L2_PIX_FMT_RGB24
42  * YUV420   2   LSB_CBCR    V4L2_PIX_FMT_NV12
43  * YUV420   2   LSB_CRCB    V4L2_PIX_FMT_NV21
44  * YUV420   2   MSB_CBCR    V4L2_PIX_FMT_NV21X*
45  * YUV420   2   MSB_CRCB    V4L2_PIX_FMT_NV12X*
46  * YUV420   3   x       V4L2_PIX_FMT_YUV420
47  * YUV422   1   YCBYCR      V4L2_PIX_FMT_YUYV
48  * YUV422   1   YCRYCB      V4L2_PIX_FMT_YVYU
49  * YUV422   1   CBYCRY      V4L2_PIX_FMT_UYVY
50  * YUV422   1   CRYCBY      V4L2_PIX_FMT_VYUY*
51  * YUV422   2   LSB_CBCR    V4L2_PIX_FMT_NV16*
52  * YUV422   2   LSB_CRCB    V4L2_PIX_FMT_NV61*
53  * YUV422   2   MSB_CBCR    V4L2_PIX_FMT_NV16X*
54  * YUV422   2   MSB_CRCB    V4L2_PIX_FMT_NV61X*
55  * YUV422   3   x       V4L2_PIX_FMT_YUV422P
56  *
57 */
58 
59 /*
60  * V 4 L 2   F I M C   E X T E N S I O N S
61  *
62 */
63 #define V4L2_PIX_FMT_YVYU       v4l2_fourcc('Y', 'V', 'Y', 'U')
64 
65 /* FOURCC for FIMC specific */
66 #define V4L2_PIX_FMT_NV12X      v4l2_fourcc('N', '1', '2', 'X')
67 #define V4L2_PIX_FMT_NV21X      v4l2_fourcc('N', '2', '1', 'X')
68 #define V4L2_PIX_FMT_VYUY       v4l2_fourcc('V', 'Y', 'U', 'Y')
69 #define V4L2_PIX_FMT_NV16       v4l2_fourcc('N', 'V', '1', '6')
70 #define V4L2_PIX_FMT_NV61       v4l2_fourcc('N', 'V', '6', '1')
71 #define V4L2_PIX_FMT_NV16X      v4l2_fourcc('N', '1', '6', 'X')
72 #define V4L2_PIX_FMT_NV61X      v4l2_fourcc('N', '6', '1', 'X')
73 
74 /* CID extensions */
75 #define V4L2_CID_ROTATION       (V4L2_CID_PRIVATE_BASE + 0)
76 #define V4L2_CID_OVLY_MODE              (V4L2_CID_PRIVATE_BASE + 9)
77 #define V4L2_CID_GET_PHY_SRC_YADDR  (V4L2_CID_PRIVATE_BASE + 12)
78 #define V4L2_CID_GET_PHY_SRC_CADDR  (V4L2_CID_PRIVATE_BASE + 13)
79 #define V4L2_CID_RESERVED_MEM_BASE_ADDR (V4L2_CID_PRIVATE_BASE + 20)
80 #define V4L2_CID_FIMC_VERSION       (V4L2_CID_PRIVATE_BASE + 21)
81 
82 /*
83  * U S E R   D E F I N E D   T Y P E S
84  *
85 */
86 #define FIMC1_RESERVED_SIZE 32768
87 
88 enum fimc_overlay_mode {
89     FIMC_OVLY_NOT_FIXED       = 0x0,    /* Overlay mode isn't fixed. */
90     FIMC_OVLY_FIFO            = 0x1,    /* Non-destructive Overlay with FIFO */
91     FIMC_OVLY_DMA_AUTO        = 0x2,    /* Non-destructive Overlay with DMA */
92     FIMC_OVLY_DMA_MANUAL      = 0x3,    /* Non-destructive Overlay with DMA */
93     FIMC_OVLY_NONE_SINGLE_BUF = 0x4,    /* Destructive Overlay with DMA single destination buffer */
94     FIMC_OVLY_NONE_MULTI_BUF  = 0x5,    /* Destructive Overlay with DMA multiple dstination buffer */
95 };
96 
97 typedef unsigned int dma_addr_t;
98 
99 struct fimc_buf {
100     dma_addr_t  base[3];
101     size_t      size[3];
102     int         planes;
103 };
104 
105 struct fimc_buffer {
106     void    *virt_addr;
107     void    *phys_addr;
108     size_t  length;
109 };
110 
111 struct yuv_fmt_list {
112     const char      *name;
113     const char      *desc;
114     unsigned int    fmt;
115     int             bpp;
116     int             planes;
117 };
118 
119 struct img_offset {
120     int y_h;
121     int y_v;
122     int cb_h;
123     int cb_v;
124     int cr_h;
125     int cr_v;
126 };
127 
128 //------------ STRUCT ---------------------------------------------------------//
129 
130 typedef struct
131 {
132     unsigned int full_width;            // Source Image Full Width (Virtual screen size)
133     unsigned int full_height;           // Source Image Full Height (Virtual screen size)
134     unsigned int start_x;               // Source Image Start width offset
135     unsigned int start_y;               // Source Image Start height offset
136     unsigned int width;                 // Source Image Width
137     unsigned int height;                // Source Image Height
138     unsigned int buf_addr_phy_rgb_y;    // Base Address of the Source Image (RGB or Y): Physical Address
139     unsigned int buf_addr_phy_cb;       // Base Address of the Source Image (CB Component) : Physical Address
140     unsigned int buf_addr_phy_cr;       // Base Address of the Source Image (CR Component) : Physical Address
141     unsigned int color_space;           // Color Space of the Source Image
142     unsigned int planes;                // number of planes for the Image
143 } s5p_fimc_img_info;
144 
145 typedef struct
146 {
147     s5p_fimc_img_info   src;
148     s5p_fimc_img_info   dst;
149 } s5p_fimc_params_t;
150 
151 typedef struct _s5p_fimc_t {
152     int                 dev_fd;
153     struct fimc_buffer  out_buf;
154 
155     s5p_fimc_params_t   params;
156 
157     int                 use_ext_out_mem;
158 } s5p_fimc_t;
159 
160 #endif
161