2 * Copyright (C) 2013 Paul Kocialkowski
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.
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.
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/>.
24 #include <sys/types.h>
27 #include <sys/ioctl.h>
29 #include <asm/types.h>
30 #include <linux/videodev2.h>
31 #include <videodev2_samsung.h>
33 #define LOG_TAG "exynos_camera"
34 #include <utils/Log.h>
36 #include "exynos_camera.h"
39 * Devices configurations
42 struct exynos_camera_preset exynos_camera_presets_galaxys2[] = {
45 .facing = CAMERA_FACING_FRONT,
53 .facing = CAMERA_FACING_BACK,
61 struct exynos_v4l2_node exynos_v4l2_nodes_galaxys2[] = {
64 .node = "/dev/video0",
68 .node = "/dev/video1",
72 .node = "/dev/video2",
76 struct exynox_camera_config exynos_camera_config_galaxys2 = {
77 .presets = (struct exynos_camera_preset *) &exynos_camera_presets_galaxys2,
79 .v4l2_nodes = (struct exynos_v4l2_node *) &exynos_v4l2_nodes_galaxys2,
80 .v4l2_nodes_count = 3,
88 -> always alloc params string (strdup)
89 -> register internally with set (but with a _register function)
90 -> unregister it all at the same time (but with a _unregister function)
91 -> at set, look if there is already one, if not, add to the end of the list and alloc
92 -> if there is one, just free the value (if string) and replace it
99 -> pas oublier les negatifs
109 struct exynox_camera_config *exynos_camera_config =
110 &exynos_camera_config_galaxys2;
112 int exynos_camera_params_init(struct exynos_camera *exynos_camera, int id)
114 if (exynos_camera == NULL)
117 exynos_param_string_set(exynos_camera, "picture-format", "jpeg");
118 exynos_param_string_set(exynos_camera, "picture-format-values", "jpeg");
120 exynos_param_string_set(exynos_camera, "picture-size", "2560x1920");
121 exynos_param_string_set(exynos_camera, "picture-size-values",
122 "2560x1920,2048x1536,1600x1200,1280x960,640x480");
124 exynos_param_string_set(exynos_camera, "preview-format", "rgb565");
125 exynos_param_string_set(exynos_camera, "preview-format-values", "rgb565");
126 exynos_param_string_set(exynos_camera, "preview-fps-range", "15000,30000");
127 exynos_param_string_set(exynos_camera, "preview-fps-range-values", "(15000,30000)");
128 exynos_param_int_set(exynos_camera, "preview-frame-rate", 15);
129 exynos_param_int_set(exynos_camera, "preview-frame-rate-values", 15);
130 exynos_param_string_set(exynos_camera, "preview-size", "640x480");
131 exynos_param_string_set(exynos_camera, "preview-size-values",
132 "720x480,640x480,352x288,176x144");
134 exynos_param_string_set(exynos_camera, "focus-mode", "auto");
135 exynos_param_string_set(exynos_camera, "focus-mode-values", "auto");
140 int exynos_camera_init(struct exynos_camera *exynos_camera, int id)
142 char firmware_version[7] = { 0 };
143 struct exynos_v4l2_ext_control control;
146 if (exynos_camera == NULL)
150 rc = exynos_v4l2_open(exynos_camera, 0);
152 LOGE("Unable to open v4l2 device");
156 rc = exynos_v4l2_querycap_cap(exynos_camera, 0);
158 LOGE("%s: querycap failed", __func__);
162 rc = exynos_v4l2_enum_input(exynos_camera, 0, id);
164 LOGE("%s: enum input failed", __func__);
168 rc = exynos_v4l2_s_input(exynos_camera, 0, id);
170 LOGE("%s: s input failed", __func__);
175 rc = exynos_v4l2_open(exynos_camera, 2);
177 LOGE("Unable to open v4l2 device");
181 rc = exynos_v4l2_querycap_cap(exynos_camera, 2);
183 LOGE("%s: querycap failed", __func__);
187 rc = exynos_v4l2_enum_input(exynos_camera, 2, id);
189 LOGE("%s: enum input failed", __func__);
193 rc = exynos_v4l2_s_input(exynos_camera, 2, id);
195 LOGE("%s: s input failed", __func__);
199 // Get firmware information
200 memset(&control, 0, sizeof(control));
201 control.id = V4L2_CID_CAM_SENSOR_FW_VER;
202 control.data.string = firmware_version;
204 rc = exynos_v4l2_g_ext_ctrls(exynos_camera, 0, (struct v4l2_ext_control *) &control, 1);
206 LOGE("%s: g ext ctrls failed", __func__);
208 LOGD("Firmware version: %s", firmware_version);
212 rc = exynos_camera_params_init(exynos_camera, id);
214 LOGE("%s: Unable to init params", __func__);
217 rc = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, (const struct hw_module_t **) &exynos_camera->gralloc);
219 LOGE("%s: Unable to get gralloc module", __func__);
224 void exynos_camera_deinit(struct exynos_camera *exynos_camera)
229 if (exynos_camera == NULL || exynos_camera->config == NULL)
232 for (i=0 ; i < exynos_camera->config->v4l2_nodes_count ; i++) {
233 id = exynos_camera->config->v4l2_nodes[i].id;
234 exynos_v4l2_close(exynos_camera, id);
239 int exynos_camera_preview(struct exynos_camera *exynos_camera)
241 buffer_handle_t *buffer;
247 int width, height, fmt;
249 int width_out, height_out, fmt_out;
254 if (exynos_camera == NULL)
257 exynos_camera->preview_window->dequeue_buffer(exynos_camera->preview_window,
259 exynos_camera->gralloc->lock(exynos_camera->gralloc, *buffer, GRALLOC_USAGE_SW_WRITE_OFTEN,
260 0, 0, 640, 480, &addr);
264 rc = exynos_v4l2_g_fmt_out(exynos_camera, 1, &width_out, &height_out, &fmt_out);
266 LOGE("%s: g fmt failed!", __func__);
272 fmt = V4L2_PIX_FMT_NV12;
274 if (width_out != width || height_out != height || fmt_out != fmt) {
275 rc = exynos_v4l2_s_fmt_pix_out(exynos_camera, 1, width, height, fmt);
277 LOGE("%s: s fmt failed!", __func__);
282 rc = exynos_v4l2_s_crop_out(exynos_camera, 1, 0, 0, width, height);
284 LOGE("%s: s crop failed!", __func__);
288 rc = exynos_v4l2_reqbufs_out(exynos_camera, 1, 1);
290 LOGE("%s: reqbufs failed!", __func__);
294 rc = exynos_v4l2_s_ctrl(exynos_camera, 1, V4L2_CID_ROTATION, 90);
296 LOGE("%s: s ctrl failed!", __func__);
300 rc = exynos_v4l2_s_ctrl(exynos_camera, 1, V4L2_CID_HFLIP, 0);
302 LOGE("%s: s ctrl failed!", __func__);
306 rc = exynos_v4l2_s_ctrl(exynos_camera, 1, V4L2_CID_VFLIP, 0);
308 LOGE("%s: s ctrl failed!", __func__);
312 rc = exynos_v4l2_g_fbuf(exynos_camera, 1, &base, &width_out, &height_out, &fmt_out);
314 LOGE("%s: g fbuf failed!", __func__);
320 if (base_out != base || width_out != width || height_out != height || fmt_out != fmt) {
321 rc = exynos_v4l2_s_fbuf(exynos_camera, 1, base, width, height, fmt);
323 LOGE("%s: s fbuf failed!", __func__);
328 memset(&fimc_buf, 0, sizeof(fimc_buf));
329 fimc_buf.base[0] = base;
331 rc = exynos_v4l2_s_ctrl(exynos_camera, 1, V4L2_CID_DST_INFO, (int) &fimc_buf);
333 LOGE("%s: s ctrl failed!", __func__);
337 rc = exynos_v4l2_s_fmt_win(exynos_camera, 1, 0, 0, width, height);
339 LOGE("%s: s fmt failed!", __func__);
343 rc = exynos_v4l2_streamon_out(exynos_camera, 1);
345 LOGE("%s: streamon failed!", __func__);
349 rc = exynos_v4l2_qbuf_out(exynos_camera, 1, 0);
351 LOGE("%s: qbuf failed!", __func__);
355 index = exynos_v4l2_dqbuf_out(exynos_camera, 1);
357 LOGE("%s: dqbuf failed!", __func__);
361 rc = exynos_v4l2_streamoff_out(exynos_camera, 1);
363 LOGE("%s: streamon failed!", __func__);
369 rc = exynos_v4l2_poll(exynos_camera, 0);
371 LOGE("%s: poll failed!", __func__);
373 } else if (rc == 0) {
374 LOGE("%s: poll timeout!", __func__);
375 // TODO: it's probably a good idea to restart everything
379 index = exynos_v4l2_dqbuf_cap(exynos_camera, 0);
380 if (index < 0 || index >= exynos_camera->preview_buffers_count) {
381 LOGE("%s: dqbuf failed!", __func__);
385 rc = exynos_v4l2_qbuf_cap(exynos_camera, 0, index);
387 LOGE("%s: qbuf failed!", __func__);
394 LOGE("Unable to get addr");
397 offset = index*640*480*1.5;
399 void *frame = (void *) ((int) exynos_camera->preview_memory->data + offset);
401 // the code below assumes YUV, not RGB
405 char *ptr = (char *)addr;
407 // Copy the Y plane, while observing the stride
408 for (h = 0; h < height; h++) {
409 memcpy(ptr, src, width);
417 ptr += stride * height / 4;
418 for (h = 0; h < height / 2; h++) {
419 memcpy(ptr, src, width / 2);
425 for (h = 0; h < height / 2; h++) {
426 memcpy(ptr, src, width / 2);
433 memcpy(addr, frame, 640*480*1.5);
435 exynos_camera->gralloc->unlock(exynos_camera->gralloc, *buffer);
437 exynos_camera->preview_window->enqueue_buffer(exynos_camera->preview_window,
443 void *exynos_camera_preview_thread(void *data)
445 struct exynos_camera *exynos_camera;
451 exynos_camera = (struct exynos_camera *) data;
453 LOGE("%s: Starting thread", __func__);
454 exynos_camera->preview_thread_running = 1;
456 // Lock preview lock mutex
457 pthread_mutex_lock(&exynos_camera->preview_lock_mutex);
459 while (exynos_camera->preview_enabled == 1) {
460 pthread_mutex_lock(&exynos_camera->preview_mutex);
462 rc = exynos_camera_preview(exynos_camera);
464 LOGE("%s: preview failed!", __func__);
465 // TODO FIXME WTF REMOVE THAT ASAP
466 exynos_camera->preview_enabled = 0;
469 pthread_mutex_unlock(&exynos_camera->preview_mutex);
472 exynos_camera->preview_thread_running = 0;
473 LOGE("%s: Exiting thread", __func__);
483 int exynos_camera_set_preview_window(struct camera_device *dev,
484 struct preview_stream_ops *w)
486 struct exynos_camera *exynos_camera;
487 buffer_handle_t *buffer;
493 LOGD("%s(%p, %p)", __func__, dev, w);
495 if (dev == NULL || dev->priv == NULL)
498 exynos_camera = (struct exynos_camera *) dev->priv;
503 pthread_mutex_lock(&exynos_camera->preview_mutex);
505 exynos_camera->preview_window = w;
507 if (w->set_buffer_count == NULL || w->set_usage == NULL || w->set_buffers_geometry == NULL)
510 if (exynos_camera->preview_buffers_count <= 0) {
511 LOGE("%s: Invalid preview buffers count", __func__);
515 rc = w->set_buffer_count(w, exynos_camera->preview_buffers_count);
517 LOGE("%s: Unable to set buffer count (%d)", __func__,
518 exynos_camera->preview_buffers_count);
522 rc = w->set_usage(w, GRALLOC_USAGE_SW_WRITE_OFTEN);
524 LOGE("%s: Unable to set usage", __func__);
528 // TODO: Get this from params
529 rc = w->set_buffers_geometry(w, 640, 480, HAL_PIXEL_FORMAT_YCrCb_420_SP);
531 LOGE("%s: Unable to set buffers geometry", __func__);
535 pthread_mutex_unlock(&exynos_camera->preview_mutex);
537 // Unlock preview lock
538 pthread_mutex_unlock(&exynos_camera->preview_lock_mutex);
543 pthread_mutex_unlock(&exynos_camera->preview_mutex);
548 void exynos_camera_set_callbacks(struct camera_device *dev,
549 camera_notify_callback notify_cb,
550 camera_data_callback data_cb,
551 camera_data_timestamp_callback data_cb_timestamp,
552 camera_request_memory get_memory,
555 struct exynos_camera *exynos_camera;
557 LOGD("%s(%p, %p)", __func__, dev, user);
559 if (dev == NULL || dev->priv == NULL)
562 exynos_camera = (struct exynos_camera *) dev->priv;
564 exynos_camera->callbacks.notify = notify_cb;
565 exynos_camera->callbacks.data = data_cb;
566 exynos_camera->callbacks.data_timestamp = data_cb_timestamp;
567 exynos_camera->callbacks.request_memory = get_memory;
568 exynos_camera->callbacks.user = user;
571 void exynos_camera_enable_msg_type(struct camera_device *dev, int32_t msg_type)
573 LOGD("%s(%p, %d)", __func__, dev, msg_type);
576 void exynos_camera_disable_msg_type(struct camera_device *dev, int32_t msg_type)
578 LOGD("%s(%p, %d)", __func__, dev, msg_type);
581 int exynos_camera_msg_type_enabled(struct camera_device *dev, int32_t msg_type)
583 LOGD("%s(%p, %d)", __func__, dev, msg_type);
588 int exynos_camera_start_preview(struct camera_device *dev)
590 struct exynos_camera *exynos_camera;
591 struct v4l2_streamparm streamparm;
593 int width, height, fps, frame_size;
596 pthread_attr_t thread_attr;
602 LOGD("%s(%p)", __func__, dev);
604 if (dev == NULL || dev->priv == NULL)
607 exynos_camera = (struct exynos_camera *) dev->priv;
609 if (exynos_camera->config == NULL || exynos_camera->config->presets == NULL ||
610 exynos_camera->camera_id >= exynos_camera->config->presets_count)
615 fmt = V4L2_PIX_FMT_NV21;
617 rc = exynos_v4l2_enum_fmt_cap(exynos_camera, 0, fmt);
619 LOGE("%s: enum fmt failed!", __func__);
626 rc = exynos_v4l2_s_fmt_pix_cap(exynos_camera, 0, width, height, fmt);
628 LOGE("%s: s fmt failed!", __func__);
632 rc = exynos_v4l2_s_ctrl(exynos_camera, 0, V4L2_CID_CACHEABLE, 1);
634 LOGE("%s: s ctrl failed!", __func__);
638 rc = exynos_v4l2_reqbufs_cap(exynos_camera, 0, 8);
640 LOGE("%s: s ctrl failed!", __func__);
644 exynos_camera->preview_buffers_count = rc;
645 LOGD("Found %d buffers available!", exynos_camera->preview_buffers_count);
648 memset(&streamparm, 0, sizeof(streamparm));
649 streamparm.parm.capture.timeperframe.numerator = 1;
650 streamparm.parm.capture.timeperframe.denominator = fps;
652 rc = exynos_v4l2_s_parm_cap(exynos_camera, 0, &streamparm);
654 LOGE("%s: s parm failed!", __func__);
658 for (i=0 ; i < exynos_camera->preview_buffers_count ; i++) {
659 rc = exynos_v4l2_querybuf_cap(exynos_camera, 0, i);
661 LOGE("%s: querybuf failed!", __func__);
666 frame_size = 640 * 480 * 1.5;
668 if (exynos_camera->callbacks.request_memory != NULL) {
669 fd = exynos_v4l2_find_fd(exynos_camera, 0);
671 LOGE("%s: Unable to find v4l2 fd", __func__);
675 if (exynos_camera->preview_memory != NULL && exynos_camera->preview_memory->release != NULL)
676 exynos_camera->preview_memory->release(exynos_camera->preview_memory);
678 exynos_camera->preview_memory =
679 exynos_camera->callbacks.request_memory(fd,
680 frame_size, exynos_camera->preview_buffers_count, 0);
681 if (exynos_camera->preview_memory == NULL) {
682 LOGE("%s: memory request failed!", __func__);
686 LOGE("%s: No memory request function!", __func__);
690 for (i=0 ; i < exynos_camera->preview_buffers_count ; i++) {
691 rc = exynos_v4l2_qbuf_cap(exynos_camera, 0, i);
693 LOGE("%s: qbuf failed!", __func__);
698 id = exynos_camera->camera_id;
700 rc = exynos_v4l2_s_ctrl(exynos_camera, 0, V4L2_CID_ROTATION,
701 exynos_camera->config->presets[i].rotation);
703 LOGE("%s: s ctrl failed!", __func__);
707 rc = exynos_v4l2_s_ctrl(exynos_camera, 0, V4L2_CID_HFLIP,
708 exynos_camera->config->presets[id].hflip);
710 LOGE("%s: s ctrl failed!", __func__);
714 rc = exynos_v4l2_s_ctrl(exynos_camera, 0, V4L2_CID_VFLIP,
715 exynos_camera->config->presets[id].vflip);
717 LOGE("%s: s ctrl failed!", __func__);
721 rc = exynos_v4l2_streamon_cap(exynos_camera, 0);
723 LOGE("%s: streamon failed!", __func__);
728 rc = exynos_v4l2_open(exynos_camera, 1);
730 LOGE("Unable to open v4l2 device");
736 pthread_mutex_init(&exynos_camera->preview_mutex, NULL);
737 pthread_mutex_init(&exynos_camera->preview_lock_mutex, NULL);
740 pthread_mutex_lock(&exynos_camera->preview_lock_mutex);
742 pthread_attr_init(&thread_attr);
743 pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
745 exynos_camera->preview_enabled = 1;
747 rc = pthread_create(&exynos_camera->preview_thread, &thread_attr,
748 exynos_camera_preview_thread, (void *) exynos_camera);
750 LOGE("%s: Unable to create thread", __func__);
757 void exynos_camera_stop_preview(struct camera_device *dev)
759 struct exynos_camera *exynos_camera;
763 LOGD("%s(%p)", __func__, dev);
765 if (dev == NULL || dev->priv == NULL)
768 exynos_camera = (struct exynos_camera *) dev->priv;
770 if (!exynos_camera->preview_enabled)
773 exynos_camera->preview_enabled = 0;
775 // Unlock preview lock
776 pthread_mutex_unlock(&exynos_camera->preview_lock_mutex);
778 pthread_mutex_lock(&exynos_camera->preview_mutex);
780 // Wait for the thread to end
781 for (i=0 ; i < 10 ; i++) {
782 if (!exynos_camera->preview_thread_running)
788 rc = exynos_v4l2_streamoff_cap(exynos_camera, 0);
790 LOGE("%s: streamoff failed!", __func__);
793 if (exynos_camera->preview_memory != NULL && exynos_camera->preview_memory->release != NULL) {
794 exynos_camera->preview_memory->release(exynos_camera->preview_memory);
795 exynos_camera->preview_memory = NULL;
798 pthread_mutex_unlock(&exynos_camera->preview_mutex);
801 int exynos_camera_preview_enabled(struct camera_device *dev)
803 struct exynos_camera *exynos_camera;
805 LOGD("%s(%p)", __func__, dev);
807 if (dev == NULL || dev->priv == NULL)
810 exynos_camera = (struct exynos_camera *) dev->priv;
812 return exynos_camera->preview_enabled;
815 int exynos_camera_store_meta_data_in_buffers(struct camera_device *dev,
818 LOGD("%s(%p, %d)", __func__, dev, enable);
823 int exynos_camera_start_recording(struct camera_device *dev)
825 LOGD("%s(%p)", __func__, dev);
830 void exynos_camera_stop_recording(struct camera_device *dev)
832 LOGD("%s(%p)", __func__, dev);
835 int exynos_camera_recording_enabled(struct camera_device *dev)
837 LOGD("%s(%p)", __func__, dev);
842 void exynos_camera_release_recording_frame(struct camera_device *dev,
845 LOGD("%s(%p, %p)", __func__, dev, opaque);
848 int exynos_camera_auto_focus(struct camera_device *dev)
850 LOGD("%s(%p)", __func__, dev);
855 int exynos_camera_cancel_auto_focus(struct camera_device *dev)
857 LOGD("%s(%p)", __func__, dev);
862 int exynos_camera_take_picture(struct camera_device *dev)
864 LOGD("%s(%p)", __func__, dev);
869 int exynos_camera_cancel_picture(struct camera_device *dev)
871 LOGD("%s(%p)", __func__, dev);
876 int exynos_camera_set_parameters(struct camera_device *dev,
879 struct exynos_camera *exynos_camera;
882 LOGD("%s(%p, %s)", __func__, dev, params);
884 if (dev == NULL || dev->priv == NULL || params == NULL)
887 exynos_camera = (struct exynos_camera *) dev->priv;
889 rc = exynos_params_string_set(exynos_camera, (char *) params);
891 LOGE("%s: Unable to set params string", __func__);
898 char *exynos_camera_get_parameters(struct camera_device *dev)
900 struct exynos_camera *exynos_camera;
903 LOGD("%s(%p)", __func__, dev);
905 if (dev == NULL || dev->priv == NULL)
908 exynos_camera = (struct exynos_camera *) dev->priv;
910 params = exynos_params_string_get(exynos_camera);
911 if (params == NULL) {
912 LOGE("%s: Couldn't find any param", __func__);
919 void exynos_camera_put_parameters(struct camera_device *dev, char *params)
921 LOGD("%s(%p)", __func__, dev);
927 int exynos_camera_send_command(struct camera_device *dev,
928 int32_t cmd, int32_t arg1, int32_t arg2)
930 LOGD("%s(%p, %d, %d, %d)", __func__, dev, cmd, arg1, arg2);
935 void exynos_camera_release(struct camera_device *dev)
937 LOGD("%s(%p)", __func__, dev);
940 int exynos_camera_dump(struct camera_device *dev, int fd)
942 LOGD("%s(%p, %d)", __func__, dev, fd);
951 struct camera_device_ops exynos_camera_ops = {
952 .set_preview_window = exynos_camera_set_preview_window,
953 .set_callbacks = exynos_camera_set_callbacks,
954 .enable_msg_type = exynos_camera_enable_msg_type,
955 .disable_msg_type = exynos_camera_disable_msg_type,
956 .msg_type_enabled = exynos_camera_msg_type_enabled,
957 .start_preview = exynos_camera_start_preview,
958 .stop_preview = exynos_camera_stop_preview,
959 .preview_enabled = exynos_camera_preview_enabled,
960 .store_meta_data_in_buffers = exynos_camera_store_meta_data_in_buffers,
961 .start_recording = exynos_camera_start_recording,
962 .stop_recording = exynos_camera_stop_recording,
963 .recording_enabled = exynos_camera_recording_enabled,
964 .release_recording_frame = exynos_camera_release_recording_frame,
965 .auto_focus = exynos_camera_auto_focus,
966 .cancel_auto_focus = exynos_camera_cancel_auto_focus,
967 .take_picture = exynos_camera_take_picture,
968 .cancel_picture = exynos_camera_cancel_picture,
969 .set_parameters = exynos_camera_set_parameters,
970 .get_parameters = exynos_camera_get_parameters,
971 .put_parameters = exynos_camera_put_parameters,
972 .send_command = exynos_camera_send_command,
973 .release = exynos_camera_release,
974 .dump = exynos_camera_dump,
977 int exynos_camera_close(hw_device_t *device)
979 struct camera_device *camera_device;
980 struct exynos_camera *exynos_camera;
982 LOGD("%s(%p)", __func__, device);
987 camera_device = (struct camera_device *) device;
989 if (camera_device->priv != NULL) {
990 exynos_camera = (struct exynos_camera *) camera_device->priv;
991 exynos_camera_deinit(exynos_camera);
1001 int exynos_camera_open(const struct hw_module_t* module, const char *camera_id,
1002 struct hw_device_t** device)
1004 struct camera_device *camera_device = NULL;
1005 struct exynos_camera *exynos_camera = NULL;
1009 LOGD("%s(%p, %s, %p)", __func__, module, camera_id, device);
1011 if (module == NULL || camera_id == NULL || device == NULL)
1014 id = atoi(camera_id);
1018 exynos_camera = calloc(1, sizeof(struct exynos_camera));
1019 exynos_camera->config = exynos_camera_config;
1021 if (exynos_camera->config->presets_count > EXYNOS_CAMERA_MAX_PRESETS_COUNT ||
1022 exynos_camera->config->v4l2_nodes_count > EXYNOS_CAMERA_MAX_V4L2_NODES_COUNT)
1025 if (id >= exynos_camera->config->presets_count)
1028 exynos_camera->camera_id = id;
1030 rc = exynos_camera_init(exynos_camera, id);
1032 LOGE("%s: Unable to init camera", __func__);
1036 camera_device = calloc(1, sizeof(struct camera_device));
1037 camera_device->common.tag = HARDWARE_DEVICE_TAG;
1038 camera_device->common.version = 0;
1039 camera_device->common.module = (struct hw_module_t *) module;
1040 camera_device->common.close = exynos_camera_close;
1042 camera_device->ops = &exynos_camera_ops;
1043 camera_device->priv = exynos_camera;
1045 *device = (struct hw_device_t *) &(camera_device->common);
1050 exynos_camera_deinit(exynos_camera);
1053 if (camera_device != NULL)
1054 free(camera_device);
1057 if (exynos_camera != NULL)
1058 free(exynos_camera);
1063 int exynos_camera_get_number_of_cameras(void)
1065 LOGD("%s()", __func__);
1067 if (exynos_camera_config == NULL || exynos_camera_config->presets == NULL) {
1068 LOGE("%s: Unable to find proper camera config", __func__);
1072 return exynos_camera_config->presets_count;
1075 int exynos_camera_get_camera_info(int id, struct camera_info *info)
1077 LOGD("%s(%d, %p)", __func__, id, info);
1079 if (id < 0 || info == NULL)
1082 if (exynos_camera_config == NULL || exynos_camera_config->presets == NULL) {
1083 LOGE("%s: Unable to find proper camera config", __func__);
1087 if (id >= exynos_camera_config->presets_count)
1090 LOGD("Selected camera: %s", exynos_camera_config->presets[id].name);
1092 info->facing = exynos_camera_config->presets[id].facing;
1093 info->orientation = exynos_camera_config->presets[id].orientation;
1098 struct hw_module_methods_t exynos_camera_module_methods = {
1099 .open = exynos_camera_open,
1102 struct camera_module HAL_MODULE_INFO_SYM = {
1104 .tag = HARDWARE_MODULE_TAG,
1107 .id = CAMERA_HARDWARE_MODULE_ID,
1108 .name = "Exynos Camera",
1109 .author = "Paul Kocialkowski",
1110 .methods = &exynos_camera_module_methods,
1112 .get_number_of_cameras = exynos_camera_get_number_of_cameras,
1113 .get_camera_info = exynos_camera_get_camera_info,