Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/media/video/meye.c
17531 views
1
/*
2
* Motion Eye video4linux driver for Sony Vaio PictureBook
3
*
4
* Copyright (C) 2001-2004 Stelian Pop <[email protected]>
5
*
6
* Copyright (C) 2001-2002 AlcĂ´ve <www.alcove.com>
7
*
8
* Copyright (C) 2000 Andrew Tridgell <[email protected]>
9
*
10
* Earlier work by Werner Almesberger, Paul `Rusty' Russell and Paul Mackerras.
11
*
12
* Some parts borrowed from various video4linux drivers, especially
13
* bttv-driver.c and zoran.c, see original files for credits.
14
*
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.
19
*
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.
24
*
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.
28
*/
29
#include <linux/module.h>
30
#include <linux/pci.h>
31
#include <linux/sched.h>
32
#include <linux/init.h>
33
#include <linux/gfp.h>
34
#include <linux/videodev2.h>
35
#include <media/v4l2-common.h>
36
#include <media/v4l2-device.h>
37
#include <media/v4l2-ioctl.h>
38
#include <asm/uaccess.h>
39
#include <asm/io.h>
40
#include <linux/delay.h>
41
#include <linux/interrupt.h>
42
#include <linux/vmalloc.h>
43
#include <linux/dma-mapping.h>
44
45
#include "meye.h"
46
#include <linux/meye.h>
47
48
MODULE_AUTHOR("Stelian Pop <[email protected]>");
49
MODULE_DESCRIPTION("v4l2 driver for the MotionEye camera");
50
MODULE_LICENSE("GPL");
51
MODULE_VERSION(MEYE_DRIVER_VERSION);
52
53
/* number of grab buffers */
54
static unsigned int gbuffers = 2;
55
module_param(gbuffers, int, 0444);
56
MODULE_PARM_DESC(gbuffers, "number of capture buffers, default is 2 (32 max)");
57
58
/* size of a grab buffer */
59
static unsigned int gbufsize = MEYE_MAX_BUFSIZE;
60
module_param(gbufsize, int, 0444);
61
MODULE_PARM_DESC(gbufsize, "size of the capture buffers, default is 614400"
62
" (will be rounded up to a page multiple)");
63
64
/* /dev/videoX registration number */
65
static int video_nr = -1;
66
module_param(video_nr, int, 0444);
67
MODULE_PARM_DESC(video_nr, "video device to register (0=/dev/video0, etc)");
68
69
/* driver structure - only one possible */
70
static struct meye meye;
71
72
/****************************************************************************/
73
/* Memory allocation routines (stolen from bttv-driver.c) */
74
/****************************************************************************/
75
static void *rvmalloc(unsigned long size)
76
{
77
void *mem;
78
unsigned long adr;
79
80
size = PAGE_ALIGN(size);
81
mem = vmalloc_32(size);
82
if (mem) {
83
memset(mem, 0, size);
84
adr = (unsigned long) mem;
85
while (size > 0) {
86
SetPageReserved(vmalloc_to_page((void *)adr));
87
adr += PAGE_SIZE;
88
size -= PAGE_SIZE;
89
}
90
}
91
return mem;
92
}
93
94
static void rvfree(void * mem, unsigned long size)
95
{
96
unsigned long adr;
97
98
if (mem) {
99
adr = (unsigned long) mem;
100
while ((long) size > 0) {
101
ClearPageReserved(vmalloc_to_page((void *)adr));
102
adr += PAGE_SIZE;
103
size -= PAGE_SIZE;
104
}
105
vfree(mem);
106
}
107
}
108
109
/*
110
* return a page table pointing to N pages of locked memory
111
*
112
* NOTE: The meye device expects DMA addresses on 32 bits, we build
113
* a table of 1024 entries = 4 bytes * 1024 = 4096 bytes.
114
*/
115
static int ptable_alloc(void)
116
{
117
u32 *pt;
118
int i;
119
120
memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
121
122
/* give only 32 bit DMA addresses */
123
if (dma_set_mask(&meye.mchip_dev->dev, DMA_BIT_MASK(32)))
124
return -1;
125
126
meye.mchip_ptable_toc = dma_alloc_coherent(&meye.mchip_dev->dev,
127
PAGE_SIZE,
128
&meye.mchip_dmahandle,
129
GFP_KERNEL);
130
if (!meye.mchip_ptable_toc) {
131
meye.mchip_dmahandle = 0;
132
return -1;
133
}
134
135
pt = meye.mchip_ptable_toc;
136
for (i = 0; i < MCHIP_NB_PAGES; i++) {
137
dma_addr_t dma;
138
meye.mchip_ptable[i] = dma_alloc_coherent(&meye.mchip_dev->dev,
139
PAGE_SIZE,
140
&dma,
141
GFP_KERNEL);
142
if (!meye.mchip_ptable[i]) {
143
int j;
144
pt = meye.mchip_ptable_toc;
145
for (j = 0; j < i; ++j) {
146
dma = (dma_addr_t) *pt;
147
dma_free_coherent(&meye.mchip_dev->dev,
148
PAGE_SIZE,
149
meye.mchip_ptable[j], dma);
150
pt++;
151
}
152
dma_free_coherent(&meye.mchip_dev->dev,
153
PAGE_SIZE,
154
meye.mchip_ptable_toc,
155
meye.mchip_dmahandle);
156
meye.mchip_ptable_toc = NULL;
157
meye.mchip_dmahandle = 0;
158
return -1;
159
}
160
*pt = (u32) dma;
161
pt++;
162
}
163
return 0;
164
}
165
166
static void ptable_free(void)
167
{
168
u32 *pt;
169
int i;
170
171
pt = meye.mchip_ptable_toc;
172
for (i = 0; i < MCHIP_NB_PAGES; i++) {
173
dma_addr_t dma = (dma_addr_t) *pt;
174
if (meye.mchip_ptable[i])
175
dma_free_coherent(&meye.mchip_dev->dev,
176
PAGE_SIZE,
177
meye.mchip_ptable[i], dma);
178
pt++;
179
}
180
181
if (meye.mchip_ptable_toc)
182
dma_free_coherent(&meye.mchip_dev->dev,
183
PAGE_SIZE,
184
meye.mchip_ptable_toc,
185
meye.mchip_dmahandle);
186
187
memset(meye.mchip_ptable, 0, sizeof(meye.mchip_ptable));
188
meye.mchip_ptable_toc = NULL;
189
meye.mchip_dmahandle = 0;
190
}
191
192
/* copy data from ptable into buf */
193
static void ptable_copy(u8 *buf, int start, int size, int pt_pages)
194
{
195
int i;
196
197
for (i = 0; i < (size / PAGE_SIZE) * PAGE_SIZE; i += PAGE_SIZE) {
198
memcpy(buf + i, meye.mchip_ptable[start++], PAGE_SIZE);
199
if (start >= pt_pages)
200
start = 0;
201
}
202
memcpy(buf + i, meye.mchip_ptable[start], size % PAGE_SIZE);
203
}
204
205
/****************************************************************************/
206
/* JPEG tables at different qualities to load into the VRJ chip */
207
/****************************************************************************/
208
209
/* return a set of quantisation tables based on a quality from 1 to 10 */
210
static u16 *jpeg_quantisation_tables(int *length, int quality)
211
{
212
static u16 jpeg_tables[][70] = { {
213
0xdbff, 0x4300, 0xff00, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
214
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
215
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
216
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
217
0xffff, 0xffff, 0xffff,
218
0xdbff, 0x4300, 0xff01, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
219
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
220
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
221
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
222
0xffff, 0xffff, 0xffff,
223
},
224
{
225
0xdbff, 0x4300, 0x5000, 0x3c37, 0x3c46, 0x5032, 0x4146, 0x5a46,
226
0x5055, 0x785f, 0x82c8, 0x6e78, 0x786e, 0xaff5, 0x91b9, 0xffc8,
227
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
228
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
229
0xffff, 0xffff, 0xffff,
230
0xdbff, 0x4300, 0x5501, 0x5a5a, 0x6978, 0xeb78, 0x8282, 0xffeb,
231
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
232
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
233
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
234
0xffff, 0xffff, 0xffff,
235
},
236
{
237
0xdbff, 0x4300, 0x2800, 0x1e1c, 0x1e23, 0x2819, 0x2123, 0x2d23,
238
0x282b, 0x3c30, 0x4164, 0x373c, 0x3c37, 0x587b, 0x495d, 0x9164,
239
0x9980, 0x8f96, 0x8c80, 0xa08a, 0xe6b4, 0xa0c3, 0xdaaa, 0x8aad,
240
0xc88c, 0xcbff, 0xeeda, 0xfff5, 0xffff, 0xc19b, 0xffff, 0xfaff,
241
0xe6ff, 0xfffd, 0xfff8,
242
0xdbff, 0x4300, 0x2b01, 0x2d2d, 0x353c, 0x763c, 0x4141, 0xf876,
243
0x8ca5, 0xf8a5, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
244
0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
245
0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8, 0xf8f8,
246
0xf8f8, 0xf8f8, 0xfff8,
247
},
248
{
249
0xdbff, 0x4300, 0x1b00, 0x1412, 0x1417, 0x1b11, 0x1617, 0x1e17,
250
0x1b1c, 0x2820, 0x2b42, 0x2528, 0x2825, 0x3a51, 0x303d, 0x6042,
251
0x6555, 0x5f64, 0x5d55, 0x6a5b, 0x9978, 0x6a81, 0x9071, 0x5b73,
252
0x855d, 0x86b5, 0x9e90, 0xaba3, 0xabad, 0x8067, 0xc9bc, 0xa6ba,
253
0x99c7, 0xaba8, 0xffa4,
254
0xdbff, 0x4300, 0x1c01, 0x1e1e, 0x2328, 0x4e28, 0x2b2b, 0xa44e,
255
0x5d6e, 0xa46e, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
256
0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
257
0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4, 0xa4a4,
258
0xa4a4, 0xa4a4, 0xffa4,
259
},
260
{
261
0xdbff, 0x4300, 0x1400, 0x0f0e, 0x0f12, 0x140d, 0x1012, 0x1712,
262
0x1415, 0x1e18, 0x2132, 0x1c1e, 0x1e1c, 0x2c3d, 0x242e, 0x4932,
263
0x4c40, 0x474b, 0x4640, 0x5045, 0x735a, 0x5062, 0x6d55, 0x4556,
264
0x6446, 0x6588, 0x776d, 0x817b, 0x8182, 0x604e, 0x978d, 0x7d8c,
265
0x7396, 0x817e, 0xff7c,
266
0xdbff, 0x4300, 0x1501, 0x1717, 0x1a1e, 0x3b1e, 0x2121, 0x7c3b,
267
0x4653, 0x7c53, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
268
0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
269
0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c, 0x7c7c,
270
0x7c7c, 0x7c7c, 0xff7c,
271
},
272
{
273
0xdbff, 0x4300, 0x1000, 0x0c0b, 0x0c0e, 0x100a, 0x0d0e, 0x120e,
274
0x1011, 0x1813, 0x1a28, 0x1618, 0x1816, 0x2331, 0x1d25, 0x3a28,
275
0x3d33, 0x393c, 0x3833, 0x4037, 0x5c48, 0x404e, 0x5744, 0x3745,
276
0x5038, 0x516d, 0x5f57, 0x6762, 0x6768, 0x4d3e, 0x7971, 0x6470,
277
0x5c78, 0x6765, 0xff63,
278
0xdbff, 0x4300, 0x1101, 0x1212, 0x1518, 0x2f18, 0x1a1a, 0x632f,
279
0x3842, 0x6342, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
280
0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
281
0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363, 0x6363,
282
0x6363, 0x6363, 0xff63,
283
},
284
{
285
0xdbff, 0x4300, 0x0d00, 0x0a09, 0x0a0b, 0x0d08, 0x0a0b, 0x0e0b,
286
0x0d0e, 0x130f, 0x1520, 0x1213, 0x1312, 0x1c27, 0x171e, 0x2e20,
287
0x3129, 0x2e30, 0x2d29, 0x332c, 0x4a3a, 0x333e, 0x4636, 0x2c37,
288
0x402d, 0x4157, 0x4c46, 0x524e, 0x5253, 0x3e32, 0x615a, 0x505a,
289
0x4a60, 0x5251, 0xff4f,
290
0xdbff, 0x4300, 0x0e01, 0x0e0e, 0x1113, 0x2613, 0x1515, 0x4f26,
291
0x2d35, 0x4f35, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
292
0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
293
0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f, 0x4f4f,
294
0x4f4f, 0x4f4f, 0xff4f,
295
},
296
{
297
0xdbff, 0x4300, 0x0a00, 0x0707, 0x0708, 0x0a06, 0x0808, 0x0b08,
298
0x0a0a, 0x0e0b, 0x1018, 0x0d0e, 0x0e0d, 0x151d, 0x1116, 0x2318,
299
0x251f, 0x2224, 0x221f, 0x2621, 0x372b, 0x262f, 0x3429, 0x2129,
300
0x3022, 0x3141, 0x3934, 0x3e3b, 0x3e3e, 0x2e25, 0x4944, 0x3c43,
301
0x3748, 0x3e3d, 0xff3b,
302
0xdbff, 0x4300, 0x0a01, 0x0b0b, 0x0d0e, 0x1c0e, 0x1010, 0x3b1c,
303
0x2228, 0x3b28, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
304
0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
305
0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b, 0x3b3b,
306
0x3b3b, 0x3b3b, 0xff3b,
307
},
308
{
309
0xdbff, 0x4300, 0x0600, 0x0504, 0x0506, 0x0604, 0x0506, 0x0706,
310
0x0607, 0x0a08, 0x0a10, 0x090a, 0x0a09, 0x0e14, 0x0c0f, 0x1710,
311
0x1814, 0x1718, 0x1614, 0x1a16, 0x251d, 0x1a1f, 0x231b, 0x161c,
312
0x2016, 0x202c, 0x2623, 0x2927, 0x292a, 0x1f19, 0x302d, 0x282d,
313
0x2530, 0x2928, 0xff28,
314
0xdbff, 0x4300, 0x0701, 0x0707, 0x080a, 0x130a, 0x0a0a, 0x2813,
315
0x161a, 0x281a, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
316
0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
317
0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828, 0x2828,
318
0x2828, 0x2828, 0xff28,
319
},
320
{
321
0xdbff, 0x4300, 0x0300, 0x0202, 0x0203, 0x0302, 0x0303, 0x0403,
322
0x0303, 0x0504, 0x0508, 0x0405, 0x0504, 0x070a, 0x0607, 0x0c08,
323
0x0c0a, 0x0b0c, 0x0b0a, 0x0d0b, 0x120e, 0x0d10, 0x110e, 0x0b0e,
324
0x100b, 0x1016, 0x1311, 0x1514, 0x1515, 0x0f0c, 0x1817, 0x1416,
325
0x1218, 0x1514, 0xff14,
326
0xdbff, 0x4300, 0x0301, 0x0404, 0x0405, 0x0905, 0x0505, 0x1409,
327
0x0b0d, 0x140d, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
328
0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
329
0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414, 0x1414,
330
0x1414, 0x1414, 0xff14,
331
},
332
{
333
0xdbff, 0x4300, 0x0100, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
334
0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
335
0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
336
0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
337
0x0101, 0x0101, 0xff01,
338
0xdbff, 0x4300, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
339
0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
340
0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
341
0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101,
342
0x0101, 0x0101, 0xff01,
343
} };
344
345
if (quality < 0 || quality > 10) {
346
printk(KERN_WARNING
347
"meye: invalid quality level %d - using 8\n", quality);
348
quality = 8;
349
}
350
351
*length = ARRAY_SIZE(jpeg_tables[quality]);
352
return jpeg_tables[quality];
353
}
354
355
/* return a generic set of huffman tables */
356
static u16 *jpeg_huffman_tables(int *length)
357
{
358
static u16 tables[] = {
359
0xC4FF, 0xB500, 0x0010, 0x0102, 0x0303, 0x0402, 0x0503, 0x0405,
360
0x0004, 0x0100, 0x017D, 0x0302, 0x0400, 0x0511, 0x2112, 0x4131,
361
0x1306, 0x6151, 0x2207, 0x1471, 0x8132, 0xA191, 0x2308, 0xB142,
362
0x15C1, 0xD152, 0x24F0, 0x6233, 0x8272, 0x0A09, 0x1716, 0x1918,
363
0x251A, 0x2726, 0x2928, 0x342A, 0x3635, 0x3837, 0x3A39, 0x4443,
364
0x4645, 0x4847, 0x4A49, 0x5453, 0x5655, 0x5857, 0x5A59, 0x6463,
365
0x6665, 0x6867, 0x6A69, 0x7473, 0x7675, 0x7877, 0x7A79, 0x8483,
366
0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998, 0xA29A,
367
0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6, 0xB9B8,
368
0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4, 0xD7D6,
369
0xD9D8, 0xE1DA, 0xE3E2, 0xE5E4, 0xE7E6, 0xE9E8, 0xF1EA, 0xF3F2,
370
0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
371
0xC4FF, 0xB500, 0x0011, 0x0102, 0x0402, 0x0304, 0x0704, 0x0405,
372
0x0004, 0x0201, 0x0077, 0x0201, 0x1103, 0x0504, 0x3121, 0x1206,
373
0x5141, 0x6107, 0x1371, 0x3222, 0x0881, 0x4214, 0xA191, 0xC1B1,
374
0x2309, 0x5233, 0x15F0, 0x7262, 0x0AD1, 0x2416, 0xE134, 0xF125,
375
0x1817, 0x1A19, 0x2726, 0x2928, 0x352A, 0x3736, 0x3938, 0x433A,
376
0x4544, 0x4746, 0x4948, 0x534A, 0x5554, 0x5756, 0x5958, 0x635A,
377
0x6564, 0x6766, 0x6968, 0x736A, 0x7574, 0x7776, 0x7978, 0x827A,
378
0x8483, 0x8685, 0x8887, 0x8A89, 0x9392, 0x9594, 0x9796, 0x9998,
379
0xA29A, 0xA4A3, 0xA6A5, 0xA8A7, 0xAAA9, 0xB3B2, 0xB5B4, 0xB7B6,
380
0xB9B8, 0xC2BA, 0xC4C3, 0xC6C5, 0xC8C7, 0xCAC9, 0xD3D2, 0xD5D4,
381
0xD7D6, 0xD9D8, 0xE2DA, 0xE4E3, 0xE6E5, 0xE8E7, 0xEAE9, 0xF3F2,
382
0xF5F4, 0xF7F6, 0xF9F8, 0xFFFA,
383
0xC4FF, 0x1F00, 0x0000, 0x0501, 0x0101, 0x0101, 0x0101, 0x0000,
384
0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
385
0xFF0B,
386
0xC4FF, 0x1F00, 0x0001, 0x0103, 0x0101, 0x0101, 0x0101, 0x0101,
387
0x0000, 0x0000, 0x0000, 0x0201, 0x0403, 0x0605, 0x0807, 0x0A09,
388
0xFF0B
389
};
390
391
*length = ARRAY_SIZE(tables);
392
return tables;
393
}
394
395
/****************************************************************************/
396
/* MCHIP low-level functions */
397
/****************************************************************************/
398
399
/* returns the horizontal capture size */
400
static inline int mchip_hsize(void)
401
{
402
return meye.params.subsample ? 320 : 640;
403
}
404
405
/* returns the vertical capture size */
406
static inline int mchip_vsize(void)
407
{
408
return meye.params.subsample ? 240 : 480;
409
}
410
411
/* waits for a register to be available */
412
static void mchip_sync(int reg)
413
{
414
u32 status;
415
int i;
416
417
if (reg == MCHIP_MM_FIFO_DATA) {
418
for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
419
status = readl(meye.mchip_mmregs +
420
MCHIP_MM_FIFO_STATUS);
421
if (!(status & MCHIP_MM_FIFO_WAIT)) {
422
printk(KERN_WARNING "meye: fifo not ready\n");
423
return;
424
}
425
if (status & MCHIP_MM_FIFO_READY)
426
return;
427
udelay(1);
428
}
429
} else if (reg > 0x80) {
430
u32 mask = (reg < 0x100) ? MCHIP_HIC_STATUS_MCC_RDY
431
: MCHIP_HIC_STATUS_VRJ_RDY;
432
for (i = 0; i < MCHIP_REG_TIMEOUT; i++) {
433
status = readl(meye.mchip_mmregs + MCHIP_HIC_STATUS);
434
if (status & mask)
435
return;
436
udelay(1);
437
}
438
} else
439
return;
440
printk(KERN_WARNING
441
"meye: mchip_sync() timeout on reg 0x%x status=0x%x\n",
442
reg, status);
443
}
444
445
/* sets a value into the register */
446
static inline void mchip_set(int reg, u32 v)
447
{
448
mchip_sync(reg);
449
writel(v, meye.mchip_mmregs + reg);
450
}
451
452
/* get the register value */
453
static inline u32 mchip_read(int reg)
454
{
455
mchip_sync(reg);
456
return readl(meye.mchip_mmregs + reg);
457
}
458
459
/* wait for a register to become a particular value */
460
static inline int mchip_delay(u32 reg, u32 v)
461
{
462
int n = 10;
463
while (--n && mchip_read(reg) != v)
464
udelay(1);
465
return n;
466
}
467
468
/* setup subsampling */
469
static void mchip_subsample(void)
470
{
471
mchip_set(MCHIP_MCC_R_SAMPLING, meye.params.subsample);
472
mchip_set(MCHIP_MCC_R_XRANGE, mchip_hsize());
473
mchip_set(MCHIP_MCC_R_YRANGE, mchip_vsize());
474
mchip_set(MCHIP_MCC_B_XRANGE, mchip_hsize());
475
mchip_set(MCHIP_MCC_B_YRANGE, mchip_vsize());
476
mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
477
}
478
479
/* set the framerate into the mchip */
480
static void mchip_set_framerate(void)
481
{
482
mchip_set(MCHIP_HIC_S_RATE, meye.params.framerate);
483
}
484
485
/* load some huffman and quantisation tables into the VRJ chip ready
486
for JPEG compression */
487
static void mchip_load_tables(void)
488
{
489
int i;
490
int length;
491
u16 *tables;
492
493
tables = jpeg_huffman_tables(&length);
494
for (i = 0; i < length; i++)
495
writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
496
497
tables = jpeg_quantisation_tables(&length, meye.params.quality);
498
for (i = 0; i < length; i++)
499
writel(tables[i], meye.mchip_mmregs + MCHIP_VRJ_TABLE_DATA);
500
}
501
502
/* setup the VRJ parameters in the chip */
503
static void mchip_vrj_setup(u8 mode)
504
{
505
mchip_set(MCHIP_VRJ_BUS_MODE, 5);
506
mchip_set(MCHIP_VRJ_SIGNAL_ACTIVE_LEVEL, 0x1f);
507
mchip_set(MCHIP_VRJ_PDAT_USE, 1);
508
mchip_set(MCHIP_VRJ_IRQ_FLAG, 0xa0);
509
mchip_set(MCHIP_VRJ_MODE_SPECIFY, mode);
510
mchip_set(MCHIP_VRJ_NUM_LINES, mchip_vsize());
511
mchip_set(MCHIP_VRJ_NUM_PIXELS, mchip_hsize());
512
mchip_set(MCHIP_VRJ_NUM_COMPONENTS, 0x1b);
513
mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_LO, 0xFFFF);
514
mchip_set(MCHIP_VRJ_LIMIT_COMPRESSED_HI, 0xFFFF);
515
mchip_set(MCHIP_VRJ_COMP_DATA_FORMAT, 0xC);
516
mchip_set(MCHIP_VRJ_RESTART_INTERVAL, 0);
517
mchip_set(MCHIP_VRJ_SOF1, 0x601);
518
mchip_set(MCHIP_VRJ_SOF2, 0x1502);
519
mchip_set(MCHIP_VRJ_SOF3, 0x1503);
520
mchip_set(MCHIP_VRJ_SOF4, 0x1596);
521
mchip_set(MCHIP_VRJ_SOS, 0x0ed0);
522
523
mchip_load_tables();
524
}
525
526
/* sets the DMA parameters into the chip */
527
static void mchip_dma_setup(dma_addr_t dma_addr)
528
{
529
int i;
530
531
mchip_set(MCHIP_MM_PT_ADDR, (u32)dma_addr);
532
for (i = 0; i < 4; i++)
533
mchip_set(MCHIP_MM_FIR(i), 0);
534
meye.mchip_fnum = 0;
535
}
536
537
/* setup for DMA transfers - also zeros the framebuffer */
538
static int mchip_dma_alloc(void)
539
{
540
if (!meye.mchip_dmahandle)
541
if (ptable_alloc())
542
return -1;
543
return 0;
544
}
545
546
/* frees the DMA buffer */
547
static void mchip_dma_free(void)
548
{
549
if (meye.mchip_dmahandle) {
550
mchip_dma_setup(0);
551
ptable_free();
552
}
553
}
554
555
/* stop any existing HIC action and wait for any dma to complete then
556
reset the dma engine */
557
static void mchip_hic_stop(void)
558
{
559
int i, j;
560
561
meye.mchip_mode = MCHIP_HIC_MODE_NOOP;
562
if (!(mchip_read(MCHIP_HIC_STATUS) & MCHIP_HIC_STATUS_BUSY))
563
return;
564
for (i = 0; i < 20; ++i) {
565
mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_STOP);
566
mchip_delay(MCHIP_HIC_CMD, 0);
567
for (j = 0; j < 100; ++j) {
568
if (mchip_delay(MCHIP_HIC_STATUS,
569
MCHIP_HIC_STATUS_IDLE))
570
return;
571
msleep(1);
572
}
573
printk(KERN_ERR "meye: need to reset HIC!\n");
574
575
mchip_set(MCHIP_HIC_CTL, MCHIP_HIC_CTL_SOFT_RESET);
576
msleep(250);
577
}
578
printk(KERN_ERR "meye: resetting HIC hanged!\n");
579
}
580
581
/****************************************************************************/
582
/* MCHIP frame processing functions */
583
/****************************************************************************/
584
585
/* get the next ready frame from the dma engine */
586
static u32 mchip_get_frame(void)
587
{
588
u32 v;
589
590
v = mchip_read(MCHIP_MM_FIR(meye.mchip_fnum));
591
return v;
592
}
593
594
/* frees the current frame from the dma engine */
595
static void mchip_free_frame(void)
596
{
597
mchip_set(MCHIP_MM_FIR(meye.mchip_fnum), 0);
598
meye.mchip_fnum++;
599
meye.mchip_fnum %= 4;
600
}
601
602
/* read one frame from the framebuffer assuming it was captured using
603
a uncompressed transfer */
604
static void mchip_cont_read_frame(u32 v, u8 *buf, int size)
605
{
606
int pt_id;
607
608
pt_id = (v >> 17) & 0x3FF;
609
610
ptable_copy(buf, pt_id, size, MCHIP_NB_PAGES);
611
}
612
613
/* read a compressed frame from the framebuffer */
614
static int mchip_comp_read_frame(u32 v, u8 *buf, int size)
615
{
616
int pt_start, pt_end, trailer;
617
int fsize;
618
int i;
619
620
pt_start = (v >> 19) & 0xFF;
621
pt_end = (v >> 11) & 0xFF;
622
trailer = (v >> 1) & 0x3FF;
623
624
if (pt_end < pt_start)
625
fsize = (MCHIP_NB_PAGES_MJPEG - pt_start) * PAGE_SIZE +
626
pt_end * PAGE_SIZE + trailer * 4;
627
else
628
fsize = (pt_end - pt_start) * PAGE_SIZE + trailer * 4;
629
630
if (fsize > size) {
631
printk(KERN_WARNING "meye: oversized compressed frame %d\n",
632
fsize);
633
return -1;
634
}
635
636
ptable_copy(buf, pt_start, fsize, MCHIP_NB_PAGES_MJPEG);
637
638
#ifdef MEYE_JPEG_CORRECTION
639
640
/* Some mchip generated jpeg frames are incorrect. In most
641
* (all ?) of those cases, the final EOI (0xff 0xd9) marker
642
* is not present at the end of the frame.
643
*
644
* Since adding the final marker is not enough to restore
645
* the jpeg integrity, we drop the frame.
646
*/
647
648
for (i = fsize - 1; i > 0 && buf[i] == 0xff; i--) ;
649
650
if (i < 2 || buf[i - 1] != 0xff || buf[i] != 0xd9)
651
return -1;
652
653
#endif
654
655
return fsize;
656
}
657
658
/* take a picture into SDRAM */
659
static void mchip_take_picture(void)
660
{
661
int i;
662
663
mchip_hic_stop();
664
mchip_subsample();
665
mchip_dma_setup(meye.mchip_dmahandle);
666
667
mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_CAP);
668
mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
669
670
mchip_delay(MCHIP_HIC_CMD, 0);
671
672
for (i = 0; i < 100; ++i) {
673
if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
674
break;
675
msleep(1);
676
}
677
}
678
679
/* dma a previously taken picture into a buffer */
680
static void mchip_get_picture(u8 *buf, int bufsize)
681
{
682
u32 v;
683
int i;
684
685
mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_OUT);
686
mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
687
688
mchip_delay(MCHIP_HIC_CMD, 0);
689
for (i = 0; i < 100; ++i) {
690
if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
691
break;
692
msleep(1);
693
}
694
for (i = 0; i < 4; ++i) {
695
v = mchip_get_frame();
696
if (v & MCHIP_MM_FIR_RDY) {
697
mchip_cont_read_frame(v, buf, bufsize);
698
break;
699
}
700
mchip_free_frame();
701
}
702
}
703
704
/* start continuous dma capture */
705
static void mchip_continuous_start(void)
706
{
707
mchip_hic_stop();
708
mchip_subsample();
709
mchip_set_framerate();
710
mchip_dma_setup(meye.mchip_dmahandle);
711
712
meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
713
714
mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_OUT);
715
mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
716
717
mchip_delay(MCHIP_HIC_CMD, 0);
718
}
719
720
/* compress one frame into a buffer */
721
static int mchip_compress_frame(u8 *buf, int bufsize)
722
{
723
u32 v;
724
int len = -1, i;
725
726
mchip_vrj_setup(0x3f);
727
udelay(50);
728
729
mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_COMP);
730
mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
731
732
mchip_delay(MCHIP_HIC_CMD, 0);
733
for (i = 0; i < 100; ++i) {
734
if (mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE))
735
break;
736
msleep(1);
737
}
738
739
for (i = 0; i < 4; ++i) {
740
v = mchip_get_frame();
741
if (v & MCHIP_MM_FIR_RDY) {
742
len = mchip_comp_read_frame(v, buf, bufsize);
743
break;
744
}
745
mchip_free_frame();
746
}
747
return len;
748
}
749
750
#if 0
751
/* uncompress one image into a buffer */
752
static int mchip_uncompress_frame(u8 *img, int imgsize, u8 *buf, int bufsize)
753
{
754
mchip_vrj_setup(0x3f);
755
udelay(50);
756
757
mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_STILL_DECOMP);
758
mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
759
760
mchip_delay(MCHIP_HIC_CMD, 0);
761
762
return mchip_comp_read_frame(buf, bufsize);
763
}
764
#endif
765
766
/* start continuous compressed capture */
767
static void mchip_cont_compression_start(void)
768
{
769
mchip_hic_stop();
770
mchip_vrj_setup(0x3f);
771
mchip_subsample();
772
mchip_set_framerate();
773
mchip_dma_setup(meye.mchip_dmahandle);
774
775
meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
776
777
mchip_set(MCHIP_HIC_MODE, MCHIP_HIC_MODE_CONT_COMP);
778
mchip_set(MCHIP_HIC_CMD, MCHIP_HIC_CMD_START);
779
780
mchip_delay(MCHIP_HIC_CMD, 0);
781
}
782
783
/****************************************************************************/
784
/* Interrupt handling */
785
/****************************************************************************/
786
787
static irqreturn_t meye_irq(int irq, void *dev_id)
788
{
789
u32 v;
790
int reqnr;
791
static int sequence;
792
793
v = mchip_read(MCHIP_MM_INTA);
794
795
if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_OUT &&
796
meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
797
return IRQ_NONE;
798
799
again:
800
v = mchip_get_frame();
801
if (!(v & MCHIP_MM_FIR_RDY))
802
return IRQ_HANDLED;
803
804
if (meye.mchip_mode == MCHIP_HIC_MODE_CONT_OUT) {
805
if (kfifo_out_locked(&meye.grabq, (unsigned char *)&reqnr,
806
sizeof(int), &meye.grabq_lock) != sizeof(int)) {
807
mchip_free_frame();
808
return IRQ_HANDLED;
809
}
810
mchip_cont_read_frame(v, meye.grab_fbuffer + gbufsize * reqnr,
811
mchip_hsize() * mchip_vsize() * 2);
812
meye.grab_buffer[reqnr].size = mchip_hsize() * mchip_vsize() * 2;
813
meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
814
do_gettimeofday(&meye.grab_buffer[reqnr].timestamp);
815
meye.grab_buffer[reqnr].sequence = sequence++;
816
kfifo_in_locked(&meye.doneq, (unsigned char *)&reqnr,
817
sizeof(int), &meye.doneq_lock);
818
wake_up_interruptible(&meye.proc_list);
819
} else {
820
int size;
821
size = mchip_comp_read_frame(v, meye.grab_temp, gbufsize);
822
if (size == -1) {
823
mchip_free_frame();
824
goto again;
825
}
826
if (kfifo_out_locked(&meye.grabq, (unsigned char *)&reqnr,
827
sizeof(int), &meye.grabq_lock) != sizeof(int)) {
828
mchip_free_frame();
829
goto again;
830
}
831
memcpy(meye.grab_fbuffer + gbufsize * reqnr, meye.grab_temp,
832
size);
833
meye.grab_buffer[reqnr].size = size;
834
meye.grab_buffer[reqnr].state = MEYE_BUF_DONE;
835
do_gettimeofday(&meye.grab_buffer[reqnr].timestamp);
836
meye.grab_buffer[reqnr].sequence = sequence++;
837
kfifo_in_locked(&meye.doneq, (unsigned char *)&reqnr,
838
sizeof(int), &meye.doneq_lock);
839
wake_up_interruptible(&meye.proc_list);
840
}
841
mchip_free_frame();
842
goto again;
843
}
844
845
/****************************************************************************/
846
/* video4linux integration */
847
/****************************************************************************/
848
849
static int meye_open(struct file *file)
850
{
851
int i;
852
853
if (test_and_set_bit(0, &meye.in_use))
854
return -EBUSY;
855
856
mchip_hic_stop();
857
858
if (mchip_dma_alloc()) {
859
printk(KERN_ERR "meye: mchip framebuffer allocation failed\n");
860
clear_bit(0, &meye.in_use);
861
return -ENOBUFS;
862
}
863
864
for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
865
meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
866
kfifo_reset(&meye.grabq);
867
kfifo_reset(&meye.doneq);
868
return 0;
869
}
870
871
static int meye_release(struct file *file)
872
{
873
mchip_hic_stop();
874
mchip_dma_free();
875
clear_bit(0, &meye.in_use);
876
return 0;
877
}
878
879
static int meyeioc_g_params(struct meye_params *p)
880
{
881
*p = meye.params;
882
return 0;
883
}
884
885
static int meyeioc_s_params(struct meye_params *jp)
886
{
887
if (jp->subsample > 1)
888
return -EINVAL;
889
890
if (jp->quality > 10)
891
return -EINVAL;
892
893
if (jp->sharpness > 63 || jp->agc > 63 || jp->picture > 63)
894
return -EINVAL;
895
896
if (jp->framerate > 31)
897
return -EINVAL;
898
899
mutex_lock(&meye.lock);
900
901
if (meye.params.subsample != jp->subsample ||
902
meye.params.quality != jp->quality)
903
mchip_hic_stop(); /* need restart */
904
905
meye.params = *jp;
906
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS,
907
meye.params.sharpness);
908
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC,
909
meye.params.agc);
910
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE,
911
meye.params.picture);
912
mutex_unlock(&meye.lock);
913
914
return 0;
915
}
916
917
static int meyeioc_qbuf_capt(int *nb)
918
{
919
if (!meye.grab_fbuffer)
920
return -EINVAL;
921
922
if (*nb >= gbuffers)
923
return -EINVAL;
924
925
if (*nb < 0) {
926
/* stop capture */
927
mchip_hic_stop();
928
return 0;
929
}
930
931
if (meye.grab_buffer[*nb].state != MEYE_BUF_UNUSED)
932
return -EBUSY;
933
934
mutex_lock(&meye.lock);
935
936
if (meye.mchip_mode != MCHIP_HIC_MODE_CONT_COMP)
937
mchip_cont_compression_start();
938
939
meye.grab_buffer[*nb].state = MEYE_BUF_USING;
940
kfifo_in_locked(&meye.grabq, (unsigned char *)nb, sizeof(int),
941
&meye.grabq_lock);
942
mutex_unlock(&meye.lock);
943
944
return 0;
945
}
946
947
static int meyeioc_sync(struct file *file, void *fh, int *i)
948
{
949
int unused;
950
951
if (*i < 0 || *i >= gbuffers)
952
return -EINVAL;
953
954
mutex_lock(&meye.lock);
955
switch (meye.grab_buffer[*i].state) {
956
957
case MEYE_BUF_UNUSED:
958
mutex_unlock(&meye.lock);
959
return -EINVAL;
960
case MEYE_BUF_USING:
961
if (file->f_flags & O_NONBLOCK) {
962
mutex_unlock(&meye.lock);
963
return -EAGAIN;
964
}
965
if (wait_event_interruptible(meye.proc_list,
966
(meye.grab_buffer[*i].state != MEYE_BUF_USING))) {
967
mutex_unlock(&meye.lock);
968
return -EINTR;
969
}
970
/* fall through */
971
case MEYE_BUF_DONE:
972
meye.grab_buffer[*i].state = MEYE_BUF_UNUSED;
973
if (kfifo_out_locked(&meye.doneq, (unsigned char *)&unused,
974
sizeof(int), &meye.doneq_lock) != sizeof(int))
975
break;
976
}
977
*i = meye.grab_buffer[*i].size;
978
mutex_unlock(&meye.lock);
979
return 0;
980
}
981
982
static int meyeioc_stillcapt(void)
983
{
984
if (!meye.grab_fbuffer)
985
return -EINVAL;
986
987
if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
988
return -EBUSY;
989
990
mutex_lock(&meye.lock);
991
meye.grab_buffer[0].state = MEYE_BUF_USING;
992
mchip_take_picture();
993
994
mchip_get_picture(meye.grab_fbuffer,
995
mchip_hsize() * mchip_vsize() * 2);
996
997
meye.grab_buffer[0].state = MEYE_BUF_DONE;
998
mutex_unlock(&meye.lock);
999
1000
return 0;
1001
}
1002
1003
static int meyeioc_stilljcapt(int *len)
1004
{
1005
if (!meye.grab_fbuffer)
1006
return -EINVAL;
1007
1008
if (meye.grab_buffer[0].state != MEYE_BUF_UNUSED)
1009
return -EBUSY;
1010
1011
mutex_lock(&meye.lock);
1012
meye.grab_buffer[0].state = MEYE_BUF_USING;
1013
*len = -1;
1014
1015
while (*len == -1) {
1016
mchip_take_picture();
1017
*len = mchip_compress_frame(meye.grab_fbuffer, gbufsize);
1018
}
1019
1020
meye.grab_buffer[0].state = MEYE_BUF_DONE;
1021
mutex_unlock(&meye.lock);
1022
return 0;
1023
}
1024
1025
static int vidioc_querycap(struct file *file, void *fh,
1026
struct v4l2_capability *cap)
1027
{
1028
strcpy(cap->driver, "meye");
1029
strcpy(cap->card, "meye");
1030
sprintf(cap->bus_info, "PCI:%s", pci_name(meye.mchip_dev));
1031
1032
cap->version = (MEYE_DRIVER_MAJORVERSION << 8) +
1033
MEYE_DRIVER_MINORVERSION;
1034
1035
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |
1036
V4L2_CAP_STREAMING;
1037
1038
return 0;
1039
}
1040
1041
static int vidioc_enum_input(struct file *file, void *fh, struct v4l2_input *i)
1042
{
1043
if (i->index != 0)
1044
return -EINVAL;
1045
1046
strcpy(i->name, "Camera");
1047
i->type = V4L2_INPUT_TYPE_CAMERA;
1048
1049
return 0;
1050
}
1051
1052
static int vidioc_g_input(struct file *file, void *fh, unsigned int *i)
1053
{
1054
*i = 0;
1055
return 0;
1056
}
1057
1058
static int vidioc_s_input(struct file *file, void *fh, unsigned int i)
1059
{
1060
if (i != 0)
1061
return -EINVAL;
1062
1063
return 0;
1064
}
1065
1066
static int vidioc_queryctrl(struct file *file, void *fh,
1067
struct v4l2_queryctrl *c)
1068
{
1069
switch (c->id) {
1070
1071
case V4L2_CID_BRIGHTNESS:
1072
c->type = V4L2_CTRL_TYPE_INTEGER;
1073
strcpy(c->name, "Brightness");
1074
c->minimum = 0;
1075
c->maximum = 63;
1076
c->step = 1;
1077
c->default_value = 32;
1078
c->flags = 0;
1079
break;
1080
case V4L2_CID_HUE:
1081
c->type = V4L2_CTRL_TYPE_INTEGER;
1082
strcpy(c->name, "Hue");
1083
c->minimum = 0;
1084
c->maximum = 63;
1085
c->step = 1;
1086
c->default_value = 32;
1087
c->flags = 0;
1088
break;
1089
case V4L2_CID_CONTRAST:
1090
c->type = V4L2_CTRL_TYPE_INTEGER;
1091
strcpy(c->name, "Contrast");
1092
c->minimum = 0;
1093
c->maximum = 63;
1094
c->step = 1;
1095
c->default_value = 32;
1096
c->flags = 0;
1097
break;
1098
case V4L2_CID_SATURATION:
1099
c->type = V4L2_CTRL_TYPE_INTEGER;
1100
strcpy(c->name, "Saturation");
1101
c->minimum = 0;
1102
c->maximum = 63;
1103
c->step = 1;
1104
c->default_value = 32;
1105
c->flags = 0;
1106
break;
1107
case V4L2_CID_AGC:
1108
c->type = V4L2_CTRL_TYPE_INTEGER;
1109
strcpy(c->name, "Agc");
1110
c->minimum = 0;
1111
c->maximum = 63;
1112
c->step = 1;
1113
c->default_value = 48;
1114
c->flags = 0;
1115
break;
1116
case V4L2_CID_MEYE_SHARPNESS:
1117
case V4L2_CID_SHARPNESS:
1118
c->type = V4L2_CTRL_TYPE_INTEGER;
1119
strcpy(c->name, "Sharpness");
1120
c->minimum = 0;
1121
c->maximum = 63;
1122
c->step = 1;
1123
c->default_value = 32;
1124
1125
/* Continue to report legacy private SHARPNESS ctrl but
1126
* say it is disabled in preference to ctrl in the spec
1127
*/
1128
c->flags = (c->id == V4L2_CID_SHARPNESS) ? 0 :
1129
V4L2_CTRL_FLAG_DISABLED;
1130
break;
1131
case V4L2_CID_PICTURE:
1132
c->type = V4L2_CTRL_TYPE_INTEGER;
1133
strcpy(c->name, "Picture");
1134
c->minimum = 0;
1135
c->maximum = 63;
1136
c->step = 1;
1137
c->default_value = 0;
1138
c->flags = 0;
1139
break;
1140
case V4L2_CID_JPEGQUAL:
1141
c->type = V4L2_CTRL_TYPE_INTEGER;
1142
strcpy(c->name, "JPEG quality");
1143
c->minimum = 0;
1144
c->maximum = 10;
1145
c->step = 1;
1146
c->default_value = 8;
1147
c->flags = 0;
1148
break;
1149
case V4L2_CID_FRAMERATE:
1150
c->type = V4L2_CTRL_TYPE_INTEGER;
1151
strcpy(c->name, "Framerate");
1152
c->minimum = 0;
1153
c->maximum = 31;
1154
c->step = 1;
1155
c->default_value = 0;
1156
c->flags = 0;
1157
break;
1158
default:
1159
return -EINVAL;
1160
}
1161
1162
return 0;
1163
}
1164
1165
static int vidioc_s_ctrl(struct file *file, void *fh, struct v4l2_control *c)
1166
{
1167
mutex_lock(&meye.lock);
1168
switch (c->id) {
1169
case V4L2_CID_BRIGHTNESS:
1170
sony_pic_camera_command(
1171
SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, c->value);
1172
meye.brightness = c->value << 10;
1173
break;
1174
case V4L2_CID_HUE:
1175
sony_pic_camera_command(
1176
SONY_PIC_COMMAND_SETCAMERAHUE, c->value);
1177
meye.hue = c->value << 10;
1178
break;
1179
case V4L2_CID_CONTRAST:
1180
sony_pic_camera_command(
1181
SONY_PIC_COMMAND_SETCAMERACONTRAST, c->value);
1182
meye.contrast = c->value << 10;
1183
break;
1184
case V4L2_CID_SATURATION:
1185
sony_pic_camera_command(
1186
SONY_PIC_COMMAND_SETCAMERACOLOR, c->value);
1187
meye.colour = c->value << 10;
1188
break;
1189
case V4L2_CID_AGC:
1190
sony_pic_camera_command(
1191
SONY_PIC_COMMAND_SETCAMERAAGC, c->value);
1192
meye.params.agc = c->value;
1193
break;
1194
case V4L2_CID_SHARPNESS:
1195
case V4L2_CID_MEYE_SHARPNESS:
1196
sony_pic_camera_command(
1197
SONY_PIC_COMMAND_SETCAMERASHARPNESS, c->value);
1198
meye.params.sharpness = c->value;
1199
break;
1200
case V4L2_CID_PICTURE:
1201
sony_pic_camera_command(
1202
SONY_PIC_COMMAND_SETCAMERAPICTURE, c->value);
1203
meye.params.picture = c->value;
1204
break;
1205
case V4L2_CID_JPEGQUAL:
1206
meye.params.quality = c->value;
1207
break;
1208
case V4L2_CID_FRAMERATE:
1209
meye.params.framerate = c->value;
1210
break;
1211
default:
1212
mutex_unlock(&meye.lock);
1213
return -EINVAL;
1214
}
1215
mutex_unlock(&meye.lock);
1216
1217
return 0;
1218
}
1219
1220
static int vidioc_g_ctrl(struct file *file, void *fh, struct v4l2_control *c)
1221
{
1222
mutex_lock(&meye.lock);
1223
switch (c->id) {
1224
case V4L2_CID_BRIGHTNESS:
1225
c->value = meye.brightness >> 10;
1226
break;
1227
case V4L2_CID_HUE:
1228
c->value = meye.hue >> 10;
1229
break;
1230
case V4L2_CID_CONTRAST:
1231
c->value = meye.contrast >> 10;
1232
break;
1233
case V4L2_CID_SATURATION:
1234
c->value = meye.colour >> 10;
1235
break;
1236
case V4L2_CID_AGC:
1237
c->value = meye.params.agc;
1238
break;
1239
case V4L2_CID_SHARPNESS:
1240
case V4L2_CID_MEYE_SHARPNESS:
1241
c->value = meye.params.sharpness;
1242
break;
1243
case V4L2_CID_PICTURE:
1244
c->value = meye.params.picture;
1245
break;
1246
case V4L2_CID_JPEGQUAL:
1247
c->value = meye.params.quality;
1248
break;
1249
case V4L2_CID_FRAMERATE:
1250
c->value = meye.params.framerate;
1251
break;
1252
default:
1253
mutex_unlock(&meye.lock);
1254
return -EINVAL;
1255
}
1256
mutex_unlock(&meye.lock);
1257
1258
return 0;
1259
}
1260
1261
static int vidioc_enum_fmt_vid_cap(struct file *file, void *fh,
1262
struct v4l2_fmtdesc *f)
1263
{
1264
if (f->index > 1)
1265
return -EINVAL;
1266
1267
if (f->index == 0) {
1268
/* standard YUV 422 capture */
1269
f->flags = 0;
1270
strcpy(f->description, "YUV422");
1271
f->pixelformat = V4L2_PIX_FMT_YUYV;
1272
} else {
1273
/* compressed MJPEG capture */
1274
f->flags = V4L2_FMT_FLAG_COMPRESSED;
1275
strcpy(f->description, "MJPEG");
1276
f->pixelformat = V4L2_PIX_FMT_MJPEG;
1277
}
1278
1279
return 0;
1280
}
1281
1282
static int vidioc_try_fmt_vid_cap(struct file *file, void *fh,
1283
struct v4l2_format *f)
1284
{
1285
if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1286
f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1287
return -EINVAL;
1288
1289
if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1290
f->fmt.pix.field != V4L2_FIELD_NONE)
1291
return -EINVAL;
1292
1293
f->fmt.pix.field = V4L2_FIELD_NONE;
1294
1295
if (f->fmt.pix.width <= 320) {
1296
f->fmt.pix.width = 320;
1297
f->fmt.pix.height = 240;
1298
} else {
1299
f->fmt.pix.width = 640;
1300
f->fmt.pix.height = 480;
1301
}
1302
1303
f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1304
f->fmt.pix.sizeimage = f->fmt.pix.height *
1305
f->fmt.pix.bytesperline;
1306
f->fmt.pix.colorspace = 0;
1307
f->fmt.pix.priv = 0;
1308
1309
return 0;
1310
}
1311
1312
static int vidioc_g_fmt_vid_cap(struct file *file, void *fh,
1313
struct v4l2_format *f)
1314
{
1315
switch (meye.mchip_mode) {
1316
case MCHIP_HIC_MODE_CONT_OUT:
1317
default:
1318
f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
1319
break;
1320
case MCHIP_HIC_MODE_CONT_COMP:
1321
f->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
1322
break;
1323
}
1324
1325
f->fmt.pix.field = V4L2_FIELD_NONE;
1326
f->fmt.pix.width = mchip_hsize();
1327
f->fmt.pix.height = mchip_vsize();
1328
f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1329
f->fmt.pix.sizeimage = f->fmt.pix.height *
1330
f->fmt.pix.bytesperline;
1331
1332
return 0;
1333
}
1334
1335
static int vidioc_s_fmt_vid_cap(struct file *file, void *fh,
1336
struct v4l2_format *f)
1337
{
1338
if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV &&
1339
f->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG)
1340
return -EINVAL;
1341
1342
if (f->fmt.pix.field != V4L2_FIELD_ANY &&
1343
f->fmt.pix.field != V4L2_FIELD_NONE)
1344
return -EINVAL;
1345
1346
f->fmt.pix.field = V4L2_FIELD_NONE;
1347
mutex_lock(&meye.lock);
1348
1349
if (f->fmt.pix.width <= 320) {
1350
f->fmt.pix.width = 320;
1351
f->fmt.pix.height = 240;
1352
meye.params.subsample = 1;
1353
} else {
1354
f->fmt.pix.width = 640;
1355
f->fmt.pix.height = 480;
1356
meye.params.subsample = 0;
1357
}
1358
1359
switch (f->fmt.pix.pixelformat) {
1360
case V4L2_PIX_FMT_YUYV:
1361
meye.mchip_mode = MCHIP_HIC_MODE_CONT_OUT;
1362
break;
1363
case V4L2_PIX_FMT_MJPEG:
1364
meye.mchip_mode = MCHIP_HIC_MODE_CONT_COMP;
1365
break;
1366
}
1367
1368
mutex_unlock(&meye.lock);
1369
f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
1370
f->fmt.pix.sizeimage = f->fmt.pix.height *
1371
f->fmt.pix.bytesperline;
1372
f->fmt.pix.colorspace = 0;
1373
f->fmt.pix.priv = 0;
1374
1375
return 0;
1376
}
1377
1378
static int vidioc_reqbufs(struct file *file, void *fh,
1379
struct v4l2_requestbuffers *req)
1380
{
1381
int i;
1382
1383
if (req->memory != V4L2_MEMORY_MMAP)
1384
return -EINVAL;
1385
1386
if (meye.grab_fbuffer && req->count == gbuffers) {
1387
/* already allocated, no modifications */
1388
return 0;
1389
}
1390
1391
mutex_lock(&meye.lock);
1392
if (meye.grab_fbuffer) {
1393
for (i = 0; i < gbuffers; i++)
1394
if (meye.vma_use_count[i]) {
1395
mutex_unlock(&meye.lock);
1396
return -EINVAL;
1397
}
1398
rvfree(meye.grab_fbuffer, gbuffers * gbufsize);
1399
meye.grab_fbuffer = NULL;
1400
}
1401
1402
gbuffers = max(2, min((int)req->count, MEYE_MAX_BUFNBRS));
1403
req->count = gbuffers;
1404
meye.grab_fbuffer = rvmalloc(gbuffers * gbufsize);
1405
1406
if (!meye.grab_fbuffer) {
1407
printk(KERN_ERR "meye: v4l framebuffer allocation"
1408
" failed\n");
1409
mutex_unlock(&meye.lock);
1410
return -ENOMEM;
1411
}
1412
1413
for (i = 0; i < gbuffers; i++)
1414
meye.vma_use_count[i] = 0;
1415
1416
mutex_unlock(&meye.lock);
1417
1418
return 0;
1419
}
1420
1421
static int vidioc_querybuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1422
{
1423
unsigned int index = buf->index;
1424
1425
if (index >= gbuffers)
1426
return -EINVAL;
1427
1428
buf->bytesused = meye.grab_buffer[index].size;
1429
buf->flags = V4L2_BUF_FLAG_MAPPED;
1430
1431
if (meye.grab_buffer[index].state == MEYE_BUF_USING)
1432
buf->flags |= V4L2_BUF_FLAG_QUEUED;
1433
1434
if (meye.grab_buffer[index].state == MEYE_BUF_DONE)
1435
buf->flags |= V4L2_BUF_FLAG_DONE;
1436
1437
buf->field = V4L2_FIELD_NONE;
1438
buf->timestamp = meye.grab_buffer[index].timestamp;
1439
buf->sequence = meye.grab_buffer[index].sequence;
1440
buf->memory = V4L2_MEMORY_MMAP;
1441
buf->m.offset = index * gbufsize;
1442
buf->length = gbufsize;
1443
1444
return 0;
1445
}
1446
1447
static int vidioc_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1448
{
1449
if (buf->memory != V4L2_MEMORY_MMAP)
1450
return -EINVAL;
1451
1452
if (buf->index >= gbuffers)
1453
return -EINVAL;
1454
1455
if (meye.grab_buffer[buf->index].state != MEYE_BUF_UNUSED)
1456
return -EINVAL;
1457
1458
mutex_lock(&meye.lock);
1459
buf->flags |= V4L2_BUF_FLAG_QUEUED;
1460
buf->flags &= ~V4L2_BUF_FLAG_DONE;
1461
meye.grab_buffer[buf->index].state = MEYE_BUF_USING;
1462
kfifo_in_locked(&meye.grabq, (unsigned char *)&buf->index,
1463
sizeof(int), &meye.grabq_lock);
1464
mutex_unlock(&meye.lock);
1465
1466
return 0;
1467
}
1468
1469
static int vidioc_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf)
1470
{
1471
int reqnr;
1472
1473
if (buf->memory != V4L2_MEMORY_MMAP)
1474
return -EINVAL;
1475
1476
mutex_lock(&meye.lock);
1477
1478
if (kfifo_len(&meye.doneq) == 0 && file->f_flags & O_NONBLOCK) {
1479
mutex_unlock(&meye.lock);
1480
return -EAGAIN;
1481
}
1482
1483
if (wait_event_interruptible(meye.proc_list,
1484
kfifo_len(&meye.doneq) != 0) < 0) {
1485
mutex_unlock(&meye.lock);
1486
return -EINTR;
1487
}
1488
1489
if (!kfifo_out_locked(&meye.doneq, (unsigned char *)&reqnr,
1490
sizeof(int), &meye.doneq_lock)) {
1491
mutex_unlock(&meye.lock);
1492
return -EBUSY;
1493
}
1494
1495
if (meye.grab_buffer[reqnr].state != MEYE_BUF_DONE) {
1496
mutex_unlock(&meye.lock);
1497
return -EINVAL;
1498
}
1499
1500
buf->index = reqnr;
1501
buf->bytesused = meye.grab_buffer[reqnr].size;
1502
buf->flags = V4L2_BUF_FLAG_MAPPED;
1503
buf->field = V4L2_FIELD_NONE;
1504
buf->timestamp = meye.grab_buffer[reqnr].timestamp;
1505
buf->sequence = meye.grab_buffer[reqnr].sequence;
1506
buf->memory = V4L2_MEMORY_MMAP;
1507
buf->m.offset = reqnr * gbufsize;
1508
buf->length = gbufsize;
1509
meye.grab_buffer[reqnr].state = MEYE_BUF_UNUSED;
1510
mutex_unlock(&meye.lock);
1511
1512
return 0;
1513
}
1514
1515
static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
1516
{
1517
mutex_lock(&meye.lock);
1518
1519
switch (meye.mchip_mode) {
1520
case MCHIP_HIC_MODE_CONT_OUT:
1521
mchip_continuous_start();
1522
break;
1523
case MCHIP_HIC_MODE_CONT_COMP:
1524
mchip_cont_compression_start();
1525
break;
1526
default:
1527
mutex_unlock(&meye.lock);
1528
return -EINVAL;
1529
}
1530
1531
mutex_unlock(&meye.lock);
1532
1533
return 0;
1534
}
1535
1536
static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
1537
{
1538
mutex_lock(&meye.lock);
1539
mchip_hic_stop();
1540
kfifo_reset(&meye.grabq);
1541
kfifo_reset(&meye.doneq);
1542
1543
for (i = 0; i < MEYE_MAX_BUFNBRS; i++)
1544
meye.grab_buffer[i].state = MEYE_BUF_UNUSED;
1545
1546
mutex_unlock(&meye.lock);
1547
return 0;
1548
}
1549
1550
static long vidioc_default(struct file *file, void *fh, bool valid_prio,
1551
int cmd, void *arg)
1552
{
1553
switch (cmd) {
1554
case MEYEIOC_G_PARAMS:
1555
return meyeioc_g_params((struct meye_params *) arg);
1556
1557
case MEYEIOC_S_PARAMS:
1558
return meyeioc_s_params((struct meye_params *) arg);
1559
1560
case MEYEIOC_QBUF_CAPT:
1561
return meyeioc_qbuf_capt((int *) arg);
1562
1563
case MEYEIOC_SYNC:
1564
return meyeioc_sync(file, fh, (int *) arg);
1565
1566
case MEYEIOC_STILLCAPT:
1567
return meyeioc_stillcapt();
1568
1569
case MEYEIOC_STILLJCAPT:
1570
return meyeioc_stilljcapt((int *) arg);
1571
1572
default:
1573
return -EINVAL;
1574
}
1575
1576
}
1577
1578
static unsigned int meye_poll(struct file *file, poll_table *wait)
1579
{
1580
unsigned int res = 0;
1581
1582
mutex_lock(&meye.lock);
1583
poll_wait(file, &meye.proc_list, wait);
1584
if (kfifo_len(&meye.doneq))
1585
res = POLLIN | POLLRDNORM;
1586
mutex_unlock(&meye.lock);
1587
return res;
1588
}
1589
1590
static void meye_vm_open(struct vm_area_struct *vma)
1591
{
1592
long idx = (long)vma->vm_private_data;
1593
meye.vma_use_count[idx]++;
1594
}
1595
1596
static void meye_vm_close(struct vm_area_struct *vma)
1597
{
1598
long idx = (long)vma->vm_private_data;
1599
meye.vma_use_count[idx]--;
1600
}
1601
1602
static const struct vm_operations_struct meye_vm_ops = {
1603
.open = meye_vm_open,
1604
.close = meye_vm_close,
1605
};
1606
1607
static int meye_mmap(struct file *file, struct vm_area_struct *vma)
1608
{
1609
unsigned long start = vma->vm_start;
1610
unsigned long size = vma->vm_end - vma->vm_start;
1611
unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
1612
unsigned long page, pos;
1613
1614
mutex_lock(&meye.lock);
1615
if (size > gbuffers * gbufsize) {
1616
mutex_unlock(&meye.lock);
1617
return -EINVAL;
1618
}
1619
if (!meye.grab_fbuffer) {
1620
int i;
1621
1622
/* lazy allocation */
1623
meye.grab_fbuffer = rvmalloc(gbuffers*gbufsize);
1624
if (!meye.grab_fbuffer) {
1625
printk(KERN_ERR "meye: v4l framebuffer allocation failed\n");
1626
mutex_unlock(&meye.lock);
1627
return -ENOMEM;
1628
}
1629
for (i = 0; i < gbuffers; i++)
1630
meye.vma_use_count[i] = 0;
1631
}
1632
pos = (unsigned long)meye.grab_fbuffer + offset;
1633
1634
while (size > 0) {
1635
page = vmalloc_to_pfn((void *)pos);
1636
if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) {
1637
mutex_unlock(&meye.lock);
1638
return -EAGAIN;
1639
}
1640
start += PAGE_SIZE;
1641
pos += PAGE_SIZE;
1642
if (size > PAGE_SIZE)
1643
size -= PAGE_SIZE;
1644
else
1645
size = 0;
1646
}
1647
1648
vma->vm_ops = &meye_vm_ops;
1649
vma->vm_flags &= ~VM_IO; /* not I/O memory */
1650
vma->vm_flags |= VM_RESERVED; /* avoid to swap out this VMA */
1651
vma->vm_private_data = (void *) (offset / gbufsize);
1652
meye_vm_open(vma);
1653
1654
mutex_unlock(&meye.lock);
1655
return 0;
1656
}
1657
1658
static const struct v4l2_file_operations meye_fops = {
1659
.owner = THIS_MODULE,
1660
.open = meye_open,
1661
.release = meye_release,
1662
.mmap = meye_mmap,
1663
.unlocked_ioctl = video_ioctl2,
1664
.poll = meye_poll,
1665
};
1666
1667
static const struct v4l2_ioctl_ops meye_ioctl_ops = {
1668
.vidioc_querycap = vidioc_querycap,
1669
.vidioc_enum_input = vidioc_enum_input,
1670
.vidioc_g_input = vidioc_g_input,
1671
.vidioc_s_input = vidioc_s_input,
1672
.vidioc_queryctrl = vidioc_queryctrl,
1673
.vidioc_s_ctrl = vidioc_s_ctrl,
1674
.vidioc_g_ctrl = vidioc_g_ctrl,
1675
.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
1676
.vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
1677
.vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
1678
.vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
1679
.vidioc_reqbufs = vidioc_reqbufs,
1680
.vidioc_querybuf = vidioc_querybuf,
1681
.vidioc_qbuf = vidioc_qbuf,
1682
.vidioc_dqbuf = vidioc_dqbuf,
1683
.vidioc_streamon = vidioc_streamon,
1684
.vidioc_streamoff = vidioc_streamoff,
1685
.vidioc_default = vidioc_default,
1686
};
1687
1688
static struct video_device meye_template = {
1689
.name = "meye",
1690
.fops = &meye_fops,
1691
.ioctl_ops = &meye_ioctl_ops,
1692
.release = video_device_release,
1693
};
1694
1695
#ifdef CONFIG_PM
1696
static int meye_suspend(struct pci_dev *pdev, pm_message_t state)
1697
{
1698
pci_save_state(pdev);
1699
meye.pm_mchip_mode = meye.mchip_mode;
1700
mchip_hic_stop();
1701
mchip_set(MCHIP_MM_INTA, 0x0);
1702
return 0;
1703
}
1704
1705
static int meye_resume(struct pci_dev *pdev)
1706
{
1707
pci_restore_state(pdev);
1708
pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1709
1710
mchip_delay(MCHIP_HIC_CMD, 0);
1711
mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1712
msleep(1);
1713
mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1714
msleep(1);
1715
mchip_set(MCHIP_MM_PCI_MODE, 5);
1716
msleep(1);
1717
mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1718
1719
switch (meye.pm_mchip_mode) {
1720
case MCHIP_HIC_MODE_CONT_OUT:
1721
mchip_continuous_start();
1722
break;
1723
case MCHIP_HIC_MODE_CONT_COMP:
1724
mchip_cont_compression_start();
1725
break;
1726
}
1727
return 0;
1728
}
1729
#endif
1730
1731
static int __devinit meye_probe(struct pci_dev *pcidev,
1732
const struct pci_device_id *ent)
1733
{
1734
struct v4l2_device *v4l2_dev = &meye.v4l2_dev;
1735
int ret = -EBUSY;
1736
unsigned long mchip_adr;
1737
1738
if (meye.mchip_dev != NULL) {
1739
printk(KERN_ERR "meye: only one device allowed!\n");
1740
goto outnotdev;
1741
}
1742
1743
ret = v4l2_device_register(&pcidev->dev, v4l2_dev);
1744
if (ret < 0) {
1745
v4l2_err(v4l2_dev, "Could not register v4l2_device\n");
1746
return ret;
1747
}
1748
ret = -ENOMEM;
1749
meye.mchip_dev = pcidev;
1750
meye.vdev = video_device_alloc();
1751
if (!meye.vdev) {
1752
v4l2_err(v4l2_dev, "video_device_alloc() failed!\n");
1753
goto outnotdev;
1754
}
1755
1756
meye.grab_temp = vmalloc(MCHIP_NB_PAGES_MJPEG * PAGE_SIZE);
1757
if (!meye.grab_temp) {
1758
v4l2_err(v4l2_dev, "grab buffer allocation failed\n");
1759
goto outvmalloc;
1760
}
1761
1762
spin_lock_init(&meye.grabq_lock);
1763
if (kfifo_alloc(&meye.grabq, sizeof(int) * MEYE_MAX_BUFNBRS,
1764
GFP_KERNEL)) {
1765
v4l2_err(v4l2_dev, "fifo allocation failed\n");
1766
goto outkfifoalloc1;
1767
}
1768
spin_lock_init(&meye.doneq_lock);
1769
if (kfifo_alloc(&meye.doneq, sizeof(int) * MEYE_MAX_BUFNBRS,
1770
GFP_KERNEL)) {
1771
v4l2_err(v4l2_dev, "fifo allocation failed\n");
1772
goto outkfifoalloc2;
1773
}
1774
1775
memcpy(meye.vdev, &meye_template, sizeof(meye_template));
1776
meye.vdev->v4l2_dev = &meye.v4l2_dev;
1777
1778
ret = -EIO;
1779
if ((ret = sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 1))) {
1780
v4l2_err(v4l2_dev, "meye: unable to power on the camera\n");
1781
v4l2_err(v4l2_dev, "meye: did you enable the camera in "
1782
"sonypi using the module options ?\n");
1783
goto outsonypienable;
1784
}
1785
1786
if ((ret = pci_enable_device(meye.mchip_dev))) {
1787
v4l2_err(v4l2_dev, "meye: pci_enable_device failed\n");
1788
goto outenabledev;
1789
}
1790
1791
mchip_adr = pci_resource_start(meye.mchip_dev,0);
1792
if (!mchip_adr) {
1793
v4l2_err(v4l2_dev, "meye: mchip has no device base address\n");
1794
goto outregions;
1795
}
1796
if (!request_mem_region(pci_resource_start(meye.mchip_dev, 0),
1797
pci_resource_len(meye.mchip_dev, 0),
1798
"meye")) {
1799
v4l2_err(v4l2_dev, "meye: request_mem_region failed\n");
1800
goto outregions;
1801
}
1802
meye.mchip_mmregs = ioremap(mchip_adr, MCHIP_MM_REGS);
1803
if (!meye.mchip_mmregs) {
1804
v4l2_err(v4l2_dev, "meye: ioremap failed\n");
1805
goto outremap;
1806
}
1807
1808
meye.mchip_irq = pcidev->irq;
1809
if (request_irq(meye.mchip_irq, meye_irq,
1810
IRQF_DISABLED | IRQF_SHARED, "meye", meye_irq)) {
1811
v4l2_err(v4l2_dev, "request_irq failed\n");
1812
goto outreqirq;
1813
}
1814
1815
pci_write_config_byte(meye.mchip_dev, PCI_CACHE_LINE_SIZE, 8);
1816
pci_write_config_byte(meye.mchip_dev, PCI_LATENCY_TIMER, 64);
1817
1818
pci_set_master(meye.mchip_dev);
1819
1820
/* Ask the camera to perform a soft reset. */
1821
pci_write_config_word(meye.mchip_dev, MCHIP_PCI_SOFTRESET_SET, 1);
1822
1823
mchip_delay(MCHIP_HIC_CMD, 0);
1824
mchip_delay(MCHIP_HIC_STATUS, MCHIP_HIC_STATUS_IDLE);
1825
1826
msleep(1);
1827
mchip_set(MCHIP_VRJ_SOFT_RESET, 1);
1828
1829
msleep(1);
1830
mchip_set(MCHIP_MM_PCI_MODE, 5);
1831
1832
msleep(1);
1833
mchip_set(MCHIP_MM_INTA, MCHIP_MM_INTA_HIC_1_MASK);
1834
1835
mutex_init(&meye.lock);
1836
init_waitqueue_head(&meye.proc_list);
1837
meye.brightness = 32 << 10;
1838
meye.hue = 32 << 10;
1839
meye.colour = 32 << 10;
1840
meye.contrast = 32 << 10;
1841
meye.params.subsample = 0;
1842
meye.params.quality = 8;
1843
meye.params.sharpness = 32;
1844
meye.params.agc = 48;
1845
meye.params.picture = 0;
1846
meye.params.framerate = 0;
1847
1848
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERABRIGHTNESS, 32);
1849
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAHUE, 32);
1850
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACOLOR, 32);
1851
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERACONTRAST, 32);
1852
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERASHARPNESS, 32);
1853
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAPICTURE, 0);
1854
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERAAGC, 48);
1855
1856
if (video_register_device(meye.vdev, VFL_TYPE_GRABBER,
1857
video_nr) < 0) {
1858
v4l2_err(v4l2_dev, "video_register_device failed\n");
1859
goto outvideoreg;
1860
}
1861
1862
v4l2_info(v4l2_dev, "Motion Eye Camera Driver v%s.\n",
1863
MEYE_DRIVER_VERSION);
1864
v4l2_info(v4l2_dev, "mchip KL5A72002 rev. %d, base %lx, irq %d\n",
1865
meye.mchip_dev->revision, mchip_adr, meye.mchip_irq);
1866
1867
return 0;
1868
1869
outvideoreg:
1870
free_irq(meye.mchip_irq, meye_irq);
1871
outreqirq:
1872
iounmap(meye.mchip_mmregs);
1873
outremap:
1874
release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1875
pci_resource_len(meye.mchip_dev, 0));
1876
outregions:
1877
pci_disable_device(meye.mchip_dev);
1878
outenabledev:
1879
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1880
outsonypienable:
1881
kfifo_free(&meye.doneq);
1882
outkfifoalloc2:
1883
kfifo_free(&meye.grabq);
1884
outkfifoalloc1:
1885
vfree(meye.grab_temp);
1886
outvmalloc:
1887
video_device_release(meye.vdev);
1888
outnotdev:
1889
return ret;
1890
}
1891
1892
static void __devexit meye_remove(struct pci_dev *pcidev)
1893
{
1894
video_unregister_device(meye.vdev);
1895
1896
mchip_hic_stop();
1897
1898
mchip_dma_free();
1899
1900
/* disable interrupts */
1901
mchip_set(MCHIP_MM_INTA, 0x0);
1902
1903
free_irq(meye.mchip_irq, meye_irq);
1904
1905
iounmap(meye.mchip_mmregs);
1906
1907
release_mem_region(pci_resource_start(meye.mchip_dev, 0),
1908
pci_resource_len(meye.mchip_dev, 0));
1909
1910
pci_disable_device(meye.mchip_dev);
1911
1912
sony_pic_camera_command(SONY_PIC_COMMAND_SETCAMERA, 0);
1913
1914
kfifo_free(&meye.doneq);
1915
kfifo_free(&meye.grabq);
1916
1917
vfree(meye.grab_temp);
1918
1919
if (meye.grab_fbuffer) {
1920
rvfree(meye.grab_fbuffer, gbuffers*gbufsize);
1921
meye.grab_fbuffer = NULL;
1922
}
1923
1924
printk(KERN_INFO "meye: removed\n");
1925
}
1926
1927
static struct pci_device_id meye_pci_tbl[] = {
1928
{ PCI_VDEVICE(KAWASAKI, PCI_DEVICE_ID_MCHIP_KL5A72002), 0 },
1929
{ }
1930
};
1931
1932
MODULE_DEVICE_TABLE(pci, meye_pci_tbl);
1933
1934
static struct pci_driver meye_driver = {
1935
.name = "meye",
1936
.id_table = meye_pci_tbl,
1937
.probe = meye_probe,
1938
.remove = __devexit_p(meye_remove),
1939
#ifdef CONFIG_PM
1940
.suspend = meye_suspend,
1941
.resume = meye_resume,
1942
#endif
1943
};
1944
1945
static int __init meye_init(void)
1946
{
1947
gbuffers = max(2, min((int)gbuffers, MEYE_MAX_BUFNBRS));
1948
if (gbufsize < 0 || gbufsize > MEYE_MAX_BUFSIZE)
1949
gbufsize = MEYE_MAX_BUFSIZE;
1950
gbufsize = PAGE_ALIGN(gbufsize);
1951
printk(KERN_INFO "meye: using %d buffers with %dk (%dk total) "
1952
"for capture\n",
1953
gbuffers,
1954
gbufsize / 1024, gbuffers * gbufsize / 1024);
1955
return pci_register_driver(&meye_driver);
1956
}
1957
1958
static void __exit meye_exit(void)
1959
{
1960
pci_unregister_driver(&meye_driver);
1961
}
1962
1963
module_init(meye_init);
1964
module_exit(meye_exit);
1965
1966