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 <asm/uaccess.h>
37 #include <linux/delay.h>
38 #include <linux/interrupt.h>
39 #include <linux/vmalloc.h>
40 #include <linux/dma-mapping.h>
43 #include <linux/meye.h>
45 MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
46 MODULE_DESCRIPTION("v4l/v4l2 driver for the MotionEye camera");
47 MODULE_LICENSE("GPL");
48 MODULE_VERSION(MEYE_DRIVER_VERSION);
50 /* force usage of V4L1 API */
51 static int forcev4l1; /* = 0 */
52 module_param(forcev4l1, int, 0644);
53 MODULE_PARM_DESC(forcev4l1, "force use of V4L1 instead of V4L2");
55 /* number of grab buffers */
56 static unsigned int gbuffers = 2;
57 module_param(gbuffers, int, 0444);
58 MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");
60 /* size of a grab buffer */
61 static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
62 module_param(gbufsize, int, 0444);
63 MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400"
64 " (will be rounded up to a page multiple)");
66 /* /dev/videoX registration number */
67 static int video_nr = -1;
68 module_param(video_nr, int, 0444);
69 MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");
71 /* driver structure - only one possible */
72 static struct meye meye;
74 /****************************************************************************/
75 /* Memory allocation routines (stolen from bttv-driver.c) */
76 /****************************************************************************/
77 static void *rvmalloc(unsigned long size)
82 size = PAGE_ALIGN(size);
83 mem = vmalloc_32(size);
86 adr = (unsigned long) mem;
88 SetPageReserved(vmalloc_to_page((void *)adr));
96 static void rvfree(void * mem, unsigned long size)
101 adr = (unsigned long) mem;
102 while ((long) size > 0) {
103 ClearPageReserved(vmalloc_to_page((void *)adr));
112 * return a page table pointing to N pages of locked memory
114 * NOTE: The meye device expects DMA addresses on 32 bits, we build
115 * a table of 1024 entries = 4 bytes * 1024 = 4096 bytes.
117 static int ptable_alloc(void)
122 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
124 /* give only 32 bit DMA addresses */
125 if (dma_set_mask(&meye.mchip_dev->dev, DMA_32BIT_MASK))
128 meye.mchip_ptable_toc = dma_alloc_coherent(&meye.mchip_dev->dev,
130 &meye.mchip_dmahandle,
132 if (!meye.mchip_ptable_toc) {
133 meye.mchip_dmahandle = 0;
137 pt = meye.mchip_ptable_toc;
138 for (i = 0; i < MCHIP_NB_PAGES; i++) {
140 meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev,
144 if (!meye.mchip_ptable[i]) {
146 pt = meye.mchip_ptable_toc;
147 for (j = 0; j < i; ++j) {
148 dma = (dma_addr_t) *pt;
149 dma_free_coherent(&meye.mchip_dev->dev,
151 meye.mchip_ptable[j], dma);
154 dma_free_coherent(&meye.mchip_dev->dev,
156 meye.mchip_ptable_toc,
157 meye.mchip_dmahandle);
158 meye.mchip_ptable_toc = NULL;
159 meye.mchip_dmahandle = 0;
168 static void ptable_free(void)
173 pt = meye.mchip_ptable_toc;
174 for (i = 0; i < MCHIP_NB_PAGES; i++) {
175 dma_addr_t dma = (dma_addr_t) *pt;
176 if (meye.mchip_ptable[i])
177 dma_free_coherent(&meye.mchip_dev->dev,
179 meye.mchip_ptable[i], dma);
183 if (meye.mchip_ptable_toc)
184 dma_free_coherent(&meye.mchip_dev->dev,
186 meye.mchip_ptable_toc,
187 meye.mchip_dmahandle);
189 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
190 meye.mchip_ptable_toc = NULL;
191 meye.mchip_dmahandle = 0;
194 /* copy data from ptable into buf */
195 static void ptable_copy(u8 *buf, int start, int size, int pt_pages)
199 for (i = 0; i < (size / PAGE_SIZE) * PAGE_SIZE; i += PAGE_SIZE) {
200 memcpy(buf + i, meye.mchip_ptable[start++], PAGE_SIZE);
201 if (start >= pt_pages)
204 memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE);
207 /****************************************************************************/
208 /* JPEG tables at different qualities to load into the VRJ chip */
209 /****************************************************************************/
211 /* return a set of quantisation tables based on a quality from 1 to 10 */
212 static u16 *jpeg_quantisation_tables(int *length, int quality)
214 static u16 jpeg_tables[][70] = { {
215 0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
216 0xffff, 0xffff, 0xffff, 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,
220 0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
221 0xffff, 0xffff, 0xffff, 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,
227 0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46,
228 0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8,
229 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
230 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
231 0xffff, 0xffff, 0xffff,
232 0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb,
233 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
234 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
235 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
236 0xffff, 0xffff, 0xffff,
239 0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23,
240 0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164,
241 0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad,
242 0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff,
243 0xe6ff, 0xfffd, 0xfff8,
244 0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876,
245 0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
246 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
247 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
248 0xf8f8, 0xf8f8, 0xfff8,
251 0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17,
252 0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042,
253 0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73,
254 0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba,
255 0x99c7, 0xaba8, 0xffa4,
256 0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e,
257 0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
258 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
259 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
260 0xa4a4, 0xa4a4, 0xffa4,
263 0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712,
264 0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932,
265 0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556,
266 0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c,
267 0x7396, 0x817e, 0xff7c,
268 0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b,
269 0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
270 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
271 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
272 0x7c7c, 0x7c7c, 0xff7c,
275 0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e,
276 0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28,
277 0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745,
278 0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470,
279 0x5c78, 0x6765, 0xff63,
280 0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f,
281 0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
282 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
283 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
284 0x6363, 0x6363, 0xff63,
287 0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b,
288 0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20,
289 0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37,
290 0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a,
291 0x4a60, 0x5251, 0xff4f,
292 0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26,
293 0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
294 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
295 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
296 0x4f4f, 0x4f4f, 0xff4f,
299 0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08,
300 0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318,
301 0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129,
302 0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43,
303 0x3748, 0x3e3d, 0xff3b,
304 0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c,
305 0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
306 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
307 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
308 0x3b3b, 0x3b3b, 0xff3b,
311 0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706,
312 0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710,
313 0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c,
314 0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d,
315 0x2530, 0x2928, 0xff28,
316 0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813,
317 0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
318 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
319 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
320 0x2828, 0x2828, 0xff28,
323 0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403,
324 0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08,
325 0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e,
326 0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416,
327 0x1218, 0x1514, 0xff14,
328 0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409,
329 0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
330 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
331 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
332 0x1414, 0x1414, 0xff14,
335 0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
336 0x0101, 0x0101, 0x0101, 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, 0xff01,
340 0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
341 0x0101, 0x0101, 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, 0xff01,
347 if (quality < 0 || quality > 10) {
349 "meye: invalid quality level %d - using 8\n", quality);
353 *length = ARRAY_SIZE(jpeg_tables[quality]);
354 return jpeg_tables[quality];
357 /* return a generic set of huffman tables */
358 static u16 *jpeg_huffman_tables(int *length)
360 static u16 tables[] = {
361 0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405,
362 0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131,
363 0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142,
364 0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918,
365 0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443,
366 0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463,
367 0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483,
368 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A,
369 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8,
370 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6,
371 0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2,
372 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
373 0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405,
374 0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206,
375 0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1,
376 0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125,
377 0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A,
378 0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A,
379 0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A,
380 0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998,
381 0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6,
382 0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4,
383 0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2,
384 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
385 0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000,
386 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
388 0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101,
389 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
393 *length = ARRAY_SIZE(tables);
397 /****************************************************************************/
398 /* MCHIP low-level functions */
399 /****************************************************************************/
401 /* returns the horizontal capture size */
402 static inline int mchip_hsize(void)
404 return meye.params.subsample ? 320 : 640;
407 /* returns the vertical capture size */
408 static inline int mchip_vsize(void)
410 return meye.params.subsample ? 240 : 480;
413 /* waits for a register to be available */
414 static void mchip_sync(int reg)
419 if (reg == MCHIP_MM_FIFO_DATA) {
420 for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
421 status = readl(meye.mchip_mmregs +
422 MCHIP_MM_FIFO_STATUS);
423 if (!(status & MCHIP_MM_FIFO_WAIT)) {
424 printk(KERN_WARNING "meye: fifo not ready\n");
427 if (status & MCHIP_MM_FIFO_READY)
431 } else if (reg > 0x80) {
432 u32 mask = (reg < 0x100) ? MCHIP_HIC_STATUS_MCC_RDY
433 : MCHIP_HIC_STATUS_VRJ_RDY;
434 for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
435 status = readl(meye.mchip_mmregs + MCHIP_HIC_STATUS);
443 "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",
447 /* sets a value into the register */
448 static inline void mchip_set(int reg, u32 v)
451 writel(v, meye.mchip_mmregs + reg);
454 /* get the register value */
455 static inline u32 mchip_read(int reg)
458 return readl(meye.mchip_mmregs + reg);
461 /* wait for a register to become a particular value */
462 static inline int mchip_delay(u32 reg, u32 v)
465 while (--n && mchip_read(reg) != v)
470 /* setup subsampling */
471 static void mchip_subsample(void)
473 mchip_set(MCHIP_MCC_R_SAMPLING, meye.params.subsample);
474 mchip_set(MCHIP_MCC_R_XRANGE, mchip_hsize());
475 mchip_set(MCHIP_MCC_R_YRANGE, mchip_vsize());
476 mchip_set(MCHIP_MCC_B_XRANGE, mchip_hsize());
477 mchip_set(MCHIP_MCC_B_YRANGE, mchip_vsize());
478 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
481 /* set the framerate into the mchip */
482 static void mchip_set_framerate(void)
484 mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);
487 /* load some huffman and quantisation tables into the VRJ chip ready
488 for JPEG compression */
489 static void mchip_load_tables(void)
495 tables = jpeg_huffman_tables(&length);
496 for (i = 0; i < length; i++)
497 writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
499 tables = jpeg_quantisation_tables(&length, meye.params.quality);
500 for (i = 0; i < length; i++)
501 writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
504 /* setup the VRJ parameters in the chip */
505 static void mchip_vrj_setup(u8 mode)
507 mchip_set(MCHIP_VRJ_BUS_MODE, 5);
508 mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL, 0x1f);
509 mchip_set(MCHIP_VRJ_PDAT_USE, 1);
510 mchip_set(MCHIP_VRJ_IRQ_FLAG, 0xa0);
511 mchip_set(MCHIP_VRJ_MODE_SPECIFY, mode);
512 mchip_set(MCHIP_VRJ_NUM_LINES, mchip_vsize());
513 mchip_set(MCHIP_VRJ_NUM_PIXELS, mchip_hsize());
514 mchip_set(MCHIP_VRJ_NUM_COMPONENTS, 0x1b);
515 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_LO, 0xFFFF);
516 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_HI, 0xFFFF);
517 mchip_set(MCHIP_VRJ_COMP_DATA_FORMAT, 0xC);
518 mchip_set(MCHIP_VRJ_RESTART_INTERVAL, 0);
519 mchip_set(MCHIP_VRJ_SOF1, 0x601);
520 mchip_set(MCHIP_VRJ_SOF2, 0x1502);
521 mchip_set(MCHIP_VRJ_SOF3, 0x1503);
522 mchip_set(MCHIP_VRJ_SOF4, 0x1596);
523 mchip_set(MCHIP_VRJ_SOS, 0x0ed0);
528 /* sets the DMA parameters into the chip */
529 static void mchip_dma_setup(dma_addr_t dma_addr)
533 mchip_set(MCHIP_MM_PT_ADDR, (u32)dma_addr);
534 for (i = 0; i < 4; i++)
535 mchip_set(MCHIP_MM_FIR(i), 0);
539 /* setup for DMA transfers - also zeros the framebuffer */
540 static int mchip_dma_alloc(void)
542 if (!meye.mchip_dmahandle)
548 /* frees the DMA buffer */
549 static void mchip_dma_free(void)
551 if (meye.mchip_dmahandle) {
557 /* stop any existing HIC action and wait for any dma to complete then
558 reset the dma engine */
559 static void mchip_hic_stop(void)
563 meye.mchip_mode = MCHIP_HIC_MODE_NOOP;
564 if (!(mchip_read(MCHIP_HIC_STATUS) & MCHIP_HIC_STATUS_BUSY))
566 for (i = 0; i < 20; ++i) {
567 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_STOP);
568 mchip_delay(MCHIP_HIC_CMD, 0);
569 for (j = 0; j < 100; ++j) {
570 if (mchip_delay(MCHIP_HIC_STATUS,
571 MCHIP_HIC_STATUS_IDLE))
575 printk(KERN_ERR "meye: need to reset HIC!\n");
577 mchip_set(MCHIP_HIC_CTL, MCHIP_HIC_CTL_SOFT_RESET);
580 printk(KERN_ERR "meye: resetting HIC hanged!\n");
583 /****************************************************************************/
584 /* MCHIP frame processing functions */
585 /****************************************************************************/
587 /* get the next ready frame from the dma engine */
588 static u32 mchip_get_frame(void)
592 v = mchip_read(MCHIP_MM_FIR(meye.mchip_fnum));
596 /* frees the current frame from the dma engine */
597 static void mchip_free_frame(void)
599 mchip_set(MCHIP_MM_FIR(meye.mchip_fnum), 0);
601 meye.mchip_fnum %= 4;
604 /* read one frame from the framebuffer assuming it was captured using
605 a uncompressed transfer */
606 static void mchip_cont_read_frame(u32 v, u8 *buf, int size)
610 pt_id = (v >> 17) & 0x3FF;
612 ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES);
615 /* read a compressed frame from the framebuffer */
616 static int mchip_comp_read_frame(u32 v, u8 *buf, int size)
618 int pt_start, pt_end, trailer;
622 pt_start = (v >> 19) & 0xFF;
623 pt_end = (v >> 11) & 0xFF;
624 trailer = (v >> 1) & 0x3FF;
626 if (pt_end < pt_start)
627 fsize = (MCHIP_NB_PAGES_MJPEG - pt_start) * PAGE_SIZE +
628 pt_end * PAGE_SIZE + trailer * 4;
630 fsize = (pt_end - pt_start) * PAGE_SIZE + trailer * 4;
633 printk(KERN_WARNING "meye: oversized compressed frame %d\n",
638 ptable_copy(buf, pt_start, fsize, MCHIP_NB_PAGES_MJPEG);
640 #ifdef MEYE_JPEG_CORRECTION
642 /* Some mchip generated jpeg frames are incorrect. In most
643 * (all ?) of those cases, the final EOI (0xff 0xd9) marker
644 * is not present at the end of the frame.
646 * Since adding the final marker is not enough to restore
647 * the jpeg integrity, we drop the frame.
650 for (i = fsize - 1; i > 0 && buf[i] == 0xff; i--) ;
652 if (i < 2 || buf[i - 1] != 0xff || buf[i] != 0xd9)
660 /* take a picture into SDRAM */
661 static void mchip_take_picture(void)
667 mchip_dma_setup(meye.mchip_dmahandle);
669 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_CAP);
670 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
672 mchip_delay(MCHIP_HIC_CMD, 0);
674 for (i = 0; i < 100; ++i) {
675 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
681 /* dma a previously taken picture into a buffer */
682 static void mchip_get_picture(u8 *buf, int bufsize)
687 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_OUT);
688 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
690 mchip_delay(MCHIP_HIC_CMD, 0);
691 for (i = 0; i < 100; ++i) {
692 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
696 for (i = 0; i < 4; ++i) {
697 v = mchip_get_frame();
698 if (v & MCHIP_MM_FIR_RDY) {
699 mchip_cont_read_frame(v, buf, bufsize);
706 /* start continuous dma capture */
707 static void mchip_continuous_start(void)
711 mchip_set_framerate();
712 mchip_dma_setup(meye.mchip_dmahandle);
714 meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
716 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_OUT);
717 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
719 mchip_delay(MCHIP_HIC_CMD, 0);
722 /* compress one frame into a buffer */
723 static int mchip_compress_frame(u8 *buf, int bufsize)
728 mchip_vrj_setup(0x3f);
731 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_COMP);
732 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
734 mchip_delay(MCHIP_HIC_CMD, 0);
735 for (i = 0; i < 100; ++i) {
736 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
741 for (i = 0; i < 4; ++i) {
742 v = mchip_get_frame();
743 if (v & MCHIP_MM_FIR_RDY) {
744 len = mchip_comp_read_frame(v, buf, bufsize);
753 /* uncompress one image into a buffer */
754 static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize)
756 mchip_vrj_setup(0x3f);
759 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_DECOMP);
760 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
762 mchip_delay(MCHIP_HIC_CMD, 0);
764 return mchip_comp_read_frame(buf, bufsize);
768 /* start continuous compressed capture */
769 static void mchip_cont_compression_start(void)
772 mchip_vrj_setup(0x3f);
774 mchip_set_framerate();
775 mchip_dma_setup(meye.mchip_dmahandle);
777 meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
779 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_COMP);
780 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
782 mchip_delay(MCHIP_HIC_CMD, 0);
785 /****************************************************************************/
786 /* Interrupt handling */
787 /****************************************************************************/
789 static irqreturn_t meye_irq(int irq, void *dev_id, struct pt_regs *regs)
793 static int sequence = 0;
795 v = mchip_read(MCHIP_MM_INTA);
797 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT &&
798 meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
802 v = mchip_get_frame();
803 if (!(v & MCHIP_MM_FIR_RDY))
806 if (meye.mchip_mode == MCHIP_HIC_MODE_CONT_OUT) {
807 if (kfifo_get(meye.grabq, (unsigned char *)&reqnr,
808 sizeof(int)) != sizeof(int)) {
812 mchip_cont_read_frame(v, meye.grab_fbuffer + gbufsize * reqnr,
813 mchip_hsize() * mchip_vsize() * 2);
814 meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2;
815 meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
816 do_gettimeofday(&meye.grab_buffer[reqnr].timestamp);
817 meye.grab_buffer[reqnr].sequence = sequence++;
818 kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int));
819 wake_up_interruptible(&meye.proc_list);
822 size = mchip_comp_read_frame(v, meye.grab_temp, gbufsize);
827 if (kfifo_get(meye.grabq, (unsigned char *)&reqnr,
828 sizeof(int)) != sizeof(int)) {
832 memcpy(meye.grab_fbuffer + gbufsize * reqnr, meye.grab_temp,
834 meye.grab_buffer[reqnr].size = size;
835 meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
836 do_gettimeofday(&meye.grab_buffer[reqnr].timestamp);
837 meye.grab_buffer[reqnr].sequence = sequence++;
838 kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int));
839 wake_up_interruptible(&meye.proc_list);
845 /****************************************************************************/
846 /* video4linux integration */
847 /****************************************************************************/
849 static int meye_open(struct inode *inode, struct file *file)
853 err = video_exclusive_open(inode, file);
859 if (mchip_dma_alloc()) {
860 printk(KERN_ERR "meye: mchip framebuffer allocation failed\n");
861 video_exclusive_release(inode, file);
865 for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
866 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
867 kfifo_reset(meye.grabq);
868 kfifo_reset(meye.doneq);
872 static int meye_release(struct inode *inode, struct file *file)
876 video_exclusive_release(inode, file);
880 static int meye_do_ioctl(struct inode *inode, struct file *file,
881 unsigned int cmd, void *arg)
886 struct video_capability *b = arg;
887 strcpy(b->name,meye.video_dev->name);
888 b->type = VID_TYPE_CAPTURE;
899 struct video_channel *v = arg;
902 v->type = VIDEO_TYPE_CAMERA;
905 strcpy(v->name,"Camera");
910 struct video_channel *v = arg;
917 struct video_picture *p = arg;
923 struct video_picture *p = arg;
926 if (p->palette != VIDEO_PALETTE_YUV422)
929 sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS,
930 p->brightness >> 10);
931 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE,
933 sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR,
935 sonypi_camera_command(SONYPI_COMMAND_SETCAMERACONTRAST,
946 if (*i < 0 || *i >= gbuffers)
951 switch (meye.grab_buffer[*i].state) {
953 case MEYE_BUF_UNUSED:
957 if (file->f_flags & O_NONBLOCK) {
961 if (wait_event_interruptible(meye.proc_list,
962 (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
968 meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
969 kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int));
975 case VIDIOCMCAPTURE: {
976 struct video_mmap *vm = arg;
979 if (vm->frame >= gbuffers || vm->frame < 0)
981 if (vm->format != VIDEO_PALETTE_YUV422)
983 if (vm->height * vm->width * 2 > gbufsize)
985 if (!meye.grab_fbuffer)
987 if (meye.grab_buffer[vm->frame].state != MEYE_BUF_UNUSED)
991 if (vm->width == 640 && vm->height == 480) {
992 if (meye.params.subsample) {
993 meye.params.subsample = 0;
996 } else if (vm->width == 320 && vm->height == 240) {
997 if (!meye.params.subsample) {
998 meye.params.subsample = 1;
1006 if (restart || meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT)
1007 mchip_continuous_start();
1008 meye.grab_buffer[vm->frame].state = MEYE_BUF_USING;
1009 kfifo_put(meye.grabq, (unsigned char *)&vm->frame, sizeof(int));
1015 struct video_mbuf *vm = arg;
1018 memset(vm, 0 , sizeof(*vm));
1019 vm->size = gbufsize * gbuffers;
1020 vm->frames = gbuffers;
1021 for (i = 0; i < gbuffers; i++)
1022 vm->offsets[i] = i * gbufsize;
1026 case MEYEIOC_G_PARAMS: {
1027 struct meye_params *p = arg;
1032 case MEYEIOC_S_PARAMS: {
1033 struct meye_params *jp = arg;
1034 if (jp->subsample > 1)
1036 if (jp->quality > 10)
1038 if (jp->sharpness > 63 || jp->agc > 63 || jp->picture > 63)
1040 if (jp->framerate > 31)
1043 if (meye.params.subsample != jp->subsample ||
1044 meye.params.quality != jp->quality)
1045 mchip_hic_stop(); /* need restart */
1047 sonypi_camera_command(SONYPI_COMMAND_SETCAMERASHARPNESS,
1048 meye.params.sharpness);
1049 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAAGC,
1051 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAPICTURE,
1052 meye.params.picture);
1057 case MEYEIOC_QBUF_CAPT: {
1060 if (!meye.grab_fbuffer)
1062 if (*nb >= gbuffers)
1069 if (meye.grab_buffer[*nb].state != MEYE_BUF_UNUSED)
1072 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
1073 mchip_cont_compression_start();
1074 meye.grab_buffer[*nb].state = MEYE_BUF_USING;
1075 kfifo_put(meye.grabq, (unsigned char *)nb, sizeof(int));
1080 case MEYEIOC_SYNC: {
1084 if (*i < 0 || *i >= gbuffers)
1088 switch (meye.grab_buffer[*i].state) {
1090 case MEYE_BUF_UNUSED:
1093 case MEYE_BUF_USING:
1094 if (file->f_flags & O_NONBLOCK) {
1098 if (wait_event_interruptible(meye.proc_list,
1099 (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
1105 meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
1106 kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int));
1108 *i = meye.grab_buffer[*i].size;
1113 case MEYEIOC_STILLCAPT: {
1115 if (!meye.grab_fbuffer)
1117 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
1120 meye.grab_buffer[0].state = MEYE_BUF_USING;
1121 mchip_take_picture();
1124 mchip_hsize() * mchip_vsize() * 2);
1125 meye.grab_buffer[0].state = MEYE_BUF_DONE;
1130 case MEYEIOC_STILLJCAPT: {
1133 if (!meye.grab_fbuffer)
1135 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
1138 meye.grab_buffer[0].state = MEYE_BUF_USING;
1140 while (*len == -1) {
1141 mchip_take_picture();
1142 *len = mchip_compress_frame(meye.grab_fbuffer, gbufsize);
1144 meye.grab_buffer[0].state = MEYE_BUF_DONE;
1149 case VIDIOC_QUERYCAP: {
1150 struct v4l2_capability *cap = arg;
1155 memset(cap, 0, sizeof(*cap));
1156 strcpy(cap->driver, "meye");
1157 strcpy(cap->card, "meye");
1158 sprintf(cap->bus_info, "PCI:%s", pci_name(meye.mchip_dev));
1159 cap->version = (MEYE_DRIVER_MAJORVERSION << 8) +
1160 MEYE_DRIVER_MINORVERSION;
1161 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1166 case VIDIOC_ENUMINPUT: {
1167 struct v4l2_input *i = arg;
1171 memset(i, 0, sizeof(*i));
1173 strcpy(i->name, "Camera");
1174 i->type = V4L2_INPUT_TYPE_CAMERA;
1178 case VIDIOC_G_INPUT: {
1185 case VIDIOC_S_INPUT: {
1193 case VIDIOC_QUERYCTRL: {
1194 struct v4l2_queryctrl *c = arg;
1198 case V4L2_CID_BRIGHTNESS:
1199 c->type = V4L2_CTRL_TYPE_INTEGER;
1200 strcpy(c->name, "Brightness");
1204 c->default_value = 32;
1208 c->type = V4L2_CTRL_TYPE_INTEGER;
1209 strcpy(c->name, "Hue");
1213 c->default_value = 32;
1216 case V4L2_CID_CONTRAST:
1217 c->type = V4L2_CTRL_TYPE_INTEGER;
1218 strcpy(c->name, "Contrast");
1222 c->default_value = 32;
1225 case V4L2_CID_SATURATION:
1226 c->type = V4L2_CTRL_TYPE_INTEGER;
1227 strcpy(c->name, "Saturation");
1231 c->default_value = 32;
1235 c->type = V4L2_CTRL_TYPE_INTEGER;
1236 strcpy(c->name, "Agc");
1240 c->default_value = 48;
1243 case V4L2_CID_SHARPNESS:
1244 c->type = V4L2_CTRL_TYPE_INTEGER;
1245 strcpy(c->name, "Sharpness");
1249 c->default_value = 32;
1252 case V4L2_CID_PICTURE:
1253 c->type = V4L2_CTRL_TYPE_INTEGER;
1254 strcpy(c->name, "Picture");
1258 c->default_value = 0;
1261 case V4L2_CID_JPEGQUAL:
1262 c->type = V4L2_CTRL_TYPE_INTEGER;
1263 strcpy(c->name, "JPEG quality");
1267 c->default_value = 8;
1270 case V4L2_CID_FRAMERATE:
1271 c->type = V4L2_CTRL_TYPE_INTEGER;
1272 strcpy(c->name, "Framerate");
1276 c->default_value = 0;
1285 case VIDIOC_S_CTRL: {
1286 struct v4l2_control *c = arg;
1290 case V4L2_CID_BRIGHTNESS:
1291 sonypi_camera_command(
1292 SONYPI_COMMAND_SETCAMERABRIGHTNESS, c->value);
1293 meye.picture.brightness = c->value << 10;
1296 sonypi_camera_command(
1297 SONYPI_COMMAND_SETCAMERAHUE, c->value);
1298 meye.picture.hue = c->value << 10;
1300 case V4L2_CID_CONTRAST:
1301 sonypi_camera_command(
1302 SONYPI_COMMAND_SETCAMERACONTRAST, c->value);
1303 meye.picture.contrast = c->value << 10;
1305 case V4L2_CID_SATURATION:
1306 sonypi_camera_command(
1307 SONYPI_COMMAND_SETCAMERACOLOR, c->value);
1308 meye.picture.colour = c->value << 10;
1311 sonypi_camera_command(
1312 SONYPI_COMMAND_SETCAMERAAGC, c->value);
1313 meye.params.agc = c->value;
1315 case V4L2_CID_SHARPNESS:
1316 sonypi_camera_command(
1317 SONYPI_COMMAND_SETCAMERASHARPNESS, c->value);
1318 meye.params.sharpness = c->value;
1320 case V4L2_CID_PICTURE:
1321 sonypi_camera_command(
1322 SONYPI_COMMAND_SETCAMERAPICTURE, c->value);
1323 meye.params.picture = c->value;
1325 case V4L2_CID_JPEGQUAL:
1326 meye.params.quality = c->value;
1328 case V4L2_CID_FRAMERATE:
1329 meye.params.framerate = c->value;
1339 case VIDIOC_G_CTRL: {
1340 struct v4l2_control *c = arg;
1344 case V4L2_CID_BRIGHTNESS:
1345 c->value = meye.picture.brightness >> 10;
1348 c->value = meye.picture.hue >> 10;
1350 case V4L2_CID_CONTRAST:
1351 c->value = meye.picture.contrast >> 10;
1353 case V4L2_CID_SATURATION:
1354 c->value = meye.picture.colour >> 10;
1357 c->value = meye.params.agc;
1359 case V4L2_CID_SHARPNESS:
1360 c->value = meye.params.sharpness;
1362 case V4L2_CID_PICTURE:
1363 c->value = meye.params.picture;
1365 case V4L2_CID_JPEGQUAL:
1366 c->value = meye.params.quality;
1368 case V4L2_CID_FRAMERATE:
1369 c->value = meye.params.framerate;
1379 case VIDIOC_ENUM_FMT: {
1380 struct v4l2_fmtdesc *f = arg;
1384 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1386 if (f->index == 0) {
1387 /* standard YUV 422 capture */
1388 memset(f, 0, sizeof(*f));
1390 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1392 strcpy(f->description, "YUV422");
1393 f->pixelformat = V4L2_PIX_FMT_YUYV;
1395 /* compressed MJPEG capture */
1396 memset(f, 0, sizeof(*f));
1398 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1399 f->flags = V4L2_FMT_FLAG_COMPRESSED;
1400 strcpy(f->description, "MJPEG");
1401 f->pixelformat = V4L2_PIX_FMT_MJPEG;
1406 case VIDIOC_TRY_FMT: {
1407 struct v4l2_format *f = arg;
1409 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1411 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1412 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1414 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1415 f->fmt.pix.field != V4L2_FIELD_NONE)
1417 f->fmt.pix.field = V4L2_FIELD_NONE;
1418 if (f->fmt.pix.width <= 320) {
1419 f->fmt.pix.width = 320;
1420 f->fmt.pix.height = 240;
1422 f->fmt.pix.width = 640;
1423 f->fmt.pix.height = 480;
1425 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1426 f->fmt.pix.sizeimage = f->fmt.pix.height *
1427 f->fmt.pix.bytesperline;
1428 f->fmt.pix.colorspace = 0;
1429 f->fmt.pix.priv = 0;
1433 case VIDIOC_G_FMT: {
1434 struct v4l2_format *f = arg;
1436 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1438 memset(&f->fmt.pix, 0, sizeof(struct v4l2_pix_format));
1439 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1440 switch (meye.mchip_mode) {
1441 case MCHIP_HIC_MODE_CONT_OUT:
1443 f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
1445 case MCHIP_HIC_MODE_CONT_COMP:
1446 f->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
1449 f->fmt.pix.field = V4L2_FIELD_NONE;
1450 f->fmt.pix.width = mchip_hsize();
1451 f->fmt.pix.height = mchip_vsize();
1452 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1453 f->fmt.pix.sizeimage = f->fmt.pix.height *
1454 f->fmt.pix.bytesperline;
1455 f->fmt.pix.colorspace = 0;
1456 f->fmt.pix.priv = 0;
1460 case VIDIOC_S_FMT: {
1461 struct v4l2_format *f = arg;
1463 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1465 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1466 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1468 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1469 f->fmt.pix.field != V4L2_FIELD_NONE)
1471 f->fmt.pix.field = V4L2_FIELD_NONE;
1473 if (f->fmt.pix.width <= 320) {
1474 f->fmt.pix.width = 320;
1475 f->fmt.pix.height = 240;
1476 meye.params.subsample = 1;
1478 f->fmt.pix.width = 640;
1479 f->fmt.pix.height = 480;
1480 meye.params.subsample = 0;
1482 switch (f->fmt.pix.pixelformat) {
1483 case V4L2_PIX_FMT_YUYV:
1484 meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
1486 case V4L2_PIX_FMT_MJPEG:
1487 meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
1491 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1492 f->fmt.pix.sizeimage = f->fmt.pix.height *
1493 f->fmt.pix.bytesperline;
1494 f->fmt.pix.colorspace = 0;
1495 f->fmt.pix.priv = 0;
1500 case VIDIOC_REQBUFS: {
1501 struct v4l2_requestbuffers *req = arg;
1504 if (req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1506 if (req->memory != V4L2_MEMORY_MMAP)
1508 if (meye.grab_fbuffer && req->count == gbuffers) {
1509 /* already allocated, no modifications */
1513 if (meye.grab_fbuffer) {
1514 for (i = 0; i < gbuffers; i++)
1515 if (meye.vma_use_count[i]) {
1519 rvfree(meye.grab_fbuffer, gbuffers * gbufsize);
1520 meye.grab_fbuffer = NULL;
1522 gbuffers = max(2, min((int)req->count, MEYE_MAX_BUFNBRS));
1523 req->count = gbuffers;
1524 meye.grab_fbuffer = rvmalloc(gbuffers * gbufsize);
1525 if (!meye.grab_fbuffer) {
1526 printk(KERN_ERR "meye: v4l framebuffer allocation"
1531 for (i = 0; i < gbuffers; i++)
1532 meye.vma_use_count[i] = 0;
1537 case VIDIOC_QUERYBUF: {
1538 struct v4l2_buffer *buf = arg;
1539 int index = buf->index;
1541 if (index < 0 || index >= gbuffers)
1543 memset(buf, 0, sizeof(*buf));
1544 buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1546 buf->bytesused = meye.grab_buffer[index].size;
1547 buf->flags = V4L2_BUF_FLAG_MAPPED;
1548 if (meye.grab_buffer[index].state == MEYE_BUF_USING)
1549 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1550 if (meye.grab_buffer[index].state == MEYE_BUF_DONE)
1551 buf->flags |= V4L2_BUF_FLAG_DONE;
1552 buf->field = V4L2_FIELD_NONE;
1553 buf->timestamp = meye.grab_buffer[index].timestamp;
1554 buf->sequence = meye.grab_buffer[index].sequence;
1555 buf->memory = V4L2_MEMORY_MMAP;
1556 buf->m.offset = index * gbufsize;
1557 buf->length = gbufsize;
1562 struct v4l2_buffer *buf = arg;
1564 if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1566 if (buf->memory != V4L2_MEMORY_MMAP)
1568 if (buf->index < 0 || buf->index >= gbuffers)
1570 if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED)
1573 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1574 buf->flags &= ~V4L2_BUF_FLAG_DONE;
1575 meye.grab_buffer[buf->index].state = MEYE_BUF_USING;
1576 kfifo_put(meye.grabq, (unsigned char *)&buf->index, sizeof(int));
1581 case VIDIOC_DQBUF: {
1582 struct v4l2_buffer *buf = arg;
1585 if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1587 if (buf->memory != V4L2_MEMORY_MMAP)
1591 if (kfifo_len(meye.doneq) == 0 && file->f_flags & O_NONBLOCK) {
1595 if (wait_event_interruptible(meye.proc_list,
1596 kfifo_len(meye.doneq) != 0) < 0) {
1600 if (!kfifo_get(meye.doneq, (unsigned char *)&reqnr,
1605 if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) {
1610 buf->bytesused = meye.grab_buffer[reqnr].size;
1611 buf->flags = V4L2_BUF_FLAG_MAPPED;
1612 buf->field = V4L2_FIELD_NONE;
1613 buf->timestamp = meye.grab_buffer[reqnr].timestamp;
1614 buf->sequence = meye.grab_buffer[reqnr].sequence;
1615 buf->memory = V4L2_MEMORY_MMAP;
1616 buf->m.offset = reqnr * gbufsize;
1617 buf->length = gbufsize;
1618 meye.grab_buffer[reqnr].state = MEYE_BUF_UNUSED;
1623 case VIDIOC_STREAMON: {
1625 switch (meye.mchip_mode) {
1626 case MCHIP_HIC_MODE_CONT_OUT:
1627 mchip_continuous_start();
1629 case MCHIP_HIC_MODE_CONT_COMP:
1630 mchip_cont_compression_start();
1640 case VIDIOC_STREAMOFF: {
1645 kfifo_reset(meye.grabq);
1646 kfifo_reset(meye.doneq);
1647 for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
1648 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
1654 * XXX what about private snapshot ioctls ?
1655 * Do they need to be converted to V4L2 ?
1659 return -ENOIOCTLCMD;
1665 static int meye_ioctl(struct inode *inode, struct file *file,
1666 unsigned int cmd, unsigned long arg)
1668 return video_usercopy(inode, file, cmd, arg, meye_do_ioctl);
1671 static unsigned int meye_poll(struct file *file, poll_table *wait)
1673 unsigned int res = 0;
1676 poll_wait(file, &meye.proc_list, wait);
1677 if (kfifo_len(meye.doneq))
1678 res = POLLIN | POLLRDNORM;
1683 static void meye_vm_open(struct vm_area_struct *vma)
1685 int idx = (int)vma->vm_private_data;
1686 meye.vma_use_count[idx]++;
1689 static void meye_vm_close(struct vm_area_struct *vma)
1691 int idx = (int)vma->vm_private_data;
1692 meye.vma_use_count[idx]--;
1695 static struct vm_operations_struct meye_vm_ops = {
1696 .open = meye_vm_open,
1697 .close = meye_vm_close,
1700 static int meye_mmap(struct file *file, struct vm_area_struct *vma)
1702 unsigned long start = vma->vm_start;
1703 unsigned long size = vma->vm_end - vma->vm_start;
1704 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
1705 unsigned long page, pos;
1708 if (size > gbuffers * gbufsize) {
1712 if (!meye.grab_fbuffer) {
1715 /* lazy allocation */
1716 meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize);
1717 if (!meye.grab_fbuffer) {
1718 printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1722 for (i = 0; i < gbuffers; i++)
1723 meye.vma_use_count[i] = 0;
1725 pos = (unsigned long)meye.grab_fbuffer + offset;
1728 page = vmalloc_to_pfn((void *)pos);
1729 if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
1735 if (size > PAGE_SIZE)
1741 vma->vm_ops = &meye_vm_ops;
1742 vma->vm_flags &= ~VM_IO; /* not I/O memory */
1743 vma->vm_flags |= VM_RESERVED; /* avoid to swap out this VMA */
1744 vma->vm_private_data = (void *) (offset / gbufsize);
1751 static struct file_operations meye_fops = {
1752 .owner = THIS_MODULE,
1754 .release = meye_release,
1756 .ioctl = meye_ioctl,
1757 .compat_ioctl = v4l_compat_ioctl32,
1759 .llseek = no_llseek,
1762 static struct video_device meye_template = {
1763 .owner = THIS_MODULE,
1765 .type = VID_TYPE_CAPTURE,
1766 .hardware = VID_HARDWARE_MEYE,
1768 .release = video_device_release,
1773 static int meye_suspend(struct pci_dev *pdev, pm_message_t state)
1775 pci_save_state(pdev);
1776 meye.pm_mchip_mode = meye.mchip_mode;
1778 mchip_set(MCHIP_MM_INTA, 0x0);
1782 static int meye_resume(struct pci_dev *pdev)
1784 pci_restore_state(pdev);
1785 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1787 mchip_delay(MCHIP_HIC_CMD, 0);
1788 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1790 mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1792 mchip_set(MCHIP_MM_PCI_MODE, 5);
1794 mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1796 switch (meye.pm_mchip_mode) {
1797 case MCHIP_HIC_MODE_CONT_OUT:
1798 mchip_continuous_start();
1800 case MCHIP_HIC_MODE_CONT_COMP:
1801 mchip_cont_compression_start();
1808 static int __devinit meye_probe(struct pci_dev *pcidev,
1809 const struct pci_device_id *ent)
1812 unsigned long mchip_adr;
1815 if (meye.mchip_dev != NULL) {
1816 printk(KERN_ERR "meye: only one device allowed!\n");
1820 meye.mchip_dev = pcidev;
1821 meye.video_dev = video_device_alloc();
1822 if (!meye.video_dev) {
1823 printk(KERN_ERR "meye: video_device_alloc() failed!\n");
1828 meye.grab_temp = vmalloc(MCHIP_NB_PAGES_MJPEG * PAGE_SIZE);
1829 if (!meye.grab_temp) {
1830 printk(KERN_ERR "meye: grab buffer allocation failed\n");
1834 spin_lock_init(&meye.grabq_lock);
1835 meye.grabq = kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL,
1837 if (IS_ERR(meye.grabq)) {
1838 printk(KERN_ERR "meye: fifo allocation failed\n");
1839 goto outkfifoalloc1;
1841 spin_lock_init(&meye.doneq_lock);
1842 meye.doneq = kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL,
1844 if (IS_ERR(meye.doneq)) {
1845 printk(KERN_ERR "meye: fifo allocation failed\n");
1846 goto outkfifoalloc2;
1849 memcpy(meye.video_dev, &meye_template, sizeof(meye_template));
1850 meye.video_dev->dev = &meye.mchip_dev->dev;
1852 if ((ret = sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 1))) {
1853 printk(KERN_ERR "meye: unable to power on the camera\n");
1854 printk(KERN_ERR "meye: did you enable the camera in "
1855 "sonypi using the module options ?\n");
1856 goto outsonypienable;
1860 if ((ret = pci_enable_device(meye.mchip_dev))) {
1861 printk(KERN_ERR "meye: pci_enable_device failed\n");
1865 mchip_adr = pci_resource_start(meye.mchip_dev,0);
1867 printk(KERN_ERR "meye: mchip has no device base address\n");
1870 if (!request_mem_region(pci_resource_start(meye.mchip_dev, 0),
1871 pci_resource_len(meye.mchip_dev, 0),
1873 printk(KERN_ERR "meye: request_mem_region failed\n");
1876 meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS);
1877 if (!meye.mchip_mmregs) {
1878 printk(KERN_ERR "meye: ioremap failed\n");
1882 meye.mchip_irq = pcidev->irq;
1883 if (request_irq(meye.mchip_irq, meye_irq,
1884 SA_INTERRUPT | SA_SHIRQ, "meye", meye_irq)) {
1885 printk(KERN_ERR "meye: request_irq failed\n");
1889 pci_read_config_byte(meye.mchip_dev, PCI_REVISION_ID, &revision);
1890 pci_write_config_byte(meye.mchip_dev, PCI_CACHE_LINE_SIZE, 8);
1891 pci_write_config_byte(meye.mchip_dev, PCI_LATENCY_TIMER, 64);
1893 pci_set_master(meye.mchip_dev);
1895 /* Ask the camera to perform a soft reset. */
1896 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1898 mchip_delay(MCHIP_HIC_CMD, 0);
1899 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1902 mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1905 mchip_set(MCHIP_MM_PCI_MODE, 5);
1908 mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1910 if (video_register_device(meye.video_dev, VFL_TYPE_GRABBER,
1912 printk(KERN_ERR "meye: video_register_device failed\n");
1916 init_MUTEX(&meye.lock);
1917 init_waitqueue_head(&meye.proc_list);
1918 meye.picture.depth = 16;
1919 meye.picture.palette = VIDEO_PALETTE_YUV422;
1920 meye.picture.brightness = 32 << 10;
1921 meye.picture.hue = 32 << 10;
1922 meye.picture.colour = 32 << 10;
1923 meye.picture.contrast = 32 << 10;
1924 meye.picture.whiteness = 0;
1925 meye.params.subsample = 0;
1926 meye.params.quality = 8;
1927 meye.params.sharpness = 32;
1928 meye.params.agc = 48;
1929 meye.params.picture = 0;
1930 meye.params.framerate = 0;
1932 sonypi_camera_command(SONYPI_COMMAND_SETCAMERABRIGHTNESS, 32);
1933 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAHUE, 32);
1934 sonypi_camera_command(SONYPI_COMMAND_SETCAMERACOLOR, 32);
1935 sonypi_camera_command(SONYPI_COMMAND_SETCAMERACONTRAST, 32);
1936 sonypi_camera_command(SONYPI_COMMAND_SETCAMERASHARPNESS, 32);
1937 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAPICTURE, 0);
1938 sonypi_camera_command(SONYPI_COMMAND_SETCAMERAAGC, 48);
1940 printk(KERN_INFO "meye: Motion Eye Camera Driver v%s.\n",
1941 MEYE_DRIVER_VERSION);
1942 printk(KERN_INFO "meye: mchip KL5A72002 rev. %d, base %lx, irq %d\n",
1943 revision, mchip_adr, meye.mchip_irq);
1948 free_irq(meye.mchip_irq, meye_irq);
1950 iounmap(meye.mchip_mmregs);
1952 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1953 pci_resource_len(meye.mchip_dev, 0));
1955 pci_disable_device(meye.mchip_dev);
1957 sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0);
1959 kfifo_free(meye.doneq);
1961 kfifo_free(meye.grabq);
1963 vfree(meye.grab_temp);
1965 video_device_release(meye.video_dev);
1970 static void __devexit meye_remove(struct pci_dev *pcidev)
1972 video_unregister_device(meye.video_dev);
1978 /* disable interrupts */
1979 mchip_set(MCHIP_MM_INTA, 0x0);
1981 free_irq(meye.mchip_irq, meye_irq);
1983 iounmap(meye.mchip_mmregs);
1985 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1986 pci_resource_len(meye.mchip_dev, 0));
1988 pci_disable_device(meye.mchip_dev);
1990 sonypi_camera_command(SONYPI_COMMAND_SETCAMERA, 0);
1992 kfifo_free(meye.doneq);
1993 kfifo_free(meye.grabq);
1995 vfree(meye.grab_temp);
1997 if (meye.grab_fbuffer) {
1998 rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
1999 meye.grab_fbuffer = NULL;
2002 printk(KERN_INFO "meye: removed\n");
2005 static struct pci_device_id meye_pci_tbl[] = {
2006 { PCI_VENDOR_ID_KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002,
2007 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
2011 MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
2013 static struct pci_driver meye_driver = {
2015 .id_table = meye_pci_tbl,
2016 .probe = meye_probe,
2017 .remove = __devexit_p(meye_remove),
2019 .suspend = meye_suspend,
2020 .resume = meye_resume,
2024 static int __init meye_init(void)
2026 gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS));
2027 if (gbufsize < 0 || gbufsize > MEYE_MAX_BUFSIZE)
2028 gbufsize = MEYE_MAX_BUFSIZE;
2029 gbufsize = PAGE_ALIGN(gbufsize);
2030 printk(KERN_INFO "meye: using %d buffers with %dk (%dk total)"
2033 gbufsize / 1024, gbuffers * gbufsize / 1024);
2034 return pci_register_driver(&meye_driver);
2037 static void __exit meye_exit(void)
2039 pci_unregister_driver(&meye_driver);
2042 module_init(meye_init);
2043 module_exit(meye_exit);