blob: 19f948fad2e73684dc87e541811b79f0defccbb6 [file] [log] [blame]
/*
* v4l-test: Test environment for Video For Linux Two API
*
* 3 Apr 2009 0.2 Added camera enabling through
* /sys/devices/platform/eeepc/camera
* 18 Dec 2008 0.1 First release
*
* Written by Márton Németh <nm127@freemail.hu>
* Released under GPL
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include "dev_video.h"
#define DEV_VIDEO_STATE_NORMAL 0
#define DEV_VIDEO_STATE_ASUS 1
#define DEV_VIDEO_STATE_EEEPC 2
static int f;
static int dev_video_state;
static int try_ASUS_camera(char *path, char* value) {
int ASUS_camera;
size_t s;
int ret;
ASUS_camera = open(path, O_WRONLY);
if (ASUS_camera < 0) {
fprintf(stderr, "Cannot open %s: %s\n", path, strerror(errno));
return ASUS_camera;
}
s = write(ASUS_camera, value, 1);
ret = close(ASUS_camera);
if (s != 1) {
return -1;
}
if (ret < 0) {
perror("Cannot close ASUS camera");
return ret;
}
sleep(1);
f = open("/dev/video0", O_RDWR);
if (f < 0) {
perror("Cannot open /dev/video0");
return f;
}
dev_video_state = DEV_VIDEO_STATE_ASUS;
return f;
}
int open_video() {
int error = 0;
fflush(stdout);
f = open("/dev/video0", O_RDWR);
if (f < 0) {
perror("Cannot open /dev/video0");
fprintf(stderr, "Retrying with ASUS camera...\n");
f = try_ASUS_camera("/proc/acpi/asus/camera", "1");
if (f < 0) {
f = try_ASUS_camera("/sys/devices/platform/eeepc/camera", "1");
if (f < 0) {
error = 1;
} else {
dev_video_state = DEV_VIDEO_STATE_EEEPC;
}
} else {
dev_video_state = DEV_VIDEO_STATE_ASUS;
}
} else {
dev_video_state = DEV_VIDEO_STATE_NORMAL;
}
return error;
}
int close_video() {
int ret;
fflush(stdout);
ret = close(f);
f = 0;
if (ret < 0) {
perror("Cannot close");
return 1;
}
switch (dev_video_state) {
case DEV_VIDEO_STATE_NORMAL:
break;
case DEV_VIDEO_STATE_ASUS:
try_ASUS_camera("/proc/acpi/asus/camera", "0");
break;
case DEV_VIDEO_STATE_EEEPC:
try_ASUS_camera("/sys/devices/platform/eeepc/camera", "0");
break;
}
return 0;
}
int get_video_fd() {
return f;
}