2 * Motion Eye video4linux driver for Sony Vaio PictureBook
4 * Copyright (C) 2001-2004 Stelian Pop <stelian@popies.net>
6 * Copyright (C) 2001-2002 AlcĂ´ve <www.alcove.com>
8 * Copyright (C) 2000 Andrew Tridgell <tridge@valinux.com>
10 * Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras.
12 * Some parts borrowed from various video4linux drivers, especially
13 * bttv-driver.c and zoran.c, see original files for credits.
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 #include <linux/config.h>
30 #include <linux/module.h>
31 #include <linux/pci.h>
32 #include <linux/sched.h>
33 #include <linux/init.h>
34 #include <linux/videodev.h>
35 #include <media/v4l2-common.h>
36 #include <asm/uaccess.h>
38 #include <linux/delay.h>
39 #include <linux/interrupt.h>
40 #include <linux/vmalloc.h>
41 #include <linux/dma-mapping.h>
44 #include <linux/meye.h>
46 MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
47 MODULE_DESCRIPTION("v4l/v4l2 driver for the MotionEye camera");
48 MODULE_LICENSE("GPL");
49 MODULE_VERSION(MEYE_DRIVER_VERSION);
51 /* force usage of V4L1 API */
52 static int forcev4l1; /* = 0 */
53 module_param(forcev4l1, int, 0644);
54 MODULE_PARM_DESC(forcev4l1, "force use of V4L1 instead of V4L2");
56 /* number of grab buffers */
57 static unsigned int gbuffers = 2;
58 module_param(gbuffers, int, 0444);
59 MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");
61 /* size of a grab buffer */
62 static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
63 module_param(gbufsize, int, 0444);
64 MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400"
65 " (will be rounded up to a page multiple)");
67 /* /dev/videoX registration number */
68 static int video_nr = -1;
69 module_param(video_nr, int, 0444);
70 MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");
72 /* driver structure - only one possible */
73 static struct meye meye;
75 /****************************************************************************/
76 /* Memory allocation routines (stolen from bttv-driver.c) */
77 /****************************************************************************/
78 static void *rvmalloc(unsigned long size)
83 size = PAGE_ALIGN(size);
84 mem = vmalloc_32(size);
87 adr = (unsigned long) mem;
89 SetPageReserved(vmalloc_to_page((void *)adr));
97 static void rvfree(void * mem, unsigned long size)
102 adr = (unsigned long) mem;
103 while ((long) size > 0) {
104 ClearPageReserved(vmalloc_to_page((void *)adr));
113 * return a page table pointing to N pages of locked memory
115 * NOTE: The meye device expects DMA addresses on 32 bits, we build
116 * a table of 1024 entries = 4 bytes * 1024 = 4096 bytes.
118 static int ptable_alloc(void)
123 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
125 /* give only 32 bit DMA addresses */
126 if (dma_set_mask(&meye.mchip_dev->dev, DMA_32BIT_MASK))
129 meye.mchip_ptable_toc = dma_alloc_coherent(&meye.mchip_dev->dev,
131 &meye.mchip_dmahandle,
133 if (!meye.mchip_ptable_toc) {
134 meye.mchip_dmahandle = 0;
138 pt = meye.mchip_ptable_toc;
139 for (i = 0; i < MCHIP_NB_PAGES; i++) {
141 meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev,
145 if (!meye.mchip_ptable[i]) {
147 pt = meye.mchip_ptable_toc;
148 for (j = 0; j < i; ++j) {
149 dma = (dma_addr_t) *pt;
150 dma_free_coherent(&meye.mchip_dev->dev,
152 meye.mchip_ptable[j], dma);
155 dma_free_coherent(&meye.mchip_dev->dev,
157 meye.mchip_ptable_toc,
158 meye.mchip_dmahandle);
159 meye.mchip_ptable_toc = NULL;
160 meye.mchip_dmahandle = 0;
169 static void ptable_free(void)
174 pt = meye.mchip_ptable_toc;
175 for (i = 0; i < MCHIP_NB_PAGES; i++) {
176 dma_addr_t dma = (dma_addr_t) *pt;
177 if (meye.mchip_ptable[i])
178 dma_free_coherent(&meye.mchip_dev->dev,
180 meye.mchip_ptable[i], dma);
184 if (meye.mchip_ptable_toc)
185 dma_free_coherent(&meye.mchip_dev->dev,
187 meye.mchip_ptable_toc,
188 meye.mchip_dmahandle);
190 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
191 meye.mchip_ptable_toc = NULL;
192 meye.mchip_dmahandle = 0;
195 /* copy data from ptable into buf */
196 static void ptable_copy(u8 *buf, int start, int size, int pt_pages)
200 for (i = 0; i < (size / PAGE_SIZE) * PAGE_SIZE; i += PAGE_SIZE) {
201 memcpy(buf + i, meye.mchip_ptable[start++], PAGE_SIZE);
202 if (start >= pt_pages)
205 memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE);
208 /****************************************************************************/
209 /* JPEG tables at different qualities to load into the VRJ chip */
210 /****************************************************************************/
212 /* return a set of quantisation tables based on a quality from 1 to 10 */
213 static u16 *jpeg_quantisation_tables(int *length, int quality)
215 static u16 jpeg_tables[][70] = { {
216 0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
217 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
218 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
219 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
220 0xffff, 0xffff, 0xffff,
221 0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
222 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
223 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
224 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
225 0xffff, 0xffff, 0xffff,
228 0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46,
229 0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8,
230 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
231 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
232 0xffff, 0xffff, 0xffff,
233 0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb,
234 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
235 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
236 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
237 0xffff, 0xffff, 0xffff,
240 0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23,
241 0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164,
242 0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad,
243 0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff,
244 0xe6ff, 0xfffd, 0xfff8,
245 0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876,
246 0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
247 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
248 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
249 0xf8f8, 0xf8f8, 0xfff8,
252 0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17,
253 0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042,
254 0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73,
255 0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba,
256 0x99c7, 0xaba8, 0xffa4,
257 0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e,
258 0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
259 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
260 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
261 0xa4a4, 0xa4a4, 0xffa4,
264 0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712,
265 0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932,
266 0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556,
267 0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c,
268 0x7396, 0x817e, 0xff7c,
269 0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b,
270 0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
271 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
272 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
273 0x7c7c, 0x7c7c, 0xff7c,
276 0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e,
277 0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28,
278 0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745,
279 0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470,
280 0x5c78, 0x6765, 0xff63,
281 0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f,
282 0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
283 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
284 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
285 0x6363, 0x6363, 0xff63,
288 0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b,
289 0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20,
290 0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37,
291 0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a,
292 0x4a60, 0x5251, 0xff4f,
293 0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26,
294 0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
295 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
296 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
297 0x4f4f, 0x4f4f, 0xff4f,
300 0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08,
301 0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318,
302 0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129,
303 0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43,
304 0x3748, 0x3e3d, 0xff3b,
305 0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c,
306 0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
307 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
308 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
309 0x3b3b, 0x3b3b, 0xff3b,
312 0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706,
313 0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710,
314 0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c,
315 0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d,
316 0x2530, 0x2928, 0xff28,
317 0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813,
318 0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
319 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
320 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
321 0x2828, 0x2828, 0xff28,
324 0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403,
325 0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08,
326 0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e,
327 0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416,
328 0x1218, 0x1514, 0xff14,
329 0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409,
330 0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
331 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
332 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
333 0x1414, 0x1414, 0xff14,
336 0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
337 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
338 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
339 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
340 0x0101, 0x0101, 0xff01,
341 0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
342 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
343 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
344 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
345 0x0101, 0x0101, 0xff01,
348 if (quality < 0 || quality > 10) {
350 "meye: invalid quality level %d - using 8\n", quality);
354 *length = ARRAY_SIZE(jpeg_tables[quality]);
355 return jpeg_tables[quality];
358 /* return a generic set of huffman tables */
359 static u16 *jpeg_huffman_tables(int *length)
361 static u16 tables[] = {
362 0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405,
363 0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131,
364 0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142,
365 0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918,
366 0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443,
367 0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463,
368 0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483,
369 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A,
370 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8,
371 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6,
372 0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2,
373 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
374 0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405,
375 0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206,
376 0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1,
377 0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125,
378 0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A,
379 0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A,
380 0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A,
381 0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998,
382 0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6,
383 0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4,
384 0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2,
385 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
386 0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000,
387 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
389 0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101,
390 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
394 *length = ARRAY_SIZE(tables);
398 /****************************************************************************/
399 /* MCHIP low-level functions */
400 /****************************************************************************/
402 /* returns the horizontal capture size */
403 static inline int mchip_hsize(void)
405 return meye.params.subsample ? 320 : 640;
408 /* returns the vertical capture size */
409 static inline int mchip_vsize(void)
411 return meye.params.subsample ? 240 : 480;
414 /* waits for a register to be available */
415 static void mchip_sync(int reg)
420 if (reg == MCHIP_MM_FIFO_DATA) {
421 for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
422 status = readl(meye.mchip_mmregs +
423 MCHIP_MM_FIFO_STATUS);
424 if (!(status & MCHIP_MM_FIFO_WAIT)) {
425 printk(KERN_WARNING "meye: fifo not ready\n");
428 if (status & MCHIP_MM_FIFO_READY)
432 } else if (reg > 0x80) {
433 u32 mask = (reg < 0x100) ? MCHIP_HIC_STATUS_MCC_RDY
434 : MCHIP_HIC_STATUS_VRJ_RDY;
435 for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
436 status = readl(meye.mchip_mmregs + MCHIP_HIC_STATUS);
444 "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",
448 /* sets a value into the register */
449 static inline void mchip_set(int reg, u32 v)
452 writel(v, meye.mchip_mmregs + reg);
455 /* get the register value */
456 static inline u32 mchip_read(int reg)
459 return readl(meye.mchip_mmregs + reg);
462 /* wait for a register to become a particular value */
463 static inline int mchip_delay(u32 reg, u32 v)
466 while (--n && mchip_read(reg) != v)
471 /* setup subsampling */
472 static void mchip_subsample(void)
474 mchip_set(MCHIP_MCC_R_SAMPLING, meye.params.subsample);
475 mchip_set(MCHIP_MCC_R_XRANGE, mchip_hsize());
476 mchip_set(MCHIP_MCC_R_YRANGE, mchip_vsize());
477 mchip_set(MCHIP_MCC_B_XRANGE, mchip_hsize());
478 mchip_set(MCHIP_MCC_B_YRANGE, mchip_vsize());
479 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
482 /* set the framerate into the mchip */
483 static void mchip_set_framerate(void)
485 mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);
488 /* load some huffman and quantisation tables into the VRJ chip ready
489 for JPEG compression */
490 static void mchip_load_tables(void)
496 tables = jpeg_huffman_tables(&length);
497 for (i = 0; i < length; i++)
498 writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
500 tables = jpeg_quantisation_tables(&length, meye.params.quality);
501 for (i = 0; i < length; i++)
502 writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
505 /* setup the VRJ parameters in the chip */
506 static void mchip_vrj_setup(u8 mode)
508 mchip_set(MCHIP_VRJ_BUS_MODE, 5);
509 mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL, 0x1f);
510 mchip_set(MCHIP_VRJ_PDAT_USE, 1);
511 mchip_set(MCHIP_VRJ_IRQ_FLAG, 0xa0);
512 mchip_set(MCHIP_VRJ_MODE_SPECIFY, mode);
513 mchip_set(MCHIP_VRJ_NUM_LINES, mchip_vsize());
514 mchip_set(MCHIP_VRJ_NUM_PIXELS, mchip_hsize());
515 mchip_set(MCHIP_VRJ_NUM_COMPONENTS, 0x1b);
516 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_LO, 0xFFFF);
517 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_HI, 0xFFFF);
518 mchip_set(MCHIP_VRJ_COMP_DATA_FORMAT, 0xC);
519 mchip_set(MCHIP_VRJ_RESTART_INTERVAL, 0);
520 mchip_set(MCHIP_VRJ_SOF1, 0x601);
521 mchip_set(MCHIP_VRJ_SOF2, 0x1502);
522 mchip_set(MCHIP_VRJ_SOF3, 0x1503);
523 mchip_set(MCHIP_VRJ_SOF4, 0x1596);
524 mchip_set(MCHIP_VRJ_SOS, 0x0ed0);
529 /* sets the DMA parameters into the chip */
530 static void mchip_dma_setup(dma_addr_t dma_addr)
534 mchip_set(MCHIP_MM_PT_ADDR, (u32)dma_addr);
535 for (i = 0; i < 4; i++)
536 mchip_set(MCHIP_MM_FIR(i), 0);
540 /* setup for DMA transfers - also zeros the framebuffer */
541 static int mchip_dma_alloc(void)
543 if (!meye.mchip_dmahandle)
549 /* frees the DMA buffer */
550 static void mchip_dma_free(void)
552 if (meye.mchip_dmahandle) {
558 /* stop any existing HIC action and wait for any dma to complete then
559 reset the dma engine */
560 static void mchip_hic_stop(void)
564 meye.mchip_mode = MCHIP_HIC_MODE_NOOP;
565 if (!(mchip_read(MCHIP_HIC_STATUS) & MCHIP_HIC_STATUS_BUSY))
567 for (i = 0; i < 20; ++i) {
568 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_STOP);
569 mchip_delay(MCHIP_HIC_CMD, 0);
570 for (j = 0; j < 100; ++j) {
571 if (mchip_delay(MCHIP_HIC_STATUS,
572 MCHIP_HIC_STATUS_IDLE))
576 printk(KERN_ERR "meye: need to reset HIC!\n");
578 mchip_set(MCHIP_HIC_CTL, MCHIP_HIC_CTL_SOFT_RESET);
581 printk(KERN_ERR "meye: resetting HIC hanged!\n");
584 /****************************************************************************/
585 /* MCHIP frame processing functions */
586 /****************************************************************************/
588 /* get the next ready frame from the dma engine */
589 static u32 mchip_get_frame(void)
593 v = mchip_read(MCHIP_MM_FIR(meye.mchip_fnum));
597 /* frees the current frame from the dma engine */
598 static void mchip_free_frame(void)
600 mchip_set(MCHIP_MM_FIR(meye.mchip_fnum), 0);
602 meye.mchip_fnum %= 4;
605 /* read one frame from the framebuffer assuming it was captured using
606 a uncompressed transfer */
607 static void mchip_cont_read_frame(u32 v, u8 *buf, int size)
611 pt_id = (v >> 17) & 0x3FF;
613 ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES);
616 /* read a compressed frame from the framebuffer */
617 static int mchip_comp_read_frame(u32 v, u8 *buf, int size)
619 int pt_start, pt_end, trailer;
623 pt_start = (v >> 19) & 0xFF;
624 pt_end = (v >> 11) & 0xFF;
625 trailer = (v >> 1) & 0x3FF;
627 if (pt_end < pt_start)
628 fsize = (MCHIP_NB_PAGES_MJPEG - pt_start) * PAGE_SIZE +
629 pt_end * PAGE_SIZE + trailer * 4;
631 fsize = (pt_end - pt_start) * PAGE_SIZE + trailer * 4;
634 printk(KERN_WARNING "meye: oversized compressed frame %d\n",
639 ptable_copy(buf, pt_start, fsize, MCHIP_NB_PAGES_MJPEG);
641 #ifdef MEYE_JPEG_CORRECTION
643 /* Some mchip generated jpeg frames are incorrect. In most
644 * (all ?) of those cases, the final EOI (0xff 0xd9) marker
645 * is not present at the end of the frame.
647 * Since adding the final marker is not enough to restore
648 * the jpeg integrity, we drop the frame.
651 for (i = fsize - 1; i > 0 && buf[i] == 0xff; i--) ;
653 if (i < 2 || buf[i - 1] != 0xff || buf[i] != 0xd9)
661 /* take a picture into SDRAM */
662 static void mchip_take_picture(void)
668 mchip_dma_setup(meye.mchip_dmahandle);
670 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_CAP);
671 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
673 mchip_delay(MCHIP_HIC_CMD, 0);
675 for (i = 0; i < 100; ++i) {
676 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
682 /* dma a previously taken picture into a buffer */
683 static void mchip_get_picture(u8 *buf, int bufsize)
688 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_OUT);
689 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
691 mchip_delay(MCHIP_HIC_CMD, 0);
692 for (i = 0; i < 100; ++i) {
693 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
697 for (i = 0; i < 4; ++i) {
698 v = mchip_get_frame();
699 if (v & MCHIP_MM_FIR_RDY) {
700 mchip_cont_read_frame(v, buf, bufsize);
707 /* start continuous dma capture */
708 static void mchip_continuous_start(void)
712 mchip_set_framerate();
713 mchip_dma_setup(meye.mchip_dmahandle);
715 meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
717 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_OUT);
718 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
720 mchip_delay(MCHIP_HIC_CMD, 0);
723 /* compress one frame into a buffer */
724 static int mchip_compress_frame(u8 *buf, int bufsize)
729 mchip_vrj_setup(0x3f);
732 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_COMP);
733 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
735 mchip_delay(MCHIP_HIC_CMD, 0);
736 for (i = 0; i < 100; ++i) {
737 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
742 for (i = 0; i < 4; ++i) {
743 v = mchip_get_frame();
744 if (v & MCHIP_MM_FIR_RDY) {
745 len = mchip_comp_read_frame(v, buf, bufsize);
754 /* uncompress one image into a buffer */
755 static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize)
757 mchip_vrj_setup(0x3f);
760 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_DECOMP);
761 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
763 mchip_delay(MCHIP_HIC_CMD, 0);
765 return mchip_comp_read_frame(buf, bufsize);
769 /* start continuous compressed capture */
770 static void mchip_cont_compression_start(void)
773 mchip_vrj_setup(0x3f);
775 mchip_set_framerate();
776 mchip_dma_setup(meye.mchip_dmahandle);
778 meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
780 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_COMP);
781 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
783 mchip_delay(MCHIP_HIC_CMD, 0);
786 /****************************************************************************/
787 /* Interrupt handling */
788 /****************************************************************************/
790 static irqreturn_t meye_irq(int irq, void *dev_id, struct pt_regs *regs)
794 static int sequence = 0;
796 v = mchip_read(MCHIP_MM_INTA);
798 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT &&
799 meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
803 v = mchip_get_frame();
804 if (!(v & MCHIP_MM_FIR_RDY))
807 if (meye.mchip_mode == MCHIP_HIC_MODE_CONT_OUT) {
808 if (kfifo_get(meye.grabq, (unsigned char *)&reqnr,
809 sizeof(int)) != sizeof(int)) {
813 mchip_cont_read_frame(v, meye.grab_fbuffer + gbufsize * reqnr,
814 mchip_hsize() * mchip_vsize() * 2);
815 meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2;
816 meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
817 do_gettimeofday(&meye.grab_buffer[reqnr].timestamp);
818 meye.grab_buffer[reqnr].sequence = sequence++;
819 kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int));
820 wake_up_interruptible(&meye.proc_list);
823 size = mchip_comp_read_frame(v, meye.grab_temp, gbufsize);
828 if (kfifo_get(meye.grabq, (unsigned char *)&reqnr,
829 sizeof(int)) != sizeof(int)) {
833 memcpy(meye.grab_fbuffer + gbufsize * reqnr, meye.grab_temp,
835 meye.grab_buffer[reqnr].size = size;
836 meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
837 do_gettimeofday(&meye.grab_buffer[reqnr].timestamp);
838 meye.grab_buffer[reqnr].sequence = sequence++;
839 kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int));
840 wake_up_interruptible(&meye.proc_list);
846 /****************************************************************************/
847 /* video4linux integration */
848 /****************************************************************************/
850 static int meye_open(struct inode *inode, struct file *file)
854 err = video_exclusive_open(inode, file);
860 if (mchip_dma_alloc()) {
861 printk(KERN_ERR "meye: mchip framebuffer allocation failed\n");
862 video_exclusive_release(inode, file);
866 for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
867 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
868 kfifo_reset(meye.grabq);
869 kfifo_reset(meye.doneq);
873 static int meye_release(struct inode *inode, struct file *file)
877 video_exclusive_release(inode, file);
881 static int meye_do_ioctl(struct inode *inode, struct file *file,
882 unsigned int cmd, void *arg)
887 struct video_capability *b = arg;
888 strcpy(b->name,meye.video_dev->name);
889 b->type = VID_TYPE_CAPTURE;
900 struct video_channel *v = arg;
903 v->type = VIDEO_TYPE_CAMERA;
906 strcpy(v->name,"Camera");
911 struct video_channel *v = arg;
918 struct video_picture *p = arg;
924 struct video_picture *p = arg;
927 if (p->palette != VIDEO_PALETTE_YUV422)
929 mutex_lock(&meye.lock);
930 sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS,
931 p->brightness >> 10);
932 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE,
934 sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR,
936 sonypi_camera_command(SONYPI_COMMAND_SETCAMERACONTRAST,
939 mutex_unlock(&meye.lock);
947 if (*i < 0 || *i >= gbuffers)
950 mutex_lock(&meye.lock);
952 switch (meye.grab_buffer[*i].state) {
954 case MEYE_BUF_UNUSED:
955 mutex_unlock(&meye.lock);
958 if (file->f_flags & O_NONBLOCK) {
959 mutex_unlock(&meye.lock);
962 if (wait_event_interruptible(meye.proc_list,
963 (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
964 mutex_unlock(&meye.lock);
969 meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
970 kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int));
972 mutex_unlock(&meye.lock);
976 case VIDIOCMCAPTURE: {
977 struct video_mmap *vm = arg;
980 if (vm->frame >= gbuffers || vm->frame < 0)
982 if (vm->format != VIDEO_PALETTE_YUV422)
984 if (vm->height * vm->width * 2 > gbufsize)
986 if (!meye.grab_fbuffer)
988 if (meye.grab_buffer[vm->frame].state != MEYE_BUF_UNUSED)
991 mutex_lock(&meye.lock);
992 if (vm->width == 640 && vm->height == 480) {
993 if (meye.params.subsample) {
994 meye.params.subsample = 0;
997 } else if (vm->width == 320 && vm->height == 240) {
998 if (!meye.params.subsample) {
999 meye.params.subsample = 1;
1003 mutex_unlock(&meye.lock);
1007 if (restart || meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT)
1008 mchip_continuous_start();
1009 meye.grab_buffer[vm->frame].state = MEYE_BUF_USING;
1010 kfifo_put(meye.grabq, (unsigned char *)&vm->frame, sizeof(int));
1011 mutex_unlock(&meye.lock);
1016 struct video_mbuf *vm = arg;
1019 memset(vm, 0 , sizeof(*vm));
1020 vm->size = gbufsize * gbuffers;
1021 vm->frames = gbuffers;
1022 for (i = 0; i < gbuffers; i++)
1023 vm->offsets[i] = i * gbufsize;
1027 case MEYEIOC_G_PARAMS: {
1028 struct meye_params *p = arg;
1033 case MEYEIOC_S_PARAMS: {
1034 struct meye_params *jp = arg;
1035 if (jp->subsample > 1)
1037 if (jp->quality > 10)
1039 if (jp->sharpness > 63 || jp->agc > 63 || jp->picture > 63)
1041 if (jp->framerate > 31)
1043 mutex_lock(&meye.lock);
1044 if (meye.params.subsample != jp->subsample ||
1045 meye.params.quality != jp->quality)
1046 mchip_hic_stop(); /* need restart */
1048 sonypi_camera_command(SONYPI_COMMAND_SETCAMERASHARPNESS,
1049 meye.params.sharpness);
1050 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAAGC,
1052 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAPICTURE,
1053 meye.params.picture);
1054 mutex_unlock(&meye.lock);
1058 case MEYEIOC_QBUF_CAPT: {
1061 if (!meye.grab_fbuffer)
1063 if (*nb >= gbuffers)
1070 if (meye.grab_buffer[*nb].state != MEYE_BUF_UNUSED)
1072 mutex_lock(&meye.lock);
1073 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
1074 mchip_cont_compression_start();
1075 meye.grab_buffer[*nb].state = MEYE_BUF_USING;
1076 kfifo_put(meye.grabq, (unsigned char *)nb, sizeof(int));
1077 mutex_unlock(&meye.lock);
1081 case MEYEIOC_SYNC: {
1085 if (*i < 0 || *i >= gbuffers)
1088 mutex_lock(&meye.lock);
1089 switch (meye.grab_buffer[*i].state) {
1091 case MEYE_BUF_UNUSED:
1092 mutex_unlock(&meye.lock);
1094 case MEYE_BUF_USING:
1095 if (file->f_flags & O_NONBLOCK) {
1096 mutex_unlock(&meye.lock);
1099 if (wait_event_interruptible(meye.proc_list,
1100 (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
1101 mutex_unlock(&meye.lock);
1106 meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
1107 kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int));
1109 *i = meye.grab_buffer[*i].size;
1110 mutex_unlock(&meye.lock);
1114 case MEYEIOC_STILLCAPT: {
1116 if (!meye.grab_fbuffer)
1118 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
1120 mutex_lock(&meye.lock);
1121 meye.grab_buffer[0].state = MEYE_BUF_USING;
1122 mchip_take_picture();
1125 mchip_hsize() * mchip_vsize() * 2);
1126 meye.grab_buffer[0].state = MEYE_BUF_DONE;
1127 mutex_unlock(&meye.lock);
1131 case MEYEIOC_STILLJCAPT: {
1134 if (!meye.grab_fbuffer)
1136 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
1138 mutex_lock(&meye.lock);
1139 meye.grab_buffer[0].state = MEYE_BUF_USING;
1141 while (*len == -1) {
1142 mchip_take_picture();
1143 *len = mchip_compress_frame(meye.grab_fbuffer, gbufsize);
1145 meye.grab_buffer[0].state = MEYE_BUF_DONE;
1146 mutex_unlock(&meye.lock);
1150 case VIDIOC_QUERYCAP: {
1151 struct v4l2_capability *cap = arg;
1156 memset(cap, 0, sizeof(*cap));
1157 strcpy(cap->driver, "meye");
1158 strcpy(cap->card, "meye");
1159 sprintf(cap->bus_info, "PCI:%s", pci_name(meye.mchip_dev));
1160 cap->version = (MEYE_DRIVER_MAJORVERSION << 8) +
1161 MEYE_DRIVER_MINORVERSION;
1162 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1167 case VIDIOC_ENUMINPUT: {
1168 struct v4l2_input *i = arg;
1172 memset(i, 0, sizeof(*i));
1174 strcpy(i->name, "Camera");
1175 i->type = V4L2_INPUT_TYPE_CAMERA;
1179 case VIDIOC_G_INPUT: {
1186 case VIDIOC_S_INPUT: {
1194 case VIDIOC_QUERYCTRL: {
1195 struct v4l2_queryctrl *c = arg;
1199 case V4L2_CID_BRIGHTNESS:
1200 c->type = V4L2_CTRL_TYPE_INTEGER;
1201 strcpy(c->name, "Brightness");
1205 c->default_value = 32;
1209 c->type = V4L2_CTRL_TYPE_INTEGER;
1210 strcpy(c->name, "Hue");
1214 c->default_value = 32;
1217 case V4L2_CID_CONTRAST:
1218 c->type = V4L2_CTRL_TYPE_INTEGER;
1219 strcpy(c->name, "Contrast");
1223 c->default_value = 32;
1226 case V4L2_CID_SATURATION:
1227 c->type = V4L2_CTRL_TYPE_INTEGER;
1228 strcpy(c->name, "Saturation");
1232 c->default_value = 32;
1236 c->type = V4L2_CTRL_TYPE_INTEGER;
1237 strcpy(c->name, "Agc");
1241 c->default_value = 48;
1244 case V4L2_CID_SHARPNESS:
1245 c->type = V4L2_CTRL_TYPE_INTEGER;
1246 strcpy(c->name, "Sharpness");
1250 c->default_value = 32;
1253 case V4L2_CID_PICTURE:
1254 c->type = V4L2_CTRL_TYPE_INTEGER;
1255 strcpy(c->name, "Picture");
1259 c->default_value = 0;
1262 case V4L2_CID_JPEGQUAL:
1263 c->type = V4L2_CTRL_TYPE_INTEGER;
1264 strcpy(c->name, "JPEG quality");
1268 c->default_value = 8;
1271 case V4L2_CID_FRAMERATE:
1272 c->type = V4L2_CTRL_TYPE_INTEGER;
1273 strcpy(c->name, "Framerate");
1277 c->default_value = 0;
1286 case VIDIOC_S_CTRL: {
1287 struct v4l2_control *c = arg;
1289 mutex_lock(&meye.lock);
1291 case V4L2_CID_BRIGHTNESS:
1292 sonypi_camera_command(
1293 SONYPI_COMMAND_SETCAMERABRIGHTNESS, c->value);
1294 meye.picture.brightness = c->value << 10;
1297 sonypi_camera_command(
1298 SONYPI_COMMAND_SETCAMERAHUE, c->value);
1299 meye.picture.hue = c->value << 10;
1301 case V4L2_CID_CONTRAST:
1302 sonypi_camera_command(
1303 SONYPI_COMMAND_SETCAMERACONTRAST, c->value);
1304 meye.picture.contrast = c->value << 10;
1306 case V4L2_CID_SATURATION:
1307 sonypi_camera_command(
1308 SONYPI_COMMAND_SETCAMERACOLOR, c->value);
1309 meye.picture.colour = c->value << 10;
1312 sonypi_camera_command(
1313 SONYPI_COMMAND_SETCAMERAAGC, c->value);
1314 meye.params.agc = c->value;
1316 case V4L2_CID_SHARPNESS:
1317 sonypi_camera_command(
1318 SONYPI_COMMAND_SETCAMERASHARPNESS, c->value);
1319 meye.params.sharpness = c->value;
1321 case V4L2_CID_PICTURE:
1322 sonypi_camera_command(
1323 SONYPI_COMMAND_SETCAMERAPICTURE, c->value);
1324 meye.params.picture = c->value;
1326 case V4L2_CID_JPEGQUAL:
1327 meye.params.quality = c->value;
1329 case V4L2_CID_FRAMERATE:
1330 meye.params.framerate = c->value;
1333 mutex_unlock(&meye.lock);
1336 mutex_unlock(&meye.lock);
1340 case VIDIOC_G_CTRL: {
1341 struct v4l2_control *c = arg;
1343 mutex_lock(&meye.lock);
1345 case V4L2_CID_BRIGHTNESS:
1346 c->value = meye.picture.brightness >> 10;
1349 c->value = meye.picture.hue >> 10;
1351 case V4L2_CID_CONTRAST:
1352 c->value = meye.picture.contrast >> 10;
1354 case V4L2_CID_SATURATION:
1355 c->value = meye.picture.colour >> 10;
1358 c->value = meye.params.agc;
1360 case V4L2_CID_SHARPNESS:
1361 c->value = meye.params.sharpness;
1363 case V4L2_CID_PICTURE:
1364 c->value = meye.params.picture;
1366 case V4L2_CID_JPEGQUAL:
1367 c->value = meye.params.quality;
1369 case V4L2_CID_FRAMERATE:
1370 c->value = meye.params.framerate;
1373 mutex_unlock(&meye.lock);
1376 mutex_unlock(&meye.lock);
1380 case VIDIOC_ENUM_FMT: {
1381 struct v4l2_fmtdesc *f = arg;
1385 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1387 if (f->index == 0) {
1388 /* standard YUV 422 capture */
1389 memset(f, 0, sizeof(*f));
1391 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1393 strcpy(f->description, "YUV422");
1394 f->pixelformat = V4L2_PIX_FMT_YUYV;
1396 /* compressed MJPEG capture */
1397 memset(f, 0, sizeof(*f));
1399 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1400 f->flags = V4L2_FMT_FLAG_COMPRESSED;
1401 strcpy(f->description, "MJPEG");
1402 f->pixelformat = V4L2_PIX_FMT_MJPEG;
1407 case VIDIOC_TRY_FMT: {
1408 struct v4l2_format *f = arg;
1410 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1412 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1413 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1415 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1416 f->fmt.pix.field != V4L2_FIELD_NONE)
1418 f->fmt.pix.field = V4L2_FIELD_NONE;
1419 if (f->fmt.pix.width <= 320) {
1420 f->fmt.pix.width = 320;
1421 f->fmt.pix.height = 240;
1423 f->fmt.pix.width = 640;
1424 f->fmt.pix.height = 480;
1426 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1427 f->fmt.pix.sizeimage = f->fmt.pix.height *
1428 f->fmt.pix.bytesperline;
1429 f->fmt.pix.colorspace = 0;
1430 f->fmt.pix.priv = 0;
1434 case VIDIOC_G_FMT: {
1435 struct v4l2_format *f = arg;
1437 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1439 memset(&f->fmt.pix, 0, sizeof(struct v4l2_pix_format));
1440 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1441 switch (meye.mchip_mode) {
1442 case MCHIP_HIC_MODE_CONT_OUT:
1444 f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
1446 case MCHIP_HIC_MODE_CONT_COMP:
1447 f->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
1450 f->fmt.pix.field = V4L2_FIELD_NONE;
1451 f->fmt.pix.width = mchip_hsize();
1452 f->fmt.pix.height = mchip_vsize();
1453 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1454 f->fmt.pix.sizeimage = f->fmt.pix.height *
1455 f->fmt.pix.bytesperline;
1456 f->fmt.pix.colorspace = 0;
1457 f->fmt.pix.priv = 0;
1461 case VIDIOC_S_FMT: {
1462 struct v4l2_format *f = arg;
1464 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1466 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1467 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1469 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1470 f->fmt.pix.field != V4L2_FIELD_NONE)
1472 f->fmt.pix.field = V4L2_FIELD_NONE;
1473 mutex_lock(&meye.lock);
1474 if (f->fmt.pix.width <= 320) {
1475 f->fmt.pix.width = 320;
1476 f->fmt.pix.height = 240;
1477 meye.params.subsample = 1;
1479 f->fmt.pix.width = 640;
1480 f->fmt.pix.height = 480;
1481 meye.params.subsample = 0;
1483 switch (f->fmt.pix.pixelformat) {
1484 case V4L2_PIX_FMT_YUYV:
1485 meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
1487 case V4L2_PIX_FMT_MJPEG:
1488 meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
1491 mutex_unlock(&meye.lock);
1492 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1493 f->fmt.pix.sizeimage = f->fmt.pix.height *
1494 f->fmt.pix.bytesperline;
1495 f->fmt.pix.colorspace = 0;
1496 f->fmt.pix.priv = 0;
1501 case VIDIOC_REQBUFS: {
1502 struct v4l2_requestbuffers *req = arg;
1505 if (req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1507 if (req->memory != V4L2_MEMORY_MMAP)
1509 if (meye.grab_fbuffer && req->count == gbuffers) {
1510 /* already allocated, no modifications */
1513 mutex_lock(&meye.lock);
1514 if (meye.grab_fbuffer) {
1515 for (i = 0; i < gbuffers; i++)
1516 if (meye.vma_use_count[i]) {
1517 mutex_unlock(&meye.lock);
1520 rvfree(meye.grab_fbuffer, gbuffers * gbufsize);
1521 meye.grab_fbuffer = NULL;
1523 gbuffers = max(2, min((int)req->count, MEYE_MAX_BUFNBRS));
1524 req->count = gbuffers;
1525 meye.grab_fbuffer = rvmalloc(gbuffers * gbufsize);
1526 if (!meye.grab_fbuffer) {
1527 printk(KERN_ERR "meye: v4l framebuffer allocation"
1529 mutex_unlock(&meye.lock);
1532 for (i = 0; i < gbuffers; i++)
1533 meye.vma_use_count[i] = 0;
1534 mutex_unlock(&meye.lock);
1538 case VIDIOC_QUERYBUF: {
1539 struct v4l2_buffer *buf = arg;
1540 int index = buf->index;
1542 if (index < 0 || index >= gbuffers)
1544 memset(buf, 0, sizeof(*buf));
1545 buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1547 buf->bytesused = meye.grab_buffer[index].size;
1548 buf->flags = V4L2_BUF_FLAG_MAPPED;
1549 if (meye.grab_buffer[index].state == MEYE_BUF_USING)
1550 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1551 if (meye.grab_buffer[index].state == MEYE_BUF_DONE)
1552 buf->flags |= V4L2_BUF_FLAG_DONE;
1553 buf->field = V4L2_FIELD_NONE;
1554 buf->timestamp = meye.grab_buffer[index].timestamp;
1555 buf->sequence = meye.grab_buffer[index].sequence;
1556 buf->memory = V4L2_MEMORY_MMAP;
1557 buf->m.offset = index * gbufsize;
1558 buf->length = gbufsize;
1563 struct v4l2_buffer *buf = arg;
1565 if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1567 if (buf->memory != V4L2_MEMORY_MMAP)
1569 if (buf->index < 0 || buf->index >= gbuffers)
1571 if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED)
1573 mutex_lock(&meye.lock);
1574 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1575 buf->flags &= ~V4L2_BUF_FLAG_DONE;
1576 meye.grab_buffer[buf->index].state = MEYE_BUF_USING;
1577 kfifo_put(meye.grabq, (unsigned char *)&buf->index, sizeof(int));
1578 mutex_unlock(&meye.lock);
1582 case VIDIOC_DQBUF: {
1583 struct v4l2_buffer *buf = arg;
1586 if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1588 if (buf->memory != V4L2_MEMORY_MMAP)
1591 mutex_lock(&meye.lock);
1592 if (kfifo_len(meye.doneq) == 0 && file->f_flags & O_NONBLOCK) {
1593 mutex_unlock(&meye.lock);
1596 if (wait_event_interruptible(meye.proc_list,
1597 kfifo_len(meye.doneq) != 0) < 0) {
1598 mutex_unlock(&meye.lock);
1601 if (!kfifo_get(meye.doneq, (unsigned char *)&reqnr,
1603 mutex_unlock(&meye.lock);
1606 if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) {
1607 mutex_unlock(&meye.lock);
1611 buf->bytesused = meye.grab_buffer[reqnr].size;
1612 buf->flags = V4L2_BUF_FLAG_MAPPED;
1613 buf->field = V4L2_FIELD_NONE;
1614 buf->timestamp = meye.grab_buffer[reqnr].timestamp;
1615 buf->sequence = meye.grab_buffer[reqnr].sequence;
1616 buf->memory = V4L2_MEMORY_MMAP;
1617 buf->m.offset = reqnr * gbufsize;
1618 buf->length = gbufsize;
1619 meye.grab_buffer[reqnr].state = MEYE_BUF_UNUSED;
1620 mutex_unlock(&meye.lock);
1624 case VIDIOC_STREAMON: {
1625 mutex_lock(&meye.lock);
1626 switch (meye.mchip_mode) {
1627 case MCHIP_HIC_MODE_CONT_OUT:
1628 mchip_continuous_start();
1630 case MCHIP_HIC_MODE_CONT_COMP:
1631 mchip_cont_compression_start();
1634 mutex_unlock(&meye.lock);
1637 mutex_unlock(&meye.lock);
1641 case VIDIOC_STREAMOFF: {
1644 mutex_lock(&meye.lock);
1646 kfifo_reset(meye.grabq);
1647 kfifo_reset(meye.doneq);
1648 for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
1649 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
1650 mutex_unlock(&meye.lock);
1655 * XXX what about private snapshot ioctls ?
1656 * Do they need to be converted to V4L2 ?
1660 return -ENOIOCTLCMD;
1666 static int meye_ioctl(struct inode *inode, struct file *file,
1667 unsigned int cmd, unsigned long arg)
1669 return video_usercopy(inode, file, cmd, arg, meye_do_ioctl);
1672 static unsigned int meye_poll(struct file *file, poll_table *wait)
1674 unsigned int res = 0;
1676 mutex_lock(&meye.lock);
1677 poll_wait(file, &meye.proc_list, wait);
1678 if (kfifo_len(meye.doneq))
1679 res = POLLIN | POLLRDNORM;
1680 mutex_unlock(&meye.lock);
1684 static void meye_vm_open(struct vm_area_struct *vma)
1686 long idx = (long)vma->vm_private_data;
1687 meye.vma_use_count[idx]++;
1690 static void meye_vm_close(struct vm_area_struct *vma)
1692 long idx = (long)vma->vm_private_data;
1693 meye.vma_use_count[idx]--;
1696 static struct vm_operations_struct meye_vm_ops = {
1697 .open = meye_vm_open,
1698 .close = meye_vm_close,
1701 static int meye_mmap(struct file *file, struct vm_area_struct *vma)
1703 unsigned long start = vma->vm_start;
1704 unsigned long size = vma->vm_end - vma->vm_start;
1705 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
1706 unsigned long page, pos;
1708 mutex_lock(&meye.lock);
1709 if (size > gbuffers * gbufsize) {
1710 mutex_unlock(&meye.lock);
1713 if (!meye.grab_fbuffer) {
1716 /* lazy allocation */
1717 meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize);
1718 if (!meye.grab_fbuffer) {
1719 printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1720 mutex_unlock(&meye.lock);
1723 for (i = 0; i < gbuffers; i++)
1724 meye.vma_use_count[i] = 0;
1726 pos = (unsigned long)meye.grab_fbuffer + offset;
1729 page = vmalloc_to_pfn((void *)pos);
1730 if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
1731 mutex_unlock(&meye.lock);
1736 if (size > PAGE_SIZE)
1742 vma->vm_ops = &meye_vm_ops;
1743 vma->vm_flags &= ~VM_IO; /* not I/O memory */
1744 vma->vm_flags |= VM_RESERVED; /* avoid to swap out this VMA */
1745 vma->vm_private_data = (void *) (offset / gbufsize);
1748 mutex_unlock(&meye.lock);
1752 static struct file_operations meye_fops = {
1753 .owner = THIS_MODULE,
1755 .release = meye_release,
1757 .ioctl = meye_ioctl,
1758 .compat_ioctl = v4l_compat_ioctl32,
1760 .llseek = no_llseek,
1763 static struct video_device meye_template = {
1764 .owner = THIS_MODULE,
1766 .type = VID_TYPE_CAPTURE,
1767 .hardware = VID_HARDWARE_MEYE,
1769 .release = video_device_release,
1774 static int meye_suspend(struct pci_dev *pdev, pm_message_t state)
1776 pci_save_state(pdev);
1777 meye.pm_mchip_mode = meye.mchip_mode;
1779 mchip_set(MCHIP_MM_INTA, 0x0);
1783 static int meye_resume(struct pci_dev *pdev)
1785 pci_restore_state(pdev);
1786 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1788 mchip_delay(MCHIP_HIC_CMD, 0);
1789 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1791 mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1793 mchip_set(MCHIP_MM_PCI_MODE, 5);
1795 mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1797 switch (meye.pm_mchip_mode) {
1798 case MCHIP_HIC_MODE_CONT_OUT:
1799 mchip_continuous_start();
1801 case MCHIP_HIC_MODE_CONT_COMP:
1802 mchip_cont_compression_start();
1809 static int __devinit meye_probe(struct pci_dev *pcidev,
1810 const struct pci_device_id *ent)
1813 unsigned long mchip_adr;
1816 if (meye.mchip_dev != NULL) {
1817 printk(KERN_ERR "meye: only one device allowed!\n");
1821 meye.mchip_dev = pcidev;
1822 meye.video_dev = video_device_alloc();
1823 if (!meye.video_dev) {
1824 printk(KERN_ERR "meye: video_device_alloc() failed!\n");
1829 meye.grab_temp = vmalloc(MCHIP_NB_PAGES_MJPEG * PAGE_SIZE);
1830 if (!meye.grab_temp) {
1831 printk(KERN_ERR "meye: grab buffer allocation failed\n");
1835 spin_lock_init(&meye.grabq_lock);
1836 meye.grabq = kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL,
1838 if (IS_ERR(meye.grabq)) {
1839 printk(KERN_ERR "meye: fifo allocation failed\n");
1840 goto outkfifoalloc1;
1842 spin_lock_init(&meye.doneq_lock);
1843 meye.doneq = kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL,
1845 if (IS_ERR(meye.doneq)) {
1846 printk(KERN_ERR "meye: fifo allocation failed\n");
1847 goto outkfifoalloc2;
1850 memcpy(meye.video_dev, &meye_template, sizeof(meye_template));
1851 meye.video_dev->dev = &meye.mchip_dev->dev;
1853 if ((ret = sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 1))) {
1854 printk(KERN_ERR "meye: unable to power on the camera\n");
1855 printk(KERN_ERR "meye: did you enable the camera in "
1856 "sonypi using the module options ?\n");
1857 goto outsonypienable;
1861 if ((ret = pci_enable_device(meye.mchip_dev))) {
1862 printk(KERN_ERR "meye: pci_enable_device failed\n");
1866 mchip_adr = pci_resource_start(meye.mchip_dev,0);
1868 printk(KERN_ERR "meye: mchip has no device base address\n");
1871 if (!request_mem_region(pci_resource_start(meye.mchip_dev, 0),
1872 pci_resource_len(meye.mchip_dev, 0),
1874 printk(KERN_ERR "meye: request_mem_region failed\n");
1877 meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS);
1878 if (!meye.mchip_mmregs) {
1879 printk(KERN_ERR "meye: ioremap failed\n");
1883 meye.mchip_irq = pcidev->irq;
1884 if (request_irq(meye.mchip_irq, meye_irq,
1885 SA_INTERRUPT | SA_SHIRQ, "meye", meye_irq)) {
1886 printk(KERN_ERR "meye: request_irq failed\n");
1890 pci_read_config_byte(meye.mchip_dev, PCI_REVISION_ID, &revision);
1891 pci_write_config_byte(meye.mchip_dev, PCI_CACHE_LINE_SIZE, 8);
1892 pci_write_config_byte(meye.mchip_dev, PCI_LATENCY_TIMER, 64);
1894 pci_set_master(meye.mchip_dev);
1896 /* Ask the camera to perform a soft reset. */
1897 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1899 mchip_delay(MCHIP_HIC_CMD, 0);
1900 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1903 mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1906 mchip_set(MCHIP_MM_PCI_MODE, 5);
1909 mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1911 if (video_register_device(meye.video_dev, VFL_TYPE_GRABBER,
1913 printk(KERN_ERR "meye: video_register_device failed\n");
1917 mutex_init(&meye.lock);
1918 init_waitqueue_head(&meye.proc_list);
1919 meye.picture.depth = 16;
1920 meye.picture.palette = VIDEO_PALETTE_YUV422;
1921 meye.picture.brightness = 32 << 10;
1922 meye.picture.hue = 32 << 10;
1923 meye.picture.colour = 32 << 10;
1924 meye.picture.contrast = 32 << 10;
1925 meye.picture.whiteness = 0;
1926 meye.params.subsample = 0;
1927 meye.params.quality = 8;
1928 meye.params.sharpness = 32;
1929 meye.params.agc = 48;
1930 meye.params.picture = 0;
1931 meye.params.framerate = 0;
1933 sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, 32);
1934 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, 32);
1935 sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR, 32);
1936 sonypi_camera_command(SONYPI_COMMAND_SETCAMERACONTRAST, 32);
1937 sonypi_camera_command(SONYPI_COMMAND_SETCAMERASHARPNESS, 32);
1938 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAPICTURE, 0);
1939 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAAGC, 48);
1941 printk(KERN_INFO "meye: Motion Eye Camera Driver v%s.\n",
1942 MEYE_DRIVER_VERSION);
1943 printk(KERN_INFO "meye: mchip KL5A72002 rev. %d, base %lx, irq %d\n",
1944 revision, mchip_adr, meye.mchip_irq);
1949 free_irq(meye.mchip_irq, meye_irq);
1951 iounmap(meye.mchip_mmregs);
1953 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1954 pci_resource_len(meye.mchip_dev, 0));
1956 pci_disable_device(meye.mchip_dev);
1958 sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0);
1960 kfifo_free(meye.doneq);
1962 kfifo_free(meye.grabq);
1964 vfree(meye.grab_temp);
1966 video_device_release(meye.video_dev);
1971 static void __devexit meye_remove(struct pci_dev *pcidev)
1973 video_unregister_device(meye.video_dev);
1979 /* disable interrupts */
1980 mchip_set(MCHIP_MM_INTA, 0x0);
1982 free_irq(meye.mchip_irq, meye_irq);
1984 iounmap(meye.mchip_mmregs);
1986 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1987 pci_resource_len(meye.mchip_dev, 0));
1989 pci_disable_device(meye.mchip_dev);
1991 sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0);
1993 kfifo_free(meye.doneq);
1994 kfifo_free(meye.grabq);
1996 vfree(meye.grab_temp);
1998 if (meye.grab_fbuffer) {
1999 rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
2000 meye.grab_fbuffer = NULL;
2003 printk(KERN_INFO "meye: removed\n");
2006 static struct pci_device_id meye_pci_tbl[] = {
2007 { PCI_VENDOR_ID_KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002,
2008 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
2012 MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
2014 static struct pci_driver meye_driver = {
2016 .id_table = meye_pci_tbl,
2017 .probe = meye_probe,
2018 .remove = __devexit_p(meye_remove),
2020 .suspend = meye_suspend,
2021 .resume = meye_resume,
2025 static int __init meye_init(void)
2027 gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS));
2028 if (gbufsize < 0 || gbufsize > MEYE_MAX_BUFSIZE)
2029 gbufsize = MEYE_MAX_BUFSIZE;
2030 gbufsize = PAGE_ALIGN(gbufsize);
2031 printk(KERN_INFO "meye: using %d buffers with %dk (%dk total)"
2034 gbufsize / 1024, gbuffers * gbufsize / 1024);
2035 return pci_register_driver(&meye_driver);
2038 static void __exit meye_exit(void)
2040 pci_unregister_driver(&meye_driver);
2043 module_init(meye_init);
2044 module_exit(meye_exit);