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
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
#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
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;
}
}
#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)
}
}
#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