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 Mrton Nmeth <nm127 (at) 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 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 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 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 118 int get_video_fd() 119 { 120 return f; 121 } 122