ADDED THE FIMC1 STUFF FOR NOTHING
[exynos_camera.git] / exynos_camera.h
1 /*
2  * Copyright (C) 2013 Paul Kocialkowski
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include <pthread.h>
19
20 #include <linux/videodev2.h>
21
22 #include <hardware/hardware.h>
23 #include <hardware/camera.h>
24
25 #ifndef _EXYNOS_CAMERA_H_
26 #define _EXYNOS_CAMERA_H_
27
28 #define EXYNOS_CAMERA_MAX_PRESETS_COUNT         2
29 #define EXYNOS_CAMERA_MAX_V4L2_NODES_COUNT      4
30
31 /*
32  * Structures
33  */
34
35 struct list_head {
36         struct list_head *next;
37         struct list_head *prev;
38 };
39
40 enum exynos_param_type {
41         EXYNOS_PARAM_INT,
42         EXYNOS_PARAM_FLOAT,
43         EXYNOS_PARAM_STRING,
44 };
45
46 union exynos_param_data {
47         int integer;
48         float floating;
49         char *string;
50 };
51
52 struct exynos_param {
53         struct list_head list;
54
55         char *key;
56         union exynos_param_data data;
57         enum exynos_param_type type;
58 };
59
60 struct exynos_camera_preset {
61         char *name;
62         int facing;
63         int orientation;
64         char *preview_sizes;
65         char *picture_sizes;
66
67         int rotation;
68         int hflip;
69         int vflip;
70 };
71
72 struct exynos_v4l2_node {
73         int id;
74         char *node;
75 };
76
77 struct exynox_camera_config {
78         struct exynos_camera_preset *presets;
79         int presets_count;
80
81         struct exynos_v4l2_node *v4l2_nodes;
82         int v4l2_nodes_count;
83 };
84
85 struct exynos_camera_callbacks {
86         camera_notify_callback notify;
87         camera_data_callback data;
88         camera_data_timestamp_callback data_timestamp;
89         camera_request_memory request_memory;
90         void *user;
91 };
92
93 struct exynos_camera {
94         int v4l2_fds[EXYNOS_CAMERA_MAX_V4L2_NODES_COUNT];
95
96         struct exynox_camera_config *config;
97         struct exynos_param *params;
98
99         struct exynos_camera_callbacks callbacks;
100
101         int camera_id;
102
103         gralloc_module_t *gralloc;
104
105         pthread_t preview_thread;
106         pthread_mutex_t preview_mutex;
107         pthread_mutex_t preview_lock_mutex;
108         int preview_thread_running;
109         int preview_enabled;
110         struct preview_stream_ops *preview_window;
111         camera_memory_t *preview_memory;
112         int preview_buffers_count;
113 };
114
115 // This is because the linux header uses anonymous union
116 struct exynos_v4l2_ext_control {
117         __u32 id;
118         __u32 size;
119         __u32 reserved2[1];
120         union {
121                 __s32 value;
122                 __s64 value64;
123                 char *string;
124         } data;
125 } __attribute__ ((packed));
126
127 /*
128  * Param
129  */
130
131 int exynos_param_int_get(struct exynos_camera *exynos_camera,
132         char *key);
133 float exynos_param_float_get(struct exynos_camera *exynos_camera,
134         char *key);
135 char *exynos_param_string_get(struct exynos_camera *exynos_camera,
136         char *key);
137
138 int exynos_param_int_set(struct exynos_camera *exynos_camera,
139         char *key, int integer);
140 int exynos_param_float_set(struct exynos_camera *exynos_camera,
141         char *key, float floating);
142 int exynos_param_string_set(struct exynos_camera *exynos_camera,
143         char *key, char *string);
144
145 char *exynos_params_string_get(struct exynos_camera *exynos_camera);
146 int exynos_params_string_set(struct exynos_camera *exynos_camera, char *string);
147
148 /*
149  * V4L2
150  */
151
152 // Utils
153 int exynos_v4l2_find_index(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
154 int exynos_v4l2_find_fd(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
155
156 // File ops
157 int exynos_v4l2_open(struct exynos_camera *exynos_camera, int id);
158 void exynos_v4l2_close(struct exynos_camera *exynos_camera, int id);
159 int exynos_v4l2_ioctl(struct exynos_camera *exynos_camera, int id, int request, void *data);
160 int exynos_v4l2_poll(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
161
162 // VIDIOC
163 int exynos_v4l2_qbuf(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
164         int type, int memory, int index);
165 int exynos_v4l2_qbuf_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
166         int index);
167 int exynos_v4l2_qbuf_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
168         int index);
169 int exynos_v4l2_dqbuf(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
170         int type, int memory);
171 int exynos_v4l2_dqbuf_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
172 int exynos_v4l2_dqbuf_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
173 int exynos_v4l2_reqbufs(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
174         int type, int memory, int count);
175 int exynos_v4l2_reqbufs_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
176         int count);
177 int exynos_v4l2_reqbufs_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
178         int count);
179 int exynos_v4l2_querybuf(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
180         int type, int memory, int index);
181 int exynos_v4l2_querybuf_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
182         int index);
183 int exynos_v4l2_querybuf_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
184         int index);
185 int exynos_v4l2_querycap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
186         int flags);
187 int exynos_v4l2_querycap_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
188 int exynos_v4l2_querycap_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
189 int exynos_v4l2_streamon(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
190         int type);
191 int exynos_v4l2_streamon_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
192 int exynos_v4l2_streamon_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
193 int exynos_v4l2_streamoff(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
194         int type);
195 int exynos_v4l2_streamoff_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
196 int exynos_v4l2_streamoff_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
197 int exynos_v4l2_g_fmt(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
198         int type, int *width, int *height, int *fmt);
199 int exynos_v4l2_g_fmt_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
200         int *width, int *height, int *fmt);
201 int exynos_v4l2_g_fmt_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
202         int *width, int *height, int *fmt);
203 int exynos_v4l2_s_fmt_pix(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
204         int type, int width, int height, int fmt);
205 int exynos_v4l2_s_fmt_pix_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
206         int width, int height, int fmt);
207 int exynos_v4l2_s_fmt_pix_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
208         int width, int height, int fmt);
209 int exynos_v4l2_s_fmt_win(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
210         int left, int top, int width, int height);
211 int exynos_v4l2_enum_fmt(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
212         int type, int fmt);
213 int exynos_v4l2_enum_fmt_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
214         int fmt);
215 int exynos_v4l2_enum_fmt_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
216         int fmt);
217 int exynos_v4l2_enum_input(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
218         int id);
219 int exynos_v4l2_s_input(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
220         int id);
221 int exynos_v4l2_g_ext_ctrls(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
222         struct v4l2_ext_control *control, int count);
223 int exynos_v4l2_s_ctrl(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
224         int id, int value);
225 int exynos_v4l2_s_parm(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
226         int type, struct v4l2_streamparm *streamparm);
227 int exynos_v4l2_s_parm_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
228         struct v4l2_streamparm *streamparm);
229 int exynos_v4l2_s_parm_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
230         struct v4l2_streamparm *streamparm);
231 int exynos_v4l2_s_crop(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
232         int type, int left, int top, int width, int height);
233 int exynos_v4l2_s_crop_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
234         int left, int top, int width, int height);
235 int exynos_v4l2_s_crop_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
236         int left, int top, int width, int height);
237 int exynos_v4l2_g_fbuf(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
238         void **base, int *width, int *height, int *fmt);
239 int exynos_v4l2_s_fbuf(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
240         void *base, int width, int height, int fmt);
241
242 #endif