* [PATCH 0/12] meye driver update
@ 2004-11-04 11:12 Stelian Pop
2004-11-04 11:13 ` [PATCH 1/12] meye: module related fixes Stelian Pop
` (13 more replies)
0 siblings, 14 replies; 26+ messages in thread
From: Stelian Pop @ 2004-11-04 11:12 UTC (permalink / raw)
To: Linux Kernel Mailing List; +Cc: Linus Torvalds, Andrew Morton
Hi,
Please find attached a collection of patches updating the meye driver
to the latest version.
The main changes in these patches are:
- migrate to module_param();
- implement the V4L2 API in addition to V4L1
- many code, whitespace and coding style cleanups
Full changelog below, the patches will be send as followups to this one.
Please apply.
Thanks,
Stelian.
PATCH 1/12: meye: module related fixes
* use module_param() instead of MODULE_PARM() and __setup()
* use MODULE_VERSION()
PATCH 2/12: meye: replace homebrew queue with kfifo
PATCH 3/12: meye: picture depth is in bits not in bytes
PATCH 4/12: meye: do lock properly when waiting for buffers
PATCH 5/12: meye: implement non blocking access using poll()
PATCH 6/12: meye: cleanup init/exit paths
PATCH 7/12: meye: the driver is no longer experimental and depends on PCI
PATCH 8/12: meye: module parameters documentation fixes
PATCH 9/12: meye: add v4l2 support
PATCH 10/12: meye: whitespace and coding style cleanups
PATCH 11/12: meye: bump up the version number
PATCH 12/12: meye: retrieving the current settings from the camera does not work
very well, we need to cache the values in the driver
--
Stelian Pop <stelian@popies.net>
^ permalink raw reply [flat|nested] 26+ messages in thread* [PATCH 1/12] meye: module related fixes 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop @ 2004-11-04 11:13 ` Stelian Pop 2004-11-04 11:13 ` [PATCH 2/12] meye: replace homebrew queue with kfifo Stelian Pop ` (12 subsequent siblings) 13 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:13 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2340, 2004-11-02 15:03:36+01:00, stelian@popies.net meye: module related fixes * use module_param() instead of MODULE_PARM() and __setup() * use MODULE_VERSION() Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== meye.c | 61 ++++++++++++++++++++++--------------------------------------- meye.h | 3 +++ 2 files changed, 25 insertions(+), 39 deletions(-) =================================================================== diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c --- a/drivers/media/video/meye.c 2004-11-04 11:03:16 +01:00 +++ b/drivers/media/video/meye.c 2004-11-04 11:03:16 +01:00 @@ -39,16 +39,31 @@ #include <linux/vmalloc.h> #include "meye.h" -#include "linux/meye.h" +#include <linux/meye.h> + +MODULE_AUTHOR("Stelian Pop <stelian@popies.net>"); +MODULE_DESCRIPTION("v4l/v4l2 driver for the MotionEye camera"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(MEYE_DRIVER_VERSION); -/* driver structure - only one possible */ -static struct meye meye; /* number of grab buffers */ static unsigned int gbuffers = 2; +module_param(gbuffers, int, 0444); +MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)"); + /* size of a grab buffer */ static unsigned int gbufsize = MEYE_MAX_BUFSIZE; +module_param(gbufsize, int, 0444); +MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400" + " (will be rounded up to a page multiple)"); + /* /dev/videoX registration number */ static int video_nr = -1; +module_param(video_nr, int, 0444); +MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)"); + +/* driver structure - only one possible */ +static struct meye meye; /****************************************************************************/ /* Queue routines */ @@ -1438,7 +1453,7 @@ #endif }; -static int __init meye_init_module(void) { +static int __init meye_init(void) { if (gbuffers < 2) gbuffers = 2; if (gbuffers > MEYE_MAX_BUFNBRS) @@ -1450,42 +1465,10 @@ return pci_module_init(&meye_driver); } -static void __exit meye_cleanup_module(void) { +static void __exit meye_exit(void) { pci_unregister_driver(&meye_driver); } -#ifndef MODULE -static int __init meye_setup(char *str) { - int ints[4]; - - str = get_options(str, ARRAY_SIZE(ints), ints); - if (ints[0] <= 0) - goto out; - gbuffers = ints[1]; - if (ints[0] == 1) - goto out; - gbufsize = ints[2]; - if (ints[0] == 2) - goto out; - video_nr = ints[3]; -out: - return 1; -} - -__setup("meye=", meye_setup); -#endif - -MODULE_AUTHOR("Stelian Pop <stelian@popies.net>"); -MODULE_DESCRIPTION("video4linux driver for the MotionEye camera"); -MODULE_LICENSE("GPL"); - -MODULE_PARM(gbuffers,"i"); -MODULE_PARM_DESC(gbuffers,"number of capture buffers, default is 2 (32 max)"); -MODULE_PARM(gbufsize,"i"); -MODULE_PARM_DESC(gbufsize,"size of the capture buffers, default is 614400"); -MODULE_PARM(video_nr,"i"); -MODULE_PARM_DESC(video_nr,"video device to register (0=/dev/video0, etc)"); - /* Module entry points */ -module_init(meye_init_module); -module_exit(meye_cleanup_module); +module_init(meye_init); +module_exit(meye_exit); diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h --- a/drivers/media/video/meye.h 2004-11-04 11:03:16 +01:00 +++ b/drivers/media/video/meye.h 2004-11-04 11:03:16 +01:00 @@ -33,6 +33,9 @@ #define MEYE_DRIVER_MAJORVERSION 1 #define MEYE_DRIVER_MINORVERSION 10 +#define MEYE_DRIVER_VERSION __stringify(MEYE_DRIVER_MAJORVERSION) "." \ + __stringify(MEYE_DRIVER_MINORVERSION) + #include <linux/config.h> #include <linux/types.h> #include <linux/pci.h> ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 2/12] meye: replace homebrew queue with kfifo 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop 2004-11-04 11:13 ` [PATCH 1/12] meye: module related fixes Stelian Pop @ 2004-11-04 11:13 ` Stelian Pop 2004-11-04 11:14 ` [PATCH 3/12] meye: picture depth is in bits not in bytes Stelian Pop ` (11 subsequent siblings) 13 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:13 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2341, 2004-11-02 15:37:50+01:00, stelian@popies.net meye: replace homebrew queue with kfifo Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== meye.c | 201 +++++++++++++++++++++++++++++------------------------------------ meye.h | 18 ++--- 2 files changed, 99 insertions(+), 120 deletions(-) =================================================================== diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c --- a/drivers/media/video/meye.c 2004-11-04 11:17:30 +01:00 +++ b/drivers/media/video/meye.c 2004-11-04 11:17:30 +01:00 @@ -66,68 +66,6 @@ static struct meye meye; /****************************************************************************/ -/* Queue routines */ -/****************************************************************************/ - -/* Inits the queue */ -static inline void meye_initq(struct meye_queue *queue) { - queue->head = queue->tail = 0; - queue->len = 0; - queue->s_lock = SPIN_LOCK_UNLOCKED; - init_waitqueue_head(&queue->proc_list); -} - -/* Pulls an element from the queue */ -static inline int meye_pullq(struct meye_queue *queue) { - int result; - unsigned long flags; - - spin_lock_irqsave(&queue->s_lock, flags); - if (!queue->len) { - spin_unlock_irqrestore(&queue->s_lock, flags); - return -1; - } - result = queue->buf[queue->head]; - queue->head++; - queue->head &= (MEYE_QUEUE_SIZE - 1); - queue->len--; - spin_unlock_irqrestore(&queue->s_lock, flags); - return result; -} - -/* Pushes an element into the queue */ -static inline void meye_pushq(struct meye_queue *queue, int element) { - unsigned long flags; - - spin_lock_irqsave(&queue->s_lock, flags); - if (queue->len == MEYE_QUEUE_SIZE) { - /* remove the first element */ - queue->head++; - queue->head &= (MEYE_QUEUE_SIZE - 1); - queue->len--; - } - queue->buf[queue->tail] = element; - queue->tail++; - queue->tail &= (MEYE_QUEUE_SIZE - 1); - queue->len++; - - spin_unlock_irqrestore(&queue->s_lock, flags); -} - -/* Tests if the queue is empty */ -static inline int meye_emptyq(struct meye_queue *queue, int *elem) { - int result; - unsigned long flags; - - spin_lock_irqsave(&queue->s_lock, flags); - result = (queue->len == 0); - if (!result && elem) - *elem = queue->buf[queue->head]; - spin_unlock_irqrestore(&queue->s_lock, flags); - return result; -} - -/****************************************************************************/ /* Memory allocation routines (stolen from bttv-driver.c) */ /****************************************************************************/ static void *rvmalloc(unsigned long size) { @@ -839,54 +777,54 @@ /****************************************************************************/ /* Interrupt handling */ /****************************************************************************/ - -static irqreturn_t meye_irq(int irq, void *dev_id, struct pt_regs *regs) { +static irqreturn_t meye_irq(int irq, void *dev_id, struct pt_regs *regs) +{ u32 v; int reqnr; v = mchip_read(MCHIP_MM_INTA); - while (1) { - v = mchip_get_frame(); - if (!(v & MCHIP_MM_FIR_RDY)) - return IRQ_NONE; - switch (meye.mchip_mode) { - - case MCHIP_HIC_MODE_CONT_OUT: - if (!meye_emptyq(&meye.grabq, NULL)) { - int nr = meye_pullq(&meye.grabq); - mchip_cont_read_frame( - v, - meye.grab_fbuffer + gbufsize * nr, - mchip_hsize() * mchip_vsize() * 2); - meye.grab_buffer[nr].state = MEYE_BUF_DONE; - wake_up_interruptible(&meye.grabq.proc_list); - } - break; - - case MCHIP_HIC_MODE_CONT_COMP: - if (!meye_emptyq(&meye.grabq, &reqnr)) { - int size; - size = mchip_comp_read_frame( - v, - meye.grab_fbuffer + gbufsize * reqnr, - gbufsize); - if (size == -1) - break; - reqnr = meye_pullq(&meye.grabq); - meye.grab_buffer[reqnr].size = size; - meye.grab_buffer[reqnr].state = MEYE_BUF_DONE; - wake_up_interruptible(&meye.grabq.proc_list); - } - break; - - default: - /* do not free frame, since it can be a snap */ - return IRQ_NONE; - } /* switch */ - - mchip_free_frame(); + if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT && + meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP) + return IRQ_NONE; + +again: + v = mchip_get_frame(); + if (!(v & MCHIP_MM_FIR_RDY)) + return IRQ_HANDLED; + + if (meye.mchip_mode == MCHIP_HIC_MODE_CONT_OUT) { + if (kfifo_get(meye.grabq, (unsigned char *)&reqnr, + sizeof(int)) != sizeof(int)) { + mchip_free_frame(); + return IRQ_HANDLED; + } + mchip_cont_read_frame(v, meye.grab_fbuffer + gbufsize * reqnr, + mchip_hsize() * mchip_vsize() * 2); + meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2; + meye.grab_buffer[reqnr].state = MEYE_BUF_DONE; + kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int)); + wake_up_interruptible(&meye.proc_list); + } else { + int size; + size = mchip_comp_read_frame(v, meye.grab_temp, gbufsize); + if (size == -1) { + mchip_free_frame(); + goto again; + } + if (kfifo_get(meye.grabq, (unsigned char *)&reqnr, + sizeof(int)) != sizeof(int)) { + mchip_free_frame(); + goto again; + } + memcpy(meye.grab_fbuffer + gbufsize * reqnr, meye.grab_temp, + size); + meye.grab_buffer[reqnr].size = size; + meye.grab_buffer[reqnr].state = MEYE_BUF_DONE; + kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int)); + wake_up_interruptible(&meye.proc_list); } - return IRQ_HANDLED; + mchip_free_frame(); + goto again; } /****************************************************************************/ @@ -906,9 +844,12 @@ return -ENOBUFS; } mchip_hic_stop(); - meye_initq(&meye.grabq); + for (i = 0; i < MEYE_MAX_BUFNBRS; i++) meye.grab_buffer[i].state = MEYE_BUF_UNUSED; + kfifo_reset(meye.grabq); + kfifo_reset(meye.doneq); + return 0; } @@ -983,6 +924,7 @@ case VIDIOCSYNC: { int *i = arg; + int unused; if (*i < 0 || *i >= gbuffers) return -EINVAL; @@ -992,12 +934,13 @@ case MEYE_BUF_UNUSED: return -EINVAL; case MEYE_BUF_USING: - if (wait_event_interruptible(meye.grabq.proc_list, + if (wait_event_interruptible(meye.proc_list, (meye.grab_buffer[*i].state != MEYE_BUF_USING))) return -EINTR; /* fall through */ case MEYE_BUF_DONE: meye.grab_buffer[*i].state = MEYE_BUF_UNUSED; + kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int)); } break; } @@ -1038,7 +981,7 @@ if (restart || meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT) mchip_continuous_start(); meye.grab_buffer[vm->frame].state = MEYE_BUF_USING; - meye_pushq(&meye.grabq, vm->frame); + kfifo_put(meye.grabq, (unsigned char *)&vm->frame, sizeof(int)); up(&meye.lock); break; } @@ -1104,13 +1047,14 @@ if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP) mchip_cont_compression_start(); meye.grab_buffer[*nb].state = MEYE_BUF_USING; - meye_pushq(&meye.grabq, *nb); + kfifo_put(meye.grabq, (unsigned char *)nb, sizeof(int)); up(&meye.lock); break; } case MEYEIOC_SYNC: { int *i = arg; + int unused; if (*i < 0 || *i >= gbuffers) return -EINVAL; @@ -1120,12 +1064,13 @@ case MEYE_BUF_UNUSED: return -EINVAL; case MEYE_BUF_USING: - if (wait_event_interruptible(meye.grabq.proc_list, + if (wait_event_interruptible(meye.proc_list, (meye.grab_buffer[*i].state != MEYE_BUF_USING))) return -EINTR; /* fall through */ case MEYE_BUF_DONE: meye.grab_buffer[*i].state = MEYE_BUF_UNUSED; + kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int)); } *i = meye.grab_buffer[*i].size; break; @@ -1290,6 +1235,29 @@ ret = -EBUSY; goto out1; } + + ret = -ENOMEM; + meye.grab_temp = vmalloc(MCHIP_NB_PAGES_MJPEG * PAGE_SIZE); + if (!meye.grab_temp) { + printk(KERN_ERR "meye: grab buffer allocation failed\n"); + goto outvmalloc; + } + + meye.grabq_lock = SPIN_LOCK_UNLOCKED; + meye.grabq = kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL, + &meye.grabq_lock); + if (IS_ERR(meye.grabq)) { + printk(KERN_ERR "meye: fifo allocation failed\n"); + goto outkfifoalloc1; + } + meye.doneq_lock = SPIN_LOCK_UNLOCKED; + meye.doneq = kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL, + &meye.doneq_lock); + if (IS_ERR(meye.doneq)) { + printk(KERN_ERR "meye: fifo allocation failed\n"); + goto outkfifoalloc2; + } + memcpy(meye.video_dev, &meye_template, sizeof(meye_template)); meye.video_dev->dev = &meye.mchip_dev->dev; @@ -1365,6 +1333,7 @@ /* init all fields */ init_MUTEX(&meye.lock); + init_waitqueue_head(&meye.proc_list); meye.picture.depth = 2; meye.picture.palette = VIDEO_PALETTE_YUV422; @@ -1402,6 +1371,13 @@ meye.video_dev = NULL; sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0); + kfifo_free(meye.doneq); +outkfifoalloc2: + kfifo_free(meye.grabq); +outkfifoalloc1: + vfree(meye.grab_temp); +outvmalloc: + video_device_release(meye.video_dev); out1: return ret; } @@ -1430,6 +1406,11 @@ rvfree(meye.grab_fbuffer, gbuffers*gbufsize); sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0); + + kfifo_free(meye.doneq); + kfifo_free(meye.grabq); + + vfree(meye.grab_temp); printk(KERN_INFO "meye: removed\n"); } diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h --- a/drivers/media/video/meye.h 2004-11-04 11:17:30 +01:00 +++ b/drivers/media/video/meye.h 2004-11-04 11:17:30 +01:00 @@ -39,6 +39,7 @@ #include <linux/config.h> #include <linux/types.h> #include <linux/pci.h> +#include <linux/kfifo.h> /****************************************************************************/ /* Motion JPEG chip registers */ @@ -280,16 +281,8 @@ unsigned long size; /* size of jpg frame */ }; -/* queues containing the buffer indices */ +/* size of kfifos containings buffer indices */ #define MEYE_QUEUE_SIZE MEYE_MAX_BUFNBRS -struct meye_queue { - unsigned int head; /* queue head */ - unsigned int tail; /* queue tail */ - unsigned int len; /* queue length */ - spinlock_t s_lock; /* spinlock protecting the queue */ - wait_queue_head_t proc_list; /* wait queue */ - int buf[MEYE_QUEUE_SIZE]; /* queue contents */ -}; /* Motion Eye device structure */ struct meye { @@ -306,13 +299,18 @@ dma_addr_t mchip_dmahandle; /* mchip: dma handle to ptable toc */ unsigned char *grab_fbuffer; /* capture framebuffer */ + unsigned char *grab_temp; /* temporary buffer */ /* list of buffers */ struct meye_grab_buffer grab_buffer[MEYE_MAX_BUFNBRS]; /* other */ struct semaphore lock; /* semaphore for open/mmap... */ - struct meye_queue grabq; /* queue for buffers to be grabbed */ + struct kfifo *grabq; /* queue for buffers to be grabbed */ + spinlock_t grabq_lock; /* lock protecting the queue */ + struct kfifo *doneq; /* queue for grabbed buffers */ + spinlock_t doneq_lock; /* lock protecting the queue */ + wait_queue_head_t proc_list; /* wait queue */ struct video_device *video_dev; /* video device parameters */ struct video_picture picture; /* video picture parameters */ ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 3/12] meye: picture depth is in bits not in bytes 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop 2004-11-04 11:13 ` [PATCH 1/12] meye: module related fixes Stelian Pop 2004-11-04 11:13 ` [PATCH 2/12] meye: replace homebrew queue with kfifo Stelian Pop @ 2004-11-04 11:14 ` Stelian Pop 2004-11-04 11:14 ` [PATCH 4/12] meye: do lock properly when waiting for buffers Stelian Pop ` (10 subsequent siblings) 13 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:14 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2342, 2004-11-02 15:41:24+01:00, stelian@popies.net meye: picture depth is in bits not in bytes Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== meye.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) =================================================================== diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c --- a/drivers/media/video/meye.c 2004-11-04 11:20:03 +01:00 +++ b/drivers/media/video/meye.c 2004-11-04 11:20:03 +01:00 @@ -904,7 +904,7 @@ case VIDIOCSPICT: { struct video_picture *p = arg; - if (p->depth != 2) + if (p->depth != 16) return -EINVAL; if (p->palette != VIDEO_PALETTE_YUV422) return -EINVAL; @@ -1335,7 +1335,7 @@ init_MUTEX(&meye.lock); init_waitqueue_head(&meye.proc_list); - meye.picture.depth = 2; + meye.picture.depth = 16; meye.picture.palette = VIDEO_PALETTE_YUV422; meye.picture.brightness = 32 << 10; meye.picture.hue = 32 << 10; ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 4/12] meye: do lock properly when waiting for buffers 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop ` (2 preceding siblings ...) 2004-11-04 11:14 ` [PATCH 3/12] meye: picture depth is in bits not in bytes Stelian Pop @ 2004-11-04 11:14 ` Stelian Pop 2004-11-04 11:15 ` [PATCH 5/12] meye: implement non blocking access using poll() Stelian Pop ` (9 subsequent siblings) 13 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:14 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2343, 2004-11-02 15:46:59+01:00, stelian@popies.net meye: do lock properly when waiting for buffers Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== meye.c | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-) =================================================================== diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c --- a/drivers/media/video/meye.c 2004-11-04 11:21:51 +01:00 +++ b/drivers/media/video/meye.c 2004-11-04 11:21:52 +01:00 @@ -929,19 +929,25 @@ if (*i < 0 || *i >= gbuffers) return -EINVAL; + down(&meye.lock); + switch (meye.grab_buffer[*i].state) { case MEYE_BUF_UNUSED: + up(&meye.lock); return -EINVAL; case MEYE_BUF_USING: if (wait_event_interruptible(meye.proc_list, - (meye.grab_buffer[*i].state != MEYE_BUF_USING))) + (meye.grab_buffer[*i].state != MEYE_BUF_USING))) { + up(&meye.lock); return -EINTR; + } /* fall through */ case MEYE_BUF_DONE: meye.grab_buffer[*i].state = MEYE_BUF_UNUSED; kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int)); } + up(&meye.lock); break; } @@ -1059,20 +1065,25 @@ if (*i < 0 || *i >= gbuffers) return -EINVAL; + down(&meye.lock); switch (meye.grab_buffer[*i].state) { case MEYE_BUF_UNUSED: + up(&meye.lock); return -EINVAL; case MEYE_BUF_USING: if (wait_event_interruptible(meye.proc_list, - (meye.grab_buffer[*i].state != MEYE_BUF_USING))) + (meye.grab_buffer[*i].state != MEYE_BUF_USING))) { + up(&meye.lock); return -EINTR; + } /* fall through */ case MEYE_BUF_DONE: meye.grab_buffer[*i].state = MEYE_BUF_UNUSED; kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int)); } *i = meye.grab_buffer[*i].size; + up(&meye.lock); break; } ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 5/12] meye: implement non blocking access using poll() 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop ` (3 preceding siblings ...) 2004-11-04 11:14 ` [PATCH 4/12] meye: do lock properly when waiting for buffers Stelian Pop @ 2004-11-04 11:15 ` Stelian Pop 2004-11-04 11:15 ` [PATCH 6/12] meye: cleanup init/exit paths Stelian Pop ` (8 subsequent siblings) 13 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:15 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2344, 2004-11-02 15:54:01+01:00, stelian@popies.net meye: implement non blocking access using poll() Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== meye.c | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+) =================================================================== diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c --- a/drivers/media/video/meye.c 2004-11-04 11:25:29 +01:00 +++ b/drivers/media/video/meye.c 2004-11-04 11:25:29 +01:00 @@ -937,6 +937,10 @@ up(&meye.lock); return -EINVAL; case MEYE_BUF_USING: + if (file->f_flags & O_NONBLOCK) { + up(&meye.lock); + return -EAGAIN; + } if (wait_event_interruptible(meye.proc_list, (meye.grab_buffer[*i].state != MEYE_BUF_USING))) { up(&meye.lock); @@ -1072,6 +1076,10 @@ up(&meye.lock); return -EINVAL; case MEYE_BUF_USING: + if (file->f_flags & O_NONBLOCK) { + up(&meye.lock); + return -EAGAIN; + } if (wait_event_interruptible(meye.proc_list, (meye.grab_buffer[*i].state != MEYE_BUF_USING))) { up(&meye.lock); @@ -1137,6 +1145,18 @@ return video_usercopy(inode, file, cmd, arg, meye_do_ioctl); } +static unsigned int meye_poll(struct file *file, poll_table *wait) +{ + unsigned int res = 0; + + down(&meye.lock); + poll_wait(file, &meye.proc_list, wait); + if (kfifo_len(meye.doneq)) + res = POLLIN | POLLRDNORM; + up(&meye.lock); + return res; +} + static int meye_mmap(struct file *file, struct vm_area_struct *vma) { unsigned long start = vma->vm_start; unsigned long size = vma->vm_end - vma->vm_start; @@ -1178,6 +1198,7 @@ .release = meye_release, .mmap = meye_mmap, .ioctl = meye_ioctl, + .poll = meye_poll, .llseek = no_llseek, }; ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 6/12] meye: cleanup init/exit paths 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop ` (4 preceding siblings ...) 2004-11-04 11:15 ` [PATCH 5/12] meye: implement non blocking access using poll() Stelian Pop @ 2004-11-04 11:15 ` Stelian Pop 2004-11-04 11:16 ` [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI Stelian Pop ` (7 subsequent siblings) 13 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:15 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2345, 2004-11-02 16:07:38+01:00, stelian@popies.net meye: cleanup init/exit paths Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== meye.c | 104 +++++++++++++++++++++++++++++------------------------------------ 1 files changed, 47 insertions(+), 57 deletions(-) =================================================================== diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c --- a/drivers/media/video/meye.c 2004-11-04 11:26:57 +01:00 +++ b/drivers/media/video/meye.c 2004-11-04 11:26:58 +01:00 @@ -837,13 +837,14 @@ err = video_exclusive_open(inode,file); if (err < 0) return err; - + + mchip_hic_stop(); + if (mchip_dma_alloc()) { printk(KERN_ERR "meye: mchip framebuffer allocation failed\n"); video_exclusive_release(inode,file); return -ENOBUFS; } - mchip_hic_stop(); for (i = 0; i < MEYE_MAX_BUFNBRS; i++) meye.grab_buffer[i].state = MEYE_BUF_UNUSED; @@ -1250,22 +1251,20 @@ static int __devinit meye_probe(struct pci_dev *pcidev, const struct pci_device_id *ent) { - int ret; + int ret = -EBUSY; unsigned long mchip_adr; u8 revision; if (meye.mchip_dev != NULL) { printk(KERN_ERR "meye: only one device allowed!\n"); - ret = -EBUSY; - goto out1; + goto outnotdev; } meye.mchip_dev = pcidev; meye.video_dev = video_device_alloc(); if (!meye.video_dev) { printk(KERN_ERR "meye: video_device_alloc() failed!\n"); - ret = -EBUSY; - goto out1; + goto outnotdev; } ret = -ENOMEM; @@ -1295,46 +1294,42 @@ sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 1); + ret = -EIO; if ((ret = pci_enable_device(meye.mchip_dev))) { printk(KERN_ERR "meye: pci_enable_device failed\n"); - goto out2; + goto outenabledev; } - meye.mchip_irq = pcidev->irq; mchip_adr = pci_resource_start(meye.mchip_dev,0); if (!mchip_adr) { printk(KERN_ERR "meye: mchip has no device base address\n"); - ret = -EIO; - goto out3; + goto outregions; } if (!request_mem_region(pci_resource_start(meye.mchip_dev, 0), - pci_resource_len(meye.mchip_dev, 0), + pci_resource_len(meye.mchip_dev, 0), "meye")) { - ret = -EIO; printk(KERN_ERR "meye: request_mem_region failed\n"); - goto out3; + goto outregions; + } + meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS); + if (!meye.mchip_mmregs) { + printk(KERN_ERR "meye: ioremap failed\n"); + goto outremap; } - pci_read_config_byte(meye.mchip_dev, PCI_REVISION_ID, &revision); - - pci_set_master(meye.mchip_dev); + meye.mchip_irq = pcidev->irq; + if (request_irq(meye.mchip_irq, meye_irq, + SA_INTERRUPT | SA_SHIRQ, "meye", meye_irq)) { + printk(KERN_ERR "meye: request_irq failed\n"); + goto outreqirq; + } + pci_read_config_byte(meye.mchip_dev, PCI_REVISION_ID, &revision); pci_write_config_byte(meye.mchip_dev, PCI_CACHE_LINE_SIZE, 8); pci_write_config_byte(meye.mchip_dev, PCI_LATENCY_TIMER, 64); - if ((ret = request_irq(meye.mchip_irq, meye_irq, - SA_INTERRUPT | SA_SHIRQ, "meye", meye_irq))) { - printk(KERN_ERR "meye: request_irq failed (ret=%d)\n", ret); - goto out4; - } + pci_set_master(meye.mchip_dev); - meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS); - if (!meye.mchip_mmregs) { - printk(KERN_ERR "meye: ioremap failed\n"); - ret = -EIO; - goto out5; - } - /* Ask the camera to perform a soft reset. */ pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1); @@ -1353,20 +1348,11 @@ if (video_register_device(meye.video_dev, VFL_TYPE_GRABBER, video_nr) < 0) { printk(KERN_ERR "meye: video_register_device failed\n"); - ret = -EIO; - goto out6; + goto outvideoreg; } - printk(KERN_INFO "meye: Motion Eye Camera Driver v%d.%d.\n", - MEYE_DRIVER_MAJORVERSION, - MEYE_DRIVER_MINORVERSION); - printk(KERN_INFO "meye: mchip KL5A72002 rev. %d, base %lx, irq %d\n", - revision, mchip_adr, meye.mchip_irq); - - /* init all fields */ init_MUTEX(&meye.lock); init_waitqueue_head(&meye.proc_list); - meye.picture.depth = 16; meye.picture.palette = VIDEO_PALETTE_YUV422; meye.picture.brightness = 32 << 10; @@ -1375,11 +1361,12 @@ meye.picture.contrast = 32 << 10; meye.picture.whiteness = 0; meye.params.subsample = 0; - meye.params.quality = 7; + meye.params.quality = 8; meye.params.sharpness = 32; meye.params.agc = 48; meye.params.picture = 0; meye.params.framerate = 0; + sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, 32); sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, 32); sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR, 32); @@ -1388,20 +1375,23 @@ sonypi_camera_command(SONYPI_COMMAND_SETCAMERAPICTURE, 0); sonypi_camera_command(SONYPI_COMMAND_SETCAMERAAGC, 48); + printk(KERN_INFO "meye: Motion Eye Camera Driver v%s.\n", + MEYE_DRIVER_VERSION); + printk(KERN_INFO "meye: mchip KL5A72002 rev. %d, base %lx, irq %d\n", + revision, mchip_adr, meye.mchip_irq); + return 0; -out6: - iounmap(meye.mchip_mmregs); -out5: + +outvideoreg: free_irq(meye.mchip_irq, meye_irq); -out4: +outreqirq: + iounmap(meye.mchip_mmregs); +outremap: release_mem_region(pci_resource_start(meye.mchip_dev, 0), pci_resource_len(meye.mchip_dev, 0)); -out3: +outregions: pci_disable_device(meye.mchip_dev); -out2: - video_device_release(meye.video_dev); - meye.video_dev = NULL; - +outenabledev: sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0); kfifo_free(meye.doneq); outkfifoalloc2: @@ -1410,7 +1400,7 @@ vfree(meye.grab_temp); outvmalloc: video_device_release(meye.video_dev); -out1: +outnotdev: return ret; } @@ -1434,9 +1424,6 @@ pci_disable_device(meye.mchip_dev); - if (meye.grab_fbuffer) - rvfree(meye.grab_fbuffer, gbuffers*gbufsize); - sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0); kfifo_free(meye.doneq); @@ -1444,6 +1431,11 @@ vfree(meye.grab_temp); + if (meye.grab_fbuffer) { + rvfree(meye.grab_fbuffer, gbuffers*gbufsize); + meye.grab_fbuffer = NULL; + } + printk(KERN_INFO "meye: removed\n"); } @@ -1467,12 +1459,10 @@ }; static int __init meye_init(void) { - if (gbuffers < 2) - gbuffers = 2; - if (gbuffers > MEYE_MAX_BUFNBRS) - gbuffers = MEYE_MAX_BUFNBRS; + gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS)); if (gbufsize < 0 || gbufsize > MEYE_MAX_BUFSIZE) gbufsize = MEYE_MAX_BUFSIZE; + gbufsize = PAGE_ALIGN(gbufsize); printk(KERN_INFO "meye: using %d buffers with %dk (%dk total) for capture\n", gbuffers, gbufsize/1024, gbuffers*gbufsize/1024); return pci_module_init(&meye_driver); ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop ` (5 preceding siblings ...) 2004-11-04 11:15 ` [PATCH 6/12] meye: cleanup init/exit paths Stelian Pop @ 2004-11-04 11:16 ` Stelian Pop 2004-11-04 11:41 ` Christoph Hellwig 2004-11-04 11:16 ` [PATCH 8/12] meye: module parameters documentation fixes Stelian Pop ` (6 subsequent siblings) 13 siblings, 1 reply; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:16 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2346, 2004-11-02 16:09:26+01:00, stelian@popies.net meye: the driver is no longer experimental and depends on PCI Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== Kconfig | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) =================================================================== diff -Nru a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig --- a/drivers/media/video/Kconfig 2004-11-04 11:28:50 +01:00 +++ b/drivers/media/video/Kconfig 2004-11-04 11:28:50 +01:00 @@ -219,8 +219,8 @@ module will be called zr36120. config VIDEO_MEYE - tristate "Sony Vaio Picturebook Motion Eye Video For Linux (EXPERIMENTAL)" - depends on VIDEO_DEV && SONYPI && !HIGHMEM64G + tristate "Sony Vaio Picturebook Motion Eye Video For Linux" + depends on VIDEO_DEV && PCI && SONYPI && !HIGHMEM64G ---help--- This is the video4linux driver for the Motion Eye camera found in the Vaio Picturebook laptops. Please read the material in ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI 2004-11-04 11:16 ` [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI Stelian Pop @ 2004-11-04 11:41 ` Christoph Hellwig 2004-11-04 11:49 ` Stelian Pop 0 siblings, 1 reply; 26+ messages in thread From: Christoph Hellwig @ 2004-11-04 11:41 UTC (permalink / raw) To: Stelian Pop, Linux Kernel Mailing List, Linus Torvalds, Andrew Morton > + depends on VIDEO_DEV && PCI && SONYPI && !HIGHMEM64G What's the problem with PAE? ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI 2004-11-04 11:41 ` Christoph Hellwig @ 2004-11-04 11:49 ` Stelian Pop 2004-11-04 12:23 ` Arjan van de Ven 0 siblings, 1 reply; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:49 UTC (permalink / raw) To: Christoph Hellwig, Linux Kernel Mailing List, Linus Torvalds, Andrew Morton On Thu, Nov 04, 2004 at 11:41:26AM +0000, Christoph Hellwig wrote: > > + depends on VIDEO_DEV && PCI && SONYPI && !HIGHMEM64G > > What's the problem with PAE? Read the source: ----------------- * NOTE: The meye device expects dma_addr_t size to be 32 bits * (the toc must be exactly 1024 entries each of them being 4 bytes * in size, the whole result being 4096 bytes). We're using here * dma_addr_t for corectness but the compilation of this driver is * disabled for HIGHMEM64G=y, where sizeof(dma_addr_t) != 4 ! ----------------- Of course, the actual hardware does exist only on C1V* Vaio Laptops, which can accept at most 256 MB RAM, so the test is there in Kconfig only to prevent 'make allyesconfig' and equivalents from spitting warnings... Stelian. -- Stelian Pop <stelian@popies.net> ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI 2004-11-04 11:49 ` Stelian Pop @ 2004-11-04 12:23 ` Arjan van de Ven 2004-11-04 12:32 ` Stelian Pop 0 siblings, 1 reply; 26+ messages in thread From: Arjan van de Ven @ 2004-11-04 12:23 UTC (permalink / raw) To: Stelian Pop Cc: Christoph Hellwig, Linux Kernel Mailing List, Linus Torvalds, Andrew Morton > Of course, the actual hardware does exist only on C1V* Vaio Laptops, > which can accept at most 256 MB RAM ... but distros enable PAE anyway for things like NX and for general reasons (distros need to support > 4Gb ram of course ;) ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI 2004-11-04 12:23 ` Arjan van de Ven @ 2004-11-04 12:32 ` Stelian Pop 2004-11-04 13:16 ` Arjan van de Ven 0 siblings, 1 reply; 26+ messages in thread From: Stelian Pop @ 2004-11-04 12:32 UTC (permalink / raw) To: Arjan van de Ven Cc: Christoph Hellwig, Linux Kernel Mailing List, Linus Torvalds, Andrew Morton On Thu, Nov 04, 2004 at 01:23:00PM +0100, Arjan van de Ven wrote: > > > Of course, the actual hardware does exist only on C1V* Vaio Laptops, > > which can accept at most 256 MB RAM > > > ... but distros enable PAE anyway for things like NX and for general > reasons (distros need to support > 4Gb ram of course ;) On a Fedora Core 2: $ grep HIGHMEM /boot/config-2.6.6-1.435 # CONFIG_NOHIGHMEM is not set CONFIG_HIGHMEM4G=y # CONFIG_HIGHMEM64G is not set CONFIG_HIGHMEM=y # CONFIG_DEBUG_HIGHMEM is not set I thought that CONFIG_HIGHMEM64G is not cost-free and thus must be enabled only when needed... Stelian. -- Stelian Pop <stelian@popies.net> ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI 2004-11-04 12:32 ` Stelian Pop @ 2004-11-04 13:16 ` Arjan van de Ven 2004-11-04 14:09 ` Stelian Pop 0 siblings, 1 reply; 26+ messages in thread From: Arjan van de Ven @ 2004-11-04 13:16 UTC (permalink / raw) To: Stelian Pop Cc: Christoph Hellwig, Linux Kernel Mailing List, Linus Torvalds, Andrew Morton > I thought that CONFIG_HIGHMEM64G is not cost-free and thus must > be enabled only when needed... having multiple kernels also isn't free... and there's a milion different config options that cost/gain performance ;) ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI 2004-11-04 13:16 ` Arjan van de Ven @ 2004-11-04 14:09 ` Stelian Pop 0 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 14:09 UTC (permalink / raw) To: Arjan van de Ven Cc: Christoph Hellwig, Linux Kernel Mailing List, Linus Torvalds, Andrew Morton On Thu, Nov 04, 2004 at 02:16:02PM +0100, Arjan van de Ven wrote: > > > I thought that CONFIG_HIGHMEM64G is not cost-free and thus must > > be enabled only when needed... > > having multiple kernels also isn't free... and there's a milion > different config options that cost/gain performance ;) What about backward compatibility ? If I understand the PAE help text correctly, a PAE enabled kernel will not boot on a processor which doesn't support PAE, like my Crusoe: processor : 0 vendor_id : GenuineTMx86 cpu family : 6 model : 4 model name : Transmeta(tm) Crusoe(tm) Processor TM5600 stepping : 3 cpu MHz : 595.597 cache size : 512 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr cx8 cmov mmx longrun bogomips : 1167.36 Stelian. -- Stelian Pop <stelian@popies.net> ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 8/12] meye: module parameters documentation fixes 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop ` (6 preceding siblings ...) 2004-11-04 11:16 ` [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI Stelian Pop @ 2004-11-04 11:16 ` Stelian Pop 2004-11-04 11:17 ` [PATCH 9/12] meye: add v4l2 support Stelian Pop ` (5 subsequent siblings) 13 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:16 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2347, 2004-11-02 16:13:47+01:00, stelian@popies.net meye: module parameters documentation fixes Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== kernel-parameters.txt | 2 +- video4linux/meye.txt | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) =================================================================== diff -Nru a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt --- a/Documentation/kernel-parameters.txt 2004-11-04 11:30:33 +01:00 +++ b/Documentation/kernel-parameters.txt 2004-11-04 11:30:33 +01:00 @@ -701,7 +701,7 @@ [KNL,ACPI] Mark specific memory as reserved. Region of memory to be used, from ss to ss+nn. - meye= [HW] Set MotionEye Camera parameters + meye.*= [HW] Set MotionEye Camera parameters See Documentation/video4linux/meye.txt. mga= [HW,DRM] diff -Nru a/Documentation/video4linux/meye.txt b/Documentation/video4linux/meye.txt --- a/Documentation/video4linux/meye.txt 2004-11-04 11:30:33 +01:00 +++ b/Documentation/video4linux/meye.txt 2004-11-04 11:30:33 +01:00 @@ -41,13 +41,10 @@ Driver options: --------------- -Several options can be passed to the meye driver, either by adding them -to /etc/modprobe.conf file, when the driver is compiled as a module, or -by adding the following to the kernel command line (in your bootloader): - - meye=gbuffers[,gbufsize[,video_nr]] - -where: +Several options can be passed to the meye driver using the standard +module argument syntax (<param>=<value> when passing the option to the +module or meye.<param>=<value> on the kernel boot line when meye is +statically linked into the kernel). Those options are: gbuffers: number of capture buffers, default is 2 (32 max) ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 9/12] meye: add v4l2 support 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop ` (7 preceding siblings ...) 2004-11-04 11:16 ` [PATCH 8/12] meye: module parameters documentation fixes Stelian Pop @ 2004-11-04 11:17 ` Stelian Pop 2004-11-04 11:17 ` [PATCH 10/12] meye: whitespace and coding style cleanups Stelian Pop ` (4 subsequent siblings) 13 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:17 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2348, 2004-11-02 16:29:09+01:00, stelian@popies.net meye: add v4l2 support Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== Documentation/video4linux/meye.txt | 21 - drivers/media/video/meye.c | 562 ++++++++++++++++++++++++++++++++++++- drivers/media/video/meye.h | 3 include/linux/meye.h | 7 4 files changed, 576 insertions(+), 17 deletions(-) =================================================================== diff -Nru a/Documentation/video4linux/meye.txt b/Documentation/video4linux/meye.txt --- a/Documentation/video4linux/meye.txt 2004-11-04 11:32:06 +01:00 +++ b/Documentation/video4linux/meye.txt 2004-11-04 11:32:06 +01:00 @@ -46,6 +46,8 @@ module or meye.<param>=<value> on the kernel boot line when meye is statically linked into the kernel). Those options are: + forcev4l1: force use of V4L1 API instead of V4L2 + gbuffers: number of capture buffers, default is 2 (32 max) gbufsize: size of each capture buffer, default is 614400 @@ -78,8 +80,9 @@ Private API: ------------ - The driver supports frame grabbing with the video4linux API, so - all video4linux tools (like xawtv) should work with this driver. + The driver supports frame grabbing with the video4linux API + (either v4l1 or v4l2), so all video4linux tools (like xawtv) + should work with this driver. Besides the video4linux interface, the driver has a private interface for accessing the Motion Eye extended parameters (camera sharpness, @@ -121,13 +124,7 @@ Bugs / Todo: ------------ - - overlay output is not supported (although the camera is capable of). - (it should not be too hard to to it, provided we found how...) - - - mjpeg hardware playback doesn't work (depends on overlay...) - - - rewrite the driver to use some common video4linux API for snapshot - and mjpeg capture. Unfortunately, video4linux1 does not permit it, - the BUZ API seems to be targeted to TV cards only. The video4linux 2 - API may be an option, if it goes into the kernel (maybe 2.5 - material ?). + - the driver could be much cleaned up by removing the v4l1 support. + However, this means all v4l1-only applications will stop working. + + - 'motioneye' still uses the meye private v4l1 API extensions. diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c --- a/drivers/media/video/meye.c 2004-11-04 11:32:06 +01:00 +++ b/drivers/media/video/meye.c 2004-11-04 11:32:06 +01:00 @@ -46,6 +46,11 @@ MODULE_LICENSE("GPL"); MODULE_VERSION(MEYE_DRIVER_VERSION); +/* force usage of V4L1 API */ +static int forcev4l1; /* = 0 */ +module_param(forcev4l1, int, 0644); +MODULE_PARM_DESC(forcev4l1, "force use of V4L1 instead of V4L2"); + /* number of grab buffers */ static unsigned int gbuffers = 2; module_param(gbuffers, int, 0444); @@ -781,6 +786,8 @@ { u32 v; int reqnr; + static int sequence = 0; + v = mchip_read(MCHIP_MM_INTA); if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT && @@ -802,6 +809,8 @@ mchip_hsize() * mchip_vsize() * 2); meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2; meye.grab_buffer[reqnr].state = MEYE_BUF_DONE; + do_gettimeofday(&meye.grab_buffer[reqnr].timestamp); + meye.grab_buffer[reqnr].sequence = sequence++; kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int)); wake_up_interruptible(&meye.proc_list); } else { @@ -820,6 +829,8 @@ size); meye.grab_buffer[reqnr].size = size; meye.grab_buffer[reqnr].state = MEYE_BUF_DONE; + do_gettimeofday(&meye.grab_buffer[reqnr].timestamp); + meye.grab_buffer[reqnr].sequence = sequence++; kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int)); wake_up_interruptible(&meye.proc_list); } @@ -1132,10 +1143,519 @@ break; } + case VIDIOC_QUERYCAP: { + struct v4l2_capability *cap = arg; + + if (forcev4l1) + return -EINVAL; + + memset(cap, 0, sizeof(*cap)); + strcpy(cap->driver, "meye"); + strcpy(cap->card, "meye"); + sprintf(cap->bus_info, "PCI:%s", meye.mchip_dev->slot_name); + cap->version = (MEYE_DRIVER_MAJORVERSION << 8) + + MEYE_DRIVER_MINORVERSION; + cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | + V4L2_CAP_STREAMING; + break; + } + + case VIDIOC_ENUMINPUT: { + struct v4l2_input *i = arg; + + if (i->index != 0) + return -EINVAL; + memset(i, 0, sizeof(*i)); + i->index = 0; + strcpy(i->name, "Camera"); + i->type = V4L2_INPUT_TYPE_CAMERA; + break; + } + + case VIDIOC_G_INPUT: { + int *i = arg; + + *i = 0; + break; + } + + case VIDIOC_S_INPUT: { + int *i = arg; + + if (*i != 0) + return -EINVAL; + break; + } + + case VIDIOC_QUERYCTRL: { + struct v4l2_queryctrl *c = arg; + + switch (c->id) { + + case V4L2_CID_BRIGHTNESS: + c->type = V4L2_CTRL_TYPE_INTEGER; + strcpy(c->name, "Brightness"); + c->minimum = 0; + c->maximum = 63; + c->step = 1; + c->default_value = 32; + c->flags = 0; + break; + case V4L2_CID_HUE: + c->type = V4L2_CTRL_TYPE_INTEGER; + strcpy(c->name, "Hue"); + c->minimum = 0; + c->maximum = 63; + c->step = 1; + c->default_value = 32; + c->flags = 0; + break; + case V4L2_CID_CONTRAST: + c->type = V4L2_CTRL_TYPE_INTEGER; + strcpy(c->name, "Contrast"); + c->minimum = 0; + c->maximum = 63; + c->step = 1; + c->default_value = 32; + c->flags = 0; + break; + case V4L2_CID_SATURATION: + c->type = V4L2_CTRL_TYPE_INTEGER; + strcpy(c->name, "Saturation"); + c->minimum = 0; + c->maximum = 63; + c->step = 1; + c->default_value = 32; + c->flags = 0; + break; + case V4L2_CID_AGC: + c->type = V4L2_CTRL_TYPE_INTEGER; + strcpy(c->name, "Agc"); + c->minimum = 0; + c->maximum = 63; + c->step = 1; + c->default_value = 48; + c->flags = 0; + break; + case V4L2_CID_SHARPNESS: + c->type = V4L2_CTRL_TYPE_INTEGER; + strcpy(c->name, "Sharpness"); + c->minimum = 0; + c->maximum = 63; + c->step = 1; + c->default_value = 32; + c->flags = 0; + break; + case V4L2_CID_PICTURE: + c->type = V4L2_CTRL_TYPE_INTEGER; + strcpy(c->name, "Picture"); + c->minimum = 0; + c->maximum = 63; + c->step = 1; + c->default_value = 0; + c->flags = 0; + break; + case V4L2_CID_JPEGQUAL: + c->type = V4L2_CTRL_TYPE_INTEGER; + strcpy(c->name, "JPEG quality"); + c->minimum = 0; + c->maximum = 10; + c->step = 1; + c->default_value = 8; + c->flags = 0; + break; + case V4L2_CID_FRAMERATE: + c->type = V4L2_CTRL_TYPE_INTEGER; + strcpy(c->name, "Framerate"); + c->minimum = 0; + c->maximum = 31; + c->step = 1; + c->default_value = 0; + c->flags = 0; + break; + default: + return -EINVAL; + } + break; + } + + case VIDIOC_S_CTRL: { + struct v4l2_control *c = arg; + + down(&meye.lock); + switch (c->id) { + + case V4L2_CID_BRIGHTNESS: + sonypi_camera_command( + SONYPI_COMMAND_SETCAMERABRIGHTNESS, c->value); + break; + case V4L2_CID_HUE: + sonypi_camera_command( + SONYPI_COMMAND_SETCAMERAHUE, c->value); + break; + case V4L2_CID_CONTRAST: + sonypi_camera_command( + SONYPI_COMMAND_SETCAMERACOLOR, c->value); + break; + case V4L2_CID_SATURATION: + sonypi_camera_command( + SONYPI_COMMAND_SETCAMERACOLOR, c->value); + break; + case V4L2_CID_AGC: + sonypi_camera_command( + SONYPI_COMMAND_SETCAMERAAGC, c->value); + break; + case V4L2_CID_SHARPNESS: + sonypi_camera_command( + SONYPI_COMMAND_SETCAMERASHARPNESS, c->value); + break; + case V4L2_CID_PICTURE: + sonypi_camera_command( + SONYPI_COMMAND_SETCAMERAPICTURE, c->value); + break; + case V4L2_CID_JPEGQUAL: + meye.params.quality = c->value; + break; + case V4L2_CID_FRAMERATE: + meye.params.framerate = c->value; + break; + default: + up(&meye.lock); + return -EINVAL; + } + up(&meye.lock); + break; + } + + case VIDIOC_G_CTRL: { + struct v4l2_control *c = arg; + + down(&meye.lock); + switch (c->id) { + case V4L2_CID_BRIGHTNESS: + c->value = sonypi_camera_command( + SONYPI_COMMAND_GETCAMERABRIGHTNESS, 0); + break; + case V4L2_CID_HUE: + c->value = sonypi_camera_command( + SONYPI_COMMAND_GETCAMERAHUE, 0); + break; + case V4L2_CID_CONTRAST: + c->value = sonypi_camera_command( + SONYPI_COMMAND_GETCAMERACOLOR, 0); + break; + case V4L2_CID_SATURATION: + c->value = sonypi_camera_command( + SONYPI_COMMAND_GETCAMERACOLOR, 0); + break; + case V4L2_CID_AGC: + c->value = sonypi_camera_command( + SONYPI_COMMAND_GETCAMERAAGC, 0); + break; + case V4L2_CID_SHARPNESS: + c->value = sonypi_camera_command( + SONYPI_COMMAND_GETCAMERASHARPNESS, 0); + break; + case V4L2_CID_PICTURE: + c->value = sonypi_camera_command( + SONYPI_COMMAND_GETCAMERAPICTURE, 0); + break; + case V4L2_CID_JPEGQUAL: + c->value = meye.params.quality; + break; + case V4L2_CID_FRAMERATE: + c->value = meye.params.framerate; + break; + default: + up(&meye.lock); + return -EINVAL; + } + up(&meye.lock); + break; + } + + case VIDIOC_ENUM_FMT: { + struct v4l2_fmtdesc *f = arg; + + if (f->index > 1) + return -EINVAL; + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + if (f->index == 0) { + /* standard YUV 422 capture */ + memset(f, 0, sizeof(*f)); + f->index = 0; + f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + f->flags = 0; + strcpy(f->description, "YUV422"); + f->pixelformat = V4L2_PIX_FMT_YUYV; + } else { + /* compressed MJPEG capture */ + memset(f, 0, sizeof(*f)); + f->index = 1; + f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + f->flags = V4L2_FMT_FLAG_COMPRESSED; + strcpy(f->description, "MJPEG"); + f->pixelformat = V4L2_PIX_FMT_MJPEG; + } + break; + } + + case VIDIOC_TRY_FMT: { + struct v4l2_format *f = arg; + + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV && + f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG) + return -EINVAL; + if (f->fmt.pix.field != V4L2_FIELD_ANY && + f->fmt.pix.field != V4L2_FIELD_NONE) + return -EINVAL; + f->fmt.pix.field = V4L2_FIELD_NONE; + if (f->fmt.pix.width <= 320) { + f->fmt.pix.width = 320; + f->fmt.pix.height = 240; + } else { + f->fmt.pix.width = 640; + f->fmt.pix.height = 480; + } + f->fmt.pix.bytesperline = f->fmt.pix.width * 2; + f->fmt.pix.sizeimage = f->fmt.pix.height * + f->fmt.pix.bytesperline; + f->fmt.pix.colorspace = 0; + f->fmt.pix.priv = 0; + break; + } + + case VIDIOC_G_FMT: { + struct v4l2_format *f = arg; + + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + memset(&f->fmt.pix, 0, sizeof(struct v4l2_pix_format)); + f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + switch (meye.mchip_mode) { + case MCHIP_HIC_MODE_CONT_OUT: + default: + f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; + break; + case MCHIP_HIC_MODE_CONT_COMP: + f->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; + break; + } + f->fmt.pix.field = V4L2_FIELD_NONE; + f->fmt.pix.width = mchip_hsize(); + f->fmt.pix.height = mchip_vsize(); + f->fmt.pix.bytesperline = f->fmt.pix.width * 2; + f->fmt.pix.sizeimage = f->fmt.pix.height * + f->fmt.pix.bytesperline; + f->fmt.pix.colorspace = 0; + f->fmt.pix.priv = 0; + break; + } + + case VIDIOC_S_FMT: { + struct v4l2_format *f = arg; + + if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV && + f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG) + return -EINVAL; + if (f->fmt.pix.field != V4L2_FIELD_ANY && + f->fmt.pix.field != V4L2_FIELD_NONE) + return -EINVAL; + f->fmt.pix.field = V4L2_FIELD_NONE; + down(&meye.lock); + if (f->fmt.pix.width <= 320) { + f->fmt.pix.width = 320; + f->fmt.pix.height = 240; + meye.params.subsample = 1; + } else { + f->fmt.pix.width = 640; + f->fmt.pix.height = 480; + meye.params.subsample = 0; + } + switch (f->fmt.pix.pixelformat) { + case V4L2_PIX_FMT_YUYV: + meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT; + break; + case V4L2_PIX_FMT_MJPEG: + meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP; + break; + } + up(&meye.lock); + f->fmt.pix.bytesperline = f->fmt.pix.width * 2; + f->fmt.pix.sizeimage = f->fmt.pix.height * + f->fmt.pix.bytesperline; + f->fmt.pix.colorspace = 0; + f->fmt.pix.priv = 0; + + break; + } + + case VIDIOC_REQBUFS: { + struct v4l2_requestbuffers *req = arg; + int i; + + if (req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + if (req->memory != V4L2_MEMORY_MMAP) + return -EINVAL; + if (meye.grab_fbuffer && req->count == gbuffers) { + /* already allocated, no modifications */ + break; + } + down(&meye.lock); + if (meye.grab_fbuffer) { + for (i = 0; i < gbuffers; i++) + if (meye.vma_use_count[i]) { + up(&meye.lock); + return -EINVAL; + } + rvfree(meye.grab_fbuffer, gbuffers * gbufsize); + meye.grab_fbuffer = NULL; + } + gbuffers = max(2, min((int)req->count, MEYE_MAX_BUFNBRS)); + req->count = gbuffers; + meye.grab_fbuffer = rvmalloc(gbuffers * gbufsize); + if (!meye.grab_fbuffer) { + printk(KERN_ERR "meye: v4l framebuffer allocation" + " failed\n"); + up(&meye.lock); + return -ENOMEM; + } + for (i = 0; i < gbuffers; i++) + meye.vma_use_count[i] = 0; + up(&meye.lock); + break; + } + + case VIDIOC_QUERYBUF: { + struct v4l2_buffer *buf = arg; + int index = buf->index; + + if (index < 0 || index >= gbuffers) + return -EINVAL; + memset(buf, 0, sizeof(*buf)); + buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf->index = index; + buf->bytesused = meye.grab_buffer[index].size; + buf->flags = V4L2_BUF_FLAG_MAPPED; + if (meye.grab_buffer[index].state == MEYE_BUF_USING) + buf->flags |= V4L2_BUF_FLAG_QUEUED; + if (meye.grab_buffer[index].state == MEYE_BUF_DONE) + buf->flags |= V4L2_BUF_FLAG_DONE; + buf->field = V4L2_FIELD_NONE; + buf->timestamp = meye.grab_buffer[index].timestamp; + buf->sequence = meye.grab_buffer[index].sequence; + buf->memory = V4L2_MEMORY_MMAP; + buf->m.offset = index * gbufsize; + buf->length = gbufsize; + break; + } + + case VIDIOC_QBUF: { + struct v4l2_buffer *buf = arg; + + if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + if (buf->memory != V4L2_MEMORY_MMAP) + return -EINVAL; + if (buf->index < 0 || buf->index >= gbuffers) + return -EINVAL; + if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED) + return -EINVAL; + down(&meye.lock); + buf->flags |= V4L2_BUF_FLAG_QUEUED; + buf->flags &= ~V4L2_BUF_FLAG_DONE; + meye.grab_buffer[buf->index].state = MEYE_BUF_USING; + kfifo_put(meye.grabq, (unsigned char *)&buf->index, sizeof(int)); + up(&meye.lock); + break; + } + + case VIDIOC_DQBUF: { + struct v4l2_buffer *buf = arg; + int reqnr; + + if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + if (buf->memory != V4L2_MEMORY_MMAP) + return -EINVAL; + + down(&meye.lock); + if (kfifo_len(meye.doneq) == 0 && file->f_flags & O_NONBLOCK) { + up(&meye.lock); + return -EAGAIN; + } + if (wait_event_interruptible(meye.proc_list, + kfifo_len(meye.doneq) != 0) < 0) { + up(&meye.lock); + return -EINTR; + } + if (!kfifo_get(meye.doneq, (unsigned char *)&reqnr, + sizeof(int))) { + up(&meye.lock); + return -EBUSY; + } + if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) { + up(&meye.lock); + return -EINVAL; + } + buf->index = reqnr; + buf->bytesused = meye.grab_buffer[reqnr].size; + buf->flags = V4L2_BUF_FLAG_MAPPED; + buf->field = V4L2_FIELD_NONE; + buf->timestamp = meye.grab_buffer[reqnr].timestamp; + buf->sequence = meye.grab_buffer[reqnr].sequence; + buf->memory = V4L2_MEMORY_MMAP; + buf->m.offset = reqnr * gbufsize; + buf->length = gbufsize; + meye.grab_buffer[reqnr].state = MEYE_BUF_UNUSED; + up(&meye.lock); + break; + } + + case VIDIOC_STREAMON: { + down(&meye.lock); + switch (meye.mchip_mode) { + case MCHIP_HIC_MODE_CONT_OUT: + mchip_continuous_start(); + break; + case MCHIP_HIC_MODE_CONT_COMP: + mchip_cont_compression_start(); + break; + default: + up(&meye.lock); + return -EINVAL; + } + up(&meye.lock); + break; + } + + case VIDIOC_STREAMOFF: { + int i; + + down(&meye.lock); + mchip_hic_stop(); + kfifo_reset(meye.grabq); + kfifo_reset(meye.doneq); + for (i = 0; i < MEYE_MAX_BUFNBRS; i++) + meye.grab_buffer[i].state = MEYE_BUF_UNUSED; + up(&meye.lock); + break; + } + + /* + * XXX what about private snapshot ioctls ? + * Do they need to be converted to V4L2 ? + */ + default: return -ENOIOCTLCMD; - - } /* switch */ + } return 0; } @@ -1158,9 +1678,27 @@ return res; } +static void meye_vm_open(struct vm_area_struct *vma) +{ + int idx = (int)vma->vm_private_data; + meye.vma_use_count[idx]++; +} + +static void meye_vm_close(struct vm_area_struct *vma) +{ + int idx = (int)vma->vm_private_data; + meye.vma_use_count[idx]--; +} + +static struct vm_operations_struct meye_vm_ops = { + .open = meye_vm_open, + .close = meye_vm_close, +}; + static int meye_mmap(struct file *file, struct vm_area_struct *vma) { unsigned long start = vma->vm_start; - unsigned long size = vma->vm_end - vma->vm_start; + unsigned long size = vma->vm_end - vma->vm_start; + unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; unsigned long page, pos; down(&meye.lock); @@ -1169,6 +1707,8 @@ return -EINVAL; } if (!meye.grab_fbuffer) { + int i; + /* lazy allocation */ meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize); if (!meye.grab_fbuffer) { @@ -1176,8 +1716,10 @@ up(&meye.lock); return -ENOMEM; } + for (i = 0; i < gbuffers; i++) + meye.vma_use_count[i] = 0; } - pos = (unsigned long)meye.grab_fbuffer; + pos = (unsigned long)meye.grab_fbuffer + offset; while (size > 0) { page = vmalloc_to_pfn((void *)pos); @@ -1187,8 +1729,18 @@ } start += PAGE_SIZE; pos += PAGE_SIZE; - size -= PAGE_SIZE; + if (size > PAGE_SIZE) + size -= PAGE_SIZE; + else + size = 0; } + + vma->vm_ops = &meye_vm_ops; + vma->vm_flags &= ~VM_IO; /* not I/O memory */ + vma->vm_flags |= VM_RESERVED; /* avoid to swap out this VMA */ + vma->vm_private_data = (void *) (offset / gbufsize); + meye_vm_open(vma); + up(&meye.lock); return 0; } diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h --- a/drivers/media/video/meye.h 2004-11-04 11:32:05 +01:00 +++ b/drivers/media/video/meye.h 2004-11-04 11:32:06 +01:00 @@ -279,6 +279,8 @@ struct meye_grab_buffer { int state; /* state of buffer */ unsigned long size; /* size of jpg frame */ + struct timeval timestamp; /* timestamp */ + unsigned long sequence; /* sequence number */ }; /* size of kfifos containings buffer indices */ @@ -302,6 +304,7 @@ unsigned char *grab_temp; /* temporary buffer */ /* list of buffers */ struct meye_grab_buffer grab_buffer[MEYE_MAX_BUFNBRS]; + int vma_use_count[MEYE_MAX_BUFNBRS]; /* mmap count */ /* other */ struct semaphore lock; /* semaphore for open/mmap... */ diff -Nru a/include/linux/meye.h b/include/linux/meye.h --- a/include/linux/meye.h 2004-11-04 11:32:05 +01:00 +++ b/include/linux/meye.h 2004-11-04 11:32:05 +01:00 @@ -56,4 +56,11 @@ /* get a jpeg compressed snapshot */ #define MEYEIOC_STILLJCAPT _IOR ('v', BASE_VIDIOCPRIVATE+5, int) +/* V4L2 private controls */ +#define V4L2_CID_AGC V4L2_CID_PRIVATE_BASE +#define V4L2_CID_SHARPNESS (V4L2_CID_PRIVATE_BASE + 1) +#define V4L2_CID_PICTURE (V4L2_CID_PRIVATE_BASE + 2) +#define V4L2_CID_JPEGQUAL (V4L2_CID_PRIVATE_BASE + 3) +#define V4L2_CID_FRAMERATE (V4L2_CID_PRIVATE_BASE + 4) + #endif ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 10/12] meye: whitespace and coding style cleanups 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop ` (8 preceding siblings ...) 2004-11-04 11:17 ` [PATCH 9/12] meye: add v4l2 support Stelian Pop @ 2004-11-04 11:17 ` Stelian Pop 2004-11-04 11:18 ` [PATCH 11/12] meye: bump up the version number Stelian Pop ` (3 subsequent siblings) 13 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:17 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2349, 2004-11-02 16:32:09+01:00, stelian@popies.net meye: whitespace and coding style cleanups Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== Documentation/video4linux/meye.txt | 10 drivers/media/video/meye.c | 624 ++++++++++++++++++------------------- drivers/media/video/meye.h | 26 - include/linux/meye.h | 10 4 files changed, 332 insertions(+), 338 deletions(-) =================================================================== diff -Nru a/Documentation/video4linux/meye.txt b/Documentation/video4linux/meye.txt --- a/Documentation/video4linux/meye.txt 2004-11-04 11:34:29 +01:00 +++ b/Documentation/video4linux/meye.txt 2004-11-04 11:34:29 +01:00 @@ -1,12 +1,12 @@ Vaio Picturebook Motion Eye Camera Driver Readme ------------------------------------------------ - Copyright (C) 2001-2003 Stelian Pop <stelian@popies.net> + Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net> Copyright (C) 2001-2002 Alcôve <www.alcove.com> Copyright (C) 2000 Andrew Tridgell <tridge@samba.org> This driver enable the use of video4linux compatible applications with the -Motion Eye camera. This driver requires the "Sony Vaio Programmable I/O -Control Device" driver (which can be found in the "Character drivers" +Motion Eye camera. This driver requires the "Sony Vaio Programmable I/O +Control Device" driver (which can be found in the "Character drivers" section of the kernel configuration utility) to be compiled and installed (using its "camera=1" parameter). @@ -24,7 +24,7 @@ The first version was connected directly on the video bus of the Neomagic video card and is unsupported. -The second one, made by Kawasaki Steel is fully supported by this +The second one, made by Kawasaki Steel is fully supported by this driver (PCI vendor/device is 0x136b/0xff01) The third one, present in recent (more or less last year) Picturebooks @@ -116,7 +116,7 @@ MEYEIOC_STILLJCAPT Takes a snapshot in an uncompressed or compressed jpeg format. This ioctl blocks until the snapshot is done and returns (for - jpeg snapshot) the size of the image. The image data is + jpeg snapshot) the size of the image. The image data is available from the first mmap'ed buffer. Look at the 'motioneye' application code for an actual example. diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c --- a/drivers/media/video/meye.c 2004-11-04 11:34:28 +01:00 +++ b/drivers/media/video/meye.c 2004-11-04 11:34:29 +01:00 @@ -1,7 +1,7 @@ -/* +/* * Motion Eye video4linux driver for Sony Vaio PictureBook * - * Copyright (C) 2001-2003 Stelian Pop <stelian@popies.net> + * Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net> * * Copyright (C) 2001-2002 Alcôve <www.alcove.com> * @@ -11,17 +11,17 @@ * * Some parts borrowed from various video4linux drivers, especially * bttv-driver.c and zoran.c, see original files for credits. - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -73,15 +73,16 @@ /****************************************************************************/ /* Memory allocation routines (stolen from bttv-driver.c) */ /****************************************************************************/ -static void *rvmalloc(unsigned long size) { +static void *rvmalloc(unsigned long size) +{ void *mem; unsigned long adr; size = PAGE_ALIGN(size); mem = vmalloc_32(size); if (mem) { - memset(mem, 0, size); /* Clear the ram out, no junk to the user */ - adr = (unsigned long)mem; + memset(mem, 0, size); + adr = (unsigned long) mem; while (size > 0) { SetPageReserved(vmalloc_to_page((void *)adr)); adr += PAGE_SIZE; @@ -91,11 +92,12 @@ return mem; } -static void rvfree(void * mem, unsigned long size) { - unsigned long adr; +static void rvfree(void * mem, unsigned long size) +{ + unsigned long adr; if (mem) { - adr = (unsigned long) mem; + adr = (unsigned long) mem; while ((long) size > 0) { ClearPageReserved(vmalloc_to_page((void *)adr)); adr += PAGE_SIZE; @@ -114,7 +116,8 @@ * dma_addr_t for correctness but the compilation of this driver is * disabled for HIGHMEM64G=y, where sizeof(dma_addr_t) != 4 */ -static int ptable_alloc(void) { +static int ptable_alloc(void) +{ dma_addr_t *pt; int i; @@ -131,7 +134,7 @@ pt = meye.mchip_ptable_toc; for (i = 0; i < MCHIP_NB_PAGES; i++) { - meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev, + meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev, PAGE_SIZE, pt, GFP_KERNEL); @@ -157,22 +160,23 @@ return 0; } -static void ptable_free(void) { +static void ptable_free(void) +{ dma_addr_t *pt; int i; pt = meye.mchip_ptable_toc; for (i = 0; i < MCHIP_NB_PAGES; i++) { if (meye.mchip_ptable[i]) - dma_free_coherent(&meye.mchip_dev->dev, - PAGE_SIZE, + dma_free_coherent(&meye.mchip_dev->dev, + PAGE_SIZE, meye.mchip_ptable[i], *pt); pt++; } if (meye.mchip_ptable_toc) - dma_free_coherent(&meye.mchip_dev->dev, - PAGE_SIZE, + dma_free_coherent(&meye.mchip_dev->dev, + PAGE_SIZE, meye.mchip_ptable_toc, meye.mchip_dmahandle); @@ -182,9 +186,10 @@ } /* copy data from ptable into buf */ -static void ptable_copy(u8 *buf, int start, int size, int pt_pages) { +static void ptable_copy(u8 *buf, int start, int size, int pt_pages) +{ int i; - + for (i = 0; i < (size / PAGE_SIZE) * PAGE_SIZE; i += PAGE_SIZE) { memcpy(buf + i, meye.mchip_ptable[start++], PAGE_SIZE); if (start >= pt_pages) @@ -193,224 +198,193 @@ memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE); } - /****************************************************************************/ /* JPEG tables at different qualities to load into the VRJ chip */ /****************************************************************************/ /* return a set of quantisation tables based on a quality from 1 to 10 */ -static u16 *jpeg_quantisation_tables(int *size, int quality) { - static u16 tables0[] = { - 0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, - 0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, - }; - static u16 tables1[] = { - 0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46, - 0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, - 0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, - }; - static u16 tables2[] = { - 0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23, - 0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164, - 0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad, - 0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff, - 0xe6ff, 0xfffd, 0xfff8, - 0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876, - 0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, - 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, - 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, - 0xf8f8, 0xf8f8, 0xfff8, - }; - static u16 tables3[] = { - 0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17, - 0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042, - 0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73, - 0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba, - 0x99c7, 0xaba8, 0xffa4, - 0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e, - 0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, - 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, - 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, - 0xa4a4, 0xa4a4, 0xffa4, - }; - static u16 tables4[] = { - 0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712, - 0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932, - 0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556, - 0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c, - 0x7396, 0x817e, 0xff7c, - 0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b, - 0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, - 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, - 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, - 0x7c7c, 0x7c7c, 0xff7c, - }; - static u16 tables5[] = { - 0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e, - 0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28, - 0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745, - 0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470, - 0x5c78, 0x6765, 0xff63, - 0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f, - 0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, - 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, - 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, - 0x6363, 0x6363, 0xff63, - }; - static u16 tables6[] = { - 0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b, - 0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20, - 0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37, - 0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a, - 0x4a60, 0x5251, 0xff4f, - 0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26, - 0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, - 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, - 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, - 0x4f4f, 0x4f4f, 0xff4f, - }; - static u16 tables7[] = { - 0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08, - 0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318, - 0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129, - 0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43, - 0x3748, 0x3e3d, 0xff3b, - 0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c, - 0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, - 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, - 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, - 0x3b3b, 0x3b3b, 0xff3b, - }; - static u16 tables8[] = { - 0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706, - 0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710, - 0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c, - 0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d, - 0x2530, 0x2928, 0xff28, - 0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813, - 0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, - 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, - 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, - 0x2828, 0x2828, 0xff28, - }; - static u16 tables9[] = { - 0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403, - 0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08, - 0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e, - 0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416, - 0x1218, 0x1514, 0xff14, - 0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409, - 0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, - 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, - 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, - 0x1414, 0x1414, 0xff14, - }; - static u16 tables10[] = { - 0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0xff01, - 0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0101, 0x0101, 0xff01, - }; - - switch (quality) { - case 0: - *size = sizeof(tables0); - return tables0; - case 1: - *size = sizeof(tables1); - return tables1; - case 2: - *size = sizeof(tables2); - return tables2; - case 3: - *size = sizeof(tables3); - return tables3; - case 4: - *size = sizeof(tables4); - return tables4; - case 5: - *size = sizeof(tables5); - return tables5; - case 6: - *size = sizeof(tables6); - return tables6; - case 7: - *size = sizeof(tables7); - return tables7; - case 8: - *size = sizeof(tables8); - return tables8; - case 9: - *size = sizeof(tables9); - return tables9; - case 10: - *size = sizeof(tables10); - return tables10; - default: - printk(KERN_WARNING "meye: invalid quality level %d - using 8\n", quality); - *size = sizeof(tables8); - return tables8; +static u16 *jpeg_quantisation_tables(int *length, int quality) +{ + static u16 jpeg_tables[][70] = { { + 0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, + 0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, + }, + { + 0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46, + 0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, + 0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, 0xffff, + }, + { + 0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23, + 0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164, + 0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad, + 0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff, + 0xe6ff, 0xfffd, 0xfff8, + 0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876, + 0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, + 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, + 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, + 0xf8f8, 0xf8f8, 0xfff8, + }, + { + 0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17, + 0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042, + 0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73, + 0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba, + 0x99c7, 0xaba8, 0xffa4, + 0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e, + 0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, + 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, + 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, + 0xa4a4, 0xa4a4, 0xffa4, + }, + { + 0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712, + 0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932, + 0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556, + 0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c, + 0x7396, 0x817e, 0xff7c, + 0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b, + 0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, + 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, + 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, + 0x7c7c, 0x7c7c, 0xff7c, + }, + { + 0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e, + 0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28, + 0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745, + 0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470, + 0x5c78, 0x6765, 0xff63, + 0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f, + 0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, + 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, + 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, + 0x6363, 0x6363, 0xff63, + }, + { + 0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b, + 0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20, + 0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37, + 0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a, + 0x4a60, 0x5251, 0xff4f, + 0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26, + 0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, + 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, + 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, + 0x4f4f, 0x4f4f, 0xff4f, + }, + { + 0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08, + 0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318, + 0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129, + 0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43, + 0x3748, 0x3e3d, 0xff3b, + 0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c, + 0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, + 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, + 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, + 0x3b3b, 0x3b3b, 0xff3b, + }, + { + 0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706, + 0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710, + 0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c, + 0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d, + 0x2530, 0x2928, 0xff28, + 0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813, + 0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, + 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, + 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, + 0x2828, 0x2828, 0xff28, + }, + { + 0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403, + 0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08, + 0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e, + 0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416, + 0x1218, 0x1514, 0xff14, + 0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409, + 0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, + 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, + 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, + 0x1414, 0x1414, 0xff14, + }, + { + 0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0101, 0x0101, 0xff01, + 0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0101, 0x0101, 0xff01, + } }; + + if (quality < 0 || quality > 10) { + printk(KERN_WARNING + "meye: invalid quality level %d - using 8\n", quality); + quality = 8; } - return NULL; + + *length = ARRAY_SIZE(jpeg_tables[quality]); + return jpeg_tables[quality]; } /* return a generic set of huffman tables */ -static u16 *jpeg_huffman_tables(int *size) { +static u16 *jpeg_huffman_tables(int *length) +{ static u16 tables[] = { - 0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405, - 0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131, - 0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142, - 0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918, - 0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443, - 0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463, - 0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483, - 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A, - 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8, - 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6, - 0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2, - 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA, - 0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405, - 0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206, - 0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1, - 0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125, - 0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A, - 0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A, - 0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A, - 0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, - 0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, - 0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, - 0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2, - 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA, - 0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09, - 0xFF0B, - 0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101, - 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09, + 0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405, + 0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131, + 0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142, + 0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918, + 0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443, + 0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463, + 0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483, + 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A, + 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8, + 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6, + 0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2, + 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA, + 0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405, + 0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206, + 0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1, + 0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125, + 0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A, + 0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A, + 0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A, + 0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, + 0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, + 0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, + 0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2, + 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA, + 0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09, + 0xFF0B, + 0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101, + 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09, 0xFF0B }; - *size = sizeof(tables); + *length = ARRAY_SIZE(tables); return tables; } @@ -419,23 +393,27 @@ /****************************************************************************/ /* returns the horizontal capture size */ -static inline int mchip_hsize(void) { +static inline int mchip_hsize(void) +{ return meye.params.subsample ? 320 : 640; } /* returns the vertical capture size */ -static inline int mchip_vsize(void) { +static inline int mchip_vsize(void) +{ return meye.params.subsample ? 240 : 480; } /* waits for a register to be available */ -static void mchip_sync(int reg) { +static void mchip_sync(int reg) +{ u32 status; int i; if (reg == MCHIP_MM_FIFO_DATA) { for (i = 0; i < MCHIP_REG_TIMEOUT; i++) { - status = readl(meye.mchip_mmregs + MCHIP_MM_FIFO_STATUS); + status = readl(meye.mchip_mmregs + + MCHIP_MM_FIFO_STATUS); if (!(status & MCHIP_MM_FIFO_WAIT)) { printk(KERN_WARNING "meye: fifo not ready\n"); return; @@ -444,44 +422,48 @@ return; udelay(1); } - } - else if (reg > 0x80) { + } else if (reg > 0x80) { u32 mask = (reg < 0x100) ? MCHIP_HIC_STATUS_MCC_RDY - : MCHIP_HIC_STATUS_VRJ_RDY; + : MCHIP_HIC_STATUS_VRJ_RDY; for (i = 0; i < MCHIP_REG_TIMEOUT; i++) { status = readl(meye.mchip_mmregs + MCHIP_HIC_STATUS); if (status & mask) return; udelay(1); } - } - else + } else return; - printk(KERN_WARNING "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n", reg, status); + printk(KERN_WARNING + "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n", + reg, status); } /* sets a value into the register */ -static inline void mchip_set(int reg, u32 v) { +static inline void mchip_set(int reg, u32 v) +{ mchip_sync(reg); writel(v, meye.mchip_mmregs + reg); } /* get the register value */ -static inline u32 mchip_read(int reg) { +static inline u32 mchip_read(int reg) +{ mchip_sync(reg); return readl(meye.mchip_mmregs + reg); } /* wait for a register to become a particular value */ -static inline int mchip_delay(u32 reg, u32 v) { +static inline int mchip_delay(u32 reg, u32 v) +{ int n = 10; - while (--n && mchip_read(reg) != v) + while (--n && mchip_read(reg) != v) udelay(1); return n; } /* setup subsampling */ -static void mchip_subsample(void) { +static void mchip_subsample(void) +{ mchip_set(MCHIP_MCC_R_SAMPLING, meye.params.subsample); mchip_set(MCHIP_MCC_R_XRANGE, mchip_hsize()); mchip_set(MCHIP_MCC_R_YRANGE, mchip_vsize()); @@ -491,29 +473,31 @@ } /* set the framerate into the mchip */ -static void mchip_set_framerate(void) { +static void mchip_set_framerate(void) +{ mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate); } /* load some huffman and quantisation tables into the VRJ chip ready for JPEG compression */ -static void mchip_load_tables(void) { +static void mchip_load_tables(void) +{ int i; - int size; + int length; u16 *tables; - tables = jpeg_huffman_tables(&size); - for (i = 0; i < size / 2; i++) + tables = jpeg_huffman_tables(&length); + for (i = 0; i < length; i++) writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA); - tables = jpeg_quantisation_tables(&size, meye.params.quality); - for (i = 0; i < size / 2; i++) + tables = jpeg_quantisation_tables(&length, meye.params.quality); + for (i = 0; i < length; i++) writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA); } /* setup the VRJ parameters in the chip */ -static void mchip_vrj_setup(u8 mode) { - +static void mchip_vrj_setup(u8 mode) +{ mchip_set(MCHIP_VRJ_BUS_MODE, 5); mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL, 0x1f); mchip_set(MCHIP_VRJ_PDAT_USE, 1); @@ -530,13 +514,14 @@ mchip_set(MCHIP_VRJ_SOF2, 0x1502); mchip_set(MCHIP_VRJ_SOF3, 0x1503); mchip_set(MCHIP_VRJ_SOF4, 0x1596); - mchip_set(MCHIP_VRJ_SOS, 0x0ed0); + mchip_set(MCHIP_VRJ_SOS, 0x0ed0); mchip_load_tables(); } /* sets the DMA parameters into the chip */ -static void mchip_dma_setup(u32 dma_addr) { +static void mchip_dma_setup(u32 dma_addr) +{ int i; mchip_set(MCHIP_MM_PT_ADDR, dma_addr); @@ -546,7 +531,8 @@ } /* setup for DMA transfers - also zeros the framebuffer */ -static int mchip_dma_alloc(void) { +static int mchip_dma_alloc(void) +{ if (!meye.mchip_dmahandle) if (ptable_alloc()) return -1; @@ -554,7 +540,8 @@ } /* frees the DMA buffer */ -static void mchip_dma_free(void) { +static void mchip_dma_free(void) +{ if (meye.mchip_dmahandle) { mchip_dma_setup(0); ptable_free(); @@ -563,7 +550,8 @@ /* stop any existing HIC action and wait for any dma to complete then reset the dma engine */ -static void mchip_hic_stop(void) { +static void mchip_hic_stop(void) +{ int i, j; meye.mchip_mode = MCHIP_HIC_MODE_NOOP; @@ -573,12 +561,13 @@ mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_STOP); mchip_delay(MCHIP_HIC_CMD, 0); for (j = 0; j < 100; ++j) { - if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE)) + if (mchip_delay(MCHIP_HIC_STATUS, + MCHIP_HIC_STATUS_IDLE)) return; msleep(1); } printk(KERN_ERR "meye: need to reset HIC!\n"); - + mchip_set(MCHIP_HIC_CTL, MCHIP_HIC_CTL_SOFT_RESET); msleep(250); } @@ -590,15 +579,17 @@ /****************************************************************************/ /* get the next ready frame from the dma engine */ -static u32 mchip_get_frame(void) { +static u32 mchip_get_frame(void) +{ u32 v; - + v = mchip_read(MCHIP_MM_FIR(meye.mchip_fnum)); return v; } /* frees the current frame from the dma engine */ -static void mchip_free_frame(void) { +static void mchip_free_frame(void) +{ mchip_set(MCHIP_MM_FIR(meye.mchip_fnum), 0); meye.mchip_fnum++; meye.mchip_fnum %= 4; @@ -606,17 +597,18 @@ /* read one frame from the framebuffer assuming it was captured using a uncompressed transfer */ -static void mchip_cont_read_frame(u32 v, u8 *buf, int size) { +static void mchip_cont_read_frame(u32 v, u8 *buf, int size) +{ int pt_id; pt_id = (v >> 17) & 0x3FF; ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES); - } /* read a compressed frame from the framebuffer */ -static int mchip_comp_read_frame(u32 v, u8 *buf, int size) { +static int mchip_comp_read_frame(u32 v, u8 *buf, int size) +{ int pt_start, pt_end, trailer; int fsize; int i; @@ -632,18 +624,17 @@ fsize = (pt_end - pt_start) * PAGE_SIZE + trailer * 4; if (fsize > size) { - printk(KERN_WARNING "meye: oversized compressed frame %d\n", + printk(KERN_WARNING "meye: oversized compressed frame %d\n", fsize); return -1; } ptable_copy(buf, pt_start, fsize, MCHIP_NB_PAGES_MJPEG); - #ifdef MEYE_JPEG_CORRECTION /* Some mchip generated jpeg frames are incorrect. In most - * (all ?) of those cases, the final EOI (0xff 0xd9) marker + * (all ?) of those cases, the final EOI (0xff 0xd9) marker * is not present at the end of the frame. * * Since adding the final marker is not enough to restore @@ -661,9 +652,10 @@ } /* take a picture into SDRAM */ -static void mchip_take_picture(void) { +static void mchip_take_picture(void) +{ int i; - + mchip_hic_stop(); mchip_subsample(); mchip_dma_setup(meye.mchip_dmahandle); @@ -681,7 +673,8 @@ } /* dma a previously taken picture into a buffer */ -static void mchip_get_picture(u8 *buf, int bufsize) { +static void mchip_get_picture(u8 *buf, int bufsize) +{ u32 v; int i; @@ -694,7 +687,7 @@ break; msleep(1); } - for (i = 0; i < 4 ; ++i) { + for (i = 0; i < 4; ++i) { v = mchip_get_frame(); if (v & MCHIP_MM_FIR_RDY) { mchip_cont_read_frame(v, buf, bufsize); @@ -705,7 +698,8 @@ } /* start continuous dma capture */ -static void mchip_continuous_start(void) { +static void mchip_continuous_start(void) +{ mchip_hic_stop(); mchip_subsample(); mchip_set_framerate(); @@ -720,7 +714,8 @@ } /* compress one frame into a buffer */ -static int mchip_compress_frame(u8 *buf, int bufsize) { +static int mchip_compress_frame(u8 *buf, int bufsize) +{ u32 v; int len = -1, i; @@ -729,7 +724,7 @@ mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_COMP); mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START); - + mchip_delay(MCHIP_HIC_CMD, 0); for (i = 0; i < 100; ++i) { if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE)) @@ -737,7 +732,7 @@ msleep(1); } - for (i = 0; i < 4 ; ++i) { + for (i = 0; i < 4; ++i) { v = mchip_get_frame(); if (v & MCHIP_MM_FIR_RDY) { len = mchip_comp_read_frame(v, buf, bufsize); @@ -750,13 +745,14 @@ #if 0 /* uncompress one image into a buffer */ -static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize) { +static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize) +{ mchip_vrj_setup(0x3f); udelay(50); mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_DECOMP); mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START); - + mchip_delay(MCHIP_HIC_CMD, 0); return mchip_comp_read_frame(buf, bufsize); @@ -764,7 +760,8 @@ #endif /* start continuous compressed capture */ -static void mchip_cont_compression_start(void) { +static void mchip_cont_compression_start(void) +{ mchip_hic_stop(); mchip_vrj_setup(0x3f); mchip_subsample(); @@ -782,6 +779,7 @@ /****************************************************************************/ /* Interrupt handling */ /****************************************************************************/ + static irqreturn_t meye_irq(int irq, void *dev_id, struct pt_regs *regs) { u32 v; @@ -842,10 +840,11 @@ /* video4linux integration */ /****************************************************************************/ -static int meye_open(struct inode *inode, struct file *file) { +static int meye_open(struct inode *inode, struct file *file) +{ int i, err; - err = video_exclusive_open(inode,file); + err = video_exclusive_open(inode, file); if (err < 0) return err; @@ -853,7 +852,7 @@ if (mchip_dma_alloc()) { printk(KERN_ERR "meye: mchip framebuffer allocation failed\n"); - video_exclusive_release(inode,file); + video_exclusive_release(inode, file); return -ENOBUFS; } @@ -861,20 +860,20 @@ meye.grab_buffer[i].state = MEYE_BUF_UNUSED; kfifo_reset(meye.grabq); kfifo_reset(meye.doneq); - return 0; } -static int meye_release(struct inode *inode, struct file *file) { +static int meye_release(struct inode *inode, struct file *file) +{ mchip_hic_stop(); mchip_dma_free(); - video_exclusive_release(inode,file); + video_exclusive_release(inode, file); return 0; } static int meye_do_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, void *arg) { - + unsigned int cmd, void *arg) +{ switch (cmd) { case VIDIOCGCAP: { @@ -921,13 +920,13 @@ if (p->palette != VIDEO_PALETTE_YUV422) return -EINVAL; down(&meye.lock); - sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, + sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, p->brightness >> 10); - sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, + sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, p->hue >> 10); - sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR, + sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR, p->colour >> 10); - sonypi_camera_command(SONYPI_COMMAND_SETCAMERACONTRAST, + sonypi_camera_command(SONYPI_COMMAND_SETCAMERACONTRAST, p->contrast >> 10); meye.picture = *p; up(&meye.lock); @@ -988,14 +987,12 @@ meye.params.subsample = 0; restart = 1; } - } - else if (vm->width == 320 && vm->height == 240) { + } else if (vm->width == 320 && vm->height == 240) { if (!meye.params.subsample) { meye.params.subsample = 1; restart = 1; } - } - else { + } else { up(&meye.lock); return -EINVAL; } @@ -1054,7 +1051,7 @@ case MEYEIOC_QBUF_CAPT: { int *nb = arg; - if (!meye.grab_fbuffer) + if (!meye.grab_fbuffer) return -EINVAL; if (*nb >= gbuffers) return -EINVAL; @@ -1109,7 +1106,7 @@ case MEYEIOC_STILLCAPT: { - if (!meye.grab_fbuffer) + if (!meye.grab_fbuffer) return -EINVAL; if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED) return -EBUSY; @@ -1127,7 +1124,7 @@ case MEYEIOC_STILLJCAPT: { int *len = arg; - if (!meye.grab_fbuffer) + if (!meye.grab_fbuffer) return -EINVAL; if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED) return -EBUSY; @@ -1695,7 +1692,8 @@ .close = meye_vm_close, }; -static int meye_mmap(struct file *file, struct vm_area_struct *vma) { +static int meye_mmap(struct file *file, struct vm_area_struct *vma) +{ unsigned long start = vma->vm_start; unsigned long size = vma->vm_end - vma->vm_start; unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; @@ -1801,8 +1799,9 @@ } #endif -static int __devinit meye_probe(struct pci_dev *pcidev, - const struct pci_device_id *ent) { +static int __devinit meye_probe(struct pci_dev *pcidev, + const struct pci_device_id *ent) +{ int ret = -EBUSY; unsigned long mchip_adr; u8 revision; @@ -1897,12 +1896,12 @@ msleep(1); mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK); - if (video_register_device(meye.video_dev, VFL_TYPE_GRABBER, video_nr) < 0) { - + if (video_register_device(meye.video_dev, VFL_TYPE_GRABBER, + video_nr) < 0) { printk(KERN_ERR "meye: video_register_device failed\n"); goto outvideoreg; } - + init_MUTEX(&meye.lock); init_waitqueue_head(&meye.proc_list); meye.picture.depth = 16; @@ -1918,7 +1917,7 @@ meye.params.agc = 48; meye.params.picture = 0; meye.params.framerate = 0; - + sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, 32); sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, 32); sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR, 32); @@ -1956,8 +1955,8 @@ return ret; } -static void __devexit meye_remove(struct pci_dev *pcidev) { - +static void __devexit meye_remove(struct pci_dev *pcidev) +{ video_unregister_device(meye.video_dev); mchip_hic_stop(); @@ -1992,7 +1991,7 @@ } static struct pci_device_id meye_pci_tbl[] = { - { PCI_VENDOR_ID_KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002, + { PCI_VENDOR_ID_KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, { } }; @@ -2010,20 +2009,23 @@ #endif }; -static int __init meye_init(void) { +static int __init meye_init(void) +{ gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS)); if (gbufsize < 0 || gbufsize > MEYE_MAX_BUFSIZE) gbufsize = MEYE_MAX_BUFSIZE; gbufsize = PAGE_ALIGN(gbufsize); - printk(KERN_INFO "meye: using %d buffers with %dk (%dk total) for capture\n", - gbuffers, gbufsize/1024, gbuffers*gbufsize/1024); - return pci_module_init(&meye_driver); + printk(KERN_INFO "meye: using %d buffers with %dk (%dk total)" + "for capture\n", + gbuffers, + gbufsize / 1024, gbuffers * gbufsize / 1024); + return pci_register_driver(&meye_driver); } -static void __exit meye_exit(void) { +static void __exit meye_exit(void) +{ pci_unregister_driver(&meye_driver); } -/* Module entry points */ module_init(meye_init); module_exit(meye_exit); diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h --- a/drivers/media/video/meye.h 2004-11-04 11:34:28 +01:00 +++ b/drivers/media/video/meye.h 2004-11-04 11:34:28 +01:00 @@ -1,27 +1,27 @@ -/* +/* * Motion Eye video4linux driver for Sony Vaio PictureBook * - * Copyright (C) 2001-2003 Stelian Pop <stelian@popies.net> + * Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net> * * Copyright (C) 2001-2002 Alcôve <www.alcove.com> * * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com> * * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras. - * + * * Some parts borrowed from various video4linux drivers, especially * bttv-driver.c and zoran.c, see original files for credits. - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -30,7 +30,7 @@ #ifndef _MEYE_PRIV_H_ #define _MEYE_PRIV_H_ -#define MEYE_DRIVER_MAJORVERSION 1 +#define MEYE_DRIVER_MAJORVERSION 1 #define MEYE_DRIVER_MINORVERSION 10 #define MEYE_DRIVER_VERSION __stringify(MEYE_DRIVER_MAJORVERSION) "." \ @@ -47,7 +47,7 @@ /* Motion JPEG chip PCI configuration registers */ #define MCHIP_PCI_POWER_CSR 0x54 -#define MCHIP_PCI_MCORE_STATUS 0x60 /* see HIC_STATUS */ +#define MCHIP_PCI_MCORE_STATUS 0x60 /* see HIC_STATUS */ #define MCHIP_PCI_HOSTUSEREQ_SET 0x64 #define MCHIP_PCI_HOSTUSEREQ_CLR 0x68 #define MCHIP_PCI_LOWPOWER_SET 0x6c @@ -77,7 +77,7 @@ #define MCHIP_MM_INTA_PCI_ERR 0x00000040 /* PCI error */ #define MCHIP_MM_INTA_PCI_ERR_MASK 0x00004000 -#define MCHIP_MM_PT_ADDR 0x08 /* page table address */ +#define MCHIP_MM_PT_ADDR 0x08 /* page table address*/ /* n*4kB */ #define MCHIP_NB_PAGES 1024 /* pages for display */ #define MCHIP_NB_PAGES_MJPEG 256 /* pages for mjpeg */ @@ -288,33 +288,25 @@ /* Motion Eye device structure */ struct meye { - - /* mchip related */ struct pci_dev *mchip_dev; /* pci device */ u8 mchip_irq; /* irq */ u8 mchip_mode; /* actual mchip mode: HIC_MODE... */ u8 mchip_fnum; /* current mchip frame number */ - unsigned char *mchip_mmregs; /* mchip: memory mapped registers */ u8 *mchip_ptable[MCHIP_NB_PAGES];/* mchip: ptable */ dma_addr_t *mchip_ptable_toc; /* mchip: ptable toc */ dma_addr_t mchip_dmahandle; /* mchip: dma handle to ptable toc */ - unsigned char *grab_fbuffer; /* capture framebuffer */ unsigned char *grab_temp; /* temporary buffer */ /* list of buffers */ struct meye_grab_buffer grab_buffer[MEYE_MAX_BUFNBRS]; int vma_use_count[MEYE_MAX_BUFNBRS]; /* mmap count */ - - /* other */ struct semaphore lock; /* semaphore for open/mmap... */ - struct kfifo *grabq; /* queue for buffers to be grabbed */ spinlock_t grabq_lock; /* lock protecting the queue */ struct kfifo *doneq; /* queue for grabbed buffers */ spinlock_t doneq_lock; /* lock protecting the queue */ wait_queue_head_t proc_list; /* wait queue */ - struct video_device *video_dev; /* video device parameters */ struct video_picture picture; /* video picture parameters */ struct meye_params params; /* additional parameters */ diff -Nru a/include/linux/meye.h b/include/linux/meye.h --- a/include/linux/meye.h 2004-11-04 11:34:28 +01:00 +++ b/include/linux/meye.h 2004-11-04 11:34:28 +01:00 @@ -1,4 +1,4 @@ -/* +/* * Motion Eye video4linux driver for Sony Vaio PictureBook * * Copyright (C) 2001-2003 Stelian Pop <stelian@popies.net> @@ -8,20 +8,20 @@ * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com> * * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras. - * + * * Some parts borrowed from various video4linux drivers, especially * bttv-driver.c and zoran.c, see original files for credits. - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 11/12] meye: bump up the version number 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop ` (9 preceding siblings ...) 2004-11-04 11:17 ` [PATCH 10/12] meye: whitespace and coding style cleanups Stelian Pop @ 2004-11-04 11:18 ` Stelian Pop 2004-11-04 11:18 ` [PATCH 12/12] meye: cache the camera settings in the driver Stelian Pop ` (2 subsequent siblings) 13 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:18 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2350, 2004-11-02 16:34:21+01:00, stelian@popies.net meye: bump up the version number Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== meye.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) =================================================================== diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h --- a/drivers/media/video/meye.h 2004-11-04 11:36:28 +01:00 +++ b/drivers/media/video/meye.h 2004-11-04 11:36:28 +01:00 @@ -31,7 +31,7 @@ #define _MEYE_PRIV_H_ #define MEYE_DRIVER_MAJORVERSION 1 -#define MEYE_DRIVER_MINORVERSION 10 +#define MEYE_DRIVER_MINORVERSION 11 #define MEYE_DRIVER_VERSION __stringify(MEYE_DRIVER_MAJORVERSION) "." \ __stringify(MEYE_DRIVER_MINORVERSION) ^ permalink raw reply [flat|nested] 26+ messages in thread
* [PATCH 12/12] meye: cache the camera settings in the driver 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop ` (10 preceding siblings ...) 2004-11-04 11:18 ` [PATCH 11/12] meye: bump up the version number Stelian Pop @ 2004-11-04 11:18 ` Stelian Pop 2004-11-04 12:25 ` [PATCH 0/12] meye driver update Emmanuel Fleury 2004-11-04 21:19 ` meye bug? (was: meye driver update) Roland Mas 13 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 11:18 UTC (permalink / raw) To: Linux Kernel Mailing List, Linus Torvalds, Andrew Morton =================================================================== ChangeSet@1.2352, 2004-11-04 11:50:37+01:00, stelian@popies.net meye: retrieving the current settings from the camera does not work very well, we need to cache the values in the driver Signed-off-by: Stelian Pop <stelian@popies.net> =================================================================== meye.c | 31 +++++++++++++++---------------- 1 files changed, 15 insertions(+), 16 deletions(-) =================================================================== diff -Nru a/drivers/media/video/meye.c b/drivers/media/video/meye.c --- a/drivers/media/video/meye.c 2004-11-04 11:52:38 +01:00 +++ b/drivers/media/video/meye.c 2004-11-04 11:52:38 +01:00 @@ -1281,34 +1281,40 @@ down(&meye.lock); switch (c->id) { - case V4L2_CID_BRIGHTNESS: sonypi_camera_command( SONYPI_COMMAND_SETCAMERABRIGHTNESS, c->value); + meye.picture.brightness = c->value << 10; break; case V4L2_CID_HUE: sonypi_camera_command( SONYPI_COMMAND_SETCAMERAHUE, c->value); + meye.picture.hue = c->value << 10; break; case V4L2_CID_CONTRAST: sonypi_camera_command( - SONYPI_COMMAND_SETCAMERACOLOR, c->value); + SONYPI_COMMAND_SETCAMERACONTRAST, c->value); + meye.picture.contrast = c->value << 10; break; case V4L2_CID_SATURATION: sonypi_camera_command( SONYPI_COMMAND_SETCAMERACOLOR, c->value); + meye.picture.colour = c->value << 10; break; case V4L2_CID_AGC: sonypi_camera_command( SONYPI_COMMAND_SETCAMERAAGC, c->value); + meye.params.agc = c->value; break; case V4L2_CID_SHARPNESS: sonypi_camera_command( SONYPI_COMMAND_SETCAMERASHARPNESS, c->value); + meye.params.sharpness = c->value; break; case V4L2_CID_PICTURE: sonypi_camera_command( SONYPI_COMMAND_SETCAMERAPICTURE, c->value); + meye.params.picture = c->value; break; case V4L2_CID_JPEGQUAL: meye.params.quality = c->value; @@ -1330,32 +1336,25 @@ down(&meye.lock); switch (c->id) { case V4L2_CID_BRIGHTNESS: - c->value = sonypi_camera_command( - SONYPI_COMMAND_GETCAMERABRIGHTNESS, 0); + c->value = meye.picture.brightness >> 10; break; case V4L2_CID_HUE: - c->value = sonypi_camera_command( - SONYPI_COMMAND_GETCAMERAHUE, 0); + c->value = meye.picture.hue >> 10; break; case V4L2_CID_CONTRAST: - c->value = sonypi_camera_command( - SONYPI_COMMAND_GETCAMERACOLOR, 0); + c->value = meye.picture.contrast >> 10; break; case V4L2_CID_SATURATION: - c->value = sonypi_camera_command( - SONYPI_COMMAND_GETCAMERACOLOR, 0); + c->value = meye.picture.colour >> 10; break; case V4L2_CID_AGC: - c->value = sonypi_camera_command( - SONYPI_COMMAND_GETCAMERAAGC, 0); + c->value = meye.params.agc; break; case V4L2_CID_SHARPNESS: - c->value = sonypi_camera_command( - SONYPI_COMMAND_GETCAMERASHARPNESS, 0); + c->value = meye.params.sharpness; break; case V4L2_CID_PICTURE: - c->value = sonypi_camera_command( - SONYPI_COMMAND_GETCAMERAPICTURE, 0); + c->value = meye.params.picture; break; case V4L2_CID_JPEGQUAL: c->value = meye.params.quality; ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 0/12] meye driver update 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop ` (11 preceding siblings ...) 2004-11-04 11:18 ` [PATCH 12/12] meye: cache the camera settings in the driver Stelian Pop @ 2004-11-04 12:25 ` Emmanuel Fleury 2004-11-04 12:36 ` Stelian Pop 2004-11-04 21:19 ` meye bug? (was: meye driver update) Roland Mas 13 siblings, 1 reply; 26+ messages in thread From: Emmanuel Fleury @ 2004-11-04 12:25 UTC (permalink / raw) To: Linux Kernel Mailing List; +Cc: Stelian Pop Hi, By the way, is there any news for the development of a driver for the meye of a PCG-C1MZX ? lspci: 0000:00:00.0 Host bridge: Transmeta Corporation LongRun Northbridge (rev 03) 0000:00:00.1 RAM memory: Transmeta Corporation SDRAM controller 0000:00:00.2 RAM memory: Transmeta Corporation BIOS scratchpad 0000:00:06.0 Multimedia audio controller: ALi Corporation M5451 PCI AC-Link Controller Audio Device (rev 02) 0000:00:07.0 ISA bridge: ALi Corporation M1533 PCI to ISA Bridge [Aladdin IV] 0000:00:08.0 Modem: ALi Corporation M5457 AC'97 Modem Controller 0000:00:09.0 FireWire (IEEE 1394): Texas Instruments TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link) 0000:00:0a.0 Multimedia controller: Fujitsu Limited.: Unknown device 2011 0000:00:0b.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10) 0000:00:0c.0 VGA compatible controller: ATI Technologies Inc Radeon Mobility M6 LY 0000:00:0f.0 USB Controller: ALi Corporation USB 1.1 Controller (rev 03) 0000:00:10.0 IDE interface: ALi Corporation M5229 IDE (rev c4) 0000:00:11.0 Non-VGA unclassified device: ALi Corporation M7101 Power Management Controller [PMU] 0000:00:12.0 CardBus bridge: Ricoh Co Ltd RL5c475 (rev 80) 0000:00:14.0 USB Controller: ALi Corporation USB 1.1 Controller (rev 03) Chipset of the meye (I guess): Ricoh Co Ltd RL5c475 (rev 80) Regards -- Emmanuel Fleury Computer Science Department, | Office: B1-201 Aalborg University, | Phone: +45 96 35 72 23 Fredriks Bajersvej 7E, | Fax: +45 98 15 98 89 9220 Aalborg East, Denmark | Email: fleury@cs.aau.dk ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH 0/12] meye driver update 2004-11-04 12:25 ` [PATCH 0/12] meye driver update Emmanuel Fleury @ 2004-11-04 12:36 ` Stelian Pop 0 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-04 12:36 UTC (permalink / raw) To: Emmanuel Fleury; +Cc: Linux Kernel Mailing List On Thu, Nov 04, 2004 at 01:25:29PM +0100, Emmanuel Fleury wrote: > By the way, is there any news for the development of a driver for the > meye of a PCG-C1MZX ? > > lspci: [...] > 0000:00:0a.0 Multimedia controller: Fujitsu Limited.: Unknown device 2011 [...] > 0000:00:12.0 CardBus bridge: Ricoh Co Ltd RL5c475 (rev 80) [...] > Chipset of the meye (I guess): > > Ricoh Co Ltd RL5c475 (rev 80) No, that's the cardbus bridge. The camera is the Fujitsu device (0x10cf/0x2011). There is a page at http://r-engine.sourceforge.net/ but the project seems dead. The manufacturer has given to several developers the docs (under a non redistribution NDA), but nobody wrote some code yet. Stelian. -- Stelian Pop <stelian@popies.net> ^ permalink raw reply [flat|nested] 26+ messages in thread
* meye bug? (was: meye driver update) 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop ` (12 preceding siblings ...) 2004-11-04 12:25 ` [PATCH 0/12] meye driver update Emmanuel Fleury @ 2004-11-04 21:19 ` Roland Mas 2004-11-04 21:42 ` Roland Mas 2004-11-04 21:58 ` Stelian Pop 13 siblings, 2 replies; 26+ messages in thread From: Roland Mas @ 2004-11-04 21:19 UTC (permalink / raw) To: Stelian Pop; +Cc: Linux Kernel Mailing List Stelian Pop, 2004-11-04 12:12:31 +0100 : > Hi, > > Please find attached a collection of patches updating the meye driver > to the latest version. I'd like to take the opportunity to report a bug with meye. I've ran various 2.6.* kernels on this recently acquired laptop, including 2.6.10-rc1 with your patches, all that with a Debian system on it (Sarge/testing). I figured the simplest way to test the meye driver, and to grab a shot from it, would be to use "motioneye -j foo.jpeg". Everytime I run that, though, the motioneye process gets stuck into an apparently endless loop. top shows it alternatively at states R and D, I can't kill it (even -9), and the kernel repeatedly complains "meye: need to reset HIC!". Repeatedly, as in about twice a second until reboot. Oh, and no picture ever comes out, either :-) Bits of info you may want: - lspci says: 0000:00:0b.0 Multimedia controller: Kawasaki Steel Corporation KL5A72002 Motion JPEG (rev 01) - Sony Vaio model PCG 141C, a member of the C1VE series; - motioneye 1.2-3 from Sarge; - dmesg says: [...] PCI: Enabling device 0000:00:09.0 (0006 -> 0007) ACPI: PCI interrupt 0000:00:09.0[A] -> GSI 9 (level, low) -> IRQ 9 sonypi: Sony Programmable I/O Controller Driver v1.23. sonypi: detected type1 model, verbose = 0, fnkeyinit = off, camera = off, compat = off, mask = 0xffffffff, useinput = on, acpi = on sonypi: enabled at irq=11, port1=0x10c0, port2=0x10c4 sonypi: device allocated minor is 63 Sony VAIO Jog Dial installed. Linux video capture interface: v1.00 meye: using 2 buffers with 600k (1200k total) for capture PCI: Enabling device 0000:00:0b.0 (0010 -> 0012) ACPI: PCI interrupt 0000:00:0b.0[A] -> GSI 9 (level, low) -> IRQ 9 meye: Motion Eye Camera Driver v1.10. meye: mchip KL5A72002 rev. 1, base fc104800, irq 9 Linux Kernel Card Services [...] Is there anything else I can provide? Thanks, Roland. -- Roland Mas How does an octopus go into battle? Fully-armed. ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: meye bug? (was: meye driver update) 2004-11-04 21:19 ` meye bug? (was: meye driver update) Roland Mas @ 2004-11-04 21:42 ` Roland Mas 2004-11-04 21:58 ` Stelian Pop 1 sibling, 0 replies; 26+ messages in thread From: Roland Mas @ 2004-11-04 21:42 UTC (permalink / raw) To: Stelian Pop; +Cc: Linux Kernel Mailing List Roland Mas, 2004-11-04 22:19:59 +0100 : > I'd like to take the opportunity to report a bug with meye. I've > ran various 2.6.* kernels on this recently acquired laptop, > including 2.6.10-rc1 with your patches, all that with a Debian > system on it (Sarge/testing). Reading myself again, I realise this may not be very clear, sorry. The bug happens with all versions of 2.6.* I've tried, including 2.6.10-rc1 + your patches. I did some more testing with other userspace apps. - With vgrabbj 0.9.3-1: $ vgrabbj -d /dev/video0 foo.jpeg Problem getting window information Fatal Error (non-daemon), exiting... There was no map allocated to be freed... $ (And no complaint from kernel). - With motion 3.1.14-2: $ motion Processing thread 0 - config file motion.conf Thread0 device: /dev/video0 input: 8 [Nothing happens for a while, then I get bored and ^C] $ (And exactly one "meye: need to reset HIC!" message). Roland. -- Roland Mas Despite rumour, Death isn't cruel - merely terribly, terribly good at his job. -- in Sourcery (Terry Pratchett) ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: meye bug? (was: meye driver update) 2004-11-04 21:19 ` meye bug? (was: meye driver update) Roland Mas 2004-11-04 21:42 ` Roland Mas @ 2004-11-04 21:58 ` Stelian Pop 2004-11-05 11:18 ` meye bug? No Roland Mas 1 sibling, 1 reply; 26+ messages in thread From: Stelian Pop @ 2004-11-04 21:58 UTC (permalink / raw) To: Roland Mas; +Cc: Linux Kernel Mailing List On Thu, Nov 04, 2004 at 10:19:59PM +0100, Roland Mas wrote: > I'd like to take the opportunity to report a bug with meye. I've > ran various 2.6.* kernels on this recently acquired laptop, including > 2.6.10-rc1 with your patches, all that with a Debian system on it > (Sarge/testing). I figured the simplest way to test the meye driver, > and to grab a shot from it, would be to use "motioneye -j foo.jpeg". > Everytime I run that, though, the motioneye process gets stuck into an > apparently endless loop. top shows it alternatively at states R and > D, I can't kill it (even -9), and the kernel repeatedly complains > "meye: need to reset HIC!". Repeatedly, as in about twice a second > until reboot. Oh, and no picture ever comes out, either :-) [...] > sonypi: detected type1 model, verbose = 0, fnkeyinit = off, camera = off, compat = off, mask = 0xffffffff, useinput = on, acpi = on ^^^^^^^^^^^^ :) Stelian. -- Stelian Pop <stelian@popies.net> ^ permalink raw reply [flat|nested] 26+ messages in thread
* meye bug? No. 2004-11-04 21:58 ` Stelian Pop @ 2004-11-05 11:18 ` Roland Mas 2004-11-05 22:25 ` Stelian Pop 0 siblings, 1 reply; 26+ messages in thread From: Roland Mas @ 2004-11-05 11:18 UTC (permalink / raw) To: Stelian Pop; +Cc: Linux Kernel Mailing List Stelian Pop (2004-11-04 22:58:05 +0100) : > On Thu, Nov 04, 2004 at 10:19:59PM +0100, Roland Mas wrote: [...] >> "meye: need to reset HIC!". Repeatedly, as in about twice a second >> until reboot. Oh, and no picture ever comes out, either :-) > [...] >> sonypi: detected type1 model, verbose = 0, fnkeyinit = off, camera = off, compat = off, mask = 0xffffffff, useinput = on, acpi = on > ^^^^^^^^^^^^ > > :) Okay, so I made a fool of myself, hope you had fun, sorry for the inconvenience otherwise :-) Seriously though, and as much as I know I should have read the docs, is this detectable from meye? If it is, I suggest it would be a nice thing to have a different or more explicit error message. Just "meye: need to reset HIC, is sonypi correctly configured?" would be cool. Roland. -- Roland Mas Such compressed poems / With seventeen syllables / Can't have much meaning... -- in Gödel, Escher, Bach: an Eternal Golden Braid (Douglas Hofstadter) ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: meye bug? No. 2004-11-05 11:18 ` meye bug? No Roland Mas @ 2004-11-05 22:25 ` Stelian Pop 0 siblings, 0 replies; 26+ messages in thread From: Stelian Pop @ 2004-11-05 22:25 UTC (permalink / raw) To: Roland Mas; +Cc: Linux Kernel Mailing List On Fri, Nov 05, 2004 at 12:18:01PM +0100, Roland Mas wrote: > > :) > > Okay, so I made a fool of myself, hope you had fun, sorry for the > inconvenience otherwise :-) No problem :) > > Seriously though, and as much as I know I should have read the docs, > is this detectable from meye? If it is, I suggest it would be a nice > thing to have a different or more explicit error message. Just "meye: > need to reset HIC, is sonypi correctly configured?" would be cool. As a matter of fact it is quite detectable yes. I'll put in a check which will even fail to load the meye module (with an explicit error message) if sonypi isn't loaded with camera=1. The only disadvantage of that is that it won't catch anymore the users who don't RTFM :) Stelian. -- Stelian Pop <stelian@popies.net> ^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2004-11-05 22:26 UTC | newest] Thread overview: 26+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2004-11-04 11:12 [PATCH 0/12] meye driver update Stelian Pop 2004-11-04 11:13 ` [PATCH 1/12] meye: module related fixes Stelian Pop 2004-11-04 11:13 ` [PATCH 2/12] meye: replace homebrew queue with kfifo Stelian Pop 2004-11-04 11:14 ` [PATCH 3/12] meye: picture depth is in bits not in bytes Stelian Pop 2004-11-04 11:14 ` [PATCH 4/12] meye: do lock properly when waiting for buffers Stelian Pop 2004-11-04 11:15 ` [PATCH 5/12] meye: implement non blocking access using poll() Stelian Pop 2004-11-04 11:15 ` [PATCH 6/12] meye: cleanup init/exit paths Stelian Pop 2004-11-04 11:16 ` [PATCH 7/12] meye: the driver is no longer experimental and depends on PCI Stelian Pop 2004-11-04 11:41 ` Christoph Hellwig 2004-11-04 11:49 ` Stelian Pop 2004-11-04 12:23 ` Arjan van de Ven 2004-11-04 12:32 ` Stelian Pop 2004-11-04 13:16 ` Arjan van de Ven 2004-11-04 14:09 ` Stelian Pop 2004-11-04 11:16 ` [PATCH 8/12] meye: module parameters documentation fixes Stelian Pop 2004-11-04 11:17 ` [PATCH 9/12] meye: add v4l2 support Stelian Pop 2004-11-04 11:17 ` [PATCH 10/12] meye: whitespace and coding style cleanups Stelian Pop 2004-11-04 11:18 ` [PATCH 11/12] meye: bump up the version number Stelian Pop 2004-11-04 11:18 ` [PATCH 12/12] meye: cache the camera settings in the driver Stelian Pop 2004-11-04 12:25 ` [PATCH 0/12] meye driver update Emmanuel Fleury 2004-11-04 12:36 ` Stelian Pop 2004-11-04 21:19 ` meye bug? (was: meye driver update) Roland Mas 2004-11-04 21:42 ` Roland Mas 2004-11-04 21:58 ` Stelian Pop 2004-11-05 11:18 ` meye bug? No Roland Mas 2004-11-05 22:25 ` Stelian Pop
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox