From af1465b6b3aadb9e075285e77a621c0d9694775a Mon Sep 17 00:00:00 2001 From: "jinhyung.jo" Date: Fri, 27 Jul 2012 17:50:03 +0900 Subject: [PATCH] [Title] Fixed a problem that first frames of preview are distorted. [Type] Enhancement [Module] Emulator / camera [Priority] Major [CQ#] [Redmine#] [Problem] [Cause] [Solution] [TestCase] --- tizen/src/hw/maru_camera_common.h | 4 ++-- tizen/src/hw/maru_camera_common_pci.c | 11 ++++++----- tizen/src/hw/maru_camera_linux_pci.c | 16 ++++++++++++---- tizen/src/hw/maru_camera_win32_pci.c | 15 ++++++++++++--- 4 files changed, 32 insertions(+), 14 deletions(-) diff --git a/tizen/src/hw/maru_camera_common.h b/tizen/src/hw/maru_camera_common.h index 6d45c39..9abc9f0 100644 --- a/tizen/src/hw/maru_camera_common.h +++ b/tizen/src/hw/maru_camera_common.h @@ -38,7 +38,7 @@ #define MARUCAM_CMD_INIT 0x00 #define MARUCAM_CMD_OPEN 0x04 #define MARUCAM_CMD_CLOSE 0x08 -#define MARUCAM_CMD_ISSTREAM 0x0C +#define MARUCAM_CMD_ISR 0x0C #define MARUCAM_CMD_START_PREVIEW 0x10 #define MARUCAM_CMD_STOP_PREVIEW 0x14 #define MARUCAM_CMD_S_PARAM 0x18 @@ -54,7 +54,6 @@ #define MARUCAM_CMD_ENUM_FINTV 0x40 #define MARUCAM_CMD_S_DATA 0x44 #define MARUCAM_CMD_G_DATA 0x48 -#define MARUCAM_CMD_CLRIRQ 0x4C #define MARUCAM_CMD_DATACLR 0x50 #define MARUCAM_CMD_REQFRAME 0x54 @@ -76,6 +75,7 @@ struct MaruCamState { QemuCond thread_cond; void *vaddr; /* vram ptr */ + uint32_t isr; uint32_t streamon; uint32_t buf_size; uint32_t req_frame; diff --git a/tizen/src/hw/maru_camera_common_pci.c b/tizen/src/hw/maru_camera_common_pci.c index 996fa42..4f187c9 100644 --- a/tizen/src/hw/maru_camera_common_pci.c +++ b/tizen/src/hw/maru_camera_common_pci.c @@ -60,9 +60,11 @@ static inline uint32_t marucam_mmio_read(void *opaque, target_phys_addr_t offset MaruCamState *state = (MaruCamState*)opaque; switch (offset & 0xFF) { - case MARUCAM_CMD_ISSTREAM: + case MARUCAM_CMD_ISR: qemu_mutex_lock(&state->thread_mutex); - ret = state->streamon; + ret = state->isr; + state->isr = 0; + qemu_irq_lower(state->dev.irq[2]); qemu_mutex_unlock(&state->thread_mutex); break; case MARUCAM_CMD_G_DATA: @@ -109,6 +111,7 @@ static inline void marucam_mmio_write(void *opaque, target_phys_addr_t offset, u break; case MARUCAM_CMD_STOP_PREVIEW: marucam_device_stop_preview(state); + memset(state->vaddr, 0, MARUCAM_MEM_SIZE); break; case MARUCAM_CMD_S_PARAM: marucam_device_s_param(state); @@ -149,9 +152,6 @@ static inline void marucam_mmio_write(void *opaque, target_phys_addr_t offset, u case MARUCAM_CMD_DATACLR: memset(state->param, 0, sizeof(MaruCamParam)); break; - case MARUCAM_CMD_CLRIRQ: - qemu_irq_lower(state->dev.irq[2]); - break; case MARUCAM_CMD_REQFRAME: qemu_mutex_lock(&state->thread_mutex); state->req_frame = value + 1; @@ -191,6 +191,7 @@ static int marucam_initfn(PCIDevice *dev) memory_region_init_ram(&s->vram, NULL, "marucamera.ram", MARUCAM_MEM_SIZE); s->vaddr = memory_region_get_ram_ptr(&s->vram); + memset(s->vaddr, 0, MARUCAM_MEM_SIZE); memory_region_init_io (&s->mmio, &maru_camera_mmio_ops, s, "maru-camera-mmio", MARUCAM_REG_SIZE); pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_MEM_PREFETCH, &s->vram); diff --git a/tizen/src/hw/maru_camera_linux_pci.c b/tizen/src/hw/maru_camera_linux_pci.c index 970cfc3..c643a92 100644 --- a/tizen/src/hw/maru_camera_linux_pci.c +++ b/tizen/src/hw/maru_camera_linux_pci.c @@ -42,6 +42,7 @@ MULTI_DEBUG_CHANNEL(tizen, camera_linux); static int v4l2_fd; static int convert_trial; +static int ready_count; static struct v4l2_format dst_fmt; @@ -188,11 +189,17 @@ static int __v4l2_grab(MaruCamState *state) qemu_mutex_lock(&state->thread_mutex); if (state->streamon) { - if (state->req_frame) { - qemu_irq_raise(state->dev.irq[2]); - state->req_frame = 0; + if (ready_count >= 4) { + if (state->req_frame) { + state->req_frame = 0; // clear request + state->isr |= 0x01; // set a flag of rasing a interrupt. + qemu_irq_raise(state->dev.irq[2]); + } + ret = 1; + } else { + ++ready_count; // skip a frame cause first some frame are distorted. + ret = 0; } - ret = 1; } else { ret = -1; } @@ -273,6 +280,7 @@ void marucam_device_start_preview(MaruCamState* state) { qemu_mutex_lock(&state->thread_mutex); state->streamon = 1; + ready_count = 0; state->buf_size = dst_fmt.fmt.pix.sizeimage; qemu_cond_signal(&state->thread_cond); qemu_mutex_unlock(&state->thread_mutex); diff --git a/tizen/src/hw/maru_camera_win32_pci.c b/tizen/src/hw/maru_camera_win32_pci.c index d32d3f8..d014f2e 100644 --- a/tizen/src/hw/maru_camera_win32_pci.c +++ b/tizen/src/hw/maru_camera_win32_pci.c @@ -1008,6 +1008,7 @@ static struct marucam_qctrl qctrl_tbl[] = { static MaruCamState *g_state = NULL; +static uint32_t ready_count = 0; static uint32_t cur_fmt_idx = 0; static uint32_t cur_frame_idx = 0; @@ -1079,10 +1080,17 @@ static STDMETHODIMP marucam_device_callbackfn(ULONG dwSize, BYTE *pBuffer) } index = !index; - if (g_state->req_frame) { - mloop_evcmd_raise_intr(g_state->dev.irq[2]); - g_state->req_frame = 0; + qemu_mutex_lock(&g_state->thread_mutex); + if (ready_count >= 4) { + if (g_state->req_frame) { + g_state->req_frame = 0; // clear request + g_state->isr |= 0x01; // set a flag raising a interrupt. + mloop_evcmd_raise_intr(g_state->dev.irq[2]); + } + } else { + ++ready_count; // skip a frame cause first some frame are distorted. } + qemu_mutex_unlock(&g_state->thread_mutex); return S_OK; } @@ -1545,6 +1553,7 @@ void marucam_device_start_preview(MaruCamState* state) qemu_mutex_lock(&state->thread_mutex); state->streamon = 1; + ready_count = 0; qemu_mutex_unlock(&state->thread_mutex); width = supported_dst_frames[cur_frame_idx].width; -- 2.7.4