summaryrefslogtreecommitdiff
path: root/camera/QCamera/stack/mm-camera-interface/src/mm_camera_thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'camera/QCamera/stack/mm-camera-interface/src/mm_camera_thread.c')
-rwxr-xr-xcamera/QCamera/stack/mm-camera-interface/src/mm_camera_thread.c361
1 files changed, 0 insertions, 361 deletions
diff --git a/camera/QCamera/stack/mm-camera-interface/src/mm_camera_thread.c b/camera/QCamera/stack/mm-camera-interface/src/mm_camera_thread.c
deleted file mode 100755
index 6947ed4..0000000
--- a/camera/QCamera/stack/mm-camera-interface/src/mm_camera_thread.c
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
-Copyright (c) 2012, The Linux Foundation. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of The Linux Foundation nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <pthread.h>
-#include <errno.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <poll.h>
-#include <semaphore.h>
-
-#include "mm_camera_dbg.h"
-#include "mm_camera_interface.h"
-#include "mm_camera.h"
-
-typedef enum {
- /* poll entries updated */
- MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED,
- /* exit */
- MM_CAMERA_PIPE_CMD_EXIT,
- /* max count */
- MM_CAMERA_PIPE_CMD_MAX
-} mm_camera_pipe_cmd_type_t;
-
-typedef enum {
- MM_CAMERA_POLL_TASK_STATE_STOPPED,
- MM_CAMERA_POLL_TASK_STATE_POLL, /* polling pid in polling state. */
- MM_CAMERA_POLL_TASK_STATE_MAX
-} mm_camera_poll_task_state_type_t;
-
-typedef struct {
- uint8_t cmd;
- mm_camera_event_t event;
-} mm_camera_sig_evt_t;
-
-static int32_t mm_camera_poll_sig(mm_camera_poll_thread_t *poll_cb,
- uint32_t cmd)
-{
- /* send through pipe */
- /* get the mutex */
- mm_camera_sig_evt_t cmd_evt;
- int len;
-
- CDBG("%s: E cmd = %d", __func__,cmd);
- memset(&cmd_evt, 0, sizeof(cmd_evt));
- cmd_evt.cmd = cmd;
- pthread_mutex_lock(&poll_cb->mutex);
- /* reset the statue to false */
- poll_cb->status = FALSE;
- /* send cmd to worker */
-
- len = write(poll_cb->pfds[1], &cmd_evt, sizeof(cmd_evt));
- if(len < 1) {
- CDBG_ERROR("%s: len = %d, errno = %d", __func__, len, errno);
- }
- CDBG("%s: begin IN mutex write done, len = %d", __func__, len);
- /* wait till worker task gives positive signal */
- if (FALSE == poll_cb->status) {
- CDBG("%s: wait", __func__);
- pthread_cond_wait(&poll_cb->cond_v, &poll_cb->mutex);
- }
- /* done */
- pthread_mutex_unlock(&poll_cb->mutex);
- CDBG("%s: X", __func__);
- return 0;
-}
-
-static void mm_camera_poll_sig_done(mm_camera_poll_thread_t *poll_cb)
-{
- pthread_mutex_lock(&poll_cb->mutex);
- poll_cb->status = TRUE;
- pthread_cond_signal(&poll_cb->cond_v);
- CDBG("%s: done, in mutex", __func__);
- pthread_mutex_unlock(&poll_cb->mutex);
-}
-
-static void mm_camera_poll_set_state(mm_camera_poll_thread_t *poll_cb,
- mm_camera_poll_task_state_type_t state)
-{
- poll_cb->state = state;
-}
-
-static void mm_camera_poll_proc_pipe(mm_camera_poll_thread_t *poll_cb)
-{
- ssize_t read_len;
- int i;
- mm_camera_sig_evt_t cmd_evt;
- read_len = read(poll_cb->pfds[0], &cmd_evt, sizeof(cmd_evt));
- CDBG("%s: read_fd = %d, read_len = %d, expect_len = %d cmd = %d",
- __func__, poll_cb->pfds[0], (int)read_len, (int)sizeof(cmd_evt), cmd_evt.cmd);
- switch (cmd_evt.cmd) {
- case MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED:
- /* we always have index 0 for pipe read */
- poll_cb->num_fds = 0;
- poll_cb->poll_fds[poll_cb->num_fds].fd = poll_cb->pfds[0];
- poll_cb->poll_fds[poll_cb->num_fds].events = POLLIN|POLLRDNORM|POLLPRI;
- poll_cb->num_fds++;
-
- if (MM_CAMERA_POLL_TYPE_EVT == poll_cb->poll_type) {
- if (poll_cb->poll_entries[0].fd > 0) {
- /* fd is valid, we update poll_fds */
- poll_cb->poll_fds[poll_cb->num_fds].fd = poll_cb->poll_entries[0].fd;
- poll_cb->poll_fds[poll_cb->num_fds].events = POLLIN|POLLRDNORM|POLLPRI;
- poll_cb->num_fds++;
- }
- } else if (MM_CAMERA_POLL_TYPE_CH == poll_cb->poll_type) {
- for(i = 0; i < MM_CAMEAR_STRAEM_NUM_MAX; i++) {
- if(poll_cb->poll_entries[i].fd > 0) {
- /* fd is valid, we update poll_fds to this fd */
- poll_cb->poll_fds[poll_cb->num_fds].fd = poll_cb->poll_entries[i].fd;
- poll_cb->poll_fds[poll_cb->num_fds].events = POLLIN|POLLRDNORM|POLLPRI;
- poll_cb->num_fds++;
- } else {
- /* fd is invalid, we set the entry to -1 to prevent polling.
- * According to spec, polling will not poll on entry with fd=-1.
- * If this is not the case, we need to skip these invalid fds
- * when updating this array.
- * We still keep fd=-1 in this array because this makes easier to
- * map cb associated with this fd once incoming data avail by directly
- * using the index-1(0 is reserved for pipe read, so need to reduce index by 1) */
- poll_cb->poll_fds[poll_cb->num_fds].fd = -1;
- poll_cb->poll_fds[poll_cb->num_fds].events = 0;
- poll_cb->num_fds++;
- }
- }
- }
- mm_camera_poll_sig_done(poll_cb);
- break;
-
- case MM_CAMERA_PIPE_CMD_EXIT:
- default:
- mm_camera_poll_set_state(poll_cb, MM_CAMERA_POLL_TASK_STATE_STOPPED);
- mm_camera_poll_sig_done(poll_cb);
- break;
- }
-}
-
-static void *mm_camera_poll_fn(mm_camera_poll_thread_t *poll_cb)
-{
- int rc = 0, i;
-
- CDBG("%s: poll type = %d, num_fd = %d poll_cb = %p\n",
- __func__, poll_cb->poll_type, poll_cb->num_fds,poll_cb);
- do {
- for(i = 0; i < poll_cb->num_fds; i++) {
- poll_cb->poll_fds[i].events = POLLIN|POLLRDNORM|POLLPRI;
- }
-
- rc = poll(poll_cb->poll_fds, poll_cb->num_fds, poll_cb->timeoutms);
- if(rc > 0) {
- if ((poll_cb->poll_fds[0].revents & POLLIN) &&
- (poll_cb->poll_fds[0].revents & POLLRDNORM)) {
- /* if we have data on pipe, we only process pipe in this iteration */
- CDBG("%s: cmd received on pipe\n", __func__);
- mm_camera_poll_proc_pipe(poll_cb);
- } else {
- for(i=1; i<poll_cb->num_fds; i++) {
- /* Checking for ctrl events */
- if ((poll_cb->poll_type == MM_CAMERA_POLL_TYPE_EVT) &&
- (poll_cb->poll_fds[i].revents & POLLPRI)) {
- CDBG("%s: mm_camera_evt_notify\n", __func__);
- if (NULL != poll_cb->poll_entries[i-1].notify_cb) {
- poll_cb->poll_entries[i-1].notify_cb(poll_cb->poll_entries[i-1].user_data);
- }
- }
-
- if ((poll_cb->poll_type == MM_CAMERA_POLL_TYPE_CH) &&
- (poll_cb->poll_fds[i].revents & POLLIN) &&
- (poll_cb->poll_fds[i].revents & POLLRDNORM)) {
- CDBG("%s: mm_stream_data_notify\n", __func__);
- if (NULL != poll_cb->poll_entries[i-1].notify_cb) {
- poll_cb->poll_entries[i-1].notify_cb(poll_cb->poll_entries[i-1].user_data);
- }
- }
- }
- }
- } else {
- /* in error case sleep 10 us and then continue. hard coded here */
- usleep(10);
- continue;
- }
- } while (poll_cb->state == MM_CAMERA_POLL_TASK_STATE_POLL);
- return NULL;
-}
-
-static void *mm_camera_poll_thread(void *data)
-{
- int rc = 0;
- int i;
- void *ret = NULL;
- mm_camera_poll_thread_t *poll_cb = (mm_camera_poll_thread_t *)data;
-
- /* add pipe read fd into poll first */
- poll_cb->poll_fds[poll_cb->num_fds++].fd = poll_cb->pfds[0];
-
- //poll_cb->poll_fds[poll_cb->num_fds++].fd = (((mm_camera_obj_t *)poll_cb->my_obj)->ctrl_fd);
-
- mm_camera_poll_sig_done(poll_cb);
- mm_camera_poll_set_state(poll_cb, MM_CAMERA_POLL_TASK_STATE_POLL);
- ret = mm_camera_poll_fn(poll_cb);
- return ret;
-}
-
-int32_t mm_camera_poll_thread_notify_entries_updated(mm_camera_poll_thread_t * poll_cb)
-{
- /* send poll entries updated signal to poll thread */
- return mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED);
-}
-
-int32_t mm_camera_poll_thread_add_poll_fd(mm_camera_poll_thread_t * poll_cb,
- uint32_t handler,
- int32_t fd,
- mm_camera_poll_notify_t notify_cb,
- void* userdata)
-{
- int32_t rc = -1;
- uint8_t idx = 0;
-
- if (MM_CAMERA_POLL_TYPE_CH == poll_cb->poll_type) {
- /* get stream idx from handler if CH type */
- idx = mm_camera_util_get_index_by_handler(handler);
- } else {
- /* for EVT type, only idx=0 is valid */
- idx = 0;
- }
-
- if (MM_CAMEAR_STRAEM_NUM_MAX > idx) {
- poll_cb->poll_entries[idx].fd = fd;
- poll_cb->poll_entries[idx].handler = handler;
- poll_cb->poll_entries[idx].notify_cb = notify_cb;
- poll_cb->poll_entries[idx].user_data = userdata;
- /* send poll entries updated signal to poll thread */
- rc = mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED);
- } else {
- CDBG_ERROR("%s: invalid handler %d (%d)",
- __func__, handler, idx);
- }
- return rc;
-}
-
-int32_t mm_camera_poll_thread_del_poll_fd(mm_camera_poll_thread_t * poll_cb,
- uint32_t handler)
-{
- int32_t rc = -1;
- uint8_t idx = 0;
-
- if (MM_CAMERA_POLL_TYPE_CH == poll_cb->poll_type) {
- /* get stream idx from handler if CH type */
- idx = mm_camera_util_get_index_by_handler(handler);
- } else {
- /* for EVT type, only idx=0 is valid */
- idx = 0;
- }
-
- if ((MM_CAMEAR_STRAEM_NUM_MAX > idx) &&
- (handler == poll_cb->poll_entries[idx].handler)) {
- /* reset poll entry */
- poll_cb->poll_entries[idx].fd = -1; /* set fd to invalid */
- poll_cb->poll_entries[idx].handler = 0;
- poll_cb->poll_entries[idx].notify_cb = NULL;
-
- /* send poll entries updated signal to poll thread */
- rc = mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED);
- } else {
- CDBG_ERROR("%s: invalid handler %d (%d)",
- __func__, handler, idx);
- }
-
- return rc;
-}
-
-int32_t mm_camera_poll_thread_launch(mm_camera_poll_thread_t * poll_cb,
- mm_camera_poll_thread_type_t poll_type)
-{
- int32_t rc = 0;
- poll_cb->poll_type = poll_type;
-
- poll_cb->pfds[0] = 0;
- poll_cb->pfds[1] = 0;
- rc = pipe(poll_cb->pfds);
- if(rc < 0) {
- CDBG_ERROR("%s: pipe open rc=%d\n", __func__, rc);
- return -1;
- }
-
- poll_cb->timeoutms = -1; /* Infinite seconds */
-
- CDBG("%s: poll_type = %d, read fd = %d, write fd = %d timeout = %d",
- __func__, poll_cb->poll_type,
- poll_cb->pfds[0], poll_cb->pfds[1],poll_cb->timeoutms);
-
- pthread_mutex_init(&poll_cb->mutex, NULL);
- pthread_cond_init(&poll_cb->cond_v, NULL);
-
- /* launch the thread */
- pthread_mutex_lock(&poll_cb->mutex);
- poll_cb->status = 0;
- pthread_create(&poll_cb->pid, NULL, mm_camera_poll_thread, (void *)poll_cb);
- if(!poll_cb->status) {
- pthread_cond_wait(&poll_cb->cond_v, &poll_cb->mutex);
- }
- pthread_mutex_unlock(&poll_cb->mutex);
- CDBG("%s: End",__func__);
- return rc;
-}
-
-int32_t mm_camera_poll_thread_release(mm_camera_poll_thread_t *poll_cb)
-{
- int32_t rc = 0;
- if(MM_CAMERA_POLL_TASK_STATE_STOPPED == poll_cb->state) {
- CDBG_ERROR("%s: err, poll thread is not running.\n", __func__);
- return rc;
- }
-
- /* send exit signal to poll thread */
- mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_EXIT);
- /* wait until poll thread exits */
- if (pthread_join(poll_cb->pid, NULL) != 0) {
- CDBG_ERROR("%s: pthread dead already\n", __func__);
- }
-
- /* close pipe */
- if(poll_cb->pfds[0]) {
- close(poll_cb->pfds[0]);
- }
- if(poll_cb->pfds[1]) {
- close(poll_cb->pfds[1]);
- }
-
- pthread_mutex_destroy(&poll_cb->mutex);
- pthread_cond_destroy(&poll_cb->cond_v);
- memset(poll_cb, 0, sizeof(mm_camera_poll_thread_t));
- return rc;
-}