Galaxy S2 camera module
[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 <stdlib.h>
19 #include <stdint.h>
20 #include <stdbool.h>
21 #include <pthread.h>
22
23 #include <linux/videodev2.h>
24 #include <linux/videodev2_samsung.h>
25
26 #include <Exif.h>
27
28 #include <hardware/hardware.h>
29 #include <hardware/camera.h>
30
31 #ifndef _EXYNOS_CAMERA_H_
32 #define _EXYNOS_CAMERA_H_
33
34 #define EXYNOS_CAMERA_MAX_PRESETS_COUNT         2
35 #define EXYNOS_CAMERA_MAX_V4L2_NODES_COUNT      4
36 #define EXYNOS_CAMERA_MIN_BUFFERS_COUNT         3
37 #define EXYNOS_CAMERA_MAX_BUFFERS_COUNT         8
38
39 #define EXYNOS_CAMERA_MSG_ENABLED(msg) \
40         (exynos_camera->messages_enabled & msg)
41 #define EXYNOS_CAMERA_CALLBACK_DEFINED(cb) \
42         (exynos_camera->callbacks.cb != NULL)
43
44 /*
45  * Structures
46  */
47
48 struct list_head {
49         struct list_head *next;
50         struct list_head *prev;
51 };
52
53 enum exynos_param_type {
54         EXYNOS_PARAM_INT,
55         EXYNOS_PARAM_FLOAT,
56         EXYNOS_PARAM_STRING,
57 };
58
59 union exynos_param_data {
60         int integer;
61         float floating;
62         char *string;
63 };
64
65 struct exynos_param {
66         struct list_head list;
67
68         char *key;
69         union exynos_param_data data;
70         enum exynos_param_type type;
71 };
72
73 struct exynos_camera_params {
74         char *preview_size_values;
75         char *preview_size;
76         char *preview_format_values;
77         char *preview_format;
78         char *preview_frame_rate_values;
79         int preview_frame_rate;
80         char *preview_fps_range_values;
81         char *preview_fps_range;
82
83         char *picture_size_values;
84         char *picture_size;
85         char *picture_format_values;
86         char *picture_format;
87         char *jpeg_thumbnail_size_values;
88         int jpeg_thumbnail_width;
89         int jpeg_thumbnail_height;
90         int jpeg_thumbnail_quality;
91         int jpeg_quality;
92
93         char *recording_size;
94         char *recording_size_values;
95         char *recording_format;
96
97         char *focus_mode;
98         char *focus_mode_values;
99         char *focus_distances;
100         char *focus_areas;
101         int max_num_focus_areas;
102
103         int zoom_supported;
104         int smooth_zoom_supported;
105         char *zoom_ratios;
106         int zoom;
107         int max_zoom;
108
109         char *flash_mode;
110         char *flash_mode_values;
111
112         int exposure_compensation;
113         float exposure_compensation_step;
114         int min_exposure_compensation;
115         int max_exposure_compensation;
116
117         char *whitebalance;
118         char *whitebalance_values;
119
120         char *scene_mode;
121         char *scene_mode_values;
122
123         char *effect;
124         char *effect_values;
125
126         char *iso;
127         char *iso_values;
128 };
129
130 struct exynos_camera_preset {
131         char *name;
132         int facing;
133         int orientation;
134
135         int rotation;
136         int hflip;
137         int vflip;
138
139         int picture_format;
140
141         float focal_length;
142         float horizontal_view_angle;
143         float vertical_view_angle;
144
145         int metering;
146
147         struct exynos_camera_params params;
148 };
149
150 struct exynos_v4l2_node {
151         int id;
152         char *node;
153 };
154
155 struct exynox_camera_config {
156         struct exynos_camera_preset *presets;
157         int presets_count;
158
159         struct exynos_v4l2_node *v4l2_nodes;
160         int v4l2_nodes_count;
161 };
162
163 struct exynos_camera_callbacks {
164         camera_notify_callback notify;
165         camera_data_callback data;
166         camera_data_timestamp_callback data_timestamp;
167         camera_request_memory request_memory;
168         void *user;
169 };
170
171 struct exynos_camera {
172         int v4l2_fds[EXYNOS_CAMERA_MAX_V4L2_NODES_COUNT];
173
174         struct exynox_camera_config *config;
175         struct exynos_param *params;
176
177         struct exynos_camera_callbacks callbacks;
178         int messages_enabled;
179
180         gralloc_module_t *gralloc;
181
182         // Picture
183         pthread_t picture_thread;
184         pthread_mutex_t picture_mutex;
185         int picture_thread_running;
186
187         int picture_enabled;
188         camera_memory_t *picture_memory;
189         int picture_buffer_length;
190
191         // Auto-focus
192         pthread_t auto_focus_thread;
193         pthread_mutex_t auto_focus_mutex;
194         int auto_focus_thread_running;
195
196         int auto_focus_enabled;
197
198         // Preview
199         pthread_t preview_thread;
200         pthread_mutex_t preview_mutex;
201         pthread_mutex_t preview_lock_mutex;
202         int preview_thread_running;
203
204         int preview_enabled;
205         struct preview_stream_ops *preview_window;
206         camera_memory_t *preview_memory;
207         int preview_buffers_count;
208         int preview_params_set;
209
210         // Recording
211         pthread_mutex_t recording_mutex;
212
213         int recording_enabled;
214         camera_memory_t *recording_memory;
215         int recording_buffers_count;
216
217         // Camera params
218         int camera_rotation;
219         int camera_hflip;
220         int camera_vflip;
221         int camera_picture_format;
222         int camera_focal_length;
223         int camera_metering;
224
225         int camera_sensor_mode;
226
227         // Params
228         int preview_width;
229         int preview_height;
230         int preview_format;
231         float preview_format_bpp;
232         int preview_fps;
233         int picture_width;
234         int picture_height;
235         int picture_format;
236         int jpeg_thumbnail_width;
237         int jpeg_thumbnail_height;
238         int jpeg_thumbnail_quality;
239         int jpeg_quality;
240         int recording_width;
241         int recording_height;
242         int recording_format;
243         int focus_mode;
244         int focus_x;
245         int focus_y;
246         int zoom;
247         int flash_mode;
248         int exposure_compensation;
249         int whitebalance;
250         int scene_mode;
251         int effect;
252         int iso;
253         int metering;
254 };
255
256 struct exynos_camera_addrs {
257         unsigned int type;
258         unsigned int y;
259         unsigned int cbcr;
260         unsigned int index;
261         unsigned int reserved;
262 };
263
264 // This is because the linux header uses anonymous union
265 struct exynos_v4l2_ext_control {
266         __u32 id;
267         __u32 size;
268         __u32 reserved2[1];
269         union {
270                 __s32 value;
271                 __s64 value64;
272                 char *string;
273         } data;
274 } __attribute__ ((packed));
275
276 /*
277  * Camera
278  */
279
280 int exynos_camera_params_init(struct exynos_camera *exynos_camera, int id);
281 int exynos_camera_params_apply(struct exynos_camera *exynos_camera);
282
283 int exynos_camera_auto_focus_start(struct exynos_camera *exynos_camera);
284 void exynos_camera_auto_focus_stop(struct exynos_camera *exynos_camera);
285
286 int exynos_camera_picture(struct exynos_camera *exynos_camera);
287 int exynos_camera_picture_start(struct exynos_camera *exynos_camera);
288
289 int exynos_camera_preview(struct exynos_camera *exynos_camera);
290 int exynos_camera_preview_start(struct exynos_camera *exynos_camera);
291 void exynos_camera_preview_stop(struct exynos_camera *exynos_camera);
292
293 /*
294  * EXIF
295  */
296
297 int exynos_exif_attributes_create_static(struct exynos_camera *exynos_camera,
298         exif_attribute_t *exif_attributes);
299 int exynos_exif_attributes_create_params(struct exynos_camera *exynos_camera,
300         exif_attribute_t *exif_attributes);
301
302 int exynos_exif_create(struct exynos_camera *exynos_camera,
303         exif_attribute_t *exif_attributes,
304         camera_memory_t *jpeg_thumbnail_data_memory, int jpeg_thumbnail_size,
305         camera_memory_t **exif_data_memory_p, int *exif_size_p);
306
307 /*
308  * Param
309  */
310
311 int exynos_param_int_get(struct exynos_camera *exynos_camera,
312         char *key);
313 float exynos_param_float_get(struct exynos_camera *exynos_camera,
314         char *key);
315 char *exynos_param_string_get(struct exynos_camera *exynos_camera,
316         char *key);
317
318 int exynos_param_int_set(struct exynos_camera *exynos_camera,
319         char *key, int integer);
320 int exynos_param_float_set(struct exynos_camera *exynos_camera,
321         char *key, float floating);
322 int exynos_param_string_set(struct exynos_camera *exynos_camera,
323         char *key, char *string);
324
325 char *exynos_params_string_get(struct exynos_camera *exynos_camera);
326 int exynos_params_string_set(struct exynos_camera *exynos_camera, char *string);
327
328 /*
329  * V4L2
330  */
331
332 // Utils
333 int exynos_v4l2_find_index(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
334 int exynos_v4l2_find_fd(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
335
336 // File ops
337 int exynos_v4l2_open(struct exynos_camera *exynos_camera, int id);
338 void exynos_v4l2_close(struct exynos_camera *exynos_camera, int id);
339 int exynos_v4l2_ioctl(struct exynos_camera *exynos_camera, int id, int request, void *data);
340 int exynos_v4l2_poll(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
341
342 // VIDIOC
343 int exynos_v4l2_qbuf(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
344         int type, int memory, int index);
345 int exynos_v4l2_qbuf_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
346         int index);
347 int exynos_v4l2_qbuf_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
348         int index);
349 int exynos_v4l2_dqbuf(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
350         int type, int memory);
351 int exynos_v4l2_dqbuf_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
352 int exynos_v4l2_dqbuf_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
353 int exynos_v4l2_reqbufs(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
354         int type, int memory, int count);
355 int exynos_v4l2_reqbufs_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
356         int count);
357 int exynos_v4l2_reqbufs_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
358         int count);
359 int exynos_v4l2_querybuf(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
360         int type, int memory, int index);
361 int exynos_v4l2_querybuf_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
362         int index);
363 int exynos_v4l2_querybuf_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
364         int index);
365 int exynos_v4l2_querycap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
366         int flags);
367 int exynos_v4l2_querycap_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
368 int exynos_v4l2_querycap_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
369 int exynos_v4l2_streamon(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
370         int type);
371 int exynos_v4l2_streamon_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
372 int exynos_v4l2_streamon_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
373 int exynos_v4l2_streamoff(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
374         int type);
375 int exynos_v4l2_streamoff_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
376 int exynos_v4l2_streamoff_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id);
377 int exynos_v4l2_g_fmt(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
378         int type, int *width, int *height, int *fmt);
379 int exynos_v4l2_g_fmt_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
380         int *width, int *height, int *fmt);
381 int exynos_v4l2_g_fmt_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
382         int *width, int *height, int *fmt);
383 int exynos_v4l2_s_fmt_pix(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
384         int type, int width, int height, int fmt, int priv);
385 int exynos_v4l2_s_fmt_pix_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
386         int width, int height, int fmt, int priv);
387 int exynos_v4l2_s_fmt_pix_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
388         int width, int height, int fmt, int priv);
389 int exynos_v4l2_s_fmt_win(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
390         int left, int top, int width, int height);
391 int exynos_v4l2_enum_fmt(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
392         int type, int fmt);
393 int exynos_v4l2_enum_fmt_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
394         int fmt);
395 int exynos_v4l2_enum_fmt_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
396         int fmt);
397 int exynos_v4l2_enum_input(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
398         int id);
399 int exynos_v4l2_s_input(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
400         int id);
401 int exynos_v4l2_g_ext_ctrls(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
402         struct v4l2_ext_control *control, int count);
403 int exynos_v4l2_g_ctrl(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
404         int id, int *value);
405 int exynos_v4l2_s_ctrl(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
406         int id, int value);
407 int exynos_v4l2_s_parm(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
408         int type, struct v4l2_streamparm *streamparm);
409 int exynos_v4l2_s_parm_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
410         struct v4l2_streamparm *streamparm);
411 int exynos_v4l2_s_parm_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
412         struct v4l2_streamparm *streamparm);
413 int exynos_v4l2_s_crop(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
414         int type, int left, int top, int width, int height);
415 int exynos_v4l2_s_crop_cap(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
416         int left, int top, int width, int height);
417 int exynos_v4l2_s_crop_out(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
418         int left, int top, int width, int height);
419 int exynos_v4l2_g_fbuf(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
420         void **base, int *width, int *height, int *fmt);
421 int exynos_v4l2_s_fbuf(struct exynos_camera *exynos_camera, int exynos_v4l2_id,
422         void *base, int width, int height, int fmt);
423
424 #endif