[Title] inserted some code to activate camera device by checking webcam connection.
authorjinhyung.jo <jinhyung.jo@samsung.com>
Mon, 20 Aug 2012 14:39:16 +0000 (23:39 +0900)
committerjinhyung.jo <jinhyung.jo@samsung.com>
Mon, 20 Aug 2012 14:39:16 +0000 (23:39 +0900)
[Type] BugFix
[Module] Emulator / Camera
[Priority] Major
[CQ#] N_SE-3291, S1-5920
[Redmine#]
[Problem]
[Cause]
[Solution]
[TestCase]

tizen/src/hw/maru_board.c
tizen/src/hw/maru_camera_common.h
tizen/src/hw/maru_camera_common_pci.c
tizen/src/hw/maru_camera_linux_pci.c
tizen/src/hw/maru_camera_win32_pci.c
vl.c

index 8999fd98961c81b7e8b24e255f91117e82ecb650..d835958ca2c00861dbe593e8af19d704190569d2 100644 (file)
@@ -258,7 +258,6 @@ static void maru_x86_machine_init(MemoryRegion *system_memory,
 #ifndef CONFIG_DARWIN
     // maru specialized device init...
     if (pci_enabled) {
-               maru_camera_pci_init(pci_bus);
        //tizen_ac97_init(pci_bus);
                codec_init(pci_bus);        
     }
index e5fd1e270c817d4e0f17a304b08f12f947965fd1..59917ee526350d3198d2636177c76507117401ba 100644 (file)
@@ -88,6 +88,7 @@ struct MaruCamState {
 /* ----------------------------------------------------------------------------- */\r
 /* Fucntion prototype                                                            */\r
 /* ----------------------------------------------------------------------------- */\r
+int marucam_device_check(void);\r
 void marucam_device_init(MaruCamState *state);\r
 void marucam_device_open(MaruCamState *state);\r
 void marucam_device_close(MaruCamState *state);\r
index 95dfd49ce54b4cffbe5c1c66a3077b93b4cb79eb..e148e645f5193963047bc824457c0a89d7c7b56d 100644 (file)
@@ -221,6 +221,7 @@ static int marucam_initfn(PCIDevice *dev)
     marucam_device_init(s);\r
 \r
     s->tx_bh = qemu_bh_new(marucam_tx_bh, s);\r
+    INFO("[%s] camera device was initialized.\n", __func__);\r
 \r
     return 0;\r
 }\r
index db08b8d7e7afa617bd17ada1f092b3fea13af0e4..e6890b0f09312c1c59a8ec773530a595da486a75 100644 (file)
@@ -239,6 +239,32 @@ wait_worker_thread:
     qemu_thread_exit((void*)0);\r
 }\r
 \r
+int marucam_device_check(void)\r
+{\r
+    int tmp_fd;\r
+    struct v4l2_capability cap;\r
+\r
+    tmp_fd = open("/dev/video0", O_RDWR);\r
+    if (tmp_fd < 0) {\r
+        ERR("camera device open failed.(/dev/video0)\n");\r
+        return 0;\r
+    }\r
+    if (ioctl(tmp_fd, VIDIOC_QUERYCAP, &cap) < 0) {\r
+        ERR("Could not qeury video capabilities\n");\r
+        close(tmp_fd);\r
+        return 0;\r
+    }\r
+    if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) ||\r
+            !(cap.capabilities & V4L2_CAP_STREAMING)) {\r
+        ERR("Not supported video driver.\n");\r
+        close(tmp_fd);\r
+        return 0;\r
+    }\r
+\r
+    close(tmp_fd);\r
+    return 1;\r
+}\r
+\r
 void marucam_device_init(MaruCamState* state)\r
 {\r
     qemu_thread_create(&state->thread_id, marucam_worker_thread, (void*)state);\r
index 26ddf36867457bf53ac8a950d19a92cb9698ced4..22eea737c1aa849fb9e4681eacfabedc295ffc27 100644 (file)
@@ -1449,6 +1449,136 @@ static STDMETHODIMP SetVideoProcAmp(long nProperty, long value)
     return hr;\r
 }\r
 \r
+int marucam_device_check(void)\r
+{\r
+    int ret = 0;\r
+    HRESULT hr;\r
+    ICreateDevEnum *pCreateDevEnum = NULL;\r
+    IEnumMoniker *pEnumMK = NULL;\r
+    IMoniker *pMoniKer;\r
+\r
+    hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);\r
+    if (FAILED(hr)) {\r
+        ERR("[%s] failed to CoInitailizeEx\n", __func__);\r
+        goto error;\r
+    }\r
+\r
+    hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, &IID_ICreateDevEnum, (void**)&pCreateDevEnum);\r
+    if (FAILED(hr)) {\r
+        ERR("[%s] failed to create instance of CLSID_SystemDeviceEnum\n", __func__);\r
+        goto error;\r
+    }\r
+\r
+    hr = pCreateDevEnum->lpVtbl->CreateClassEnumerator(pCreateDevEnum, &CLSID_VideoInputDeviceCategory, &pEnumMK, 0);\r
+    if (FAILED(hr))\r
+    {\r
+        pCreateDevEnum->lpVtbl->Release(pCreateDevEnum);\r
+        ERR("[%s] failed to create class enumerator\n");\r
+        goto error;\r
+    }\r
+\r
+    if (!pEnumMK)\r
+    {\r
+        pCreateDevEnum->lpVtbl->Release(pCreateDevEnum);\r
+        ERR("[%s] class enumerator is NULL!!\n");\r
+        goto error;\r
+    }\r
+    pEnumMK->lpVtbl->Reset(pEnumMK);\r
+\r
+    hr = pEnumMK->lpVtbl->Next(pEnumMK, 1, &pMoniKer, NULL);\r
+    if (hr == S_FALSE)\r
+    {\r
+        hr = E_FAIL;\r
+    }\r
+    if (SUCCEEDED(hr))\r
+    {\r
+        IPropertyBag *pBag = NULL;\r
+        hr = pMoniKer->lpVtbl->BindToStorage(pMoniKer, 0, 0, &IID_IPropertyBag, (void **)&pBag);\r
+        if(SUCCEEDED(hr))\r
+        {\r
+            VARIANT var;\r
+            var.vt = VT_BSTR;\r
+            hr = pBag->lpVtbl->Read(pBag, L"FriendlyName", &var, NULL);\r
+            if (hr == NOERROR)\r
+            {\r
+                ret = 1;\r
+                SysFreeString(var.bstrVal);\r
+            }\r
+            pBag->lpVtbl->Release(pBag);\r
+        }\r
+        pMoniKer->lpVtbl->Release(pMoniKer);\r
+    }\r
+\r
+error:\r
+    CoUninitialize();\r
+    return ret;\r
+}\r
+\r
+int marucam_device_check(void)\r
+{\r
+    int ret = 0;\r
+    HRESULT hr;\r
+    ICreateDevEnum *pCreateDevEnum = NULL;\r
+    IEnumMoniker *pEnumMK = NULL;\r
+    IMoniker *pMoniKer;\r
+\r
+    hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);\r
+    if (FAILED(hr)) {\r
+        ERR("[%s] failed to CoInitailizeEx\n", __func__);\r
+        goto error;\r
+    }\r
+\r
+    hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, &IID_ICreateDevEnum, (void**)&pCreateDevEnum);\r
+    if (FAILED(hr)) {\r
+        ERR("[%s] failed to create instance of CLSID_SystemDeviceEnum\n", __func__);\r
+        goto error;\r
+    }\r
+\r
+    hr = pCreateDevEnum->lpVtbl->CreateClassEnumerator(pCreateDevEnum, &CLSID_VideoInputDeviceCategory, &pEnumMK, 0);\r
+    if (FAILED(hr))\r
+    {\r
+        pCreateDevEnum->lpVtbl->Release(pCreateDevEnum);\r
+        ERR("[%s] failed to create class enumerator\n", __func__);\r
+        goto error;\r
+    }\r
+\r
+    if (!pEnumMK)\r
+    {\r
+        pCreateDevEnum->lpVtbl->Release(pCreateDevEnum);\r
+        ERR("[%s] class enumerator is NULL!!\n", __func__);\r
+        goto error;\r
+    }\r
+    pEnumMK->lpVtbl->Reset(pEnumMK);\r
+\r
+    hr = pEnumMK->lpVtbl->Next(pEnumMK, 1, &pMoniKer, NULL);\r
+    if (hr == S_FALSE)\r
+    {\r
+        hr = E_FAIL;\r
+    }\r
+    if (SUCCEEDED(hr))\r
+    {\r
+        IPropertyBag *pBag = NULL;\r
+        hr = pMoniKer->lpVtbl->BindToStorage(pMoniKer, 0, 0, &IID_IPropertyBag, (void **)&pBag);\r
+        if(SUCCEEDED(hr))\r
+        {\r
+            VARIANT var;\r
+            var.vt = VT_BSTR;\r
+            hr = pBag->lpVtbl->Read(pBag, L"FriendlyName", &var, NULL);\r
+            if (hr == NOERROR)\r
+            {\r
+                ret = 1;\r
+                SysFreeString(var.bstrVal);\r
+            }\r
+            pBag->lpVtbl->Release(pBag);\r
+        }\r
+        pMoniKer->lpVtbl->Release(pMoniKer);\r
+    }\r
+\r
+error:\r
+    CoUninitialize();\r
+    return ret;\r
+}\r
+\r
 // MARUCAM_CMD_INIT\r
 void marucam_device_init(MaruCamState* state)\r
 {\r
diff --git a/vl.c b/vl.c
index 0fe29357624866be7ce2ac108b639e7f83749aa3..dee71d2a710cab830aaf6d81574df8a945e0be42 100644 (file)
--- a/vl.c
+++ b/vl.c
@@ -195,6 +195,7 @@ int qemu_main(int argc, char **argv, char **envp);
 
 #ifdef CONFIG_MARU
 #define VIRTIOGL_DEV_NAME "virtio-gl-pci"
+#define MARUCAM_DEV_NAME "maru_camera_pci"
 extern int tizen_base_port;
 int skin_disabled = 0;
 #endif
@@ -268,6 +269,11 @@ extern int gl_acceleration_capability_check (void);
 int enable_gl = 0;
 int capability_check_gl = 0;
 #endif
+#if defined(CONFIG_MARU)
+extern int marucam_device_check(void);
+int is_webcam_enabled = 0;
+#endif
+
 
 typedef struct FWBootEntry FWBootEntry;
 
@@ -1802,6 +1808,14 @@ static int device_init_func(QemuOpts *opts, void *opaque)
                }
        }
 #endif
+#if defined(CONFIG_MARU)
+    if (!is_webcam_enabled) {
+        const char *driver = qemu_opt_get(opts, "driver");
+        if (driver && (strcmp (driver, MARUCAM_DEV_NAME) == 0)) {
+            return 0;
+        }
+    }
+#endif
        
     dev = qdev_device_add(opts);
     if (!dev)
@@ -3246,7 +3260,29 @@ fprintf(stdout, "kernel command : %s\n", kernel_cmdline);
                }
        }
 #endif
-       
+
+#if defined(CONFIG_MARU)
+    is_webcam_enabled = marucam_device_check();
+    if (!is_webcam_enabled) {
+        fprintf (stderr, "WARNING: Webcam support was disabled due to "
+                         "the fail of webcam capability check!\n");
+    }
+
+    gchar *tmp_cam_kcmd = kernel_cmdline;
+    kernel_cmdline = g_strdup_printf("%s enable_cam=%d", tmp_cam_kcmd, is_webcam_enabled);
+    fprintf(stdout, "kernel command : %s\n", kernel_cmdline);
+    g_free(tmp_cam_kcmd);
+
+    if (is_webcam_enabled) {
+        device_opt_finding_t devp = {MARUCAM_DEV_NAME, 0};
+        qemu_opts_foreach(qemu_find_opts("device"), find_device_opt, &devp, 0);
+        if (devp.found == 0) {
+            if (!qemu_opts_parse(qemu_find_opts("device"), MARUCAM_DEV_NAME, "driver")) {
+                exit(1);
+            }
+        }
+    }
+#endif
        
     /* Open the logfile at this point, if necessary. We can't open the logfile
      * when encountering either of the logging options (-d or -D) because the