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 #include <linux/module.h>
26 #include <linux/pci.h>
27 #include <linux/sched.h>
28 #include <linux/init.h>
29 #include <linux/gfp.h>
30 #include <linux/videodev2.h>
31 #include <media/v4l2-common.h>
32 #include <media/v4l2-device.h>
33 #include <media/v4l2-ioctl.h>
34 #include <media/v4l2-fh.h>
35 #include <media/v4l2-event.h>
36 #include <linux/uaccess.h>
38 #include <linux/delay.h>
39 #include <linux/interrupt.h>
40 #include <linux/vmalloc.h>
41 #include <linux/dma-mapping.h>
44 #include <linux/meye.h>
46 MODULE_AUTHOR("Stelian Pop <stelian@popies.net>");
47 MODULE_DESCRIPTION("v4l2 driver for the MotionEye camera");
48 MODULE_LICENSE("GPL");
49 MODULE_VERSION(MEYE_DRIVER_VERSION
);
51 /* number of grab buffers */
52 static unsigned int gbuffers
= 2;
53 module_param(gbuffers
, int, 0444);
54 MODULE_PARM_DESC(gbuffers
, "number of capture buffers, default is 2 (32 max)");
56 /* size of a grab buffer */
57 static unsigned int gbufsize
= MEYE_MAX_BUFSIZE
;
58 module_param(gbufsize
, int, 0444);
59 MODULE_PARM_DESC(gbufsize
, "size of the capture buffers, default is 614400 (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_BIT_MASK(32)))
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)
585 return mchip_read(MCHIP_MM_FIR(meye
.mchip_fnum
));
588 /* frees the current frame from the dma engine */
589 static void mchip_free_frame(void)
591 mchip_set(MCHIP_MM_FIR(meye
.mchip_fnum
), 0);
593 meye
.mchip_fnum
%= 4;
596 /* read one frame from the framebuffer assuming it was captured using
597 a uncompressed transfer */
598 static void mchip_cont_read_frame(u32 v
, u8
*buf
, int size
)
602 pt_id
= (v
>> 17) & 0x3FF;
604 ptable_copy(buf
, pt_id
, size
, MCHIP_NB_PAGES
);
607 /* read a compressed frame from the framebuffer */
608 static int mchip_comp_read_frame(u32 v
, u8
*buf
, int size
)
610 int pt_start
, pt_end
, trailer
;
614 pt_start
= (v
>> 19) & 0xFF;
615 pt_end
= (v
>> 11) & 0xFF;
616 trailer
= (v
>> 1) & 0x3FF;
618 if (pt_end
< pt_start
)
619 fsize
= (MCHIP_NB_PAGES_MJPEG
- pt_start
) * PAGE_SIZE
+
620 pt_end
* PAGE_SIZE
+ trailer
* 4;
622 fsize
= (pt_end
- pt_start
) * PAGE_SIZE
+ trailer
* 4;
625 printk(KERN_WARNING
"meye: oversized compressed frame %d\n",
630 ptable_copy(buf
, pt_start
, fsize
, MCHIP_NB_PAGES_MJPEG
);
632 #ifdef MEYE_JPEG_CORRECTION
634 /* Some mchip generated jpeg frames are incorrect. In most
635 * (all ?) of those cases, the final EOI (0xff 0xd9) marker
636 * is not present at the end of the frame.
638 * Since adding the final marker is not enough to restore
639 * the jpeg integrity, we drop the frame.
642 for (i
= fsize
- 1; i
> 0 && buf
[i
] == 0xff; i
--) ;
644 if (i
< 2 || buf
[i
- 1] != 0xff || buf
[i
] != 0xd9)
652 /* take a picture into SDRAM */
653 static void mchip_take_picture(void)
659 mchip_dma_setup(meye
.mchip_dmahandle
);
661 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_STILL_CAP
);
662 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
664 mchip_delay(MCHIP_HIC_CMD
, 0);
666 for (i
= 0; i
< 100; ++i
) {
667 if (mchip_delay(MCHIP_HIC_STATUS
, MCHIP_HIC_STATUS_IDLE
))
673 /* dma a previously taken picture into a buffer */
674 static void mchip_get_picture(u8
*buf
, int bufsize
)
679 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_STILL_OUT
);
680 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
682 mchip_delay(MCHIP_HIC_CMD
, 0);
683 for (i
= 0; i
< 100; ++i
) {
684 if (mchip_delay(MCHIP_HIC_STATUS
, MCHIP_HIC_STATUS_IDLE
))
688 for (i
= 0; i
< 4; ++i
) {
689 v
= mchip_get_frame();
690 if (v
& MCHIP_MM_FIR_RDY
) {
691 mchip_cont_read_frame(v
, buf
, bufsize
);
698 /* start continuous dma capture */
699 static void mchip_continuous_start(void)
703 mchip_set_framerate();
704 mchip_dma_setup(meye
.mchip_dmahandle
);
706 meye
.mchip_mode
= MCHIP_HIC_MODE_CONT_OUT
;
708 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_CONT_OUT
);
709 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
711 mchip_delay(MCHIP_HIC_CMD
, 0);
714 /* compress one frame into a buffer */
715 static int mchip_compress_frame(u8
*buf
, int bufsize
)
720 mchip_vrj_setup(0x3f);
723 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_STILL_COMP
);
724 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
726 mchip_delay(MCHIP_HIC_CMD
, 0);
727 for (i
= 0; i
< 100; ++i
) {
728 if (mchip_delay(MCHIP_HIC_STATUS
, MCHIP_HIC_STATUS_IDLE
))
733 for (i
= 0; i
< 4; ++i
) {
734 v
= mchip_get_frame();
735 if (v
& MCHIP_MM_FIR_RDY
) {
736 len
= mchip_comp_read_frame(v
, buf
, bufsize
);
745 /* uncompress one image into a buffer */
746 static int mchip_uncompress_frame(u8
*img
, int imgsize
, u8
*buf
, int bufsize
)
748 mchip_vrj_setup(0x3f);
751 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_STILL_DECOMP
);
752 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
754 mchip_delay(MCHIP_HIC_CMD
, 0);
756 return mchip_comp_read_frame(buf
, bufsize
);
760 /* start continuous compressed capture */
761 static void mchip_cont_compression_start(void)
764 mchip_vrj_setup(0x3f);
766 mchip_set_framerate();
767 mchip_dma_setup(meye
.mchip_dmahandle
);
769 meye
.mchip_mode
= MCHIP_HIC_MODE_CONT_COMP
;
771 mchip_set(MCHIP_HIC_MODE
, MCHIP_HIC_MODE_CONT_COMP
);
772 mchip_set(MCHIP_HIC_CMD
, MCHIP_HIC_CMD_START
);
774 mchip_delay(MCHIP_HIC_CMD
, 0);
777 /****************************************************************************/
778 /* Interrupt handling */
779 /****************************************************************************/
781 static irqreturn_t
meye_irq(int irq
, void *dev_id
)
787 v
= mchip_read(MCHIP_MM_INTA
);
789 if (meye
.mchip_mode
!= MCHIP_HIC_MODE_CONT_OUT
&&
790 meye
.mchip_mode
!= MCHIP_HIC_MODE_CONT_COMP
)
794 v
= mchip_get_frame();
795 if (!(v
& MCHIP_MM_FIR_RDY
))
798 if (meye
.mchip_mode
== MCHIP_HIC_MODE_CONT_OUT
) {
799 if (kfifo_out_locked(&meye
.grabq
, (unsigned char *)&reqnr
,
800 sizeof(int), &meye
.grabq_lock
) != sizeof(int)) {
804 mchip_cont_read_frame(v
, meye
.grab_fbuffer
+ gbufsize
* reqnr
,
805 mchip_hsize() * mchip_vsize() * 2);
806 meye
.grab_buffer
[reqnr
].size
= mchip_hsize() * mchip_vsize() * 2;
807 meye
.grab_buffer
[reqnr
].state
= MEYE_BUF_DONE
;
808 v4l2_get_timestamp(&meye
.grab_buffer
[reqnr
].timestamp
);
809 meye
.grab_buffer
[reqnr
].sequence
= sequence
++;
810 kfifo_in_locked(&meye
.doneq
, (unsigned char *)&reqnr
,
811 sizeof(int), &meye
.doneq_lock
);
812 wake_up_interruptible(&meye
.proc_list
);
815 size
= mchip_comp_read_frame(v
, meye
.grab_temp
, gbufsize
);
820 if (kfifo_out_locked(&meye
.grabq
, (unsigned char *)&reqnr
,
821 sizeof(int), &meye
.grabq_lock
) != sizeof(int)) {
825 memcpy(meye
.grab_fbuffer
+ gbufsize
* reqnr
, meye
.grab_temp
,
827 meye
.grab_buffer
[reqnr
].size
= size
;
828 meye
.grab_buffer
[reqnr
].state
= MEYE_BUF_DONE
;
829 v4l2_get_timestamp(&meye
.grab_buffer
[reqnr
].timestamp
);
830 meye
.grab_buffer
[reqnr
].sequence
= sequence
++;
831 kfifo_in_locked(&meye
.doneq
, (unsigned char *)&reqnr
,
832 sizeof(int), &meye
.doneq_lock
);
833 wake_up_interruptible(&meye
.proc_list
);
839 /****************************************************************************/
840 /* video4linux integration */
841 /****************************************************************************/
843 static int meye_open(struct file
*file
)
847 if (test_and_set_bit(0, &meye
.in_use
))
852 if (mchip_dma_alloc()) {
853 printk(KERN_ERR
"meye: mchip framebuffer allocation failed\n");
854 clear_bit(0, &meye
.in_use
);
858 for (i
= 0; i
< MEYE_MAX_BUFNBRS
; i
++)
859 meye
.grab_buffer
[i
].state
= MEYE_BUF_UNUSED
;
860 kfifo_reset(&meye
.grabq
);
861 kfifo_reset(&meye
.doneq
);
862 return v4l2_fh_open(file
);
865 static int meye_release(struct file
*file
)
869 clear_bit(0, &meye
.in_use
);
870 return v4l2_fh_release(file
);
873 static int meyeioc_g_params(struct meye_params
*p
)
879 static int meyeioc_s_params(struct meye_params
*jp
)
881 if (jp
->subsample
> 1)
884 if (jp
->quality
> 10)
887 if (jp
->sharpness
> 63 || jp
->agc
> 63 || jp
->picture
> 63)
890 if (jp
->framerate
> 31)
893 mutex_lock(&meye
.lock
);
895 if (meye
.params
.subsample
!= jp
->subsample
||
896 meye
.params
.quality
!= jp
->quality
)
897 mchip_hic_stop(); /* need restart */
900 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS
,
901 meye
.params
.sharpness
);
902 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC
,
904 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE
,
905 meye
.params
.picture
);
906 mutex_unlock(&meye
.lock
);
911 static int meyeioc_qbuf_capt(int *nb
)
913 if (!meye
.grab_fbuffer
)
925 if (meye
.grab_buffer
[*nb
].state
!= MEYE_BUF_UNUSED
)
928 mutex_lock(&meye
.lock
);
930 if (meye
.mchip_mode
!= MCHIP_HIC_MODE_CONT_COMP
)
931 mchip_cont_compression_start();
933 meye
.grab_buffer
[*nb
].state
= MEYE_BUF_USING
;
934 kfifo_in_locked(&meye
.grabq
, (unsigned char *)nb
, sizeof(int),
936 mutex_unlock(&meye
.lock
);
941 static int meyeioc_sync(struct file
*file
, void *fh
, int *i
)
945 if (*i
< 0 || *i
>= gbuffers
)
948 mutex_lock(&meye
.lock
);
949 switch (meye
.grab_buffer
[*i
].state
) {
951 case MEYE_BUF_UNUSED
:
952 mutex_unlock(&meye
.lock
);
955 if (file
->f_flags
& O_NONBLOCK
) {
956 mutex_unlock(&meye
.lock
);
959 if (wait_event_interruptible(meye
.proc_list
,
960 (meye
.grab_buffer
[*i
].state
!= MEYE_BUF_USING
))) {
961 mutex_unlock(&meye
.lock
);
966 meye
.grab_buffer
[*i
].state
= MEYE_BUF_UNUSED
;
967 if (kfifo_out_locked(&meye
.doneq
, (unsigned char *)&unused
,
968 sizeof(int), &meye
.doneq_lock
) != sizeof(int))
971 *i
= meye
.grab_buffer
[*i
].size
;
972 mutex_unlock(&meye
.lock
);
976 static int meyeioc_stillcapt(void)
978 if (!meye
.grab_fbuffer
)
981 if (meye
.grab_buffer
[0].state
!= MEYE_BUF_UNUSED
)
984 mutex_lock(&meye
.lock
);
985 meye
.grab_buffer
[0].state
= MEYE_BUF_USING
;
986 mchip_take_picture();
988 mchip_get_picture(meye
.grab_fbuffer
,
989 mchip_hsize() * mchip_vsize() * 2);
991 meye
.grab_buffer
[0].state
= MEYE_BUF_DONE
;
992 mutex_unlock(&meye
.lock
);
997 static int meyeioc_stilljcapt(int *len
)
999 if (!meye
.grab_fbuffer
)
1002 if (meye
.grab_buffer
[0].state
!= MEYE_BUF_UNUSED
)
1005 mutex_lock(&meye
.lock
);
1006 meye
.grab_buffer
[0].state
= MEYE_BUF_USING
;
1009 while (*len
== -1) {
1010 mchip_take_picture();
1011 *len
= mchip_compress_frame(meye
.grab_fbuffer
, gbufsize
);
1014 meye
.grab_buffer
[0].state
= MEYE_BUF_DONE
;
1015 mutex_unlock(&meye
.lock
);
1019 static int vidioc_querycap(struct file
*file
, void *fh
,
1020 struct v4l2_capability
*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
->device_caps
= V4L2_CAP_VIDEO_CAPTURE
|
1028 cap
->capabilities
= cap
->device_caps
| V4L2_CAP_DEVICE_CAPS
;
1033 static int vidioc_enum_input(struct file
*file
, void *fh
, struct v4l2_input
*i
)
1038 strcpy(i
->name
, "Camera");
1039 i
->type
= V4L2_INPUT_TYPE_CAMERA
;
1044 static int vidioc_g_input(struct file
*file
, void *fh
, unsigned int *i
)
1050 static int vidioc_s_input(struct file
*file
, void *fh
, unsigned int i
)
1058 static int meye_s_ctrl(struct v4l2_ctrl
*ctrl
)
1060 mutex_lock(&meye
.lock
);
1062 case V4L2_CID_BRIGHTNESS
:
1063 sony_pic_camera_command(
1064 SONY_PIC_COMMAND_SETCAMERABRIGHTNESS
, ctrl
->val
);
1065 meye
.brightness
= ctrl
->val
<< 10;
1068 sony_pic_camera_command(
1069 SONY_PIC_COMMAND_SETCAMERAHUE
, ctrl
->val
);
1070 meye
.hue
= ctrl
->val
<< 10;
1072 case V4L2_CID_CONTRAST
:
1073 sony_pic_camera_command(
1074 SONY_PIC_COMMAND_SETCAMERACONTRAST
, ctrl
->val
);
1075 meye
.contrast
= ctrl
->val
<< 10;
1077 case V4L2_CID_SATURATION
:
1078 sony_pic_camera_command(
1079 SONY_PIC_COMMAND_SETCAMERACOLOR
, ctrl
->val
);
1080 meye
.colour
= ctrl
->val
<< 10;
1082 case V4L2_CID_MEYE_AGC
:
1083 sony_pic_camera_command(
1084 SONY_PIC_COMMAND_SETCAMERAAGC
, ctrl
->val
);
1085 meye
.params
.agc
= ctrl
->val
;
1087 case V4L2_CID_SHARPNESS
:
1088 sony_pic_camera_command(
1089 SONY_PIC_COMMAND_SETCAMERASHARPNESS
, ctrl
->val
);
1090 meye
.params
.sharpness
= ctrl
->val
;
1092 case V4L2_CID_MEYE_PICTURE
:
1093 sony_pic_camera_command(
1094 SONY_PIC_COMMAND_SETCAMERAPICTURE
, ctrl
->val
);
1095 meye
.params
.picture
= ctrl
->val
;
1097 case V4L2_CID_JPEG_COMPRESSION_QUALITY
:
1098 meye
.params
.quality
= ctrl
->val
;
1100 case V4L2_CID_MEYE_FRAMERATE
:
1101 meye
.params
.framerate
= ctrl
->val
;
1104 mutex_unlock(&meye
.lock
);
1107 mutex_unlock(&meye
.lock
);
1112 static int vidioc_enum_fmt_vid_cap(struct file
*file
, void *fh
,
1113 struct v4l2_fmtdesc
*f
)
1118 if (f
->index
== 0) {
1119 /* standard YUV 422 capture */
1121 strcpy(f
->description
, "YUV422");
1122 f
->pixelformat
= V4L2_PIX_FMT_YUYV
;
1124 /* compressed MJPEG capture */
1125 f
->flags
= V4L2_FMT_FLAG_COMPRESSED
;
1126 strcpy(f
->description
, "MJPEG");
1127 f
->pixelformat
= V4L2_PIX_FMT_MJPEG
;
1133 static int vidioc_try_fmt_vid_cap(struct file
*file
, void *fh
,
1134 struct v4l2_format
*f
)
1136 if (f
->fmt
.pix
.pixelformat
!= V4L2_PIX_FMT_YUYV
&&
1137 f
->fmt
.pix
.pixelformat
!= V4L2_PIX_FMT_MJPEG
)
1140 if (f
->fmt
.pix
.field
!= V4L2_FIELD_ANY
&&
1141 f
->fmt
.pix
.field
!= V4L2_FIELD_NONE
)
1144 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
1146 if (f
->fmt
.pix
.width
<= 320) {
1147 f
->fmt
.pix
.width
= 320;
1148 f
->fmt
.pix
.height
= 240;
1150 f
->fmt
.pix
.width
= 640;
1151 f
->fmt
.pix
.height
= 480;
1154 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
* 2;
1155 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
*
1156 f
->fmt
.pix
.bytesperline
;
1157 f
->fmt
.pix
.colorspace
= 0;
1162 static int vidioc_g_fmt_vid_cap(struct file
*file
, void *fh
,
1163 struct v4l2_format
*f
)
1165 switch (meye
.mchip_mode
) {
1166 case MCHIP_HIC_MODE_CONT_OUT
:
1168 f
->fmt
.pix
.pixelformat
= V4L2_PIX_FMT_YUYV
;
1170 case MCHIP_HIC_MODE_CONT_COMP
:
1171 f
->fmt
.pix
.pixelformat
= V4L2_PIX_FMT_MJPEG
;
1175 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
1176 f
->fmt
.pix
.width
= mchip_hsize();
1177 f
->fmt
.pix
.height
= mchip_vsize();
1178 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
* 2;
1179 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
*
1180 f
->fmt
.pix
.bytesperline
;
1185 static int vidioc_s_fmt_vid_cap(struct file
*file
, void *fh
,
1186 struct v4l2_format
*f
)
1188 if (f
->fmt
.pix
.pixelformat
!= V4L2_PIX_FMT_YUYV
&&
1189 f
->fmt
.pix
.pixelformat
!= V4L2_PIX_FMT_MJPEG
)
1192 if (f
->fmt
.pix
.field
!= V4L2_FIELD_ANY
&&
1193 f
->fmt
.pix
.field
!= V4L2_FIELD_NONE
)
1196 f
->fmt
.pix
.field
= V4L2_FIELD_NONE
;
1197 mutex_lock(&meye
.lock
);
1199 if (f
->fmt
.pix
.width
<= 320) {
1200 f
->fmt
.pix
.width
= 320;
1201 f
->fmt
.pix
.height
= 240;
1202 meye
.params
.subsample
= 1;
1204 f
->fmt
.pix
.width
= 640;
1205 f
->fmt
.pix
.height
= 480;
1206 meye
.params
.subsample
= 0;
1209 switch (f
->fmt
.pix
.pixelformat
) {
1210 case V4L2_PIX_FMT_YUYV
:
1211 meye
.mchip_mode
= MCHIP_HIC_MODE_CONT_OUT
;
1213 case V4L2_PIX_FMT_MJPEG
:
1214 meye
.mchip_mode
= MCHIP_HIC_MODE_CONT_COMP
;
1218 mutex_unlock(&meye
.lock
);
1219 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
* 2;
1220 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
*
1221 f
->fmt
.pix
.bytesperline
;
1222 f
->fmt
.pix
.colorspace
= 0;
1227 static int vidioc_reqbufs(struct file
*file
, void *fh
,
1228 struct v4l2_requestbuffers
*req
)
1232 if (req
->memory
!= V4L2_MEMORY_MMAP
)
1235 if (meye
.grab_fbuffer
&& req
->count
== gbuffers
) {
1236 /* already allocated, no modifications */
1240 mutex_lock(&meye
.lock
);
1241 if (meye
.grab_fbuffer
) {
1242 for (i
= 0; i
< gbuffers
; i
++)
1243 if (meye
.vma_use_count
[i
]) {
1244 mutex_unlock(&meye
.lock
);
1247 rvfree(meye
.grab_fbuffer
, gbuffers
* gbufsize
);
1248 meye
.grab_fbuffer
= NULL
;
1251 gbuffers
= max(2, min((int)req
->count
, MEYE_MAX_BUFNBRS
));
1252 req
->count
= gbuffers
;
1253 meye
.grab_fbuffer
= rvmalloc(gbuffers
* gbufsize
);
1255 if (!meye
.grab_fbuffer
) {
1256 printk(KERN_ERR
"meye: v4l framebuffer allocation failed\n");
1257 mutex_unlock(&meye
.lock
);
1261 for (i
= 0; i
< gbuffers
; i
++)
1262 meye
.vma_use_count
[i
] = 0;
1264 mutex_unlock(&meye
.lock
);
1269 static int vidioc_querybuf(struct file
*file
, void *fh
, struct v4l2_buffer
*buf
)
1271 unsigned int index
= buf
->index
;
1273 if (index
>= gbuffers
)
1276 buf
->bytesused
= meye
.grab_buffer
[index
].size
;
1277 buf
->flags
= V4L2_BUF_FLAG_MAPPED
| V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
1279 if (meye
.grab_buffer
[index
].state
== MEYE_BUF_USING
)
1280 buf
->flags
|= V4L2_BUF_FLAG_QUEUED
;
1282 if (meye
.grab_buffer
[index
].state
== MEYE_BUF_DONE
)
1283 buf
->flags
|= V4L2_BUF_FLAG_DONE
;
1285 buf
->field
= V4L2_FIELD_NONE
;
1286 buf
->timestamp
= meye
.grab_buffer
[index
].timestamp
;
1287 buf
->sequence
= meye
.grab_buffer
[index
].sequence
;
1288 buf
->memory
= V4L2_MEMORY_MMAP
;
1289 buf
->m
.offset
= index
* gbufsize
;
1290 buf
->length
= gbufsize
;
1295 static int vidioc_qbuf(struct file
*file
, void *fh
, struct v4l2_buffer
*buf
)
1297 if (buf
->memory
!= V4L2_MEMORY_MMAP
)
1300 if (buf
->index
>= gbuffers
)
1303 if (meye
.grab_buffer
[buf
->index
].state
!= MEYE_BUF_UNUSED
)
1306 mutex_lock(&meye
.lock
);
1307 buf
->flags
|= V4L2_BUF_FLAG_QUEUED
;
1308 buf
->flags
&= ~V4L2_BUF_FLAG_DONE
;
1309 meye
.grab_buffer
[buf
->index
].state
= MEYE_BUF_USING
;
1310 kfifo_in_locked(&meye
.grabq
, (unsigned char *)&buf
->index
,
1311 sizeof(int), &meye
.grabq_lock
);
1312 mutex_unlock(&meye
.lock
);
1317 static int vidioc_dqbuf(struct file
*file
, void *fh
, struct v4l2_buffer
*buf
)
1321 if (buf
->memory
!= V4L2_MEMORY_MMAP
)
1324 mutex_lock(&meye
.lock
);
1326 if (kfifo_len(&meye
.doneq
) == 0 && file
->f_flags
& O_NONBLOCK
) {
1327 mutex_unlock(&meye
.lock
);
1331 if (wait_event_interruptible(meye
.proc_list
,
1332 kfifo_len(&meye
.doneq
) != 0) < 0) {
1333 mutex_unlock(&meye
.lock
);
1337 if (!kfifo_out_locked(&meye
.doneq
, (unsigned char *)&reqnr
,
1338 sizeof(int), &meye
.doneq_lock
)) {
1339 mutex_unlock(&meye
.lock
);
1343 if (meye
.grab_buffer
[reqnr
].state
!= MEYE_BUF_DONE
) {
1344 mutex_unlock(&meye
.lock
);
1349 buf
->bytesused
= meye
.grab_buffer
[reqnr
].size
;
1350 buf
->flags
= V4L2_BUF_FLAG_MAPPED
| V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
1351 buf
->field
= V4L2_FIELD_NONE
;
1352 buf
->timestamp
= meye
.grab_buffer
[reqnr
].timestamp
;
1353 buf
->sequence
= meye
.grab_buffer
[reqnr
].sequence
;
1354 buf
->memory
= V4L2_MEMORY_MMAP
;
1355 buf
->m
.offset
= reqnr
* gbufsize
;
1356 buf
->length
= gbufsize
;
1357 meye
.grab_buffer
[reqnr
].state
= MEYE_BUF_UNUSED
;
1358 mutex_unlock(&meye
.lock
);
1363 static int vidioc_streamon(struct file
*file
, void *fh
, enum v4l2_buf_type i
)
1365 mutex_lock(&meye
.lock
);
1367 switch (meye
.mchip_mode
) {
1368 case MCHIP_HIC_MODE_CONT_OUT
:
1369 mchip_continuous_start();
1371 case MCHIP_HIC_MODE_CONT_COMP
:
1372 mchip_cont_compression_start();
1375 mutex_unlock(&meye
.lock
);
1379 mutex_unlock(&meye
.lock
);
1384 static int vidioc_streamoff(struct file
*file
, void *fh
, enum v4l2_buf_type i
)
1386 mutex_lock(&meye
.lock
);
1388 kfifo_reset(&meye
.grabq
);
1389 kfifo_reset(&meye
.doneq
);
1391 for (i
= 0; i
< MEYE_MAX_BUFNBRS
; i
++)
1392 meye
.grab_buffer
[i
].state
= MEYE_BUF_UNUSED
;
1394 mutex_unlock(&meye
.lock
);
1398 static long vidioc_default(struct file
*file
, void *fh
, bool valid_prio
,
1399 unsigned int cmd
, void *arg
)
1402 case MEYEIOC_G_PARAMS
:
1403 return meyeioc_g_params((struct meye_params
*) arg
);
1405 case MEYEIOC_S_PARAMS
:
1406 return meyeioc_s_params((struct meye_params
*) arg
);
1408 case MEYEIOC_QBUF_CAPT
:
1409 return meyeioc_qbuf_capt((int *) arg
);
1412 return meyeioc_sync(file
, fh
, (int *) arg
);
1414 case MEYEIOC_STILLCAPT
:
1415 return meyeioc_stillcapt();
1417 case MEYEIOC_STILLJCAPT
:
1418 return meyeioc_stilljcapt((int *) arg
);
1426 static __poll_t
meye_poll(struct file
*file
, poll_table
*wait
)
1428 __poll_t res
= v4l2_ctrl_poll(file
, wait
);
1430 mutex_lock(&meye
.lock
);
1431 poll_wait(file
, &meye
.proc_list
, wait
);
1432 if (kfifo_len(&meye
.doneq
))
1433 res
|= EPOLLIN
| EPOLLRDNORM
;
1434 mutex_unlock(&meye
.lock
);
1438 static void meye_vm_open(struct vm_area_struct
*vma
)
1440 long idx
= (long)vma
->vm_private_data
;
1441 meye
.vma_use_count
[idx
]++;
1444 static void meye_vm_close(struct vm_area_struct
*vma
)
1446 long idx
= (long)vma
->vm_private_data
;
1447 meye
.vma_use_count
[idx
]--;
1450 static const struct vm_operations_struct meye_vm_ops
= {
1451 .open
= meye_vm_open
,
1452 .close
= meye_vm_close
,
1455 static int meye_mmap(struct file
*file
, struct vm_area_struct
*vma
)
1457 unsigned long start
= vma
->vm_start
;
1458 unsigned long size
= vma
->vm_end
- vma
->vm_start
;
1459 unsigned long offset
= vma
->vm_pgoff
<< PAGE_SHIFT
;
1460 unsigned long page
, pos
;
1462 mutex_lock(&meye
.lock
);
1463 if (size
> gbuffers
* gbufsize
) {
1464 mutex_unlock(&meye
.lock
);
1467 if (!meye
.grab_fbuffer
) {
1470 /* lazy allocation */
1471 meye
.grab_fbuffer
= rvmalloc(gbuffers
*gbufsize
);
1472 if (!meye
.grab_fbuffer
) {
1473 printk(KERN_ERR
"meye: v4l framebuffer allocation failed\n");
1474 mutex_unlock(&meye
.lock
);
1477 for (i
= 0; i
< gbuffers
; i
++)
1478 meye
.vma_use_count
[i
] = 0;
1480 pos
= (unsigned long)meye
.grab_fbuffer
+ offset
;
1483 page
= vmalloc_to_pfn((void *)pos
);
1484 if (remap_pfn_range(vma
, start
, page
, PAGE_SIZE
, PAGE_SHARED
)) {
1485 mutex_unlock(&meye
.lock
);
1490 if (size
> PAGE_SIZE
)
1496 vma
->vm_ops
= &meye_vm_ops
;
1497 vma
->vm_flags
&= ~VM_IO
; /* not I/O memory */
1498 vma
->vm_flags
|= VM_DONTEXPAND
| VM_DONTDUMP
;
1499 vma
->vm_private_data
= (void *) (offset
/ gbufsize
);
1502 mutex_unlock(&meye
.lock
);
1506 static const struct v4l2_file_operations meye_fops
= {
1507 .owner
= THIS_MODULE
,
1509 .release
= meye_release
,
1511 .unlocked_ioctl
= video_ioctl2
,
1515 static const struct v4l2_ioctl_ops meye_ioctl_ops
= {
1516 .vidioc_querycap
= vidioc_querycap
,
1517 .vidioc_enum_input
= vidioc_enum_input
,
1518 .vidioc_g_input
= vidioc_g_input
,
1519 .vidioc_s_input
= vidioc_s_input
,
1520 .vidioc_enum_fmt_vid_cap
= vidioc_enum_fmt_vid_cap
,
1521 .vidioc_try_fmt_vid_cap
= vidioc_try_fmt_vid_cap
,
1522 .vidioc_g_fmt_vid_cap
= vidioc_g_fmt_vid_cap
,
1523 .vidioc_s_fmt_vid_cap
= vidioc_s_fmt_vid_cap
,
1524 .vidioc_reqbufs
= vidioc_reqbufs
,
1525 .vidioc_querybuf
= vidioc_querybuf
,
1526 .vidioc_qbuf
= vidioc_qbuf
,
1527 .vidioc_dqbuf
= vidioc_dqbuf
,
1528 .vidioc_streamon
= vidioc_streamon
,
1529 .vidioc_streamoff
= vidioc_streamoff
,
1530 .vidioc_log_status
= v4l2_ctrl_log_status
,
1531 .vidioc_subscribe_event
= v4l2_ctrl_subscribe_event
,
1532 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
1533 .vidioc_default
= vidioc_default
,
1536 static const struct video_device meye_template
= {
1539 .ioctl_ops
= &meye_ioctl_ops
,
1540 .release
= video_device_release_empty
,
1543 static const struct v4l2_ctrl_ops meye_ctrl_ops
= {
1544 .s_ctrl
= meye_s_ctrl
,
1548 static int meye_suspend(struct pci_dev
*pdev
, pm_message_t state
)
1550 pci_save_state(pdev
);
1551 meye
.pm_mchip_mode
= meye
.mchip_mode
;
1553 mchip_set(MCHIP_MM_INTA
, 0x0);
1557 static int meye_resume(struct pci_dev
*pdev
)
1559 pci_restore_state(pdev
);
1560 pci_write_config_word(meye
.mchip_dev
, MCHIP_PCI_SOFTRESET_SET
, 1);
1562 mchip_delay(MCHIP_HIC_CMD
, 0);
1563 mchip_delay(MCHIP_HIC_STATUS
, MCHIP_HIC_STATUS_IDLE
);
1565 mchip_set(MCHIP_VRJ_SOFT_RESET
, 1);
1567 mchip_set(MCHIP_MM_PCI_MODE
, 5);
1569 mchip_set(MCHIP_MM_INTA
, MCHIP_MM_INTA_HIC_1_MASK
);
1571 switch (meye
.pm_mchip_mode
) {
1572 case MCHIP_HIC_MODE_CONT_OUT
:
1573 mchip_continuous_start();
1575 case MCHIP_HIC_MODE_CONT_COMP
:
1576 mchip_cont_compression_start();
1583 static int meye_probe(struct pci_dev
*pcidev
, const struct pci_device_id
*ent
)
1585 static const struct v4l2_ctrl_config ctrl_agc
= {
1586 .id
= V4L2_CID_MEYE_AGC
,
1587 .type
= V4L2_CTRL_TYPE_INTEGER
,
1588 .ops
= &meye_ctrl_ops
,
1593 .flags
= V4L2_CTRL_FLAG_SLIDER
,
1595 static const struct v4l2_ctrl_config ctrl_picture
= {
1596 .id
= V4L2_CID_MEYE_PICTURE
,
1597 .type
= V4L2_CTRL_TYPE_INTEGER
,
1598 .ops
= &meye_ctrl_ops
,
1603 static const struct v4l2_ctrl_config ctrl_framerate
= {
1604 .id
= V4L2_CID_MEYE_FRAMERATE
,
1605 .type
= V4L2_CTRL_TYPE_INTEGER
,
1606 .ops
= &meye_ctrl_ops
,
1607 .name
= "Framerate",
1611 struct v4l2_device
*v4l2_dev
= &meye
.v4l2_dev
;
1613 unsigned long mchip_adr
;
1615 if (meye
.mchip_dev
!= NULL
) {
1616 printk(KERN_ERR
"meye: only one device allowed!\n");
1620 ret
= v4l2_device_register(&pcidev
->dev
, v4l2_dev
);
1622 v4l2_err(v4l2_dev
, "Could not register v4l2_device\n");
1626 meye
.mchip_dev
= pcidev
;
1628 meye
.grab_temp
= vmalloc(MCHIP_NB_PAGES_MJPEG
* PAGE_SIZE
);
1629 if (!meye
.grab_temp
)
1632 spin_lock_init(&meye
.grabq_lock
);
1633 if (kfifo_alloc(&meye
.grabq
, sizeof(int) * MEYE_MAX_BUFNBRS
,
1635 goto outkfifoalloc1
;
1637 spin_lock_init(&meye
.doneq_lock
);
1638 if (kfifo_alloc(&meye
.doneq
, sizeof(int) * MEYE_MAX_BUFNBRS
,
1640 goto outkfifoalloc2
;
1642 meye
.vdev
= meye_template
;
1643 meye
.vdev
.v4l2_dev
= &meye
.v4l2_dev
;
1645 ret
= sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA
, 1);
1647 v4l2_err(v4l2_dev
, "meye: unable to power on the camera\n");
1648 v4l2_err(v4l2_dev
, "meye: did you enable the camera in sonypi using the module options ?\n");
1649 goto outsonypienable
;
1652 ret
= pci_enable_device(meye
.mchip_dev
);
1654 v4l2_err(v4l2_dev
, "meye: pci_enable_device failed\n");
1659 mchip_adr
= pci_resource_start(meye
.mchip_dev
,0);
1661 v4l2_err(v4l2_dev
, "meye: mchip has no device base address\n");
1664 if (!request_mem_region(pci_resource_start(meye
.mchip_dev
, 0),
1665 pci_resource_len(meye
.mchip_dev
, 0),
1667 v4l2_err(v4l2_dev
, "meye: request_mem_region failed\n");
1670 meye
.mchip_mmregs
= ioremap(mchip_adr
, MCHIP_MM_REGS
);
1671 if (!meye
.mchip_mmregs
) {
1672 v4l2_err(v4l2_dev
, "meye: ioremap failed\n");
1676 meye
.mchip_irq
= pcidev
->irq
;
1677 if (request_irq(meye
.mchip_irq
, meye_irq
,
1678 IRQF_SHARED
, "meye", meye_irq
)) {
1679 v4l2_err(v4l2_dev
, "request_irq failed\n");
1683 pci_write_config_byte(meye
.mchip_dev
, PCI_CACHE_LINE_SIZE
, 8);
1684 pci_write_config_byte(meye
.mchip_dev
, PCI_LATENCY_TIMER
, 64);
1686 pci_set_master(meye
.mchip_dev
);
1688 /* Ask the camera to perform a soft reset. */
1689 pci_write_config_word(meye
.mchip_dev
, MCHIP_PCI_SOFTRESET_SET
, 1);
1691 mchip_delay(MCHIP_HIC_CMD
, 0);
1692 mchip_delay(MCHIP_HIC_STATUS
, MCHIP_HIC_STATUS_IDLE
);
1695 mchip_set(MCHIP_VRJ_SOFT_RESET
, 1);
1698 mchip_set(MCHIP_MM_PCI_MODE
, 5);
1701 mchip_set(MCHIP_MM_INTA
, MCHIP_MM_INTA_HIC_1_MASK
);
1703 mutex_init(&meye
.lock
);
1704 init_waitqueue_head(&meye
.proc_list
);
1706 v4l2_ctrl_handler_init(&meye
.hdl
, 3);
1707 v4l2_ctrl_new_std(&meye
.hdl
, &meye_ctrl_ops
,
1708 V4L2_CID_BRIGHTNESS
, 0, 63, 1, 32);
1709 v4l2_ctrl_new_std(&meye
.hdl
, &meye_ctrl_ops
,
1710 V4L2_CID_HUE
, 0, 63, 1, 32);
1711 v4l2_ctrl_new_std(&meye
.hdl
, &meye_ctrl_ops
,
1712 V4L2_CID_CONTRAST
, 0, 63, 1, 32);
1713 v4l2_ctrl_new_std(&meye
.hdl
, &meye_ctrl_ops
,
1714 V4L2_CID_SATURATION
, 0, 63, 1, 32);
1715 v4l2_ctrl_new_custom(&meye
.hdl
, &ctrl_agc
, NULL
);
1716 v4l2_ctrl_new_std(&meye
.hdl
, &meye_ctrl_ops
,
1717 V4L2_CID_SHARPNESS
, 0, 63, 1, 32);
1718 v4l2_ctrl_new_custom(&meye
.hdl
, &ctrl_picture
, NULL
);
1719 v4l2_ctrl_new_std(&meye
.hdl
, &meye_ctrl_ops
,
1720 V4L2_CID_JPEG_COMPRESSION_QUALITY
, 0, 10, 1, 8);
1721 v4l2_ctrl_new_custom(&meye
.hdl
, &ctrl_framerate
, NULL
);
1722 if (meye
.hdl
.error
) {
1723 v4l2_err(v4l2_dev
, "couldn't register controls\n");
1727 v4l2_ctrl_handler_setup(&meye
.hdl
);
1728 meye
.vdev
.ctrl_handler
= &meye
.hdl
;
1730 if (video_register_device(&meye
.vdev
, VFL_TYPE_GRABBER
,
1732 v4l2_err(v4l2_dev
, "video_register_device failed\n");
1736 v4l2_info(v4l2_dev
, "Motion Eye Camera Driver v%s.\n",
1737 MEYE_DRIVER_VERSION
);
1738 v4l2_info(v4l2_dev
, "mchip KL5A72002 rev. %d, base %lx, irq %d\n",
1739 meye
.mchip_dev
->revision
, mchip_adr
, meye
.mchip_irq
);
1744 v4l2_ctrl_handler_free(&meye
.hdl
);
1745 free_irq(meye
.mchip_irq
, meye_irq
);
1747 iounmap(meye
.mchip_mmregs
);
1749 release_mem_region(pci_resource_start(meye
.mchip_dev
, 0),
1750 pci_resource_len(meye
.mchip_dev
, 0));
1752 pci_disable_device(meye
.mchip_dev
);
1754 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA
, 0);
1756 kfifo_free(&meye
.doneq
);
1758 kfifo_free(&meye
.grabq
);
1760 vfree(meye
.grab_temp
);
1765 static void meye_remove(struct pci_dev
*pcidev
)
1767 video_unregister_device(&meye
.vdev
);
1773 /* disable interrupts */
1774 mchip_set(MCHIP_MM_INTA
, 0x0);
1776 free_irq(meye
.mchip_irq
, meye_irq
);
1778 iounmap(meye
.mchip_mmregs
);
1780 release_mem_region(pci_resource_start(meye
.mchip_dev
, 0),
1781 pci_resource_len(meye
.mchip_dev
, 0));
1783 pci_disable_device(meye
.mchip_dev
);
1785 sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA
, 0);
1787 kfifo_free(&meye
.doneq
);
1788 kfifo_free(&meye
.grabq
);
1790 vfree(meye
.grab_temp
);
1792 if (meye
.grab_fbuffer
) {
1793 rvfree(meye
.grab_fbuffer
, gbuffers
*gbufsize
);
1794 meye
.grab_fbuffer
= NULL
;
1797 printk(KERN_INFO
"meye: removed\n");
1800 static const struct pci_device_id meye_pci_tbl
[] = {
1801 { PCI_VDEVICE(KAWASAKI
, PCI_DEVICE_ID_MCHIP_KL5A72002
), 0 },
1805 MODULE_DEVICE_TABLE(pci
, meye_pci_tbl
);
1807 static struct pci_driver meye_driver
= {
1809 .id_table
= meye_pci_tbl
,
1810 .probe
= meye_probe
,
1811 .remove
= meye_remove
,
1813 .suspend
= meye_suspend
,
1814 .resume
= meye_resume
,
1818 static int __init
meye_init(void)
1820 gbuffers
= max(2, min((int)gbuffers
, MEYE_MAX_BUFNBRS
));
1821 if (gbufsize
> MEYE_MAX_BUFSIZE
)
1822 gbufsize
= MEYE_MAX_BUFSIZE
;
1823 gbufsize
= PAGE_ALIGN(gbufsize
);
1824 printk(KERN_INFO
"meye: using %d buffers with %dk (%dk total) for capture\n",
1826 gbufsize
/ 1024, gbuffers
* gbufsize
/ 1024);
1827 return pci_register_driver(&meye_driver
);
1830 static void __exit
meye_exit(void)
1832 pci_unregister_driver(&meye_driver
);
1835 module_init(meye_init
);
1836 module_exit(meye_exit
);