camera: Fix hotplug failure
Due to other v4l device getting enumerated as
"/dev/video0" when camera not connected at boot time,
camera gets enumerated as "/dev/video1" this may again
fail in case if there are other v4l devices.
Change-Id: I2bcb91a2bd815746e68e2a38c746e69be476ba5e
Signed-off-by: Vishal Bhoj <vishal.bhoj@linaro.org>
diff --git a/libcamera/CameraHardware.cpp b/libcamera/CameraHardware.cpp
index bd7f079..64afcc3 100644
--- a/libcamera/CameraHardware.cpp
+++ b/libcamera/CameraHardware.cpp
@@ -25,7 +25,6 @@
#include <fcntl.h>
#include <sys/mman.h>
-#define VIDEO_DEVICE "/dev/video0"
#define MIN_WIDTH 640
#define MIN_HEIGHT 480
#define CAM_SIZE "640x480"
@@ -147,15 +146,25 @@
{
int ret;
int width, height;
-
+ int i;
+ char devnode[12];
Mutex::Autolock lock(mLock);
if (mPreviewThread != 0) {
//already running
return INVALID_OPERATION;
}
+ LOGI("startPreview: in startpreview \n");
- LOGI("startPreview: in startpreview \n");
- camera.Open(VIDEO_DEVICE, MIN_WIDTH, MIN_HEIGHT, PIXEL_FORMAT);
+ for( i=0; i<10; i++) {
+ sprintf(devnode,"/dev/video%d",i);
+ LOGI("trying the node %s \n",devnode);
+ ret = camera.Open(devnode, MIN_WIDTH, MIN_HEIGHT, PIXEL_FORMAT);
+ if( ret >= 0)
+ break;
+ }
+
+ if( ret < 0)
+ return -1;
mPreviewFrameSize = MIN_WIDTH * MIN_HEIGHT * 2;
@@ -286,6 +295,8 @@
struct v4l2_buffer cfilledbuffer;
struct v4l2_requestbuffers creqbuf;
struct v4l2_capability cap;
+ int i;
+ char devnode[12];
if (mMsgEnabled & CAMERA_MSG_SHUTTER)
@@ -296,7 +307,18 @@
int width, height;
mParameters.getPictureSize(&width, &height);
- camera.Open(VIDEO_DEVICE, MIN_WIDTH, MIN_HEIGHT, PIXEL_FORMAT);
+
+ for(i=0; i<10; i++) {
+ sprintf(devnode,"/dev/video%d",i);
+ LOGI("trying the node %s \n",devnode);
+ ret = camera.Open(devnode, MIN_WIDTH, MIN_HEIGHT, PIXEL_FORMAT);
+ if( ret >= 0)
+ break;
+ }
+
+ if( ret < 0)
+ return -1;
+
camera.Init();
camera.StartStreaming();