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/module.h>
30 #include <linux/pci.h>
31 #include <linux/init.h>
32 #include <linux/videodev.h>
33 #include <media/v4l2-common.h>
34 #include <media/v4l2-ioctl.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("v4l2 driver for the MotionEye camera");
47 MODULE_LICENSE("GPL");
48 MODULE_VERSION(MEYE_DRIVER_VERSION);
50 /* number of grab buffers */
51 static unsigned int gbuffers = 2;
52 module_param(gbuffers, int, 0444);
53 MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");
55 /* size of a grab buffer */
56 static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
57 module_param(gbufsize, int, 0444);
58 MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400"
59 " (will be rounded up to a page multiple)");
61 /* /dev/videoX registration number */
62 static int video_nr = -1;
63 module_param(video_nr, int, 0444);
64 MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");
66 /* driver structure - only one possible */
67 static struct meye meye;
69 /****************************************************************************/
70 /* Memory allocation routines (stolen from bttv-driver.c) */
71 /****************************************************************************/
72 static void *rvmalloc(unsigned long size)
77 size = PAGE_ALIGN(size);
78 mem = vmalloc_32(size);
81 adr = (unsigned long) mem;
83 SetPageReserved(vmalloc_to_page((void *)adr));
91 static void rvfree(void * mem, unsigned long size)
96 adr = (unsigned long) mem;
97 while ((long) size > 0) {
98 ClearPageReserved(vmalloc_to_page((void *)adr));
107 * return a page table pointing to N pages of locked memory
109 * NOTE: The meye device expects DMA addresses on 32 bits, we build
110 * a table of 1024 entries = 4 bytes * 1024 = 4096 bytes.
112 static int ptable_alloc(void)
117 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
119 /* give only 32 bit DMA addresses */
120 if (dma_set_mask(&meye.mchip_dev->dev, DMA_32BIT_MASK))
123 meye.mchip_ptable_toc = dma_alloc_coherent(&meye.mchip_dev->dev,
125 &meye.mchip_dmahandle,
127 if (!meye.mchip_ptable_toc) {
128 meye.mchip_dmahandle = 0;
132 pt = meye.mchip_ptable_toc;
133 for (i = 0; i < MCHIP_NB_PAGES; i++) {
135 meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev,
139 if (!meye.mchip_ptable[i]) {
141 pt = meye.mchip_ptable_toc;
142 for (j = 0; j < i; ++j) {
143 dma = (dma_addr_t) *pt;
144 dma_free_coherent(&meye.mchip_dev->dev,
146 meye.mchip_ptable[j], dma);
149 dma_free_coherent(&meye.mchip_dev->dev,
151 meye.mchip_ptable_toc,
152 meye.mchip_dmahandle);
153 meye.mchip_ptable_toc = NULL;
154 meye.mchip_dmahandle = 0;
163 static void ptable_free(void)
168 pt = meye.mchip_ptable_toc;
169 for (i = 0; i < MCHIP_NB_PAGES; i++) {
170 dma_addr_t dma = (dma_addr_t) *pt;
171 if (meye.mchip_ptable[i])
172 dma_free_coherent(&meye.mchip_dev->dev,
174 meye.mchip_ptable[i], dma);
178 if (meye.mchip_ptable_toc)
179 dma_free_coherent(&meye.mchip_dev->dev,
181 meye.mchip_ptable_toc,
182 meye.mchip_dmahandle);
184 memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
185 meye.mchip_ptable_toc = NULL;
186 meye.mchip_dmahandle = 0;
189 /* copy data from ptable into buf */
190 static void ptable_copy(u8 *buf, int start, int size, int pt_pages)
194 for (i = 0; i < (size / PAGE_SIZE) * PAGE_SIZE; i += PAGE_SIZE) {
195 memcpy(buf + i, meye.mchip_ptable[start++], PAGE_SIZE);
196 if (start >= pt_pages)
199 memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE);
202 /****************************************************************************/
203 /* JPEG tables at different qualities to load into the VRJ chip */
204 /****************************************************************************/
206 /* return a set of quantisation tables based on a quality from 1 to 10 */
207 static u16 *jpeg_quantisation_tables(int *length, int quality)
209 static u16 jpeg_tables[][70] = { {
210 0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
211 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
212 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
213 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
214 0xffff, 0xffff, 0xffff,
215 0xdbff, 0x4300, 0xff01, 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,
222 0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46,
223 0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8,
224 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
225 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
226 0xffff, 0xffff, 0xffff,
227 0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb,
228 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
229 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
230 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
231 0xffff, 0xffff, 0xffff,
234 0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23,
235 0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164,
236 0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad,
237 0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff,
238 0xe6ff, 0xfffd, 0xfff8,
239 0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876,
240 0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
241 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
242 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
243 0xf8f8, 0xf8f8, 0xfff8,
246 0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17,
247 0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042,
248 0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73,
249 0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba,
250 0x99c7, 0xaba8, 0xffa4,
251 0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e,
252 0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
253 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
254 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
255 0xa4a4, 0xa4a4, 0xffa4,
258 0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712,
259 0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932,
260 0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556,
261 0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c,
262 0x7396, 0x817e, 0xff7c,
263 0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b,
264 0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
265 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
266 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
267 0x7c7c, 0x7c7c, 0xff7c,
270 0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e,
271 0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28,
272 0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745,
273 0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470,
274 0x5c78, 0x6765, 0xff63,
275 0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f,
276 0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
277 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
278 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
279 0x6363, 0x6363, 0xff63,
282 0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b,
283 0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20,
284 0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37,
285 0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a,
286 0x4a60, 0x5251, 0xff4f,
287 0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26,
288 0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
289 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
290 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
291 0x4f4f, 0x4f4f, 0xff4f,
294 0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08,
295 0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318,
296 0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129,
297 0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43,
298 0x3748, 0x3e3d, 0xff3b,
299 0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c,
300 0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
301 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
302 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
303 0x3b3b, 0x3b3b, 0xff3b,
306 0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706,
307 0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710,
308 0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c,
309 0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d,
310 0x2530, 0x2928, 0xff28,
311 0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813,
312 0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
313 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
314 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
315 0x2828, 0x2828, 0xff28,
318 0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403,
319 0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08,
320 0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e,
321 0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416,
322 0x1218, 0x1514, 0xff14,
323 0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409,
324 0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
325 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
326 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
327 0x1414, 0x1414, 0xff14,
330 0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
331 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
332 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
333 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
334 0x0101, 0x0101, 0xff01,
335 0xdbff, 0x4300, 0x0101, 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,
342 if (quality < 0 || quality > 10) {
344 "meye: invalid quality level %d - using 8\n", quality);
348 *length = ARRAY_SIZE(jpeg_tables[quality]);
349 return jpeg_tables[quality];
352 /* return a generic set of huffman tables */
353 static u16 *jpeg_huffman_tables(int *length)
355 static u16 tables[] = {
356 0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405,
357 0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131,
358 0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142,
359 0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918,
360 0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443,
361 0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463,
362 0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483,
363 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A,
364 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8,
365 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6,
366 0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2,
367 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
368 0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405,
369 0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206,
370 0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1,
371 0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125,
372 0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A,
373 0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A,
374 0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A,
375 0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998,
376 0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6,
377 0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4,
378 0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2,
379 0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
380 0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000,
381 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
383 0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101,
384 0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
388 *length = ARRAY_SIZE(tables);
392 /****************************************************************************/
393 /* MCHIP low-level functions */
394 /****************************************************************************/
396 /* returns the horizontal capture size */
397 static inline int mchip_hsize(void)
399 return meye.params.subsample ? 320 : 640;
402 /* returns the vertical capture size */
403 static inline int mchip_vsize(void)
405 return meye.params.subsample ? 240 : 480;
408 /* waits for a register to be available */
409 static void mchip_sync(int reg)
414 if (reg == MCHIP_MM_FIFO_DATA) {
415 for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
416 status = readl(meye.mchip_mmregs +
417 MCHIP_MM_FIFO_STATUS);
418 if (!(status & MCHIP_MM_FIFO_WAIT)) {
419 printk(KERN_WARNING "meye: fifo not ready\n");
422 if (status & MCHIP_MM_FIFO_READY)
426 } else if (reg > 0x80) {
427 u32 mask = (reg < 0x100) ? MCHIP_HIC_STATUS_MCC_RDY
428 : MCHIP_HIC_STATUS_VRJ_RDY;
429 for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
430 status = readl(meye.mchip_mmregs + MCHIP_HIC_STATUS);
438 "meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",
442 /* sets a value into the register */
443 static inline void mchip_set(int reg, u32 v)
446 writel(v, meye.mchip_mmregs + reg);
449 /* get the register value */
450 static inline u32 mchip_read(int reg)
453 return readl(meye.mchip_mmregs + reg);
456 /* wait for a register to become a particular value */
457 static inline int mchip_delay(u32 reg, u32 v)
460 while (--n && mchip_read(reg) != v)
465 /* setup subsampling */
466 static void mchip_subsample(void)
468 mchip_set(MCHIP_MCC_R_SAMPLING, meye.params.subsample);
469 mchip_set(MCHIP_MCC_R_XRANGE, mchip_hsize());
470 mchip_set(MCHIP_MCC_R_YRANGE, mchip_vsize());
471 mchip_set(MCHIP_MCC_B_XRANGE, mchip_hsize());
472 mchip_set(MCHIP_MCC_B_YRANGE, mchip_vsize());
473 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
476 /* set the framerate into the mchip */
477 static void mchip_set_framerate(void)
479 mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);
482 /* load some huffman and quantisation tables into the VRJ chip ready
483 for JPEG compression */
484 static void mchip_load_tables(void)
490 tables = jpeg_huffman_tables(&length);
491 for (i = 0; i < length; i++)
492 writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
494 tables = jpeg_quantisation_tables(&length, meye.params.quality);
495 for (i = 0; i < length; i++)
496 writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
499 /* setup the VRJ parameters in the chip */
500 static void mchip_vrj_setup(u8 mode)
502 mchip_set(MCHIP_VRJ_BUS_MODE, 5);
503 mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL, 0x1f);
504 mchip_set(MCHIP_VRJ_PDAT_USE, 1);
505 mchip_set(MCHIP_VRJ_IRQ_FLAG, 0xa0);
506 mchip_set(MCHIP_VRJ_MODE_SPECIFY, mode);
507 mchip_set(MCHIP_VRJ_NUM_LINES, mchip_vsize());
508 mchip_set(MCHIP_VRJ_NUM_PIXELS, mchip_hsize());
509 mchip_set(MCHIP_VRJ_NUM_COMPONENTS, 0x1b);
510 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_LO, 0xFFFF);
511 mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_HI, 0xFFFF);
512 mchip_set(MCHIP_VRJ_COMP_DATA_FORMAT, 0xC);
513 mchip_set(MCHIP_VRJ_RESTART_INTERVAL, 0);
514 mchip_set(MCHIP_VRJ_SOF1, 0x601);
515 mchip_set(MCHIP_VRJ_SOF2, 0x1502);
516 mchip_set(MCHIP_VRJ_SOF3, 0x1503);
517 mchip_set(MCHIP_VRJ_SOF4, 0x1596);
518 mchip_set(MCHIP_VRJ_SOS, 0x0ed0);
523 /* sets the DMA parameters into the chip */
524 static void mchip_dma_setup(dma_addr_t dma_addr)
528 mchip_set(MCHIP_MM_PT_ADDR, (u32)dma_addr);
529 for (i = 0; i < 4; i++)
530 mchip_set(MCHIP_MM_FIR(i), 0);
534 /* setup for DMA transfers - also zeros the framebuffer */
535 static int mchip_dma_alloc(void)
537 if (!meye.mchip_dmahandle)
543 /* frees the DMA buffer */
544 static void mchip_dma_free(void)
546 if (meye.mchip_dmahandle) {
552 /* stop any existing HIC action and wait for any dma to complete then
553 reset the dma engine */
554 static void mchip_hic_stop(void)
558 meye.mchip_mode = MCHIP_HIC_MODE_NOOP;
559 if (!(mchip_read(MCHIP_HIC_STATUS) & MCHIP_HIC_STATUS_BUSY))
561 for (i = 0; i < 20; ++i) {
562 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_STOP);
563 mchip_delay(MCHIP_HIC_CMD, 0);
564 for (j = 0; j < 100; ++j) {
565 if (mchip_delay(MCHIP_HIC_STATUS,
566 MCHIP_HIC_STATUS_IDLE))
570 printk(KERN_ERR "meye: need to reset HIC!\n");
572 mchip_set(MCHIP_HIC_CTL, MCHIP_HIC_CTL_SOFT_RESET);
575 printk(KERN_ERR "meye: resetting HIC hanged!\n");
578 /****************************************************************************/
579 /* MCHIP frame processing functions */
580 /****************************************************************************/
582 /* get the next ready frame from the dma engine */
583 static u32 mchip_get_frame(void)
587 v = mchip_read(MCHIP_MM_FIR(meye.mchip_fnum));
591 /* frees the current frame from the dma engine */
592 static void mchip_free_frame(void)
594 mchip_set(MCHIP_MM_FIR(meye.mchip_fnum), 0);
596 meye.mchip_fnum %= 4;
599 /* read one frame from the framebuffer assuming it was captured using
600 a uncompressed transfer */
601 static void mchip_cont_read_frame(u32 v, u8 *buf, int size)
605 pt_id = (v >> 17) & 0x3FF;
607 ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES);
610 /* read a compressed frame from the framebuffer */
611 static int mchip_comp_read_frame(u32 v, u8 *buf, int size)
613 int pt_start, pt_end, trailer;
617 pt_start = (v >> 19) & 0xFF;
618 pt_end = (v >> 11) & 0xFF;
619 trailer = (v >> 1) & 0x3FF;
621 if (pt_end < pt_start)
622 fsize = (MCHIP_NB_PAGES_MJPEG - pt_start) * PAGE_SIZE +
623 pt_end * PAGE_SIZE + trailer * 4;
625 fsize = (pt_end - pt_start) * PAGE_SIZE + trailer * 4;
628 printk(KERN_WARNING "meye: oversized compressed frame %d\n",
633 ptable_copy(buf, pt_start, fsize, MCHIP_NB_PAGES_MJPEG);
635 #ifdef MEYE_JPEG_CORRECTION
637 /* Some mchip generated jpeg frames are incorrect. In most
638 * (all ?) of those cases, the final EOI (0xff 0xd9) marker
639 * is not present at the end of the frame.
641 * Since adding the final marker is not enough to restore
642 * the jpeg integrity, we drop the frame.
645 for (i = fsize - 1; i > 0 && buf[i] == 0xff; i--) ;
647 if (i < 2 || buf[i - 1] != 0xff || buf[i] != 0xd9)
655 /* take a picture into SDRAM */
656 static void mchip_take_picture(void)
662 mchip_dma_setup(meye.mchip_dmahandle);
664 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_CAP);
665 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
667 mchip_delay(MCHIP_HIC_CMD, 0);
669 for (i = 0; i < 100; ++i) {
670 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
676 /* dma a previously taken picture into a buffer */
677 static void mchip_get_picture(u8 *buf, int bufsize)
682 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_OUT);
683 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
685 mchip_delay(MCHIP_HIC_CMD, 0);
686 for (i = 0; i < 100; ++i) {
687 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
691 for (i = 0; i < 4; ++i) {
692 v = mchip_get_frame();
693 if (v & MCHIP_MM_FIR_RDY) {
694 mchip_cont_read_frame(v, buf, bufsize);
701 /* start continuous dma capture */
702 static void mchip_continuous_start(void)
706 mchip_set_framerate();
707 mchip_dma_setup(meye.mchip_dmahandle);
709 meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
711 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_OUT);
712 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
714 mchip_delay(MCHIP_HIC_CMD, 0);
717 /* compress one frame into a buffer */
718 static int mchip_compress_frame(u8 *buf, int bufsize)
723 mchip_vrj_setup(0x3f);
726 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_COMP);
727 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
729 mchip_delay(MCHIP_HIC_CMD, 0);
730 for (i = 0; i < 100; ++i) {
731 if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
736 for (i = 0; i < 4; ++i) {
737 v = mchip_get_frame();
738 if (v & MCHIP_MM_FIR_RDY) {
739 len = mchip_comp_read_frame(v, buf, bufsize);
748 /* uncompress one image into a buffer */
749 static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize)
751 mchip_vrj_setup(0x3f);
754 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_DECOMP);
755 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
757 mchip_delay(MCHIP_HIC_CMD, 0);
759 return mchip_comp_read_frame(buf, bufsize);
763 /* start continuous compressed capture */
764 static void mchip_cont_compression_start(void)
767 mchip_vrj_setup(0x3f);
769 mchip_set_framerate();
770 mchip_dma_setup(meye.mchip_dmahandle);
772 meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
774 mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_COMP);
775 mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
777 mchip_delay(MCHIP_HIC_CMD, 0);
780 /****************************************************************************/
781 /* Interrupt handling */
782 /****************************************************************************/
784 static irqreturn_t meye_irq(int irq, void *dev_id)
790 v = mchip_read(MCHIP_MM_INTA);
792 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT &&
793 meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
797 v = mchip_get_frame();
798 if (!(v & MCHIP_MM_FIR_RDY))
801 if (meye.mchip_mode == MCHIP_HIC_MODE_CONT_OUT) {
802 if (kfifo_get(meye.grabq, (unsigned char *)&reqnr,
803 sizeof(int)) != sizeof(int)) {
807 mchip_cont_read_frame(v, meye.grab_fbuffer + gbufsize * reqnr,
808 mchip_hsize() * mchip_vsize() * 2);
809 meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2;
810 meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
811 do_gettimeofday(&meye.grab_buffer[reqnr].timestamp);
812 meye.grab_buffer[reqnr].sequence = sequence++;
813 kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int));
814 wake_up_interruptible(&meye.proc_list);
817 size = mchip_comp_read_frame(v, meye.grab_temp, gbufsize);
822 if (kfifo_get(meye.grabq, (unsigned char *)&reqnr,
823 sizeof(int)) != sizeof(int)) {
827 memcpy(meye.grab_fbuffer + gbufsize * reqnr, meye.grab_temp,
829 meye.grab_buffer[reqnr].size = size;
830 meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
831 do_gettimeofday(&meye.grab_buffer[reqnr].timestamp);
832 meye.grab_buffer[reqnr].sequence = sequence++;
833 kfifo_put(meye.doneq, (unsigned char *)&reqnr, sizeof(int));
834 wake_up_interruptible(&meye.proc_list);
840 /****************************************************************************/
841 /* video4linux integration */
842 /****************************************************************************/
844 static int meye_open(struct inode *inode, struct file *file)
848 err = video_exclusive_open(inode, file);
854 if (mchip_dma_alloc()) {
855 printk(KERN_ERR "meye: mchip framebuffer allocation failed\n");
856 video_exclusive_release(inode, file);
860 for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
861 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
862 kfifo_reset(meye.grabq);
863 kfifo_reset(meye.doneq);
867 static int meye_release(struct inode *inode, struct file *file)
871 video_exclusive_release(inode, file);
875 static int meyeioc_g_params(struct meye_params *p)
881 static int meyeioc_s_params(struct meye_params *jp)
883 if (jp->subsample > 1)
886 if (jp->quality > 10)
889 if (jp->sharpness > 63 || jp->agc > 63 || jp->picture > 63)
892 if (jp->framerate > 31)
895 mutex_lock(&meye.lock);
897 if (meye.params.subsample != jp->subsample ||
898 meye.params.quality != jp->quality)
899 mchip_hic_stop(); /* need restart */
902 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS,
903 meye.params.sharpness);
904 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC,
906 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE,
907 meye.params.picture);
908 mutex_unlock(&meye.lock);
913 static int meyeioc_qbuf_capt(int *nb)
915 if (!meye.grab_fbuffer)
927 if (meye.grab_buffer[*nb].state != MEYE_BUF_UNUSED)
930 mutex_lock(&meye.lock);
932 if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
933 mchip_cont_compression_start();
935 meye.grab_buffer[*nb].state = MEYE_BUF_USING;
936 kfifo_put(meye.grabq, (unsigned char *)nb, sizeof(int));
937 mutex_unlock(&meye.lock);
942 static int meyeioc_sync(struct file *file, void *fh, int *i)
946 if (*i < 0 || *i >= gbuffers)
949 mutex_lock(&meye.lock);
950 switch (meye.grab_buffer[*i].state) {
952 case MEYE_BUF_UNUSED:
953 mutex_unlock(&meye.lock);
956 if (file->f_flags & O_NONBLOCK) {
957 mutex_unlock(&meye.lock);
960 if (wait_event_interruptible(meye.proc_list,
961 (meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
962 mutex_unlock(&meye.lock);
967 meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
968 kfifo_get(meye.doneq, (unsigned char *)&unused, sizeof(int));
970 *i = meye.grab_buffer[*i].size;
971 mutex_unlock(&meye.lock);
975 static int meyeioc_stillcapt(void)
977 if (!meye.grab_fbuffer)
980 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
983 mutex_lock(&meye.lock);
984 meye.grab_buffer[0].state = MEYE_BUF_USING;
985 mchip_take_picture();
987 mchip_get_picture(meye.grab_fbuffer,
988 mchip_hsize() * mchip_vsize() * 2);
990 meye.grab_buffer[0].state = MEYE_BUF_DONE;
991 mutex_unlock(&meye.lock);
996 static int meyeioc_stilljcapt(int *len)
998 if (!meye.grab_fbuffer)
1001 if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
1004 mutex_lock(&meye.lock);
1005 meye.grab_buffer[0].state = MEYE_BUF_USING;
1008 while (*len == -1) {
1009 mchip_take_picture();
1010 *len = mchip_compress_frame(meye.grab_fbuffer, gbufsize);
1013 meye.grab_buffer[0].state = MEYE_BUF_DONE;
1014 mutex_unlock(&meye.lock);
1018 static int vidioc_querycap(struct file *file, void *fh,
1019 struct v4l2_capability *cap)
1021 memset(cap, 0, sizeof(*cap));
1022 strcpy(cap->driver, "meye");
1023 strcpy(cap->card, "meye");
1024 sprintf(cap->bus_info, "PCI:%s", pci_name(meye.mchip_dev));
1026 cap->version = (MEYE_DRIVER_MAJORVERSION << 8) +
1027 MEYE_DRIVER_MINORVERSION;
1029 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1035 static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
1040 memset(i, 0, sizeof(*i));
1042 strcpy(i->name, "Camera");
1043 i->type = V4L2_INPUT_TYPE_CAMERA;
1048 static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
1054 static int vidioc_s_input(struct file *file, void *fh, unsigned int i)
1062 static int vidioc_queryctrl(struct file *file, void *fh,
1063 struct v4l2_queryctrl *c)
1067 case V4L2_CID_BRIGHTNESS:
1068 c->type = V4L2_CTRL_TYPE_INTEGER;
1069 strcpy(c->name, "Brightness");
1073 c->default_value = 32;
1077 c->type = V4L2_CTRL_TYPE_INTEGER;
1078 strcpy(c->name, "Hue");
1082 c->default_value = 32;
1085 case V4L2_CID_CONTRAST:
1086 c->type = V4L2_CTRL_TYPE_INTEGER;
1087 strcpy(c->name, "Contrast");
1091 c->default_value = 32;
1094 case V4L2_CID_SATURATION:
1095 c->type = V4L2_CTRL_TYPE_INTEGER;
1096 strcpy(c->name, "Saturation");
1100 c->default_value = 32;
1104 c->type = V4L2_CTRL_TYPE_INTEGER;
1105 strcpy(c->name, "Agc");
1109 c->default_value = 48;
1112 case V4L2_CID_MEYE_SHARPNESS:
1113 case V4L2_CID_SHARPNESS:
1114 c->type = V4L2_CTRL_TYPE_INTEGER;
1115 strcpy(c->name, "Sharpness");
1119 c->default_value = 32;
1121 /* Continue to report legacy private SHARPNESS ctrl but
1122 * say it is disabled in preference to ctrl in the spec
1124 c->flags = (c->id == V4L2_CID_SHARPNESS) ? 0 :
1125 V4L2_CTRL_FLAG_DISABLED;
1127 case V4L2_CID_PICTURE:
1128 c->type = V4L2_CTRL_TYPE_INTEGER;
1129 strcpy(c->name, "Picture");
1133 c->default_value = 0;
1136 case V4L2_CID_JPEGQUAL:
1137 c->type = V4L2_CTRL_TYPE_INTEGER;
1138 strcpy(c->name, "JPEG quality");
1142 c->default_value = 8;
1145 case V4L2_CID_FRAMERATE:
1146 c->type = V4L2_CTRL_TYPE_INTEGER;
1147 strcpy(c->name, "Framerate");
1151 c->default_value = 0;
1161 static int vidioc_s_ctrl(struct file *file, void *fh, struct v4l2_control *c)
1163 mutex_lock(&meye.lock);
1165 case V4L2_CID_BRIGHTNESS:
1166 sony_pic_camera_command(
1167 SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, c->value);
1168 meye.picture.brightness = c->value << 10;
1171 sony_pic_camera_command(
1172 SONY_PIC_COMMAND_SETCAMERAHUE, c->value);
1173 meye.picture.hue = c->value << 10;
1175 case V4L2_CID_CONTRAST:
1176 sony_pic_camera_command(
1177 SONY_PIC_COMMAND_SETCAMERACONTRAST, c->value);
1178 meye.picture.contrast = c->value << 10;
1180 case V4L2_CID_SATURATION:
1181 sony_pic_camera_command(
1182 SONY_PIC_COMMAND_SETCAMERACOLOR, c->value);
1183 meye.picture.colour = c->value << 10;
1186 sony_pic_camera_command(
1187 SONY_PIC_COMMAND_SETCAMERAAGC, c->value);
1188 meye.params.agc = c->value;
1190 case V4L2_CID_SHARPNESS:
1191 case V4L2_CID_MEYE_SHARPNESS:
1192 sony_pic_camera_command(
1193 SONY_PIC_COMMAND_SETCAMERASHARPNESS, c->value);
1194 meye.params.sharpness = c->value;
1196 case V4L2_CID_PICTURE:
1197 sony_pic_camera_command(
1198 SONY_PIC_COMMAND_SETCAMERAPICTURE, c->value);
1199 meye.params.picture = c->value;
1201 case V4L2_CID_JPEGQUAL:
1202 meye.params.quality = c->value;
1204 case V4L2_CID_FRAMERATE:
1205 meye.params.framerate = c->value;
1208 mutex_unlock(&meye.lock);
1211 mutex_unlock(&meye.lock);
1216 static int vidioc_g_ctrl(struct file *file, void *fh, struct v4l2_control *c)
1218 mutex_lock(&meye.lock);
1220 case V4L2_CID_BRIGHTNESS:
1221 c->value = meye.picture.brightness >> 10;
1224 c->value = meye.picture.hue >> 10;
1226 case V4L2_CID_CONTRAST:
1227 c->value = meye.picture.contrast >> 10;
1229 case V4L2_CID_SATURATION:
1230 c->value = meye.picture.colour >> 10;
1233 c->value = meye.params.agc;
1235 case V4L2_CID_SHARPNESS:
1236 case V4L2_CID_MEYE_SHARPNESS:
1237 c->value = meye.params.sharpness;
1239 case V4L2_CID_PICTURE:
1240 c->value = meye.params.picture;
1242 case V4L2_CID_JPEGQUAL:
1243 c->value = meye.params.quality;
1245 case V4L2_CID_FRAMERATE:
1246 c->value = meye.params.framerate;
1249 mutex_unlock(&meye.lock);
1252 mutex_unlock(&meye.lock);
1257 static int vidioc_enum_fmt_vid_cap(struct file *file, void *fh,
1258 struct v4l2_fmtdesc *f)
1263 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1266 if (f->index == 0) {
1267 /* standard YUV 422 capture */
1268 memset(f, 0, sizeof(*f));
1270 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1272 strcpy(f->description, "YUV422");
1273 f->pixelformat = V4L2_PIX_FMT_YUYV;
1275 /* compressed MJPEG capture */
1276 memset(f, 0, sizeof(*f));
1278 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1279 f->flags = V4L2_FMT_FLAG_COMPRESSED;
1280 strcpy(f->description, "MJPEG");
1281 f->pixelformat = V4L2_PIX_FMT_MJPEG;
1287 static int vidioc_try_fmt_vid_cap(struct file *file, void *fh,
1288 struct v4l2_format *f)
1290 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1293 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1294 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1297 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1298 f->fmt.pix.field != V4L2_FIELD_NONE)
1301 f->fmt.pix.field = V4L2_FIELD_NONE;
1303 if (f->fmt.pix.width <= 320) {
1304 f->fmt.pix.width = 320;
1305 f->fmt.pix.height = 240;
1307 f->fmt.pix.width = 640;
1308 f->fmt.pix.height = 480;
1311 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1312 f->fmt.pix.sizeimage = f->fmt.pix.height *
1313 f->fmt.pix.bytesperline;
1314 f->fmt.pix.colorspace = 0;
1315 f->fmt.pix.priv = 0;
1320 static int vidioc_g_fmt_vid_cap(struct file *file, void *fh,
1321 struct v4l2_format *f)
1323 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1326 memset(&f->fmt.pix, 0, sizeof(struct v4l2_pix_format));
1327 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1329 switch (meye.mchip_mode) {
1330 case MCHIP_HIC_MODE_CONT_OUT:
1332 f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
1334 case MCHIP_HIC_MODE_CONT_COMP:
1335 f->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
1339 f->fmt.pix.field = V4L2_FIELD_NONE;
1340 f->fmt.pix.width = mchip_hsize();
1341 f->fmt.pix.height = mchip_vsize();
1342 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1343 f->fmt.pix.sizeimage = f->fmt.pix.height *
1344 f->fmt.pix.bytesperline;
1345 f->fmt.pix.colorspace = 0;
1346 f->fmt.pix.priv = 0;
1351 static int vidioc_s_fmt_vid_cap(struct file *file, void *fh,
1352 struct v4l2_format *f)
1354 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1357 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1358 f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1361 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1362 f->fmt.pix.field != V4L2_FIELD_NONE)
1365 f->fmt.pix.field = V4L2_FIELD_NONE;
1366 mutex_lock(&meye.lock);
1368 if (f->fmt.pix.width <= 320) {
1369 f->fmt.pix.width = 320;
1370 f->fmt.pix.height = 240;
1371 meye.params.subsample = 1;
1373 f->fmt.pix.width = 640;
1374 f->fmt.pix.height = 480;
1375 meye.params.subsample = 0;
1378 switch (f->fmt.pix.pixelformat) {
1379 case V4L2_PIX_FMT_YUYV:
1380 meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
1382 case V4L2_PIX_FMT_MJPEG:
1383 meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
1387 mutex_unlock(&meye.lock);
1388 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1389 f->fmt.pix.sizeimage = f->fmt.pix.height *
1390 f->fmt.pix.bytesperline;
1391 f->fmt.pix.colorspace = 0;
1392 f->fmt.pix.priv = 0;
1397 static int vidioc_reqbufs(struct file *file, void *fh,
1398 struct v4l2_requestbuffers *req)
1402 if (req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1405 if (req->memory != V4L2_MEMORY_MMAP)
1408 if (meye.grab_fbuffer && req->count == gbuffers) {
1409 /* already allocated, no modifications */
1413 mutex_lock(&meye.lock);
1414 if (meye.grab_fbuffer) {
1415 for (i = 0; i < gbuffers; i++)
1416 if (meye.vma_use_count[i]) {
1417 mutex_unlock(&meye.lock);
1420 rvfree(meye.grab_fbuffer, gbuffers * gbufsize);
1421 meye.grab_fbuffer = NULL;
1424 gbuffers = max(2, min((int)req->count, MEYE_MAX_BUFNBRS));
1425 req->count = gbuffers;
1426 meye.grab_fbuffer = rvmalloc(gbuffers * gbufsize);
1428 if (!meye.grab_fbuffer) {
1429 printk(KERN_ERR "meye: v4l framebuffer allocation"
1431 mutex_unlock(&meye.lock);
1435 for (i = 0; i < gbuffers; i++)
1436 meye.vma_use_count[i] = 0;
1438 mutex_unlock(&meye.lock);
1443 static int vidioc_querybuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1445 int index = buf->index;
1447 if (index < 0 || index >= gbuffers)
1450 memset(buf, 0, sizeof(*buf));
1452 buf->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1454 buf->bytesused = meye.grab_buffer[index].size;
1455 buf->flags = V4L2_BUF_FLAG_MAPPED;
1457 if (meye.grab_buffer[index].state == MEYE_BUF_USING)
1458 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1460 if (meye.grab_buffer[index].state == MEYE_BUF_DONE)
1461 buf->flags |= V4L2_BUF_FLAG_DONE;
1463 buf->field = V4L2_FIELD_NONE;
1464 buf->timestamp = meye.grab_buffer[index].timestamp;
1465 buf->sequence = meye.grab_buffer[index].sequence;
1466 buf->memory = V4L2_MEMORY_MMAP;
1467 buf->m.offset = index * gbufsize;
1468 buf->length = gbufsize;
1473 static int vidioc_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1475 if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1478 if (buf->memory != V4L2_MEMORY_MMAP)
1481 if (buf->index < 0 || buf->index >= gbuffers)
1484 if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED)
1487 mutex_lock(&meye.lock);
1488 buf->flags |= V4L2_BUF_FLAG_QUEUED;
1489 buf->flags &= ~V4L2_BUF_FLAG_DONE;
1490 meye.grab_buffer[buf->index].state = MEYE_BUF_USING;
1491 kfifo_put(meye.grabq, (unsigned char *)&buf->index, sizeof(int));
1492 mutex_unlock(&meye.lock);
1497 static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1501 if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1504 if (buf->memory != V4L2_MEMORY_MMAP)
1507 mutex_lock(&meye.lock);
1509 if (kfifo_len(meye.doneq) == 0 && file->f_flags & O_NONBLOCK) {
1510 mutex_unlock(&meye.lock);
1514 if (wait_event_interruptible(meye.proc_list,
1515 kfifo_len(meye.doneq) != 0) < 0) {
1516 mutex_unlock(&meye.lock);
1520 if (!kfifo_get(meye.doneq, (unsigned char *)&reqnr,
1522 mutex_unlock(&meye.lock);
1526 if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) {
1527 mutex_unlock(&meye.lock);
1532 buf->bytesused = meye.grab_buffer[reqnr].size;
1533 buf->flags = V4L2_BUF_FLAG_MAPPED;
1534 buf->field = V4L2_FIELD_NONE;
1535 buf->timestamp = meye.grab_buffer[reqnr].timestamp;
1536 buf->sequence = meye.grab_buffer[reqnr].sequence;
1537 buf->memory = V4L2_MEMORY_MMAP;
1538 buf->m.offset = reqnr * gbufsize;
1539 buf->length = gbufsize;
1540 meye.grab_buffer[reqnr].state = MEYE_BUF_UNUSED;
1541 mutex_unlock(&meye.lock);
1546 static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
1548 mutex_lock(&meye.lock);
1550 switch (meye.mchip_mode) {
1551 case MCHIP_HIC_MODE_CONT_OUT:
1552 mchip_continuous_start();
1554 case MCHIP_HIC_MODE_CONT_COMP:
1555 mchip_cont_compression_start();
1558 mutex_unlock(&meye.lock);
1562 mutex_unlock(&meye.lock);
1567 static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
1569 mutex_lock(&meye.lock);
1571 kfifo_reset(meye.grabq);
1572 kfifo_reset(meye.doneq);
1574 for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
1575 meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
1577 mutex_unlock(&meye.lock);
1581 static int vidioc_default(struct file *file, void *fh, int cmd, void *arg)
1584 case MEYEIOC_G_PARAMS:
1585 return meyeioc_g_params((struct meye_params *) arg);
1587 case MEYEIOC_S_PARAMS:
1588 return meyeioc_s_params((struct meye_params *) arg);
1590 case MEYEIOC_QBUF_CAPT:
1591 return meyeioc_qbuf_capt((int *) arg);
1594 return meyeioc_sync(file, fh, (int *) arg);
1596 case MEYEIOC_STILLCAPT:
1597 return meyeioc_stillcapt();
1599 case MEYEIOC_STILLJCAPT:
1600 return meyeioc_stilljcapt((int *) arg);
1608 static unsigned int meye_poll(struct file *file, poll_table *wait)
1610 unsigned int res = 0;
1612 mutex_lock(&meye.lock);
1613 poll_wait(file, &meye.proc_list, wait);
1614 if (kfifo_len(meye.doneq))
1615 res = POLLIN | POLLRDNORM;
1616 mutex_unlock(&meye.lock);
1620 static void meye_vm_open(struct vm_area_struct *vma)
1622 long idx = (long)vma->vm_private_data;
1623 meye.vma_use_count[idx]++;
1626 static void meye_vm_close(struct vm_area_struct *vma)
1628 long idx = (long)vma->vm_private_data;
1629 meye.vma_use_count[idx]--;
1632 static struct vm_operations_struct meye_vm_ops = {
1633 .open = meye_vm_open,
1634 .close = meye_vm_close,
1637 static int meye_mmap(struct file *file, struct vm_area_struct *vma)
1639 unsigned long start = vma->vm_start;
1640 unsigned long size = vma->vm_end - vma->vm_start;
1641 unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
1642 unsigned long page, pos;
1644 mutex_lock(&meye.lock);
1645 if (size > gbuffers * gbufsize) {
1646 mutex_unlock(&meye.lock);
1649 if (!meye.grab_fbuffer) {
1652 /* lazy allocation */
1653 meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize);
1654 if (!meye.grab_fbuffer) {
1655 printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1656 mutex_unlock(&meye.lock);
1659 for (i = 0; i < gbuffers; i++)
1660 meye.vma_use_count[i] = 0;
1662 pos = (unsigned long)meye.grab_fbuffer + offset;
1665 page = vmalloc_to_pfn((void *)pos);
1666 if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
1667 mutex_unlock(&meye.lock);
1672 if (size > PAGE_SIZE)
1678 vma->vm_ops = &meye_vm_ops;
1679 vma->vm_flags &= ~VM_IO; /* not I/O memory */
1680 vma->vm_flags |= VM_RESERVED; /* avoid to swap out this VMA */
1681 vma->vm_private_data = (void *) (offset / gbufsize);
1684 mutex_unlock(&meye.lock);
1688 static const struct file_operations meye_fops = {
1689 .owner = THIS_MODULE,
1691 .release = meye_release,
1693 .ioctl = video_ioctl2,
1694 #ifdef CONFIG_COMPAT
1695 .compat_ioctl = v4l_compat_ioctl32,
1698 .llseek = no_llseek,
1701 static const struct v4l2_ioctl_ops meye_ioctl_ops = {
1702 .vidioc_querycap = vidioc_querycap,
1703 .vidioc_enum_input = vidioc_enum_input,
1704 .vidioc_g_input = vidioc_g_input,
1705 .vidioc_s_input = vidioc_s_input,
1706 .vidioc_queryctrl = vidioc_queryctrl,
1707 .vidioc_s_ctrl = vidioc_s_ctrl,
1708 .vidioc_g_ctrl = vidioc_g_ctrl,
1709 .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1710 .vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1711 .vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1712 .vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1713 .vidioc_reqbufs = vidioc_reqbufs,
1714 .vidioc_querybuf = vidioc_querybuf,
1715 .vidioc_qbuf = vidioc_qbuf,
1716 .vidioc_dqbuf = vidioc_dqbuf,
1717 .vidioc_streamon = vidioc_streamon,
1718 .vidioc_streamoff = vidioc_streamoff,
1719 .vidioc_default = vidioc_default,
1722 static struct video_device meye_template = {
1725 .ioctl_ops = &meye_ioctl_ops,
1726 .release = video_device_release,
1731 static int meye_suspend(struct pci_dev *pdev, pm_message_t state)
1733 pci_save_state(pdev);
1734 meye.pm_mchip_mode = meye.mchip_mode;
1736 mchip_set(MCHIP_MM_INTA, 0x0);
1740 static int meye_resume(struct pci_dev *pdev)
1742 pci_restore_state(pdev);
1743 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1745 mchip_delay(MCHIP_HIC_CMD, 0);
1746 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1748 mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1750 mchip_set(MCHIP_MM_PCI_MODE, 5);
1752 mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1754 switch (meye.pm_mchip_mode) {
1755 case MCHIP_HIC_MODE_CONT_OUT:
1756 mchip_continuous_start();
1758 case MCHIP_HIC_MODE_CONT_COMP:
1759 mchip_cont_compression_start();
1766 static int __devinit meye_probe(struct pci_dev *pcidev,
1767 const struct pci_device_id *ent)
1770 unsigned long mchip_adr;
1772 if (meye.mchip_dev != NULL) {
1773 printk(KERN_ERR "meye: only one device allowed!\n");
1777 meye.mchip_dev = pcidev;
1778 meye.video_dev = video_device_alloc();
1779 if (!meye.video_dev) {
1780 printk(KERN_ERR "meye: video_device_alloc() failed!\n");
1785 meye.grab_temp = vmalloc(MCHIP_NB_PAGES_MJPEG * PAGE_SIZE);
1786 if (!meye.grab_temp) {
1787 printk(KERN_ERR "meye: grab buffer allocation failed\n");
1791 spin_lock_init(&meye.grabq_lock);
1792 meye.grabq = kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL,
1794 if (IS_ERR(meye.grabq)) {
1795 printk(KERN_ERR "meye: fifo allocation failed\n");
1796 goto outkfifoalloc1;
1798 spin_lock_init(&meye.doneq_lock);
1799 meye.doneq = kfifo_alloc(sizeof(int) * MEYE_MAX_BUFNBRS, GFP_KERNEL,
1801 if (IS_ERR(meye.doneq)) {
1802 printk(KERN_ERR "meye: fifo allocation failed\n");
1803 goto outkfifoalloc2;
1806 memcpy(meye.video_dev, &meye_template, sizeof(meye_template));
1807 meye.video_dev->parent = &meye.mchip_dev->dev;
1810 if ((ret = sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 1))) {
1811 printk(KERN_ERR "meye: unable to power on the camera\n");
1812 printk(KERN_ERR "meye: did you enable the camera in "
1813 "sonypi using the module options ?\n");
1814 goto outsonypienable;
1817 if ((ret = pci_enable_device(meye.mchip_dev))) {
1818 printk(KERN_ERR "meye: pci_enable_device failed\n");
1822 mchip_adr = pci_resource_start(meye.mchip_dev,0);
1824 printk(KERN_ERR "meye: mchip has no device base address\n");
1827 if (!request_mem_region(pci_resource_start(meye.mchip_dev, 0),
1828 pci_resource_len(meye.mchip_dev, 0),
1830 printk(KERN_ERR "meye: request_mem_region failed\n");
1833 meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS);
1834 if (!meye.mchip_mmregs) {
1835 printk(KERN_ERR "meye: ioremap failed\n");
1839 meye.mchip_irq = pcidev->irq;
1840 if (request_irq(meye.mchip_irq, meye_irq,
1841 IRQF_DISABLED | IRQF_SHARED, "meye", meye_irq)) {
1842 printk(KERN_ERR "meye: request_irq failed\n");
1846 pci_write_config_byte(meye.mchip_dev, PCI_CACHE_LINE_SIZE, 8);
1847 pci_write_config_byte(meye.mchip_dev, PCI_LATENCY_TIMER, 64);
1849 pci_set_master(meye.mchip_dev);
1851 /* Ask the camera to perform a soft reset. */
1852 pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1854 mchip_delay(MCHIP_HIC_CMD, 0);
1855 mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1858 mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1861 mchip_set(MCHIP_MM_PCI_MODE, 5);
1864 mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1866 if (video_register_device(meye.video_dev, VFL_TYPE_GRABBER,
1868 printk(KERN_ERR "meye: video_register_device failed\n");
1872 mutex_init(&meye.lock);
1873 init_waitqueue_head(&meye.proc_list);
1874 meye.picture.depth = 16;
1875 meye.picture.palette = VIDEO_PALETTE_YUV422;
1876 meye.picture.brightness = 32 << 10;
1877 meye.picture.hue = 32 << 10;
1878 meye.picture.colour = 32 << 10;
1879 meye.picture.contrast = 32 << 10;
1880 meye.picture.whiteness = 0;
1881 meye.params.subsample = 0;
1882 meye.params.quality = 8;
1883 meye.params.sharpness = 32;
1884 meye.params.agc = 48;
1885 meye.params.picture = 0;
1886 meye.params.framerate = 0;
1888 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, 32);
1889 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAHUE, 32);
1890 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACOLOR, 32);
1891 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACONTRAST, 32);
1892 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS, 32);
1893 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE, 0);
1894 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC, 48);
1896 printk(KERN_INFO "meye: Motion Eye Camera Driver v%s.\n",
1897 MEYE_DRIVER_VERSION);
1898 printk(KERN_INFO "meye: mchip KL5A72002 rev. %d, base %lx, irq %d\n",
1899 meye.mchip_dev->revision, mchip_adr, meye.mchip_irq);
1904 free_irq(meye.mchip_irq, meye_irq);
1906 iounmap(meye.mchip_mmregs);
1908 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1909 pci_resource_len(meye.mchip_dev, 0));
1911 pci_disable_device(meye.mchip_dev);
1913 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1915 kfifo_free(meye.doneq);
1917 kfifo_free(meye.grabq);
1919 vfree(meye.grab_temp);
1921 video_device_release(meye.video_dev);
1926 static void __devexit meye_remove(struct pci_dev *pcidev)
1928 video_unregister_device(meye.video_dev);
1934 /* disable interrupts */
1935 mchip_set(MCHIP_MM_INTA, 0x0);
1937 free_irq(meye.mchip_irq, meye_irq);
1939 iounmap(meye.mchip_mmregs);
1941 release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1942 pci_resource_len(meye.mchip_dev, 0));
1944 pci_disable_device(meye.mchip_dev);
1946 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1948 kfifo_free(meye.doneq);
1949 kfifo_free(meye.grabq);
1951 vfree(meye.grab_temp);
1953 if (meye.grab_fbuffer) {
1954 rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
1955 meye.grab_fbuffer = NULL;
1958 printk(KERN_INFO "meye: removed\n");
1961 static struct pci_device_id meye_pci_tbl[] = {
1962 { PCI_VENDOR_ID_KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002,
1963 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
1967 MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
1969 static struct pci_driver meye_driver = {
1971 .id_table = meye_pci_tbl,
1972 .probe = meye_probe,
1973 .remove = __devexit_p(meye_remove),
1975 .suspend = meye_suspend,
1976 .resume = meye_resume,
1980 static int __init meye_init(void)
1982 gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS));
1983 if (gbufsize < 0 || gbufsize > MEYE_MAX_BUFSIZE)
1984 gbufsize = MEYE_MAX_BUFSIZE;
1985 gbufsize = PAGE_ALIGN(gbufsize);
1986 printk(KERN_INFO "meye: using %d buffers with %dk (%dk total) "
1989 gbufsize / 1024, gbuffers * gbufsize / 1024);
1990 return pci_register_driver(&meye_driver);
1993 static void __exit meye_exit(void)
1995 pci_unregister_driver(&meye_driver);
1998 module_init(meye_init);
1999 module_exit(meye_exit);