cia a tutti, ho una bellissima webcam trovata nella patatine che mi piacerebbe fare funzionare sotto linux. Si tratta di una Cpia webcam che riesco a fare funzionare persino con osx e driver opensource.
sotto linux invece in dmesg trovo questo: ======================================================= inux video capture interface: v1.00 V4L-Driver for Vision CPiA based cameras v1.2.3 Since in-kernel colorspace conversion is not allowed, it is disabled by default now. Users should fix the applications in case they don't work without conversion reenabled by setting the 'colorspace_conv' module parameter to 1<6>USB driver for Vision CPiA based cameras v1.2.3 USB CPiA camera found videodev: "CPiA Camera" has no release callback. Please fix your driver for proper sysfs support, see http://lwn.net/Articles/36850/ CPiA Version: 1.33 (2.10) CPiA PnP-ID: 0553:0002:0106 VP-Version: 1.0 0100 usbcore: registered new driver cpia ======================================================= ho letto l'articolo indicato nel log, ma non ci ho capito un granchè su come risolvere il mio problema indi ho cercato in google ed ho trovato questa patch http://www.thisishull.net/showthread.php?t=27137 ma come la applico 'sta patch?? Tutte le volte mi da: debian:/usr/src/linux# patch -p0 < cpia_diff patching file ./drivers/media/video/cpia.c patch: **** malformed patch at line 4: if (!cpia_proc_root || !cam) allego la patch ne caso volgiate provare ciao MaX
--- ./drivers/media/video/cpia.c.org 2004-05-10 04:32:54.000000000 +0200 +++ ./drivers/media/video/cpia.c 2004-07-08 23:57:20.061174852 +0200 @@ -1368,7 +1368,7 @@ if (!cpia_proc_root || !cam) return; - sprintf(name, "video%d", cam->vdev.minor); + sprintf(name, "video%d", cam->vdev->minor); ent = create_proc_entry(name, S_IFREG|S_IRUGO|S_IWUSR, cpia_proc_root); if (!ent) @@ -1393,7 +1393,7 @@ if (!cam || !cam->proc_entry) return; - sprintf(name, "video%d", cam->vdev.minor); + sprintf(name, "video%d", cam->vdev->minor); remove_proc_entry(name, cpia_proc_root); cam->proc_entry = NULL; } @@ -3710,7 +3710,7 @@ DBG("VIDIOCGUNIT\n"); - vu->video = cam->vdev.minor; + vu->video = cam->vdev->minor; vu->vbi = VIDEO_NO_UNIT; vu->radio = VIDEO_NO_UNIT; vu->audio = VIDEO_NO_UNIT; @@ -3804,6 +3804,14 @@ return 0; } + +void cpia_video_release(struct video_device *vfd) +{ + struct cam_data *cam = vfd->priv; + down(&cam->busy_lock); + video_device_release(vfd); +} + static struct file_operations cpia_fops = { .owner = THIS_MODULE, .open = cpia_open, @@ -3820,6 +3828,8 @@ .type = VID_TYPE_CAPTURE, .hardware = VID_HARDWARE_CPIA, .fops = &cpia_fops, + .release = cpia_video_release, + .minor = -1, }; /* initialise cam_data structure */ @@ -3930,7 +3940,7 @@ } /* initialize cam_data structure */ -static void init_camera_struct(struct cam_data *cam, +static int init_camera_struct(struct cam_data *cam, struct cpia_camera_ops *ops ) { int i; @@ -3946,8 +3956,13 @@ cam->proc_entry = NULL; - memcpy(&cam->vdev, &cpia_template, sizeof(cpia_template)); - cam->vdev.priv = cam; + cam->vdev = video_device_alloc(); + if (!cam->vdev) { + printk(KERN_ERR "cpia: video_device_alloc() failed!\n"); + return -ENOMEM; + } + memcpy(cam->vdev, &cpia_template, sizeof(cpia_template)); + cam->vdev->priv = cam; cam->curframe = 0; for (i = 0; i < FRAME_NUM; i++) { @@ -3960,6 +3975,7 @@ cam->decompressed_frame.height = 0; cam->decompressed_frame.state = FRAME_UNUSED; cam->decompressed_frame.data = NULL; + return 0; } struct cam_data *cpia_register_camera(struct cpia_camera_ops *ops, void *lowlevel) @@ -3970,11 +3986,14 @@ return NULL; - init_camera_struct( camera, ops ); + if (init_camera_struct( camera, ops )) { + kfree(camera); + return NULL; + } camera->lowlevel_data = lowlevel; /* register v4l device */ - if (video_register_device(&camera->vdev, VFL_TYPE_GRABBER, video_nr) == -1) { + if (video_register_device(camera->vdev, VFL_TYPE_GRABBER, video_nr) == -1) { kfree(camera); printk(KERN_DEBUG "video_register_device failed\n"); return NULL; @@ -4019,7 +4038,7 @@ void cpia_unregister_camera(struct cam_data *cam) { DBG("unregistering video\n"); - video_unregister_device(&cam->vdev); + video_unregister_device(cam->vdev); if (cam->open_count) { put_cam(cam->ops); DBG("camera open -- setting ops to NULL\n"); @@ -4027,7 +4046,7 @@ } #ifdef CONFIG_PROC_FS - DBG("destroying /proc/cpia/video%d\n", cam->vdev.minor); + DBG("destroying /proc/cpia/video%d\n", cam->vdev->minor); destroy_proc_cpia_cam(cam); #endif if (!cam->open_count) { --- ./drivers/media/video/cpia.h.org 2004-05-10 04:33:19.000000000 +0200 +++ ./drivers/media/video/cpia.h 2004-07-08 23:47:39.295359761 +0200 @@ -268,7 +268,7 @@ /* v4l */ int video_size; /* VIDEO_SIZE_ */ volatile enum v4l_camstates camstate; /* v4l layer status */ - struct video_device vdev; /* v4l videodev */ + struct video_device *vdev; /* v4l videodev */ struct video_picture vp; /* v4l camera settings */ struct video_window vw; /* v4l capture area */ struct video_capture vc; /* v4l subcapture area */