SyntekUSBVideoCamera
stk11xx-sysfs.c
Go to the documentation of this file.
00001 
00034 #include <linux/module.h>
00035 #include <linux/init.h>
00036 #include <linux/kernel.h>
00037 #include <linux/version.h>
00038 #include <linux/errno.h>
00039 #include <linux/slab.h>
00040 #include <linux/kref.h>
00041 #include <linux/device.h>
00042 #include <linux/mm.h>
00043 #include <linux/videodev.h>
00044 
00045 
00046 #include <linux/usb.h>
00047 #include <media/v4l2-common.h>
00048 #include <media/v4l2-ioctl.h>
00049 
00050 #include "stk11xx.h"
00051 
00052 
00053 extern const struct stk11xx_coord stk11xx_image_sizes[STK11XX_NBR_SIZES];
00054 
00055 
00065 static ssize_t show_release(struct device *class, struct device_attribute *attr, char *buf)
00066 {
00067     struct video_device *vdev = to_video_device(class);
00068     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00069 
00070     return sprintf(buf, "%d\n", dev->release);
00071 }
00072 
00073 
00083 static ssize_t show_videostatus(struct device *class, struct device_attribute *attr, char *buf)
00084 {
00085     struct video_device *vdev = to_video_device(class);
00086     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00087 
00088     return sprintf(buf,
00089             "Nbr ISOC errors    : %d\n"
00090             "Nbr dropped frames : %d\n"
00091             "Nbr dumped frames  : %d\n",
00092             dev->visoc_errors,
00093             dev->vframes_error,
00094             dev->vframes_dumped);
00095 }
00096 
00097 
00107 static ssize_t show_informations(struct device *class, struct device_attribute *attr, char *buf)
00108 {
00109     int width, height;
00110     char *pixelfmt = NULL;
00111 
00112     struct video_device *vdev = to_video_device(class);
00113     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00114 
00115     char *palette_rgb24 = "RGB24 - RGB-8-8-8 - 24 bits";
00116     char *palette_rgb32 = "RGB32 - RGB-8-8-8-8 - 32 bits";
00117     char *palette_bgr24 = "BGR24 - BGR-8-8-8 - 24 bits";
00118     char *palette_bgr32 = "BGR32 - BGR-8-8-8-8 - 32 bits";
00119     char *palette_uyvy = "UYVY - YUV 4:2:2 - 16 bits";
00120     char *palette_yuyv = "YUYV - YUV 4:2:2 - 16 bits";
00121 
00122 
00123     switch (dev->vsettings.palette) {
00124         case STK11XX_PALETTE_RGB24:
00125             pixelfmt = palette_rgb24;
00126             break;
00127 
00128         case STK11XX_PALETTE_RGB32:
00129             pixelfmt = palette_rgb32;
00130             break;
00131 
00132         case STK11XX_PALETTE_BGR24:
00133             pixelfmt = palette_bgr24;
00134             break;
00135 
00136         case STK11XX_PALETTE_BGR32:
00137             pixelfmt = palette_bgr32;
00138             break;
00139 
00140         case STK11XX_PALETTE_UYVY:
00141             pixelfmt = palette_uyvy;
00142             break;
00143 
00144         case STK11XX_PALETTE_YUYV:
00145             pixelfmt = palette_yuyv;
00146             break;
00147     }
00148 
00149     switch (dev->resolution) {
00150         case STK11XX_80x60:
00151         case STK11XX_128x96:
00152         case STK11XX_160x120:
00153         case STK11XX_213x160:
00154         case STK11XX_320x240:
00155         case STK11XX_640x480:
00156             width = stk11xx_image_sizes[STK11XX_640x480].x;
00157             height = stk11xx_image_sizes[STK11XX_640x480].y;
00158             break;
00159 
00160         case STK11XX_800x600:
00161         case STK11XX_1024x768:
00162         case STK11XX_1280x1024:
00163             width = stk11xx_image_sizes[STK11XX_1280x1024].x;
00164             height = stk11xx_image_sizes[STK11XX_1280x1024].y;
00165             break;
00166 
00167         default:
00168             width = 0;
00169             height = 0;
00170     }
00171 
00172     return sprintf(buf,
00173             "Asked resolution  : %dx%d\n"
00174             "Driver resolution : %dx%d\n"
00175             "Webcam resolution : %dx%d\n"
00176             "\n"
00177             "%s\n"
00178             "\n"
00179             "Brightness        : 0x%X\n"
00180             "Contrast          : 0x%X\n"
00181             "Whiteness         : 0x%X\n"
00182             "Colour            : 0x%X\n",
00183             dev->view.x, dev->view.y,
00184             stk11xx_image_sizes[dev->resolution].x, stk11xx_image_sizes[dev->resolution].y,
00185             width, height,
00186             pixelfmt,
00187             0xFFFF & dev->vsettings.brightness,
00188             0xFFFF & dev->vsettings.contrast,
00189             0xFFFF & dev->vsettings.whiteness,
00190             0xFFFF & dev->vsettings.colour);
00191 }
00192 
00193 
00203 static ssize_t show_fps(struct device *class, struct device_attribute *attr, char *buf)
00204 {
00205     struct video_device *vdev = to_video_device(class);
00206     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00207 
00208     return sprintf(buf, "%d\n", dev->vsettings.fps);
00209 }
00210 
00211 
00221 static ssize_t show_brightness(struct device *class, struct device_attribute *attr, char *buf)
00222 {
00223     struct video_device *vdev = to_video_device(class);
00224     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00225 
00226     return sprintf(buf, "%X\n", dev->vsettings.brightness);
00227 }
00228 
00229 
00239 static ssize_t store_brightness(struct device *class, struct device_attribute *attr, 
00240         const char *buf, size_t count)
00241 {
00242     char *endp;
00243     unsigned long value;
00244 
00245     struct video_device *vdev = to_video_device(class);
00246     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00247 
00248     value = simple_strtoul(buf, &endp, 16);
00249 
00250     dev->vsettings.brightness = (int) value;
00251 
00252     dev_stk11xx_set_camera_quality(dev);
00253 
00254     return strlen(buf);
00255 }
00256 
00266 static ssize_t show_contrast(struct device *class, struct device_attribute *attr, char *buf)
00267 {
00268     struct video_device *vdev = to_video_device(class);
00269     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00270 
00271     return sprintf(buf, "%X\n", dev->vsettings.contrast);
00272 }
00273 
00274 
00284 static ssize_t store_contrast(struct device *class, struct device_attribute *attr,
00285         const char *buf, size_t count)
00286 {
00287     char *endp;
00288     unsigned long value;
00289 
00290     struct video_device *vdev = to_video_device(class);
00291     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00292 
00293     value = simple_strtoul(buf, &endp, 16);
00294 
00295     dev->vsettings.contrast = (int) value;
00296 
00297     dev_stk11xx_set_camera_quality(dev);
00298 
00299     return strlen(buf);
00300 }
00301 
00302 
00312 static ssize_t show_whitebalance(struct device *class, struct device_attribute *attr, char *buf)
00313 {
00314     struct video_device *vdev = to_video_device(class);
00315     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00316 
00317     return sprintf(buf, "%X\n", dev->vsettings.whiteness);
00318 }
00319 
00320 
00330 static ssize_t store_whitebalance(struct device *class, struct device_attribute *attr,
00331         const char *buf, size_t count)
00332 {
00333     char *endp;
00334     unsigned long value;
00335 
00336     struct video_device *vdev = to_video_device(class);
00337     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00338 
00339     value = simple_strtoul(buf, &endp, 16);
00340 
00341     dev->vsettings.whiteness = (int) value;
00342 
00343     dev_stk11xx_set_camera_quality(dev);
00344 
00345     return strlen(buf);
00346 }
00347 
00348 
00358 static ssize_t show_colour(struct device *class, struct device_attribute *attr, char *buf)
00359 {
00360     struct video_device *vdev = to_video_device(class);
00361     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00362 
00363     return sprintf(buf, "%X\n", dev->vsettings.colour);
00364 }
00365 
00366 
00376 static ssize_t store_colour(struct device *class, struct device_attribute *attr,
00377         const char *buf, size_t count)
00378 {
00379     char *endp;
00380     unsigned long value;
00381 
00382     struct video_device *vdev = to_video_device(class);
00383     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00384 
00385     value = simple_strtoul(buf, &endp, 16);
00386 
00387     dev->vsettings.colour = (int) value;
00388 
00389     dev_stk11xx_set_camera_quality(dev);
00390 
00391     return strlen(buf);
00392 }
00393 
00394 
00404 static ssize_t show_hflip(struct device *class, struct device_attribute *attr, char *buf)
00405 {
00406     struct video_device *vdev = to_video_device(class);
00407     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00408 
00409     return sprintf(buf, "%d\n", dev->vsettings.hflip);
00410 }
00411 
00412 
00422 static ssize_t store_hflip(struct device *class, struct device_attribute *attr,
00423         const char *buf, size_t count)
00424 {
00425     struct video_device *vdev = to_video_device(class);
00426     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00427 
00428     if (strncmp(buf, "1", 1) == 0)
00429         dev->vsettings.hflip = 1;
00430     else if (strncmp(buf, "0", 1) == 0)
00431         dev->vsettings.hflip = 0;
00432     else
00433         return -EINVAL;
00434 
00435     return strlen(buf);
00436 }
00437 
00438 
00448 static ssize_t show_vflip(struct device *class, struct device_attribute *attr, char *buf)
00449 {
00450     struct video_device *vdev = to_video_device(class);
00451     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00452 
00453     return sprintf(buf, "%d\n", dev->vsettings.vflip);
00454 }
00455 
00456 
00466 static ssize_t store_vflip(struct device *class, struct device_attribute *attr, const char *buf, size_t count)
00467 {
00468     struct video_device *vdev = to_video_device(class);
00469     struct usb_stk11xx *dev = video_get_drvdata(vdev);
00470 
00471     if (strncmp(buf, "1", 1) == 0)
00472         dev->vsettings.vflip = 1;
00473     else if (strncmp(buf, "0", 1) == 0)
00474         dev->vsettings.vflip = 0;
00475     else
00476         return -EINVAL;
00477 
00478     return strlen(buf);
00479 }
00480 
00481 
00482 static DEVICE_ATTR(release, S_IRUGO, show_release, NULL);                                           
00483 static DEVICE_ATTR(videostatus, S_IRUGO, show_videostatus, NULL);                                   
00484 static DEVICE_ATTR(informations, S_IRUGO, show_informations, NULL);                                 
00485 static DEVICE_ATTR(fps, S_IRUGO, show_fps, NULL);                                                   
00486 static DEVICE_ATTR(brightness, S_IRUGO | S_IWUGO, show_brightness, store_brightness);               
00487 static DEVICE_ATTR(contrast, S_IRUGO | S_IWUGO, show_contrast, store_contrast);                     
00488 static DEVICE_ATTR(whitebalance, S_IRUGO | S_IWUGO, show_whitebalance, store_whitebalance);         
00489 static DEVICE_ATTR(colour, S_IRUGO | S_IWUGO, show_colour, store_colour);                           
00490 static DEVICE_ATTR(hflip, S_IRUGO | S_IWUGO, show_hflip, store_hflip);                              
00491 static DEVICE_ATTR(vflip, S_IRUGO | S_IWUGO, show_vflip, store_vflip);                              
00503 int stk11xx_create_sysfs_files(struct video_device *vdev)
00504 {
00505     int ret;
00506 
00507     ret = device_create_file(&vdev->dev, &dev_attr_release);
00508     ret = device_create_file(&vdev->dev, &dev_attr_videostatus);
00509     ret = device_create_file(&vdev->dev, &dev_attr_informations);
00510     ret = device_create_file(&vdev->dev, &dev_attr_fps);
00511     ret = device_create_file(&vdev->dev, &dev_attr_brightness);
00512     ret = device_create_file(&vdev->dev, &dev_attr_contrast);
00513     ret = device_create_file(&vdev->dev, &dev_attr_whitebalance);
00514     ret = device_create_file(&vdev->dev, &dev_attr_colour);
00515     ret = device_create_file(&vdev->dev, &dev_attr_hflip);
00516     ret = device_create_file(&vdev->dev, &dev_attr_vflip);
00517 
00518     return ret;
00519 }
00520 
00521 
00531 void stk11xx_remove_sysfs_files(struct video_device *vdev)
00532 {
00533     device_remove_file(&vdev->dev, &dev_attr_release);
00534     device_remove_file(&vdev->dev, &dev_attr_videostatus);
00535     device_remove_file(&vdev->dev, &dev_attr_informations);
00536     device_remove_file(&vdev->dev, &dev_attr_fps);
00537     device_remove_file(&vdev->dev, &dev_attr_brightness);
00538     device_remove_file(&vdev->dev, &dev_attr_contrast);
00539     device_remove_file(&vdev->dev, &dev_attr_whitebalance);
00540     device_remove_file(&vdev->dev, &dev_attr_colour);
00541     device_remove_file(&vdev->dev, &dev_attr_hflip);
00542     device_remove_file(&vdev->dev, &dev_attr_vflip);
00543 }
00544