1 /*
2 * v4l-test: Test environment for Video For Linux Two API
3 *
4 * 3 Apr 2009 0.2 Added camera enabling through
5 * /sys/devices/platform/eeepc/camera
6 * 18 Dec 2008 0.1 First release
7 *
8 * Written by M�rton N�meth <nm127@freemail.hu>
9 * Released under GPL
10 */
11
12 #include <stdio.h>
13 #include <sys/types.h>
14 #include <sys/stat.h>
15 #include <fcntl.h>
16 #include <unistd.h>
17 #include <sys/ioctl.h>
18 #include <errno.h>
19 #include <string.h>
20 #include <unistd.h>
21
22 #include "dev_video.h"
23
24 #define DEV_VIDEO_STATE_NORMAL 0
25 #define DEV_VIDEO_STATE_ASUS 1
26 #define DEV_VIDEO_STATE_EEEPC 2
27
28 static int f;
29 static int dev_video_state;
30
try_ASUS_camera(char * path,char * value)31 static int try_ASUS_camera(char *path, char *value)
32 {
33 int ASUS_camera;
34 size_t s;
35 int ret;
36
37 ASUS_camera = open(path, O_WRONLY);
38 if (ASUS_camera < 0) {
39 fprintf(stderr, "Cannot open %s: %s\n", path, strerror(errno));
40 return ASUS_camera;
41 }
42 s = write(ASUS_camera, value, 1);
43 ret = close(ASUS_camera);
44 if (s != 1) {
45 return -1;
46 }
47 if (ret < 0) {
48 perror("Cannot close ASUS camera");
49 return ret;
50 }
51
52 sleep(1);
53
54 f = open("/dev/video0", O_RDWR);
55 if (f < 0) {
56 perror("Cannot open /dev/video0");
57 return f;
58 }
59 dev_video_state = DEV_VIDEO_STATE_ASUS;
60
61 return f;
62 }
63
open_video()64 int open_video()
65 {
66 int error = 0;
67
68 fflush(stdout);
69
70 f = open("/dev/video0", O_RDWR);
71 if (f < 0) {
72 perror("Cannot open /dev/video0");
73 fprintf(stderr, "Retrying with ASUS camera...\n");
74 f = try_ASUS_camera("/proc/acpi/asus/camera", "1");
75 if (f < 0) {
76 f = try_ASUS_camera
77 ("/sys/devices/platform/eeepc/camera", "1");
78 if (f < 0) {
79 error = 1;
80 } else {
81 dev_video_state = DEV_VIDEO_STATE_EEEPC;
82 }
83 } else {
84 dev_video_state = DEV_VIDEO_STATE_ASUS;
85 }
86 } else {
87 dev_video_state = DEV_VIDEO_STATE_NORMAL;
88 }
89 return error;
90 }
91
close_video()92 int close_video()
93 {
94 int ret;
95
96 fflush(stdout);
97
98 ret = close(f);
99 f = 0;
100 if (ret < 0) {
101 perror("Cannot close");
102 return 1;
103 }
104 switch (dev_video_state) {
105 case DEV_VIDEO_STATE_NORMAL:
106 break;
107 case DEV_VIDEO_STATE_ASUS:
108 try_ASUS_camera("/proc/acpi/asus/camera", "0");
109 break;
110 case DEV_VIDEO_STATE_EEEPC:
111 try_ASUS_camera("/sys/devices/platform/eeepc/camera", "0");
112 break;
113 }
114
115 return 0;
116 }
117
get_video_fd()118 int get_video_fd()
119 {
120 return f;
121 }
122