2 * s2255drv.c - a driver for the Sensoray 2255 USB video capture device
4 * Copyright (C) 2007-2008 by Sensoray Company Inc.
7 * Some video buffer code based on vivi driver:
9 * Sensoray 2255 device supports 4 simultaneous channels.
10 * The channels are not "crossbar" inputs, they are physically
11 * attached to separate video decoders.
13 * Because of USB2.0 bandwidth limitations. There is only a
14 * certain amount of data which may be transferred at one time.
16 * Example maximum bandwidth utilization:
18 * -full size, color mode YUYV or YUV422P: 2 channels at once
20 * -full or half size Grey scale: all 4 channels at once
22 * -half size, color mode YUYV or YUV422P: all 4 channels at once
24 * -full size, color mode YUYV or YUV422P 1/2 frame rate: all 4 channels
26 * (TODO: Incorporate videodev2 frame rate(FR) enumeration,
27 * which is currently experimental.)
29 * This program is free software; you can redistribute it and/or modify
30 * it under the terms of the GNU General Public License as published by
31 * the Free Software Foundation; either version 2 of the License, or
32 * (at your option) any later version.
34 * This program is distributed in the hope that it will be useful,
35 * but WITHOUT ANY WARRANTY; without even the implied warranty of
36 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
37 * GNU General Public License for more details.
39 * You should have received a copy of the GNU General Public License
40 * along with this program; if not, write to the Free Software
41 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
44 #include <linux/module.h>
45 #include <linux/firmware.h>
46 #include <linux/kernel.h>
47 #include <linux/mutex.h>
48 #include <linux/slab.h>
49 #include <linux/videodev2.h>
50 #include <linux/version.h>
52 #include <linux/smp_lock.h>
53 #include <media/videobuf-vmalloc.h>
54 #include <media/v4l2-common.h>
55 #include <media/v4l2-ioctl.h>
56 #include <linux/vmalloc.h>
57 #include <linux/usb.h>
59 #define FIRMWARE_FILE_NAME "f2255usb.bin"
63 /* default JPEG quality */
64 #define S2255_DEF_JPEG_QUAL 50
65 /* vendor request in */
67 /* vendor request out */
68 #define S2255_VR_OUT 1
70 #define S2255_VR_FW 0x30
71 /* USB endpoint number for configuring the device */
72 #define S2255_CONFIG_EP 2
73 /* maximum time for DSP to start responding after last FW word loaded(ms) */
74 #define S2255_DSP_BOOTTIME 800
75 /* maximum time to wait for firmware to load (ms) */
76 #define S2255_LOAD_TIMEOUT (5000 + S2255_DSP_BOOTTIME)
77 #define S2255_DEF_BUFS 16
78 #define S2255_SETMODE_TIMEOUT 500
79 #define MAX_CHANNELS 4
80 #define S2255_MARKER_FRAME 0x2255DA4AL
81 #define S2255_MARKER_RESPONSE 0x2255ACACL
82 #define S2255_RESPONSE_SETMODE 0x01
83 #define S2255_RESPONSE_FW 0x10
84 #define S2255_USB_XFER_SIZE (16 * 1024)
85 #define MAX_CHANNELS 4
86 #define MAX_PIPE_BUFFERS 1
88 /* maximum size is PAL full size plus room for the marker header(s) */
89 #define SYS_FRAMES_MAXSIZE (720*288*2*2 + 4096)
90 #define DEF_USB_BLOCK S2255_USB_XFER_SIZE
91 #define LINE_SZ_4CIFS_NTSC 640
92 #define LINE_SZ_2CIFS_NTSC 640
93 #define LINE_SZ_1CIFS_NTSC 320
94 #define LINE_SZ_4CIFS_PAL 704
95 #define LINE_SZ_2CIFS_PAL 704
96 #define LINE_SZ_1CIFS_PAL 352
97 #define NUM_LINES_4CIFS_NTSC 240
98 #define NUM_LINES_2CIFS_NTSC 240
99 #define NUM_LINES_1CIFS_NTSC 240
100 #define NUM_LINES_4CIFS_PAL 288
101 #define NUM_LINES_2CIFS_PAL 288
102 #define NUM_LINES_1CIFS_PAL 288
103 #define LINE_SZ_DEF 640
104 #define NUM_LINES_DEF 240
107 /* predefined settings */
108 #define FORMAT_NTSC 1
111 #define SCALE_4CIFS 1 /* 640x480(NTSC) or 704x576(PAL) */
112 #define SCALE_2CIFS 2 /* 640x240(NTSC) or 704x288(PAL) */
113 #define SCALE_1CIFS 3 /* 320x240(NTSC) or 352x288(PAL) */
114 /* SCALE_4CIFSI is the 2 fields interpolated into one */
115 #define SCALE_4CIFSI 4 /* 640x480(NTSC) or 704x576(PAL) high quality */
117 #define COLOR_YUVPL 1 /* YUV planar */
118 #define COLOR_YUVPK 2 /* YUV packed */
119 #define COLOR_Y8 4 /* monochrome */
120 #define COLOR_JPG 5 /* JPEG */
121 #define MASK_COLOR 0xff
122 #define MASK_JPG_QUALITY 0xff00
124 /* frame decimation. Not implemented by V4L yet(experimental in V4L) */
125 #define FDEC_1 1 /* capture every frame. default */
126 #define FDEC_2 2 /* capture every 2nd frame */
127 #define FDEC_3 3 /* capture every 3rd frame */
128 #define FDEC_5 5 /* capture every 5th frame */
130 /*-------------------------------------------------------
131 * Default mode parameters.
132 *-------------------------------------------------------*/
133 #define DEF_SCALE SCALE_4CIFS
134 #define DEF_COLOR COLOR_YUVPL
135 #define DEF_FDEC FDEC_1
137 #define DEF_CONTRAST 0x5c
138 #define DEF_SATURATION 0x80
141 /* usb config commands */
142 #define IN_DATA_TOKEN 0x2255c0de
143 #define CMD_2255 0xc2255000
144 #define CMD_SET_MODE (CMD_2255 | 0x10)
145 #define CMD_START (CMD_2255 | 0x20)
146 #define CMD_STOP (CMD_2255 | 0x30)
147 #define CMD_STATUS (CMD_2255 | 0x40)
150 u32 format
; /* input video format (NTSC, PAL) */
151 u32 scale
; /* output video scale */
152 u32 color
; /* output video color format */
153 u32 fdec
; /* frame decimation */
154 u32 bright
; /* brightness */
155 u32 contrast
; /* contrast */
156 u32 saturation
; /* saturation */
157 u32 hue
; /* hue (NTSC only)*/
158 u32 single
; /* capture 1 frame at a time (!=0), continuously (==0)*/
159 u32 usb_block
; /* block size. should be 4096 of DEF_USB_BLOCK */
160 u32 restart
; /* if DSP requires restart */
164 #define S2255_READ_IDLE 0
165 #define S2255_READ_FRAME 1
167 /* frame structure */
168 struct s2255_framei
{
170 unsigned long ulState
; /* ulState:S2255_READ_IDLE, S2255_READ_FRAME*/
171 void *lpvbits
; /* image data */
172 unsigned long cur_size
; /* current data copied to it */
175 /* image buffer structure */
176 struct s2255_bufferi
{
177 unsigned long dwFrames
; /* number of frames in buffer */
178 struct s2255_framei frame
[SYS_FRAMES
]; /* array of FRAME structures */
181 #define DEF_MODEI_NTSC_CONT {FORMAT_NTSC, DEF_SCALE, DEF_COLOR, \
182 DEF_FDEC, DEF_BRIGHT, DEF_CONTRAST, DEF_SATURATION, \
183 DEF_HUE, 0, DEF_USB_BLOCK, 0}
185 struct s2255_dmaqueue
{
186 struct list_head active
;
187 struct s2255_dev
*dev
;
191 /* for firmware loading, fw_state */
192 #define S2255_FW_NOTLOADED 0
193 #define S2255_FW_LOADED_DSPWAIT 1
194 #define S2255_FW_SUCCESS 2
195 #define S2255_FW_FAILED 3
196 #define S2255_FW_DISCONNECTING 4
198 #define S2255_FW_MARKER cpu_to_le32(0x22552f2f)
199 /* 2255 read states */
200 #define S2255_READ_IDLE 0
201 #define S2255_READ_FRAME 1
208 wait_queue_head_t wait_fw
;
209 const struct firmware
*fw
;
212 struct s2255_pipeinfo
{
213 u32 max_transfer_size
;
214 u32 cur_transfer_size
;
218 void *dev
; /* back pointer to s2255_dev struct*/
223 struct s2255_fmt
; /*forward declaration */
227 int users
[MAX_CHANNELS
];
229 struct mutex open_lock
;
230 int resources
[MAX_CHANNELS
];
231 struct usb_device
*udev
;
232 struct usb_interface
*interface
;
235 struct s2255_dmaqueue vidq
[MAX_CHANNELS
];
236 struct video_device
*vdev
[MAX_CHANNELS
];
237 struct timer_list timer
;
238 struct s2255_fw
*fw_data
;
239 struct s2255_pipeinfo pipes
[MAX_PIPE_BUFFERS
];
240 struct s2255_bufferi buffer
[MAX_CHANNELS
];
241 struct s2255_mode mode
[MAX_CHANNELS
];
242 /* jpeg compression */
243 struct v4l2_jpegcompression jc
[MAX_CHANNELS
];
244 /* capture parameters (for high quality mode full size) */
245 struct v4l2_captureparm cap_parm
[MAX_CHANNELS
];
246 const struct s2255_fmt
*cur_fmt
[MAX_CHANNELS
];
247 int cur_frame
[MAX_CHANNELS
];
248 int last_frame
[MAX_CHANNELS
];
249 u32 cc
; /* current channel */
250 int b_acquire
[MAX_CHANNELS
];
251 /* allocated image size */
252 unsigned long req_image_size
[MAX_CHANNELS
];
253 /* received packet size */
254 unsigned long pkt_size
[MAX_CHANNELS
];
255 int bad_payload
[MAX_CHANNELS
];
256 unsigned long frame_count
[MAX_CHANNELS
];
259 int jpg_size
[MAX_CHANNELS
];
260 /* if channel configured to default state */
261 int chn_configured
[MAX_CHANNELS
];
262 wait_queue_head_t wait_setmode
[MAX_CHANNELS
];
263 int setmode_ready
[MAX_CHANNELS
];
268 #define to_s2255_dev(d) container_of(d, struct s2255_dev, kref)
276 /* buffer for one video frame */
277 struct s2255_buffer
{
278 /* common v4l buffer stuff -- must be first */
279 struct videobuf_buffer vb
;
280 const struct s2255_fmt
*fmt
;
284 struct s2255_dev
*dev
;
285 const struct s2255_fmt
*fmt
;
288 struct videobuf_queue vb_vidq
;
289 enum v4l2_buf_type type
;
291 /* mode below is the desired mode.
292 mode in s2255_dev is the current mode that was last set */
293 struct s2255_mode mode
;
294 int resources
[MAX_CHANNELS
];
297 /* current cypress EEPROM firmware version */
298 #define S2255_CUR_USB_FWVER ((3 << 8) | 6)
299 #define S2255_MAJOR_VERSION 1
300 #define S2255_MINOR_VERSION 14
301 #define S2255_RELEASE 0
302 #define S2255_VERSION KERNEL_VERSION(S2255_MAJOR_VERSION, \
303 S2255_MINOR_VERSION, \
307 #define USB_S2255_VENDOR_ID 0x1943
308 #define USB_S2255_PRODUCT_ID 0x2255
309 #define S2255_NORMS (V4L2_STD_PAL | V4L2_STD_NTSC)
310 /* frame prefix size (sent once every frame) */
311 #define PREFIX_SIZE 512
313 /* Channels on box are in reverse order */
314 static unsigned long G_chnmap
[MAX_CHANNELS
] = {3, 2, 1, 0};
317 static int *s2255_debug
= &debug
;
319 static int s2255_start_readpipe(struct s2255_dev
*dev
);
320 static void s2255_stop_readpipe(struct s2255_dev
*dev
);
321 static int s2255_start_acquire(struct s2255_dev
*dev
, unsigned long chn
);
322 static int s2255_stop_acquire(struct s2255_dev
*dev
, unsigned long chn
);
323 static void s2255_fillbuff(struct s2255_dev
*dev
, struct s2255_buffer
*buf
,
324 int chn
, int jpgsize
);
325 static int s2255_set_mode(struct s2255_dev
*dev
, unsigned long chn
,
326 struct s2255_mode
*mode
);
327 static int s2255_board_shutdown(struct s2255_dev
*dev
);
328 static void s2255_exit_v4l(struct s2255_dev
*dev
);
329 static void s2255_fwload_start(struct s2255_dev
*dev
, int reset
);
330 static void s2255_destroy(struct kref
*kref
);
331 static long s2255_vendor_req(struct s2255_dev
*dev
, unsigned char req
,
332 u16 index
, u16 value
, void *buf
,
333 s32 buf_len
, int bOut
);
335 /* dev_err macro with driver name */
336 #define S2255_DRIVER_NAME "s2255"
337 #define s2255_dev_err(dev, fmt, arg...) \
338 dev_err(dev, S2255_DRIVER_NAME " - " fmt, ##arg)
340 #define dprintk(level, fmt, arg...) \
342 if (*s2255_debug >= (level)) { \
343 printk(KERN_DEBUG S2255_DRIVER_NAME \
348 static struct usb_driver s2255_driver
;
351 /* Declare static vars that will be used as parameters */
352 static unsigned int vid_limit
= 16; /* Video memory limit, in Mb */
354 /* start video number */
355 static int video_nr
= -1; /* /dev/videoN, -1 for autodetect */
357 module_param(debug
, int, 0644);
358 MODULE_PARM_DESC(debug
, "Debug level(0-100) default 0");
359 module_param(vid_limit
, int, 0644);
360 MODULE_PARM_DESC(vid_limit
, "video memory limit(Mb)");
361 module_param(video_nr
, int, 0644);
362 MODULE_PARM_DESC(video_nr
, "start video minor(-1 default autodetect)");
364 /* USB device table */
365 static struct usb_device_id s2255_table
[] = {
366 {USB_DEVICE(USB_S2255_VENDOR_ID
, USB_S2255_PRODUCT_ID
)},
367 { } /* Terminating entry */
369 MODULE_DEVICE_TABLE(usb
, s2255_table
);
372 #define BUFFER_TIMEOUT msecs_to_jiffies(400)
374 /* supported controls */
375 static struct v4l2_queryctrl s2255_qctrl
[] = {
377 .id
= V4L2_CID_BRIGHTNESS
,
378 .type
= V4L2_CTRL_TYPE_INTEGER
,
379 .name
= "Brightness",
386 .id
= V4L2_CID_CONTRAST
,
387 .type
= V4L2_CTRL_TYPE_INTEGER
,
392 .default_value
= DEF_CONTRAST
,
395 .id
= V4L2_CID_SATURATION
,
396 .type
= V4L2_CTRL_TYPE_INTEGER
,
397 .name
= "Saturation",
401 .default_value
= DEF_SATURATION
,
405 .type
= V4L2_CTRL_TYPE_INTEGER
,
410 .default_value
= DEF_HUE
,
415 static int qctl_regs
[ARRAY_SIZE(s2255_qctrl
)];
418 static const struct s2255_fmt formats
[] = {
420 .name
= "4:2:2, planar, YUV422P",
421 .fourcc
= V4L2_PIX_FMT_YUV422P
,
425 .name
= "4:2:2, packed, YUYV",
426 .fourcc
= V4L2_PIX_FMT_YUYV
,
430 .name
= "4:2:2, packed, UYVY",
431 .fourcc
= V4L2_PIX_FMT_UYVY
,
435 .fourcc
= V4L2_PIX_FMT_JPEG
,
439 .fourcc
= V4L2_PIX_FMT_GREY
,
444 static int norm_maxw(struct video_device
*vdev
)
446 return (vdev
->current_norm
& V4L2_STD_NTSC
) ?
447 LINE_SZ_4CIFS_NTSC
: LINE_SZ_4CIFS_PAL
;
450 static int norm_maxh(struct video_device
*vdev
)
452 return (vdev
->current_norm
& V4L2_STD_NTSC
) ?
453 (NUM_LINES_1CIFS_NTSC
* 2) : (NUM_LINES_1CIFS_PAL
* 2);
456 static int norm_minw(struct video_device
*vdev
)
458 return (vdev
->current_norm
& V4L2_STD_NTSC
) ?
459 LINE_SZ_1CIFS_NTSC
: LINE_SZ_1CIFS_PAL
;
462 static int norm_minh(struct video_device
*vdev
)
464 return (vdev
->current_norm
& V4L2_STD_NTSC
) ?
465 (NUM_LINES_1CIFS_NTSC
) : (NUM_LINES_1CIFS_PAL
);
470 * TODO: fixme: move YUV reordering to hardware
471 * converts 2255 planar format to yuyv or uyvy
473 static void planar422p_to_yuv_packed(const unsigned char *in
,
475 int width
, int height
,
481 unsigned long size
= height
* width
;
483 pY
= (unsigned char *)in
;
484 pCr
= (unsigned char *)in
+ height
* width
;
485 pCb
= (unsigned char *)in
+ height
* width
+ (height
* width
/ 2);
486 for (i
= 0; i
< size
* 2; i
+= 4) {
487 out
[i
] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pY
++ : *pCr
++;
488 out
[i
+ 1] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pCr
++ : *pY
++;
489 out
[i
+ 2] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pY
++ : *pCb
++;
490 out
[i
+ 3] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pCb
++ : *pY
++;
495 static void s2255_reset_dsppower(struct s2255_dev
*dev
)
497 s2255_vendor_req(dev
, 0x40, 0x0b0b, 0x0b0b, NULL
, 0, 1);
499 s2255_vendor_req(dev
, 0x50, 0x0000, 0x0000, NULL
, 0, 1);
503 /* kickstarts the firmware loading. from probe
505 static void s2255_timer(unsigned long user_data
)
507 struct s2255_fw
*data
= (struct s2255_fw
*)user_data
;
508 dprintk(100, "s2255 timer\n");
509 if (usb_submit_urb(data
->fw_urb
, GFP_ATOMIC
) < 0) {
510 printk(KERN_ERR
"s2255: can't submit urb\n");
511 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
512 /* wake up anything waiting for the firmware */
513 wake_up(&data
->wait_fw
);
519 /* this loads the firmware asynchronously.
520 Originally this was done synchroously in probe.
521 But it is better to load it asynchronously here than block
522 inside the probe function. Blocking inside probe affects boot time.
523 FW loading is triggered by the timer in the probe function
525 static void s2255_fwchunk_complete(struct urb
*urb
)
527 struct s2255_fw
*data
= urb
->context
;
528 struct usb_device
*udev
= urb
->dev
;
530 dprintk(100, "udev %p urb %p", udev
, urb
);
532 dev_err(&udev
->dev
, "URB failed with status %d\n", urb
->status
);
533 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
534 /* wake up anything waiting for the firmware */
535 wake_up(&data
->wait_fw
);
538 if (data
->fw_urb
== NULL
) {
539 s2255_dev_err(&udev
->dev
, "disconnected\n");
540 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
541 /* wake up anything waiting for the firmware */
542 wake_up(&data
->wait_fw
);
545 #define CHUNK_SIZE 512
546 /* all USB transfers must be done with continuous kernel memory.
547 can't allocate more than 128k in current linux kernel, so
548 upload the firmware in chunks
550 if (data
->fw_loaded
< data
->fw_size
) {
551 len
= (data
->fw_loaded
+ CHUNK_SIZE
) > data
->fw_size
?
552 data
->fw_size
% CHUNK_SIZE
: CHUNK_SIZE
;
554 if (len
< CHUNK_SIZE
)
555 memset(data
->pfw_data
, 0, CHUNK_SIZE
);
557 dprintk(100, "completed len %d, loaded %d \n", len
,
560 memcpy(data
->pfw_data
,
561 (char *) data
->fw
->data
+ data
->fw_loaded
, len
);
563 usb_fill_bulk_urb(data
->fw_urb
, udev
, usb_sndbulkpipe(udev
, 2),
564 data
->pfw_data
, CHUNK_SIZE
,
565 s2255_fwchunk_complete
, data
);
566 if (usb_submit_urb(data
->fw_urb
, GFP_ATOMIC
) < 0) {
567 dev_err(&udev
->dev
, "failed submit URB\n");
568 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
569 /* wake up anything waiting for the firmware */
570 wake_up(&data
->wait_fw
);
573 data
->fw_loaded
+= len
;
575 atomic_set(&data
->fw_state
, S2255_FW_LOADED_DSPWAIT
);
577 dprintk(100, "2255 complete done\n");
582 static int s2255_got_frame(struct s2255_dev
*dev
, int chn
, int jpgsize
)
584 struct s2255_dmaqueue
*dma_q
= &dev
->vidq
[chn
];
585 struct s2255_buffer
*buf
;
586 unsigned long flags
= 0;
588 dprintk(2, "wakeup: %p channel: %d\n", &dma_q
, chn
);
589 spin_lock_irqsave(&dev
->slock
, flags
);
591 if (list_empty(&dma_q
->active
)) {
592 dprintk(1, "No active queue to serve\n");
596 buf
= list_entry(dma_q
->active
.next
,
597 struct s2255_buffer
, vb
.queue
);
599 list_del(&buf
->vb
.queue
);
600 do_gettimeofday(&buf
->vb
.ts
);
601 dprintk(100, "[%p/%d] wakeup\n", buf
, buf
->vb
.i
);
602 s2255_fillbuff(dev
, buf
, dma_q
->channel
, jpgsize
);
603 wake_up(&buf
->vb
.done
);
604 dprintk(2, "wakeup [buf/i] [%p/%d]\n", buf
, buf
->vb
.i
);
606 spin_unlock_irqrestore(&dev
->slock
, flags
);
611 static const struct s2255_fmt
*format_by_fourcc(int fourcc
)
615 for (i
= 0; i
< ARRAY_SIZE(formats
); i
++) {
616 if (-1 == formats
[i
].fourcc
)
618 if (formats
[i
].fourcc
== fourcc
)
627 /* video buffer vmalloc implementation based partly on VIVI driver which is
628 * Copyright (c) 2006 by
629 * Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
630 * Ted Walther <ted--a.t--enumera.com>
631 * John Sokol <sokol--a.t--videotechnology.com>
632 * http://v4l.videotechnology.com/
635 static void s2255_fillbuff(struct s2255_dev
*dev
, struct s2255_buffer
*buf
,
636 int chn
, int jpgsize
)
641 char *vbuf
= videobuf_to_vmalloc(&buf
->vb
);
642 unsigned long last_frame
;
643 struct s2255_framei
*frm
;
648 last_frame
= dev
->last_frame
[chn
];
649 if (last_frame
!= -1) {
650 frm
= &dev
->buffer
[chn
].frame
[last_frame
];
652 (const char *)dev
->buffer
[chn
].frame
[last_frame
].lpvbits
;
653 switch (buf
->fmt
->fourcc
) {
654 case V4L2_PIX_FMT_YUYV
:
655 case V4L2_PIX_FMT_UYVY
:
656 planar422p_to_yuv_packed((const unsigned char *)tmpbuf
,
661 case V4L2_PIX_FMT_GREY
:
662 memcpy(vbuf
, tmpbuf
, buf
->vb
.width
* buf
->vb
.height
);
664 case V4L2_PIX_FMT_JPEG
:
665 buf
->vb
.size
= jpgsize
;
666 memcpy(vbuf
, tmpbuf
, buf
->vb
.size
);
668 case V4L2_PIX_FMT_YUV422P
:
670 buf
->vb
.width
* buf
->vb
.height
* 2);
673 printk(KERN_DEBUG
"s2255: unknown format?\n");
675 dev
->last_frame
[chn
] = -1;
677 printk(KERN_ERR
"s2255: =======no frame\n");
681 dprintk(2, "s2255fill at : Buffer 0x%08lx size= %d\n",
682 (unsigned long)vbuf
, pos
);
683 /* tell v4l buffer was filled */
685 buf
->vb
.field_count
= dev
->frame_count
[chn
] * 2;
686 do_gettimeofday(&ts
);
688 buf
->vb
.state
= VIDEOBUF_DONE
;
692 /* ------------------------------------------------------------------
694 ------------------------------------------------------------------*/
696 static int buffer_setup(struct videobuf_queue
*vq
, unsigned int *count
,
699 struct s2255_fh
*fh
= vq
->priv_data
;
701 *size
= fh
->width
* fh
->height
* (fh
->fmt
->depth
>> 3);
704 *count
= S2255_DEF_BUFS
;
706 while (*size
* (*count
) > vid_limit
* 1024 * 1024)
712 static void free_buffer(struct videobuf_queue
*vq
, struct s2255_buffer
*buf
)
714 dprintk(4, "%s\n", __func__
);
716 videobuf_vmalloc_free(&buf
->vb
);
717 buf
->vb
.state
= VIDEOBUF_NEEDS_INIT
;
720 static int buffer_prepare(struct videobuf_queue
*vq
, struct videobuf_buffer
*vb
,
721 enum v4l2_field field
)
723 struct s2255_fh
*fh
= vq
->priv_data
;
724 struct s2255_buffer
*buf
= container_of(vb
, struct s2255_buffer
, vb
);
726 dprintk(4, "%s, field=%d\n", __func__
, field
);
730 if ((fh
->width
< norm_minw(fh
->dev
->vdev
[fh
->channel
])) ||
731 (fh
->width
> norm_maxw(fh
->dev
->vdev
[fh
->channel
])) ||
732 (fh
->height
< norm_minh(fh
->dev
->vdev
[fh
->channel
])) ||
733 (fh
->height
> norm_maxh(fh
->dev
->vdev
[fh
->channel
]))) {
734 dprintk(4, "invalid buffer prepare\n");
738 buf
->vb
.size
= fh
->width
* fh
->height
* (fh
->fmt
->depth
>> 3);
740 if (0 != buf
->vb
.baddr
&& buf
->vb
.bsize
< buf
->vb
.size
) {
741 dprintk(4, "invalid buffer prepare\n");
746 buf
->vb
.width
= fh
->width
;
747 buf
->vb
.height
= fh
->height
;
748 buf
->vb
.field
= field
;
751 if (VIDEOBUF_NEEDS_INIT
== buf
->vb
.state
) {
752 rc
= videobuf_iolock(vq
, &buf
->vb
, NULL
);
757 buf
->vb
.state
= VIDEOBUF_PREPARED
;
760 free_buffer(vq
, buf
);
764 static void buffer_queue(struct videobuf_queue
*vq
, struct videobuf_buffer
*vb
)
766 struct s2255_buffer
*buf
= container_of(vb
, struct s2255_buffer
, vb
);
767 struct s2255_fh
*fh
= vq
->priv_data
;
768 struct s2255_dev
*dev
= fh
->dev
;
769 struct s2255_dmaqueue
*vidq
= &dev
->vidq
[fh
->channel
];
771 dprintk(1, "%s\n", __func__
);
773 buf
->vb
.state
= VIDEOBUF_QUEUED
;
774 list_add_tail(&buf
->vb
.queue
, &vidq
->active
);
777 static void buffer_release(struct videobuf_queue
*vq
,
778 struct videobuf_buffer
*vb
)
780 struct s2255_buffer
*buf
= container_of(vb
, struct s2255_buffer
, vb
);
781 struct s2255_fh
*fh
= vq
->priv_data
;
782 dprintk(4, "%s %d\n", __func__
, fh
->channel
);
783 free_buffer(vq
, buf
);
786 static struct videobuf_queue_ops s2255_video_qops
= {
787 .buf_setup
= buffer_setup
,
788 .buf_prepare
= buffer_prepare
,
789 .buf_queue
= buffer_queue
,
790 .buf_release
= buffer_release
,
794 static int res_get(struct s2255_dev
*dev
, struct s2255_fh
*fh
)
797 mutex_lock(&dev
->lock
);
798 if (dev
->resources
[fh
->channel
]) {
799 /* no, someone else uses it */
800 mutex_unlock(&dev
->lock
);
803 /* it's free, grab it */
804 dev
->resources
[fh
->channel
] = 1;
805 fh
->resources
[fh
->channel
] = 1;
806 dprintk(1, "s2255: res: get\n");
807 mutex_unlock(&dev
->lock
);
811 static int res_locked(struct s2255_dev
*dev
, struct s2255_fh
*fh
)
813 return dev
->resources
[fh
->channel
];
816 static int res_check(struct s2255_fh
*fh
)
818 return fh
->resources
[fh
->channel
];
822 static void res_free(struct s2255_dev
*dev
, struct s2255_fh
*fh
)
824 mutex_lock(&dev
->lock
);
825 dev
->resources
[fh
->channel
] = 0;
826 fh
->resources
[fh
->channel
] = 0;
827 mutex_unlock(&dev
->lock
);
828 dprintk(1, "res: put\n");
832 static int vidioc_querycap(struct file
*file
, void *priv
,
833 struct v4l2_capability
*cap
)
835 struct s2255_fh
*fh
= file
->private_data
;
836 struct s2255_dev
*dev
= fh
->dev
;
837 strlcpy(cap
->driver
, "s2255", sizeof(cap
->driver
));
838 strlcpy(cap
->card
, "s2255", sizeof(cap
->card
));
839 usb_make_path(dev
->udev
, cap
->bus_info
, sizeof(cap
->bus_info
));
840 cap
->version
= S2255_VERSION
;
841 cap
->capabilities
= V4L2_CAP_VIDEO_CAPTURE
| V4L2_CAP_STREAMING
;
845 static int vidioc_enum_fmt_vid_cap(struct file
*file
, void *priv
,
846 struct v4l2_fmtdesc
*f
)
852 if (index
>= ARRAY_SIZE(formats
))
855 dprintk(4, "name %s\n", formats
[index
].name
);
856 strlcpy(f
->description
, formats
[index
].name
, sizeof(f
->description
));
857 f
->pixelformat
= formats
[index
].fourcc
;
861 static int vidioc_g_fmt_vid_cap(struct file
*file
, void *priv
,
862 struct v4l2_format
*f
)
864 struct s2255_fh
*fh
= priv
;
866 f
->fmt
.pix
.width
= fh
->width
;
867 f
->fmt
.pix
.height
= fh
->height
;
868 f
->fmt
.pix
.field
= fh
->vb_vidq
.field
;
869 f
->fmt
.pix
.pixelformat
= fh
->fmt
->fourcc
;
870 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
* (fh
->fmt
->depth
>> 3);
871 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
875 static int vidioc_try_fmt_vid_cap(struct file
*file
, void *priv
,
876 struct v4l2_format
*f
)
878 const struct s2255_fmt
*fmt
;
879 enum v4l2_field field
;
881 struct s2255_fh
*fh
= priv
;
882 struct s2255_dev
*dev
= fh
->dev
;
886 (dev
->vdev
[fh
->channel
]->current_norm
& V4L2_STD_NTSC
) ? 1 : 0;
888 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
893 field
= f
->fmt
.pix
.field
;
894 if (field
== V4L2_FIELD_ANY
)
897 dprintk(4, "try format %d \n", is_ntsc
);
898 /* supports 3 sizes. see s2255drv.h */
899 dprintk(50, "width test %d, height %d\n",
900 f
->fmt
.pix
.width
, f
->fmt
.pix
.height
);
903 if (f
->fmt
.pix
.height
>= NUM_LINES_1CIFS_NTSC
* 2) {
904 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_NTSC
* 2;
906 field
= V4L2_FIELD_SEQ_TB
;
907 } else if (!((field
== V4L2_FIELD_INTERLACED
) ||
908 (field
== V4L2_FIELD_SEQ_TB
) ||
909 (field
== V4L2_FIELD_INTERLACED_TB
))) {
910 dprintk(1, "unsupported field setting\n");
914 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_NTSC
;
916 field
= V4L2_FIELD_TOP
;
917 } else if (!((field
== V4L2_FIELD_TOP
) ||
918 (field
== V4L2_FIELD_BOTTOM
))) {
919 dprintk(1, "unsupported field setting\n");
924 if (f
->fmt
.pix
.width
>= LINE_SZ_4CIFS_NTSC
)
925 f
->fmt
.pix
.width
= LINE_SZ_4CIFS_NTSC
;
926 else if (f
->fmt
.pix
.width
>= LINE_SZ_2CIFS_NTSC
)
927 f
->fmt
.pix
.width
= LINE_SZ_2CIFS_NTSC
;
928 else if (f
->fmt
.pix
.width
>= LINE_SZ_1CIFS_NTSC
)
929 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_NTSC
;
931 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_NTSC
;
934 if (f
->fmt
.pix
.height
>= NUM_LINES_1CIFS_PAL
* 2) {
935 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_PAL
* 2;
937 field
= V4L2_FIELD_SEQ_TB
;
938 } else if (!((field
== V4L2_FIELD_INTERLACED
) ||
939 (field
== V4L2_FIELD_SEQ_TB
) ||
940 (field
== V4L2_FIELD_INTERLACED_TB
))) {
941 dprintk(1, "unsupported field setting\n");
945 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_PAL
;
947 field
= V4L2_FIELD_TOP
;
948 } else if (!((field
== V4L2_FIELD_TOP
) ||
949 (field
== V4L2_FIELD_BOTTOM
))) {
950 dprintk(1, "unsupported field setting\n");
954 if (f
->fmt
.pix
.width
>= LINE_SZ_4CIFS_PAL
) {
955 dprintk(50, "pal 704\n");
956 f
->fmt
.pix
.width
= LINE_SZ_4CIFS_PAL
;
957 field
= V4L2_FIELD_SEQ_TB
;
958 } else if (f
->fmt
.pix
.width
>= LINE_SZ_2CIFS_PAL
) {
959 dprintk(50, "pal 352A\n");
960 f
->fmt
.pix
.width
= LINE_SZ_2CIFS_PAL
;
961 field
= V4L2_FIELD_TOP
;
962 } else if (f
->fmt
.pix
.width
>= LINE_SZ_1CIFS_PAL
) {
963 dprintk(50, "pal 352B\n");
964 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_PAL
;
965 field
= V4L2_FIELD_TOP
;
967 dprintk(50, "pal 352C\n");
968 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_PAL
;
969 field
= V4L2_FIELD_TOP
;
973 dprintk(50, "width %d height %d field %d \n", f
->fmt
.pix
.width
,
974 f
->fmt
.pix
.height
, f
->fmt
.pix
.field
);
975 f
->fmt
.pix
.field
= field
;
976 f
->fmt
.pix
.bytesperline
= (f
->fmt
.pix
.width
* fmt
->depth
) >> 3;
977 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
981 static int vidioc_s_fmt_vid_cap(struct file
*file
, void *priv
,
982 struct v4l2_format
*f
)
984 struct s2255_fh
*fh
= priv
;
985 const struct s2255_fmt
*fmt
;
986 struct videobuf_queue
*q
= &fh
->vb_vidq
;
990 ret
= vidioc_try_fmt_vid_cap(file
, fh
, f
);
995 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
1000 mutex_lock(&q
->vb_lock
);
1002 if (videobuf_queue_is_busy(&fh
->vb_vidq
)) {
1003 dprintk(1, "queue busy\n");
1008 if (res_locked(fh
->dev
, fh
)) {
1009 dprintk(1, "can't change format after started\n");
1015 fh
->width
= f
->fmt
.pix
.width
;
1016 fh
->height
= f
->fmt
.pix
.height
;
1017 fh
->vb_vidq
.field
= f
->fmt
.pix
.field
;
1019 norm
= norm_minw(fh
->dev
->vdev
[fh
->channel
]);
1020 if (fh
->width
> norm_minw(fh
->dev
->vdev
[fh
->channel
])) {
1021 if (fh
->height
> norm_minh(fh
->dev
->vdev
[fh
->channel
])) {
1022 if (fh
->dev
->cap_parm
[fh
->channel
].capturemode
&
1023 V4L2_MODE_HIGHQUALITY
) {
1024 fh
->mode
.scale
= SCALE_4CIFSI
;
1025 dprintk(2, "scale 4CIFSI\n");
1027 fh
->mode
.scale
= SCALE_4CIFS
;
1028 dprintk(2, "scale 4CIFS\n");
1031 fh
->mode
.scale
= SCALE_2CIFS
;
1034 fh
->mode
.scale
= SCALE_1CIFS
;
1038 switch (fh
->fmt
->fourcc
) {
1039 case V4L2_PIX_FMT_GREY
:
1040 fh
->mode
.color
= COLOR_Y8
;
1042 case V4L2_PIX_FMT_JPEG
:
1043 fh
->mode
.color
= COLOR_JPG
|
1044 (fh
->dev
->jc
[fh
->channel
].quality
<< 8);
1046 case V4L2_PIX_FMT_YUV422P
:
1047 fh
->mode
.color
= COLOR_YUVPL
;
1049 case V4L2_PIX_FMT_YUYV
:
1050 case V4L2_PIX_FMT_UYVY
:
1052 fh
->mode
.color
= COLOR_YUVPK
;
1057 mutex_unlock(&q
->vb_lock
);
1061 static int vidioc_reqbufs(struct file
*file
, void *priv
,
1062 struct v4l2_requestbuffers
*p
)
1065 struct s2255_fh
*fh
= priv
;
1066 rc
= videobuf_reqbufs(&fh
->vb_vidq
, p
);
1070 static int vidioc_querybuf(struct file
*file
, void *priv
, struct v4l2_buffer
*p
)
1073 struct s2255_fh
*fh
= priv
;
1074 rc
= videobuf_querybuf(&fh
->vb_vidq
, p
);
1078 static int vidioc_qbuf(struct file
*file
, void *priv
, struct v4l2_buffer
*p
)
1081 struct s2255_fh
*fh
= priv
;
1082 rc
= videobuf_qbuf(&fh
->vb_vidq
, p
);
1086 static int vidioc_dqbuf(struct file
*file
, void *priv
, struct v4l2_buffer
*p
)
1089 struct s2255_fh
*fh
= priv
;
1090 rc
= videobuf_dqbuf(&fh
->vb_vidq
, p
, file
->f_flags
& O_NONBLOCK
);
1094 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1095 static int vidioc_cgmbuf(struct file
*file
, void *priv
, struct video_mbuf
*mbuf
)
1097 struct s2255_fh
*fh
= priv
;
1099 return videobuf_cgmbuf(&fh
->vb_vidq
, mbuf
, 8);
1103 /* write to the configuration pipe, synchronously */
1104 static int s2255_write_config(struct usb_device
*udev
, unsigned char *pbuf
,
1111 pipe
= usb_sndbulkpipe(udev
, S2255_CONFIG_EP
);
1112 retval
= usb_bulk_msg(udev
, pipe
, pbuf
, size
, &done
, 500);
1117 static u32
get_transfer_size(struct s2255_mode
*mode
)
1119 int linesPerFrame
= LINE_SZ_DEF
;
1120 int pixelsPerLine
= NUM_LINES_DEF
;
1123 unsigned int mask_mult
;
1128 if (mode
->format
== FORMAT_NTSC
) {
1129 switch (mode
->scale
) {
1132 linesPerFrame
= NUM_LINES_4CIFS_NTSC
* 2;
1133 pixelsPerLine
= LINE_SZ_4CIFS_NTSC
;
1136 linesPerFrame
= NUM_LINES_2CIFS_NTSC
;
1137 pixelsPerLine
= LINE_SZ_2CIFS_NTSC
;
1140 linesPerFrame
= NUM_LINES_1CIFS_NTSC
;
1141 pixelsPerLine
= LINE_SZ_1CIFS_NTSC
;
1146 } else if (mode
->format
== FORMAT_PAL
) {
1147 switch (mode
->scale
) {
1150 linesPerFrame
= NUM_LINES_4CIFS_PAL
* 2;
1151 pixelsPerLine
= LINE_SZ_4CIFS_PAL
;
1154 linesPerFrame
= NUM_LINES_2CIFS_PAL
;
1155 pixelsPerLine
= LINE_SZ_2CIFS_PAL
;
1158 linesPerFrame
= NUM_LINES_1CIFS_PAL
;
1159 pixelsPerLine
= LINE_SZ_1CIFS_PAL
;
1165 outImageSize
= linesPerFrame
* pixelsPerLine
;
1166 if ((mode
->color
& MASK_COLOR
) != COLOR_Y8
) {
1167 /* 2 bytes/pixel if not monochrome */
1171 /* total bytes to send including prefix and 4K padding;
1172 must be a multiple of USB_READ_SIZE */
1173 usbInSize
= outImageSize
+ PREFIX_SIZE
; /* always send prefix */
1174 mask_mult
= 0xffffffffUL
- DEF_USB_BLOCK
+ 1;
1175 /* if size not a multiple of USB_READ_SIZE */
1176 if (usbInSize
& ~mask_mult
)
1177 usbInSize
= (usbInSize
& mask_mult
) + (DEF_USB_BLOCK
);
1181 static void dump_verify_mode(struct s2255_dev
*sdev
, struct s2255_mode
*mode
)
1183 struct device
*dev
= &sdev
->udev
->dev
;
1184 dev_info(dev
, "------------------------------------------------\n");
1185 dev_info(dev
, "verify mode\n");
1186 dev_info(dev
, "format: %d\n", mode
->format
);
1187 dev_info(dev
, "scale: %d\n", mode
->scale
);
1188 dev_info(dev
, "fdec: %d\n", mode
->fdec
);
1189 dev_info(dev
, "color: %d\n", mode
->color
);
1190 dev_info(dev
, "bright: 0x%x\n", mode
->bright
);
1191 dev_info(dev
, "restart: 0x%x\n", mode
->restart
);
1192 dev_info(dev
, "usb_block: 0x%x\n", mode
->usb_block
);
1193 dev_info(dev
, "single: 0x%x\n", mode
->single
);
1194 dev_info(dev
, "------------------------------------------------\n");
1198 * set mode is the function which controls the DSP.
1199 * the restart parameter in struct s2255_mode should be set whenever
1200 * the image size could change via color format, video system or image
1202 * When the restart parameter is set, we sleep for ONE frame to allow the
1203 * DSP time to get the new frame
1205 static int s2255_set_mode(struct s2255_dev
*dev
, unsigned long chn
,
1206 struct s2255_mode
*mode
)
1210 unsigned long chn_rev
;
1212 mutex_lock(&dev
->lock
);
1213 chn_rev
= G_chnmap
[chn
];
1214 dprintk(3, "mode scale [%ld] %p %d\n", chn
, mode
, mode
->scale
);
1215 dprintk(3, "mode scale [%ld] %p %d\n", chn
, &dev
->mode
[chn
],
1216 dev
->mode
[chn
].scale
);
1217 dprintk(2, "mode contrast %x\n", mode
->contrast
);
1219 /* if JPEG, set the quality */
1220 if ((mode
->color
& MASK_COLOR
) == COLOR_JPG
)
1221 mode
->color
= (dev
->jc
[chn
].quality
<< 8) | COLOR_JPG
;
1224 dev
->mode
[chn
] = *mode
;
1225 dev
->req_image_size
[chn
] = get_transfer_size(mode
);
1226 dprintk(1, "transfer size %ld\n", dev
->req_image_size
[chn
]);
1228 buffer
= kzalloc(512, GFP_KERNEL
);
1229 if (buffer
== NULL
) {
1230 dev_err(&dev
->udev
->dev
, "out of mem\n");
1231 mutex_unlock(&dev
->lock
);
1236 buffer
[0] = IN_DATA_TOKEN
;
1237 buffer
[1] = (u32
) chn_rev
;
1238 buffer
[2] = CMD_SET_MODE
;
1239 memcpy(&buffer
[3], &dev
->mode
[chn
], sizeof(struct s2255_mode
));
1240 dev
->setmode_ready
[chn
] = 0;
1241 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
1243 dump_verify_mode(dev
, mode
);
1245 dprintk(1, "set mode done chn %lu, %d\n", chn
, res
);
1247 /* wait at least 3 frames before continuing */
1248 if (mode
->restart
) {
1249 wait_event_timeout(dev
->wait_setmode
[chn
],
1250 (dev
->setmode_ready
[chn
] != 0),
1251 msecs_to_jiffies(S2255_SETMODE_TIMEOUT
));
1252 if (dev
->setmode_ready
[chn
] != 1) {
1253 printk(KERN_DEBUG
"s2255: no set mode response\n");
1258 /* clear the restart flag */
1259 dev
->mode
[chn
].restart
= 0;
1260 mutex_unlock(&dev
->lock
);
1264 static int vidioc_streamon(struct file
*file
, void *priv
, enum v4l2_buf_type i
)
1267 struct s2255_fh
*fh
= priv
;
1268 struct s2255_dev
*dev
= fh
->dev
;
1269 struct s2255_mode
*new_mode
;
1270 struct s2255_mode
*old_mode
;
1273 dprintk(4, "%s\n", __func__
);
1274 if (fh
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
) {
1275 dev_err(&dev
->udev
->dev
, "invalid fh type0\n");
1278 if (i
!= fh
->type
) {
1279 dev_err(&dev
->udev
->dev
, "invalid fh type1\n");
1283 if (!res_get(dev
, fh
)) {
1284 s2255_dev_err(&dev
->udev
->dev
, "stream busy\n");
1288 /* send a set mode command everytime with restart.
1289 in case we switch resolutions or other parameters */
1291 new_mode
= &fh
->mode
;
1292 old_mode
= &fh
->dev
->mode
[chn
];
1294 if (new_mode
->color
!= old_mode
->color
)
1295 new_mode
->restart
= 1;
1296 else if (new_mode
->scale
!= old_mode
->scale
)
1297 new_mode
->restart
= 1;
1298 else if (new_mode
->format
!= old_mode
->format
)
1299 new_mode
->restart
= 1;
1301 s2255_set_mode(dev
, chn
, new_mode
);
1302 new_mode
->restart
= 0;
1303 *old_mode
= *new_mode
;
1304 dev
->cur_fmt
[chn
] = fh
->fmt
;
1305 dprintk(1, "%s[%d]\n", __func__
, chn
);
1306 dev
->last_frame
[chn
] = -1;
1307 dev
->bad_payload
[chn
] = 0;
1308 dev
->cur_frame
[chn
] = 0;
1309 dev
->frame_count
[chn
] = 0;
1310 for (j
= 0; j
< SYS_FRAMES
; j
++) {
1311 dev
->buffer
[chn
].frame
[j
].ulState
= S2255_READ_IDLE
;
1312 dev
->buffer
[chn
].frame
[j
].cur_size
= 0;
1314 res
= videobuf_streamon(&fh
->vb_vidq
);
1316 s2255_start_acquire(dev
, chn
);
1317 dev
->b_acquire
[chn
] = 1;
1324 static int vidioc_streamoff(struct file
*file
, void *priv
, enum v4l2_buf_type i
)
1326 struct s2255_fh
*fh
= priv
;
1327 struct s2255_dev
*dev
= fh
->dev
;
1329 dprintk(4, "%s\n, channel: %d", __func__
, fh
->channel
);
1330 if (fh
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
) {
1331 printk(KERN_ERR
"invalid fh type0\n");
1334 if (i
!= fh
->type
) {
1335 printk(KERN_ERR
"invalid type i\n");
1338 s2255_stop_acquire(dev
, fh
->channel
);
1339 videobuf_streamoff(&fh
->vb_vidq
);
1344 static int vidioc_s_std(struct file
*file
, void *priv
, v4l2_std_id
*i
)
1346 struct s2255_fh
*fh
= priv
;
1347 struct s2255_mode
*mode
;
1348 struct videobuf_queue
*q
= &fh
->vb_vidq
;
1351 mutex_lock(&q
->vb_lock
);
1352 if (videobuf_queue_is_busy(q
)) {
1353 dprintk(1, "queue busy\n");
1358 if (res_locked(fh
->dev
, fh
)) {
1359 dprintk(1, "can't change standard after started\n");
1365 if (*i
& V4L2_STD_NTSC
) {
1366 dprintk(4, "vidioc_s_std NTSC\n");
1367 mode
->format
= FORMAT_NTSC
;
1368 } else if (*i
& V4L2_STD_PAL
) {
1369 dprintk(4, "vidioc_s_std PAL\n");
1370 mode
->format
= FORMAT_PAL
;
1375 mutex_unlock(&q
->vb_lock
);
1379 /* Sensoray 2255 is a multiple channel capture device.
1380 It does not have a "crossbar" of inputs.
1381 We use one V4L device per channel. The user must
1382 be aware that certain combinations are not allowed.
1383 For instance, you cannot do full FPS on more than 2 channels(2 videodevs)
1384 at once in color(you can do full fps on 4 channels with greyscale.
1386 static int vidioc_enum_input(struct file
*file
, void *priv
,
1387 struct v4l2_input
*inp
)
1389 if (inp
->index
!= 0)
1392 inp
->type
= V4L2_INPUT_TYPE_CAMERA
;
1393 inp
->std
= S2255_NORMS
;
1394 strlcpy(inp
->name
, "Camera", sizeof(inp
->name
));
1398 static int vidioc_g_input(struct file
*file
, void *priv
, unsigned int *i
)
1403 static int vidioc_s_input(struct file
*file
, void *priv
, unsigned int i
)
1410 /* --- controls ---------------------------------------------- */
1411 static int vidioc_queryctrl(struct file
*file
, void *priv
,
1412 struct v4l2_queryctrl
*qc
)
1416 for (i
= 0; i
< ARRAY_SIZE(s2255_qctrl
); i
++)
1417 if (qc
->id
&& qc
->id
== s2255_qctrl
[i
].id
) {
1418 memcpy(qc
, &(s2255_qctrl
[i
]), sizeof(*qc
));
1422 dprintk(4, "query_ctrl -EINVAL %d\n", qc
->id
);
1426 static int vidioc_g_ctrl(struct file
*file
, void *priv
,
1427 struct v4l2_control
*ctrl
)
1431 for (i
= 0; i
< ARRAY_SIZE(s2255_qctrl
); i
++)
1432 if (ctrl
->id
== s2255_qctrl
[i
].id
) {
1433 ctrl
->value
= qctl_regs
[i
];
1436 dprintk(4, "g_ctrl -EINVAL\n");
1441 static int vidioc_s_ctrl(struct file
*file
, void *priv
,
1442 struct v4l2_control
*ctrl
)
1445 struct s2255_fh
*fh
= priv
;
1446 struct s2255_dev
*dev
= fh
->dev
;
1447 struct s2255_mode
*mode
;
1449 dprintk(4, "vidioc_s_ctrl\n");
1450 for (i
= 0; i
< ARRAY_SIZE(s2255_qctrl
); i
++) {
1451 if (ctrl
->id
== s2255_qctrl
[i
].id
) {
1452 if (ctrl
->value
< s2255_qctrl
[i
].minimum
||
1453 ctrl
->value
> s2255_qctrl
[i
].maximum
)
1456 qctl_regs
[i
] = ctrl
->value
;
1457 /* update the mode to the corresponding value */
1459 case V4L2_CID_BRIGHTNESS
:
1460 mode
->bright
= ctrl
->value
;
1462 case V4L2_CID_CONTRAST
:
1463 mode
->contrast
= ctrl
->value
;
1466 mode
->hue
= ctrl
->value
;
1468 case V4L2_CID_SATURATION
:
1469 mode
->saturation
= ctrl
->value
;
1473 /* set mode here. Note: stream does not need restarted.
1474 some V4L programs restart stream unnecessarily
1477 s2255_set_mode(dev
, fh
->channel
, mode
);
1484 static int vidioc_g_jpegcomp(struct file
*file
, void *priv
,
1485 struct v4l2_jpegcompression
*jc
)
1487 struct s2255_fh
*fh
= priv
;
1488 struct s2255_dev
*dev
= fh
->dev
;
1489 *jc
= dev
->jc
[fh
->channel
];
1490 dprintk(2, "getting jpegcompression, quality %d\n", jc
->quality
);
1494 static int vidioc_s_jpegcomp(struct file
*file
, void *priv
,
1495 struct v4l2_jpegcompression
*jc
)
1497 struct s2255_fh
*fh
= priv
;
1498 struct s2255_dev
*dev
= fh
->dev
;
1499 if (jc
->quality
< 0 || jc
->quality
> 100)
1501 dev
->jc
[fh
->channel
].quality
= jc
->quality
;
1502 dprintk(2, "setting jpeg quality %d\n", jc
->quality
);
1506 static int vidioc_g_parm(struct file
*file
, void *priv
,
1507 struct v4l2_streamparm
*sp
)
1509 struct s2255_fh
*fh
= priv
;
1510 struct s2255_dev
*dev
= fh
->dev
;
1511 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1513 sp
->parm
.capture
.capturemode
= dev
->cap_parm
[fh
->channel
].capturemode
;
1514 dprintk(2, "getting parm %d\n", sp
->parm
.capture
.capturemode
);
1518 static int vidioc_s_parm(struct file
*file
, void *priv
,
1519 struct v4l2_streamparm
*sp
)
1521 struct s2255_fh
*fh
= priv
;
1522 struct s2255_dev
*dev
= fh
->dev
;
1524 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1527 dev
->cap_parm
[fh
->channel
].capturemode
= sp
->parm
.capture
.capturemode
;
1528 dprintk(2, "setting param capture mode %d\n",
1529 sp
->parm
.capture
.capturemode
);
1532 static int s2255_open(struct file
*file
)
1534 struct video_device
*vdev
= video_devdata(file
);
1535 struct s2255_dev
*dev
= video_drvdata(file
);
1536 struct s2255_fh
*fh
;
1537 enum v4l2_buf_type type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1539 int cur_channel
= -1;
1542 dprintk(1, "s2255: open called (dev=%s)\n",
1543 video_device_node_name(vdev
));
1547 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
1548 if (dev
->vdev
[i
] == vdev
) {
1554 if (atomic_read(&dev
->fw_data
->fw_state
) == S2255_FW_DISCONNECTING
) {
1556 printk(KERN_INFO
"disconnecting\n");
1559 kref_get(&dev
->kref
);
1560 mutex_lock(&dev
->open_lock
);
1562 dev
->users
[cur_channel
]++;
1563 dprintk(4, "s2255: open_handles %d\n", dev
->users
[cur_channel
]);
1565 switch (atomic_read(&dev
->fw_data
->fw_state
)) {
1566 case S2255_FW_FAILED
:
1567 s2255_dev_err(&dev
->udev
->dev
,
1568 "firmware load failed. retrying.\n");
1569 s2255_fwload_start(dev
, 1);
1570 wait_event_timeout(dev
->fw_data
->wait_fw
,
1571 ((atomic_read(&dev
->fw_data
->fw_state
)
1572 == S2255_FW_SUCCESS
) ||
1573 (atomic_read(&dev
->fw_data
->fw_state
)
1574 == S2255_FW_DISCONNECTING
)),
1575 msecs_to_jiffies(S2255_LOAD_TIMEOUT
));
1577 case S2255_FW_NOTLOADED
:
1578 case S2255_FW_LOADED_DSPWAIT
:
1579 /* give S2255_LOAD_TIMEOUT time for firmware to load in case
1580 driver loaded and then device immediately opened */
1581 printk(KERN_INFO
"%s waiting for firmware load\n", __func__
);
1582 wait_event_timeout(dev
->fw_data
->wait_fw
,
1583 ((atomic_read(&dev
->fw_data
->fw_state
)
1584 == S2255_FW_SUCCESS
) ||
1585 (atomic_read(&dev
->fw_data
->fw_state
)
1586 == S2255_FW_DISCONNECTING
)),
1587 msecs_to_jiffies(S2255_LOAD_TIMEOUT
));
1589 case S2255_FW_SUCCESS
:
1593 state
= atomic_read(&dev
->fw_data
->fw_state
);
1594 if (state
!= S2255_FW_SUCCESS
) {
1597 case S2255_FW_FAILED
:
1598 printk(KERN_INFO
"2255 FW load failed. %d\n", state
);
1601 case S2255_FW_DISCONNECTING
:
1602 printk(KERN_INFO
"%s: disconnecting\n", __func__
);
1605 case S2255_FW_LOADED_DSPWAIT
:
1606 case S2255_FW_NOTLOADED
:
1607 printk(KERN_INFO
"%s: firmware not loaded yet"
1608 "please try again later\n",
1613 printk(KERN_INFO
"%s: unknown state\n", __func__
);
1617 dev
->users
[cur_channel
]--;
1618 mutex_unlock(&dev
->open_lock
);
1619 kref_put(&dev
->kref
, s2255_destroy
);
1624 /* allocate + initialize per filehandle data */
1625 fh
= kzalloc(sizeof(*fh
), GFP_KERNEL
);
1627 dev
->users
[cur_channel
]--;
1628 mutex_unlock(&dev
->open_lock
);
1629 kref_put(&dev
->kref
, s2255_destroy
);
1634 file
->private_data
= fh
;
1636 fh
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1637 fh
->mode
= dev
->mode
[cur_channel
];
1638 fh
->fmt
= dev
->cur_fmt
[cur_channel
];
1639 /* default 4CIF NTSC */
1640 fh
->width
= LINE_SZ_4CIFS_NTSC
;
1641 fh
->height
= NUM_LINES_4CIFS_NTSC
* 2;
1642 fh
->channel
= cur_channel
;
1644 /* configure channel to default state */
1645 if (!dev
->chn_configured
[cur_channel
]) {
1646 s2255_set_mode(dev
, cur_channel
, &fh
->mode
);
1647 dev
->chn_configured
[cur_channel
] = 1;
1651 /* Put all controls at a sane state */
1652 for (i
= 0; i
< ARRAY_SIZE(s2255_qctrl
); i
++)
1653 qctl_regs
[i
] = s2255_qctrl
[i
].default_value
;
1655 dprintk(1, "s2255drv: open dev=%s type=%s users=%d\n",
1656 video_device_node_name(vdev
), v4l2_type_names
[type
],
1657 dev
->users
[cur_channel
]);
1658 dprintk(2, "s2255drv: open: fh=0x%08lx, dev=0x%08lx, vidq=0x%08lx\n",
1659 (unsigned long)fh
, (unsigned long)dev
,
1660 (unsigned long)&dev
->vidq
[cur_channel
]);
1661 dprintk(4, "s2255drv: open: list_empty active=%d\n",
1662 list_empty(&dev
->vidq
[cur_channel
].active
));
1664 videobuf_queue_vmalloc_init(&fh
->vb_vidq
, &s2255_video_qops
,
1667 V4L2_FIELD_INTERLACED
,
1668 sizeof(struct s2255_buffer
), fh
);
1670 mutex_unlock(&dev
->open_lock
);
1676 static unsigned int s2255_poll(struct file
*file
,
1677 struct poll_table_struct
*wait
)
1679 struct s2255_fh
*fh
= file
->private_data
;
1681 dprintk(100, "%s\n", __func__
);
1683 if (V4L2_BUF_TYPE_VIDEO_CAPTURE
!= fh
->type
)
1686 rc
= videobuf_poll_stream(file
, &fh
->vb_vidq
, wait
);
1690 static void s2255_destroy(struct kref
*kref
)
1692 struct s2255_dev
*dev
= to_s2255_dev(kref
);
1695 printk(KERN_ERR
"s2255drv: kref problem\n");
1698 atomic_set(&dev
->fw_data
->fw_state
, S2255_FW_DISCONNECTING
);
1699 wake_up(&dev
->fw_data
->wait_fw
);
1700 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
1701 dev
->setmode_ready
[i
] = 1;
1702 wake_up(&dev
->wait_setmode
[i
]);
1704 mutex_lock(&dev
->open_lock
);
1705 /* reset the DSP so firmware can be reload next time */
1706 s2255_reset_dsppower(dev
);
1707 s2255_exit_v4l(dev
);
1708 /* board shutdown stops the read pipe if it is running */
1709 s2255_board_shutdown(dev
);
1710 /* make sure firmware still not trying to load */
1711 del_timer(&dev
->timer
); /* only started in .probe and .open */
1713 if (dev
->fw_data
->fw_urb
) {
1714 dprintk(2, "kill fw_urb\n");
1715 usb_kill_urb(dev
->fw_data
->fw_urb
);
1716 usb_free_urb(dev
->fw_data
->fw_urb
);
1717 dev
->fw_data
->fw_urb
= NULL
;
1719 if (dev
->fw_data
->fw
)
1720 release_firmware(dev
->fw_data
->fw
);
1721 kfree(dev
->fw_data
->pfw_data
);
1722 kfree(dev
->fw_data
);
1723 usb_put_dev(dev
->udev
);
1724 dprintk(1, "%s", __func__
);
1726 mutex_unlock(&dev
->open_lock
);
1730 static int s2255_close(struct file
*file
)
1732 struct s2255_fh
*fh
= file
->private_data
;
1733 struct s2255_dev
*dev
= fh
->dev
;
1734 struct video_device
*vdev
= video_devdata(file
);
1739 mutex_lock(&dev
->open_lock
);
1741 /* turn off stream */
1742 if (res_check(fh
)) {
1743 if (dev
->b_acquire
[fh
->channel
])
1744 s2255_stop_acquire(dev
, fh
->channel
);
1745 videobuf_streamoff(&fh
->vb_vidq
);
1749 videobuf_mmap_free(&fh
->vb_vidq
);
1750 dev
->users
[fh
->channel
]--;
1752 mutex_unlock(&dev
->open_lock
);
1754 kref_put(&dev
->kref
, s2255_destroy
);
1755 dprintk(1, "s2255: close called (dev=%s, users=%d)\n",
1756 video_device_node_name(vdev
), dev
->users
[fh
->channel
]);
1761 static int s2255_mmap_v4l(struct file
*file
, struct vm_area_struct
*vma
)
1763 struct s2255_fh
*fh
= file
->private_data
;
1768 dprintk(4, "mmap called, vma=0x%08lx\n", (unsigned long)vma
);
1770 ret
= videobuf_mmap_mapper(&fh
->vb_vidq
, vma
);
1772 dprintk(4, "vma start=0x%08lx, size=%ld, ret=%d\n",
1773 (unsigned long)vma
->vm_start
,
1774 (unsigned long)vma
->vm_end
- (unsigned long)vma
->vm_start
, ret
);
1779 static const struct v4l2_file_operations s2255_fops_v4l
= {
1780 .owner
= THIS_MODULE
,
1782 .release
= s2255_close
,
1784 .ioctl
= video_ioctl2
, /* V4L2 ioctl handler */
1785 .mmap
= s2255_mmap_v4l
,
1788 static const struct v4l2_ioctl_ops s2255_ioctl_ops
= {
1789 .vidioc_querycap
= vidioc_querycap
,
1790 .vidioc_enum_fmt_vid_cap
= vidioc_enum_fmt_vid_cap
,
1791 .vidioc_g_fmt_vid_cap
= vidioc_g_fmt_vid_cap
,
1792 .vidioc_try_fmt_vid_cap
= vidioc_try_fmt_vid_cap
,
1793 .vidioc_s_fmt_vid_cap
= vidioc_s_fmt_vid_cap
,
1794 .vidioc_reqbufs
= vidioc_reqbufs
,
1795 .vidioc_querybuf
= vidioc_querybuf
,
1796 .vidioc_qbuf
= vidioc_qbuf
,
1797 .vidioc_dqbuf
= vidioc_dqbuf
,
1798 .vidioc_s_std
= vidioc_s_std
,
1799 .vidioc_enum_input
= vidioc_enum_input
,
1800 .vidioc_g_input
= vidioc_g_input
,
1801 .vidioc_s_input
= vidioc_s_input
,
1802 .vidioc_queryctrl
= vidioc_queryctrl
,
1803 .vidioc_g_ctrl
= vidioc_g_ctrl
,
1804 .vidioc_s_ctrl
= vidioc_s_ctrl
,
1805 .vidioc_streamon
= vidioc_streamon
,
1806 .vidioc_streamoff
= vidioc_streamoff
,
1807 #ifdef CONFIG_VIDEO_V4L1_COMPAT
1808 .vidiocgmbuf
= vidioc_cgmbuf
,
1810 .vidioc_s_jpegcomp
= vidioc_s_jpegcomp
,
1811 .vidioc_g_jpegcomp
= vidioc_g_jpegcomp
,
1812 .vidioc_s_parm
= vidioc_s_parm
,
1813 .vidioc_g_parm
= vidioc_g_parm
,
1816 static struct video_device
template = {
1818 .fops
= &s2255_fops_v4l
,
1819 .ioctl_ops
= &s2255_ioctl_ops
,
1820 .release
= video_device_release
,
1821 .tvnorms
= S2255_NORMS
,
1822 .current_norm
= V4L2_STD_NTSC_M
,
1825 static int s2255_probe_v4l(struct s2255_dev
*dev
)
1829 int cur_nr
= video_nr
;
1831 /* initialize all video 4 linux */
1832 /* register 4 video devices */
1833 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
1834 INIT_LIST_HEAD(&dev
->vidq
[i
].active
);
1835 dev
->vidq
[i
].dev
= dev
;
1836 dev
->vidq
[i
].channel
= i
;
1837 /* register 4 video devices */
1838 dev
->vdev
[i
] = video_device_alloc();
1839 memcpy(dev
->vdev
[i
], &template, sizeof(struct video_device
));
1840 dev
->vdev
[i
]->parent
= &dev
->interface
->dev
;
1841 video_set_drvdata(dev
->vdev
[i
], dev
);
1843 ret
= video_register_device(dev
->vdev
[i
],
1847 ret
= video_register_device(dev
->vdev
[i
],
1850 video_set_drvdata(dev
->vdev
[i
], dev
);
1853 dev_err(&dev
->udev
->dev
,
1854 "failed to register video device!\n");
1858 printk(KERN_INFO
"Sensoray 2255 V4L driver Revision: %d.%d\n",
1859 S2255_MAJOR_VERSION
,
1860 S2255_MINOR_VERSION
);
1864 static void s2255_exit_v4l(struct s2255_dev
*dev
)
1868 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
1869 if (video_is_registered(dev
->vdev
[i
])) {
1870 video_unregister_device(dev
->vdev
[i
]);
1871 printk(KERN_INFO
"s2255 unregistered\n");
1873 video_device_release(dev
->vdev
[i
]);
1874 printk(KERN_INFO
"s2255 released\n");
1879 /* this function moves the usb stream read pipe data
1880 * into the system buffers.
1881 * returns 0 on success, EAGAIN if more data to process( call this
1884 * Received frame structure:
1885 * bytes 0-3: marker : 0x2255DA4AL (S2255_MARKER_FRAME)
1886 * bytes 4-7: channel: 0-3
1887 * bytes 8-11: payload size: size of the frame
1888 * bytes 12-payloadsize+12: frame data
1890 static int save_frame(struct s2255_dev
*dev
, struct s2255_pipeinfo
*pipe_info
)
1896 unsigned long copy_size
;
1899 struct s2255_framei
*frm
;
1900 unsigned char *pdata
;
1902 dprintk(100, "buffer to user\n");
1904 idx
= dev
->cur_frame
[dev
->cc
];
1905 frm
= &dev
->buffer
[dev
->cc
].frame
[idx
];
1907 if (frm
->ulState
== S2255_READ_IDLE
) {
1912 /* search for marker codes */
1913 pdata
= (unsigned char *)pipe_info
->transfer_buffer
;
1914 for (jj
= 0; jj
< (pipe_info
->cur_transfer_size
- 12); jj
++) {
1915 switch (*(s32
*) pdata
) {
1916 case S2255_MARKER_FRAME
:
1917 pdword
= (s32
*)pdata
;
1918 dprintk(4, "found frame marker at offset:"
1919 " %d [%x %x]\n", jj
, pdata
[0],
1921 offset
= jj
+ PREFIX_SIZE
;
1924 if (cc
>= MAX_CHANNELS
) {
1930 dev
->cc
= G_chnmap
[cc
];
1931 payload
= pdword
[3];
1932 if (payload
> dev
->req_image_size
[dev
->cc
]) {
1933 dev
->bad_payload
[dev
->cc
]++;
1934 /* discard the bad frame */
1937 dev
->pkt_size
[dev
->cc
] = payload
;
1938 dev
->jpg_size
[dev
->cc
] = pdword
[4];
1940 case S2255_MARKER_RESPONSE
:
1941 pdword
= (s32
*)pdata
;
1942 pdata
+= DEF_USB_BLOCK
;
1943 jj
+= DEF_USB_BLOCK
;
1944 if (pdword
[1] >= MAX_CHANNELS
)
1946 cc
= G_chnmap
[pdword
[1]];
1947 if (cc
>= MAX_CHANNELS
)
1949 switch (pdword
[2]) {
1950 case S2255_RESPONSE_SETMODE
:
1951 /* check if channel valid */
1952 /* set mode ready */
1953 dev
->setmode_ready
[cc
] = 1;
1954 wake_up(&dev
->wait_setmode
[cc
]);
1955 dprintk(5, "setmode ready %d\n", cc
);
1957 case S2255_RESPONSE_FW
:
1959 dev
->chn_ready
|= (1 << cc
);
1960 if ((dev
->chn_ready
& 0x0f) != 0x0f)
1962 /* all channels ready */
1963 printk(KERN_INFO
"s2255: fw loaded\n");
1964 atomic_set(&dev
->fw_data
->fw_state
,
1966 wake_up(&dev
->fw_data
->wait_fw
);
1969 printk(KERN_INFO
"s2255 unknown resp\n");
1983 idx
= dev
->cur_frame
[dev
->cc
];
1984 frm
= &dev
->buffer
[dev
->cc
].frame
[idx
];
1986 /* search done. now find out if should be acquiring on this channel */
1987 if (!dev
->b_acquire
[dev
->cc
]) {
1988 /* we found a frame, but this channel is turned off */
1989 frm
->ulState
= S2255_READ_IDLE
;
1993 if (frm
->ulState
== S2255_READ_IDLE
) {
1994 frm
->ulState
= S2255_READ_FRAME
;
1998 /* skip the marker 512 bytes (and offset if out of sync) */
1999 psrc
= (u8
*)pipe_info
->transfer_buffer
+ offset
;
2002 if (frm
->lpvbits
== NULL
) {
2003 dprintk(1, "s2255 frame buffer == NULL.%p %p %d %d",
2004 frm
, dev
, dev
->cc
, idx
);
2008 pdest
= frm
->lpvbits
+ frm
->cur_size
;
2010 copy_size
= (pipe_info
->cur_transfer_size
- offset
);
2012 size
= dev
->pkt_size
[dev
->cc
] - PREFIX_SIZE
;
2014 /* sanity check on pdest */
2015 if ((copy_size
+ frm
->cur_size
) < dev
->req_image_size
[dev
->cc
])
2016 memcpy(pdest
, psrc
, copy_size
);
2018 frm
->cur_size
+= copy_size
;
2019 dprintk(4, "cur_size size %lu size %lu \n", frm
->cur_size
, size
);
2021 if (frm
->cur_size
>= size
) {
2024 dprintk(2, "****************[%d]Buffer[%d]full*************\n",
2026 dev
->last_frame
[cc
] = dev
->cur_frame
[cc
];
2027 dev
->cur_frame
[cc
]++;
2028 /* end of system frame ring buffer, start at zero */
2029 if ((dev
->cur_frame
[cc
] == SYS_FRAMES
) ||
2030 (dev
->cur_frame
[cc
] == dev
->buffer
[cc
].dwFrames
))
2031 dev
->cur_frame
[cc
] = 0;
2033 if (dev
->b_acquire
[cc
])
2034 s2255_got_frame(dev
, cc
, dev
->jpg_size
[cc
]);
2035 dev
->frame_count
[cc
]++;
2036 frm
->ulState
= S2255_READ_IDLE
;
2040 /* done successfully */
2044 static void s2255_read_video_callback(struct s2255_dev
*dev
,
2045 struct s2255_pipeinfo
*pipe_info
)
2048 dprintk(50, "callback read video \n");
2050 if (dev
->cc
>= MAX_CHANNELS
) {
2052 dev_err(&dev
->udev
->dev
, "invalid channel\n");
2055 /* otherwise copy to the system buffers */
2056 res
= save_frame(dev
, pipe_info
);
2058 dprintk(4, "s2255: read callback failed\n");
2060 dprintk(50, "callback read video done\n");
2064 static long s2255_vendor_req(struct s2255_dev
*dev
, unsigned char Request
,
2065 u16 Index
, u16 Value
, void *TransferBuffer
,
2066 s32 TransferBufferLength
, int bOut
)
2070 r
= usb_control_msg(dev
->udev
, usb_rcvctrlpipe(dev
->udev
, 0),
2072 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
|
2074 Value
, Index
, TransferBuffer
,
2075 TransferBufferLength
, HZ
* 5);
2077 r
= usb_control_msg(dev
->udev
, usb_sndctrlpipe(dev
->udev
, 0),
2078 Request
, USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
2079 Value
, Index
, TransferBuffer
,
2080 TransferBufferLength
, HZ
* 5);
2086 * retrieve FX2 firmware version. future use.
2087 * @param dev pointer to device extension
2088 * @return -1 for fail, else returns firmware version as an int(16 bits)
2090 static int s2255_get_fx2fw(struct s2255_dev
*dev
)
2094 unsigned char transBuffer
[64];
2095 ret
= s2255_vendor_req(dev
, S2255_VR_FW
, 0, 0, transBuffer
, 2,
2098 dprintk(2, "get fw error: %x\n", ret
);
2099 fw
= transBuffer
[0] + (transBuffer
[1] << 8);
2100 dprintk(2, "Get FW %x %x\n", transBuffer
[0], transBuffer
[1]);
2105 * Create the system ring buffer to copy frames into from the
2108 static int s2255_create_sys_buffers(struct s2255_dev
*dev
, unsigned long chn
)
2111 unsigned long reqsize
;
2112 dprintk(1, "create sys buffers\n");
2113 if (chn
>= MAX_CHANNELS
)
2116 dev
->buffer
[chn
].dwFrames
= SYS_FRAMES
;
2118 /* always allocate maximum size(PAL) for system buffers */
2119 reqsize
= SYS_FRAMES_MAXSIZE
;
2121 if (reqsize
> SYS_FRAMES_MAXSIZE
)
2122 reqsize
= SYS_FRAMES_MAXSIZE
;
2124 for (i
= 0; i
< SYS_FRAMES
; i
++) {
2125 /* allocate the frames */
2126 dev
->buffer
[chn
].frame
[i
].lpvbits
= vmalloc(reqsize
);
2128 dprintk(1, "valloc %p chan %lu, idx %lu, pdata %p\n",
2129 &dev
->buffer
[chn
].frame
[i
], chn
, i
,
2130 dev
->buffer
[chn
].frame
[i
].lpvbits
);
2131 dev
->buffer
[chn
].frame
[i
].size
= reqsize
;
2132 if (dev
->buffer
[chn
].frame
[i
].lpvbits
== NULL
) {
2133 printk(KERN_INFO
"out of memory. using less frames\n");
2134 dev
->buffer
[chn
].dwFrames
= i
;
2139 /* make sure internal states are set */
2140 for (i
= 0; i
< SYS_FRAMES
; i
++) {
2141 dev
->buffer
[chn
].frame
[i
].ulState
= 0;
2142 dev
->buffer
[chn
].frame
[i
].cur_size
= 0;
2145 dev
->cur_frame
[chn
] = 0;
2146 dev
->last_frame
[chn
] = -1;
2150 static int s2255_release_sys_buffers(struct s2255_dev
*dev
,
2151 unsigned long channel
)
2154 dprintk(1, "release sys buffers\n");
2155 for (i
= 0; i
< SYS_FRAMES
; i
++) {
2156 if (dev
->buffer
[channel
].frame
[i
].lpvbits
) {
2157 dprintk(1, "vfree %p\n",
2158 dev
->buffer
[channel
].frame
[i
].lpvbits
);
2159 vfree(dev
->buffer
[channel
].frame
[i
].lpvbits
);
2161 dev
->buffer
[channel
].frame
[i
].lpvbits
= NULL
;
2166 static int s2255_board_init(struct s2255_dev
*dev
)
2169 struct s2255_mode mode_def
= DEF_MODEI_NTSC_CONT
;
2171 dprintk(4, "board init: %p", dev
);
2173 for (j
= 0; j
< MAX_PIPE_BUFFERS
; j
++) {
2174 struct s2255_pipeinfo
*pipe
= &dev
->pipes
[j
];
2176 memset(pipe
, 0, sizeof(*pipe
));
2178 pipe
->cur_transfer_size
= S2255_USB_XFER_SIZE
;
2179 pipe
->max_transfer_size
= S2255_USB_XFER_SIZE
;
2181 pipe
->transfer_buffer
= kzalloc(pipe
->max_transfer_size
,
2183 if (pipe
->transfer_buffer
== NULL
) {
2184 dprintk(1, "out of memory!\n");
2190 /* query the firmware */
2191 fw_ver
= s2255_get_fx2fw(dev
);
2193 printk(KERN_INFO
"2255 usb firmware version %d.%d\n",
2194 (fw_ver
>> 8) & 0xff,
2197 if (fw_ver
< S2255_CUR_USB_FWVER
)
2198 dev_err(&dev
->udev
->dev
,
2199 "usb firmware not up to date %d.%d\n",
2200 (fw_ver
>> 8) & 0xff,
2203 for (j
= 0; j
< MAX_CHANNELS
; j
++) {
2204 dev
->b_acquire
[j
] = 0;
2205 dev
->mode
[j
] = mode_def
;
2206 dev
->jc
[j
].quality
= S2255_DEF_JPEG_QUAL
;
2207 dev
->cur_fmt
[j
] = &formats
[0];
2208 dev
->mode
[j
].restart
= 1;
2209 dev
->req_image_size
[j
] = get_transfer_size(&mode_def
);
2210 dev
->frame_count
[j
] = 0;
2211 /* create the system buffers */
2212 s2255_create_sys_buffers(dev
, j
);
2214 /* start read pipe */
2215 s2255_start_readpipe(dev
);
2217 dprintk(1, "S2255: board initialized\n");
2221 static int s2255_board_shutdown(struct s2255_dev
*dev
)
2225 dprintk(1, "S2255: board shutdown: %p", dev
);
2227 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2228 if (dev
->b_acquire
[i
])
2229 s2255_stop_acquire(dev
, i
);
2232 s2255_stop_readpipe(dev
);
2234 for (i
= 0; i
< MAX_CHANNELS
; i
++)
2235 s2255_release_sys_buffers(dev
, i
);
2237 /* release transfer buffers */
2238 for (i
= 0; i
< MAX_PIPE_BUFFERS
; i
++) {
2239 struct s2255_pipeinfo
*pipe
= &dev
->pipes
[i
];
2240 kfree(pipe
->transfer_buffer
);
2245 static void read_pipe_completion(struct urb
*purb
)
2247 struct s2255_pipeinfo
*pipe_info
;
2248 struct s2255_dev
*dev
;
2252 pipe_info
= purb
->context
;
2253 dprintk(100, "read pipe completion %p, status %d\n", purb
,
2255 if (pipe_info
== NULL
) {
2256 dev_err(&purb
->dev
->dev
, "no context!\n");
2260 dev
= pipe_info
->dev
;
2262 dev_err(&purb
->dev
->dev
, "no context!\n");
2265 status
= purb
->status
;
2266 /* if shutting down, do not resubmit, exit immediately */
2267 if (status
== -ESHUTDOWN
) {
2268 dprintk(2, "read_pipe_completion: err shutdown\n");
2269 pipe_info
->err_count
++;
2273 if (pipe_info
->state
== 0) {
2274 dprintk(2, "exiting USB pipe");
2279 s2255_read_video_callback(dev
, pipe_info
);
2281 pipe_info
->err_count
++;
2282 dprintk(1, "s2255drv: failed URB %d\n", status
);
2285 pipe
= usb_rcvbulkpipe(dev
->udev
, dev
->read_endpoint
);
2287 usb_fill_bulk_urb(pipe_info
->stream_urb
, dev
->udev
,
2289 pipe_info
->transfer_buffer
,
2290 pipe_info
->cur_transfer_size
,
2291 read_pipe_completion
, pipe_info
);
2293 if (pipe_info
->state
!= 0) {
2294 if (usb_submit_urb(pipe_info
->stream_urb
, GFP_KERNEL
)) {
2295 dev_err(&dev
->udev
->dev
, "error submitting urb\n");
2298 dprintk(2, "read pipe complete state 0\n");
2303 static int s2255_start_readpipe(struct s2255_dev
*dev
)
2308 struct s2255_pipeinfo
*pipe_info
= dev
->pipes
;
2309 pipe
= usb_rcvbulkpipe(dev
->udev
, dev
->read_endpoint
);
2310 dprintk(2, "start pipe IN %d\n", dev
->read_endpoint
);
2312 for (i
= 0; i
< MAX_PIPE_BUFFERS
; i
++) {
2313 pipe_info
->state
= 1;
2314 pipe_info
->err_count
= 0;
2315 pipe_info
->stream_urb
= usb_alloc_urb(0, GFP_KERNEL
);
2316 if (!pipe_info
->stream_urb
) {
2317 dev_err(&dev
->udev
->dev
,
2318 "ReadStream: Unable to alloc URB\n");
2321 /* transfer buffer allocated in board_init */
2322 usb_fill_bulk_urb(pipe_info
->stream_urb
, dev
->udev
,
2324 pipe_info
->transfer_buffer
,
2325 pipe_info
->cur_transfer_size
,
2326 read_pipe_completion
, pipe_info
);
2328 dprintk(4, "submitting URB %p\n", pipe_info
->stream_urb
);
2329 retval
= usb_submit_urb(pipe_info
->stream_urb
, GFP_KERNEL
);
2331 printk(KERN_ERR
"s2255: start read pipe failed\n");
2339 /* starts acquisition process */
2340 static int s2255_start_acquire(struct s2255_dev
*dev
, unsigned long chn
)
2342 unsigned char *buffer
;
2344 unsigned long chn_rev
;
2346 if (chn
>= MAX_CHANNELS
) {
2347 dprintk(2, "start acquire failed, bad channel %lu\n", chn
);
2351 chn_rev
= G_chnmap
[chn
];
2352 dprintk(1, "S2255: start acquire %lu \n", chn
);
2354 buffer
= kzalloc(512, GFP_KERNEL
);
2355 if (buffer
== NULL
) {
2356 dev_err(&dev
->udev
->dev
, "out of mem\n");
2360 dev
->last_frame
[chn
] = -1;
2361 dev
->bad_payload
[chn
] = 0;
2362 dev
->cur_frame
[chn
] = 0;
2363 for (j
= 0; j
< SYS_FRAMES
; j
++) {
2364 dev
->buffer
[chn
].frame
[j
].ulState
= 0;
2365 dev
->buffer
[chn
].frame
[j
].cur_size
= 0;
2368 /* send the start command */
2369 *(u32
*) buffer
= IN_DATA_TOKEN
;
2370 *((u32
*) buffer
+ 1) = (u32
) chn_rev
;
2371 *((u32
*) buffer
+ 2) = (u32
) CMD_START
;
2372 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
2374 dev_err(&dev
->udev
->dev
, "CMD_START error\n");
2376 dprintk(2, "start acquire exit[%lu] %d \n", chn
, res
);
2381 static int s2255_stop_acquire(struct s2255_dev
*dev
, unsigned long chn
)
2383 unsigned char *buffer
;
2385 unsigned long chn_rev
;
2387 if (chn
>= MAX_CHANNELS
) {
2388 dprintk(2, "stop acquire failed, bad channel %lu\n", chn
);
2391 chn_rev
= G_chnmap
[chn
];
2393 buffer
= kzalloc(512, GFP_KERNEL
);
2394 if (buffer
== NULL
) {
2395 dev_err(&dev
->udev
->dev
, "out of mem\n");
2399 /* send the stop command */
2400 dprintk(4, "stop acquire %lu\n", chn
);
2401 *(u32
*) buffer
= IN_DATA_TOKEN
;
2402 *((u32
*) buffer
+ 1) = (u32
) chn_rev
;
2403 *((u32
*) buffer
+ 2) = CMD_STOP
;
2404 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
2407 dev_err(&dev
->udev
->dev
, "CMD_STOP error\n");
2409 dprintk(4, "stop acquire: releasing states \n");
2412 dev
->b_acquire
[chn
] = 0;
2417 static void s2255_stop_readpipe(struct s2255_dev
*dev
)
2422 s2255_dev_err(&dev
->udev
->dev
, "invalid device\n");
2425 dprintk(4, "stop read pipe\n");
2426 for (j
= 0; j
< MAX_PIPE_BUFFERS
; j
++) {
2427 struct s2255_pipeinfo
*pipe_info
= &dev
->pipes
[j
];
2429 if (pipe_info
->state
== 0)
2431 pipe_info
->state
= 0;
2435 for (j
= 0; j
< MAX_PIPE_BUFFERS
; j
++) {
2436 struct s2255_pipeinfo
*pipe_info
= &dev
->pipes
[j
];
2437 if (pipe_info
->stream_urb
) {
2439 usb_kill_urb(pipe_info
->stream_urb
);
2440 usb_free_urb(pipe_info
->stream_urb
);
2441 pipe_info
->stream_urb
= NULL
;
2444 dprintk(2, "s2255 stop read pipe: %d\n", j
);
2448 static void s2255_fwload_start(struct s2255_dev
*dev
, int reset
)
2451 s2255_reset_dsppower(dev
);
2452 dev
->fw_data
->fw_size
= dev
->fw_data
->fw
->size
;
2453 atomic_set(&dev
->fw_data
->fw_state
, S2255_FW_NOTLOADED
);
2454 memcpy(dev
->fw_data
->pfw_data
,
2455 dev
->fw_data
->fw
->data
, CHUNK_SIZE
);
2456 dev
->fw_data
->fw_loaded
= CHUNK_SIZE
;
2457 usb_fill_bulk_urb(dev
->fw_data
->fw_urb
, dev
->udev
,
2458 usb_sndbulkpipe(dev
->udev
, 2),
2459 dev
->fw_data
->pfw_data
,
2460 CHUNK_SIZE
, s2255_fwchunk_complete
,
2462 mod_timer(&dev
->timer
, jiffies
+ HZ
);
2465 /* standard usb probe function */
2466 static int s2255_probe(struct usb_interface
*interface
,
2467 const struct usb_device_id
*id
)
2469 struct s2255_dev
*dev
= NULL
;
2470 struct usb_host_interface
*iface_desc
;
2471 struct usb_endpoint_descriptor
*endpoint
;
2473 int retval
= -ENOMEM
;
2477 dprintk(2, "s2255: probe\n");
2479 /* allocate memory for our device state and initialize it to zero */
2480 dev
= kzalloc(sizeof(struct s2255_dev
), GFP_KERNEL
);
2482 s2255_dev_err(&interface
->dev
, "out of memory\n");
2486 dev
->fw_data
= kzalloc(sizeof(struct s2255_fw
), GFP_KERNEL
);
2490 mutex_init(&dev
->lock
);
2491 mutex_init(&dev
->open_lock
);
2493 /* grab usb_device and save it */
2494 dev
->udev
= usb_get_dev(interface_to_usbdev(interface
));
2495 if (dev
->udev
== NULL
) {
2496 dev_err(&interface
->dev
, "null usb device\n");
2500 kref_init(&dev
->kref
);
2501 dprintk(1, "dev: %p, kref: %p udev %p interface %p\n", dev
, &dev
->kref
,
2502 dev
->udev
, interface
);
2503 dev
->interface
= interface
;
2504 /* set up the endpoint information */
2505 iface_desc
= interface
->cur_altsetting
;
2506 dprintk(1, "num endpoints %d\n", iface_desc
->desc
.bNumEndpoints
);
2507 for (i
= 0; i
< iface_desc
->desc
.bNumEndpoints
; ++i
) {
2508 endpoint
= &iface_desc
->endpoint
[i
].desc
;
2509 if (!dev
->read_endpoint
&& usb_endpoint_is_bulk_in(endpoint
)) {
2510 /* we found the bulk in endpoint */
2511 dev
->read_endpoint
= endpoint
->bEndpointAddress
;
2515 if (!dev
->read_endpoint
) {
2516 dev_err(&interface
->dev
, "Could not find bulk-in endpoint\n");
2521 usb_set_intfdata(interface
, dev
);
2523 dprintk(100, "after intfdata %p\n", dev
);
2525 init_timer(&dev
->timer
);
2526 dev
->timer
.function
= s2255_timer
;
2527 dev
->timer
.data
= (unsigned long)dev
->fw_data
;
2529 init_waitqueue_head(&dev
->fw_data
->wait_fw
);
2530 for (i
= 0; i
< MAX_CHANNELS
; i
++)
2531 init_waitqueue_head(&dev
->wait_setmode
[i
]);
2534 dev
->fw_data
->fw_urb
= usb_alloc_urb(0, GFP_KERNEL
);
2536 if (!dev
->fw_data
->fw_urb
) {
2537 dev_err(&interface
->dev
, "out of memory!\n");
2540 dev
->fw_data
->pfw_data
= kzalloc(CHUNK_SIZE
, GFP_KERNEL
);
2541 if (!dev
->fw_data
->pfw_data
) {
2542 dev_err(&interface
->dev
, "out of memory!\n");
2545 /* load the first chunk */
2546 if (request_firmware(&dev
->fw_data
->fw
,
2547 FIRMWARE_FILE_NAME
, &dev
->udev
->dev
)) {
2548 printk(KERN_ERR
"sensoray 2255 failed to get firmware\n");
2551 /* check the firmware is valid */
2552 fw_size
= dev
->fw_data
->fw
->size
;
2553 pdata
= (__le32
*) &dev
->fw_data
->fw
->data
[fw_size
- 8];
2555 if (*pdata
!= S2255_FW_MARKER
) {
2556 printk(KERN_INFO
"Firmware invalid.\n");
2560 /* make sure firmware is the latest */
2562 pRel
= (__le32
*) &dev
->fw_data
->fw
->data
[fw_size
- 4];
2563 printk(KERN_INFO
"s2255 dsp fw version %x\n", *pRel
);
2565 /* loads v4l specific */
2566 s2255_probe_v4l(dev
);
2567 usb_reset_device(dev
->udev
);
2568 /* load 2255 board specific */
2569 retval
= s2255_board_init(dev
);
2573 dprintk(4, "before probe done %p\n", dev
);
2574 spin_lock_init(&dev
->slock
);
2576 s2255_fwload_start(dev
, 0);
2577 dev_info(&interface
->dev
, "Sensoray 2255 detected\n");
2583 /* disconnect routine. when board is removed physically or with rmmod */
2584 static void s2255_disconnect(struct usb_interface
*interface
)
2586 struct s2255_dev
*dev
= NULL
;
2588 dprintk(1, "s2255: disconnect interface %p\n", interface
);
2589 dev
= usb_get_intfdata(interface
);
2592 * wake up any of the timers to allow open_lock to be
2595 atomic_set(&dev
->fw_data
->fw_state
, S2255_FW_DISCONNECTING
);
2596 wake_up(&dev
->fw_data
->wait_fw
);
2597 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2598 dev
->setmode_ready
[i
] = 1;
2599 wake_up(&dev
->wait_setmode
[i
]);
2602 mutex_lock(&dev
->open_lock
);
2603 usb_set_intfdata(interface
, NULL
);
2604 mutex_unlock(&dev
->open_lock
);
2607 kref_put(&dev
->kref
, s2255_destroy
);
2608 dprintk(1, "s2255drv: disconnect\n");
2609 dev_info(&interface
->dev
, "s2255usb now disconnected\n");
2613 static struct usb_driver s2255_driver
= {
2614 .name
= S2255_DRIVER_NAME
,
2615 .probe
= s2255_probe
,
2616 .disconnect
= s2255_disconnect
,
2617 .id_table
= s2255_table
,
2620 static int __init
usb_s2255_init(void)
2624 /* register this driver with the USB subsystem */
2625 result
= usb_register(&s2255_driver
);
2628 pr_err(KBUILD_MODNAME
2629 ": usb_register failed. Error number %d\n", result
);
2631 dprintk(2, "s2255_init: done\n");
2635 static void __exit
usb_s2255_exit(void)
2637 usb_deregister(&s2255_driver
);
2640 module_init(usb_s2255_init
);
2641 module_exit(usb_s2255_exit
);
2643 MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2644 MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2645 MODULE_LICENSE("GPL");