2 * s2255drv.c - a driver for the Sensoray 2255 USB video capture device
4 * Copyright (C) 2007-2014 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
19 * -full or half size Grey scale: all 4 channels at once
20 * -half size, color mode YUYV or YUV422P: all 4 channels at once
21 * -full size, color mode YUYV or YUV422P 1/2 frame rate: all 4 channels
24 * This program is free software; you can redistribute it and/or modify
25 * it under the terms of the GNU General Public License as published by
26 * the Free Software Foundation; either version 2 of the License, or
27 * (at your option) any later version.
29 * This program is distributed in the hope that it will be useful,
30 * but WITHOUT ANY WARRANTY; without even the implied warranty of
31 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32 * GNU General Public License for more details.
35 #include <linux/module.h>
36 #include <linux/firmware.h>
37 #include <linux/kernel.h>
38 #include <linux/mutex.h>
39 #include <linux/slab.h>
40 #include <linux/videodev2.h>
42 #include <linux/vmalloc.h>
43 #include <linux/usb.h>
44 #include <media/videobuf2-v4l2.h>
45 #include <media/videobuf2-vmalloc.h>
46 #include <media/v4l2-common.h>
47 #include <media/v4l2-device.h>
48 #include <media/v4l2-ioctl.h>
49 #include <media/v4l2-ctrls.h>
50 #include <media/v4l2-event.h>
52 #define S2255_VERSION "1.25.1"
53 #define FIRMWARE_FILE_NAME "f2255usb.bin"
55 /* default JPEG quality */
56 #define S2255_DEF_JPEG_QUAL 50
57 /* vendor request in */
59 /* vendor request out */
60 #define S2255_VR_OUT 1
62 #define S2255_VR_FW 0x30
63 /* USB endpoint number for configuring the device */
64 #define S2255_CONFIG_EP 2
65 /* maximum time for DSP to start responding after last FW word loaded(ms) */
66 #define S2255_DSP_BOOTTIME 800
67 /* maximum time to wait for firmware to load (ms) */
68 #define S2255_LOAD_TIMEOUT (5000 + S2255_DSP_BOOTTIME)
69 #define S2255_MIN_BUFS 2
70 #define S2255_SETMODE_TIMEOUT 500
71 #define S2255_VIDSTATUS_TIMEOUT 350
72 #define S2255_MARKER_FRAME cpu_to_le32(0x2255DA4AL)
73 #define S2255_MARKER_RESPONSE cpu_to_le32(0x2255ACACL)
74 #define S2255_RESPONSE_SETMODE cpu_to_le32(0x01)
75 #define S2255_RESPONSE_FW cpu_to_le32(0x10)
76 #define S2255_RESPONSE_STATUS cpu_to_le32(0x20)
77 #define S2255_USB_XFER_SIZE (16 * 1024)
78 #define MAX_CHANNELS 4
80 /* maximum size is PAL full size plus room for the marker header(s) */
81 #define SYS_FRAMES_MAXSIZE (720*288*2*2 + 4096)
82 #define DEF_USB_BLOCK S2255_USB_XFER_SIZE
83 #define LINE_SZ_4CIFS_NTSC 640
84 #define LINE_SZ_2CIFS_NTSC 640
85 #define LINE_SZ_1CIFS_NTSC 320
86 #define LINE_SZ_4CIFS_PAL 704
87 #define LINE_SZ_2CIFS_PAL 704
88 #define LINE_SZ_1CIFS_PAL 352
89 #define NUM_LINES_4CIFS_NTSC 240
90 #define NUM_LINES_2CIFS_NTSC 240
91 #define NUM_LINES_1CIFS_NTSC 240
92 #define NUM_LINES_4CIFS_PAL 288
93 #define NUM_LINES_2CIFS_PAL 288
94 #define NUM_LINES_1CIFS_PAL 288
95 #define LINE_SZ_DEF 640
96 #define NUM_LINES_DEF 240
99 /* predefined settings */
100 #define FORMAT_NTSC 1
103 #define SCALE_4CIFS 1 /* 640x480(NTSC) or 704x576(PAL) */
104 #define SCALE_2CIFS 2 /* 640x240(NTSC) or 704x288(PAL) */
105 #define SCALE_1CIFS 3 /* 320x240(NTSC) or 352x288(PAL) */
106 /* SCALE_4CIFSI is the 2 fields interpolated into one */
107 #define SCALE_4CIFSI 4 /* 640x480(NTSC) or 704x576(PAL) high quality */
109 #define COLOR_YUVPL 1 /* YUV planar */
110 #define COLOR_YUVPK 2 /* YUV packed */
111 #define COLOR_Y8 4 /* monochrome */
112 #define COLOR_JPG 5 /* JPEG */
114 #define MASK_COLOR 0x000000ff
115 #define MASK_JPG_QUALITY 0x0000ff00
116 #define MASK_INPUT_TYPE 0x000f0000
117 /* frame decimation. */
118 #define FDEC_1 1 /* capture every frame. default */
119 #define FDEC_2 2 /* capture every 2nd frame */
120 #define FDEC_3 3 /* capture every 3rd frame */
121 #define FDEC_5 5 /* capture every 5th frame */
123 /*-------------------------------------------------------
124 * Default mode parameters.
125 *-------------------------------------------------------*/
126 #define DEF_SCALE SCALE_4CIFS
127 #define DEF_COLOR COLOR_YUVPL
128 #define DEF_FDEC FDEC_1
130 #define DEF_CONTRAST 0x5c
131 #define DEF_SATURATION 0x80
134 /* usb config commands */
135 #define IN_DATA_TOKEN cpu_to_le32(0x2255c0de)
136 #define CMD_2255 0xc2255000
137 #define CMD_SET_MODE cpu_to_le32((CMD_2255 | 0x10))
138 #define CMD_START cpu_to_le32((CMD_2255 | 0x20))
139 #define CMD_STOP cpu_to_le32((CMD_2255 | 0x30))
140 #define CMD_STATUS cpu_to_le32((CMD_2255 | 0x40))
143 u32 format
; /* input video format (NTSC, PAL) */
144 u32 scale
; /* output video scale */
145 u32 color
; /* output video color format */
146 u32 fdec
; /* frame decimation */
147 u32 bright
; /* brightness */
148 u32 contrast
; /* contrast */
149 u32 saturation
; /* saturation */
150 u32 hue
; /* hue (NTSC only)*/
151 u32 single
; /* capture 1 frame at a time (!=0), continuously (==0)*/
152 u32 usb_block
; /* block size. should be 4096 of DEF_USB_BLOCK */
153 u32 restart
; /* if DSP requires restart */
157 #define S2255_READ_IDLE 0
158 #define S2255_READ_FRAME 1
160 /* frame structure */
161 struct s2255_framei
{
163 unsigned long ulState
; /* ulState:S2255_READ_IDLE, S2255_READ_FRAME*/
164 void *lpvbits
; /* image data */
165 unsigned long cur_size
; /* current data copied to it */
168 /* image buffer structure */
169 struct s2255_bufferi
{
170 unsigned long dwFrames
; /* number of frames in buffer */
171 struct s2255_framei frame
[SYS_FRAMES
]; /* array of FRAME structures */
174 #define DEF_MODEI_NTSC_CONT {FORMAT_NTSC, DEF_SCALE, DEF_COLOR, \
175 DEF_FDEC, DEF_BRIGHT, DEF_CONTRAST, DEF_SATURATION, \
176 DEF_HUE, 0, DEF_USB_BLOCK, 0}
178 /* for firmware loading, fw_state */
179 #define S2255_FW_NOTLOADED 0
180 #define S2255_FW_LOADED_DSPWAIT 1
181 #define S2255_FW_SUCCESS 2
182 #define S2255_FW_FAILED 3
183 #define S2255_FW_DISCONNECTING 4
184 #define S2255_FW_MARKER cpu_to_le32(0x22552f2f)
185 /* 2255 read states */
186 #define S2255_READ_IDLE 0
187 #define S2255_READ_FRAME 1
194 wait_queue_head_t wait_fw
;
195 const struct firmware
*fw
;
198 struct s2255_pipeinfo
{
199 u32 max_transfer_size
;
200 u32 cur_transfer_size
;
204 void *dev
; /* back pointer to s2255_dev struct*/
209 struct s2255_fmt
; /*forward declaration */
212 /* 2255 video channel */
214 struct s2255_dev
*dev
;
215 struct video_device vdev
;
216 struct v4l2_ctrl_handler hdl
;
217 struct v4l2_ctrl
*jpegqual_ctrl
;
219 struct list_head buf_list
;
220 struct s2255_bufferi buffer
;
221 struct s2255_mode mode
;
223 /* jpeg compression */
225 /* capture parameters (for high quality mode full size) */
226 struct v4l2_captureparm cap_parm
;
229 /* allocated image size */
230 unsigned long req_image_size
;
231 /* received packet size */
232 unsigned long pkt_size
;
234 unsigned long frame_count
;
237 /* if channel configured to default state */
239 wait_queue_head_t wait_setmode
;
241 /* video status items */
243 wait_queue_head_t wait_vidstatus
;
247 enum v4l2_field field
;
248 const struct s2255_fmt
*fmt
;
249 int idx
; /* channel number on device, 0-3 */
250 struct vb2_queue vb_vidq
;
251 struct mutex vb_lock
; /* streaming lock */
257 struct s2255_vc vc
[MAX_CHANNELS
];
258 struct v4l2_device v4l2_dev
;
259 atomic_t num_channels
;
261 struct mutex lock
; /* channels[].vdev.lock */
262 struct mutex cmdlock
; /* protects cmdbuf */
263 struct usb_device
*udev
;
264 struct usb_interface
*interface
;
266 struct timer_list timer
;
267 struct s2255_fw
*fw_data
;
268 struct s2255_pipeinfo pipe
;
269 u32 cc
; /* current channel */
272 /* dsp firmware version (f2255usb.bin) */
274 u16 pid
; /* product id */
275 #define S2255_CMDBUF_SIZE 512
279 static inline struct s2255_dev
*to_s2255_dev(struct v4l2_device
*v4l2_dev
)
281 return container_of(v4l2_dev
, struct s2255_dev
, v4l2_dev
);
290 /* buffer for one video frame */
291 struct s2255_buffer
{
292 /* common v4l buffer stuff -- must be first */
293 struct vb2_v4l2_buffer vb
;
294 struct list_head list
;
298 /* current cypress EEPROM firmware version */
299 #define S2255_CUR_USB_FWVER ((3 << 8) | 12)
300 /* current DSP FW version */
301 #define S2255_CUR_DSP_FWVER 10104
302 /* Need DSP version 5+ for video status feature */
303 #define S2255_MIN_DSP_STATUS 5
304 #define S2255_MIN_DSP_COLORFILTER 8
305 #define S2255_NORMS (V4L2_STD_ALL)
307 /* private V4L2 controls */
310 * The following chart displays how COLORFILTER should be set
311 * =========================================================
312 * = fourcc = COLORFILTER =
313 * = ===============================
315 * =========================================================
316 * = V4L2_PIX_FMT_GREY(Y8) = monochrome from = monochrome=
317 * = = s-video or = composite =
318 * = = B/W camera = input =
319 * =========================================================
320 * = other = color, svideo = color, =
322 * =========================================================
325 * channels 0-3 on 2255 are composite
326 * channels 0-1 on 2257 are composite, 2-3 are s-video
327 * If COLORFILTER is 0 with a composite color camera connected,
328 * the output will appear monochrome but hatching
330 * COLORFILTER is different from "color killer" and "color effects"
333 #define S2255_V4L2_YC_ON 1
334 #define S2255_V4L2_YC_OFF 0
335 #define V4L2_CID_S2255_COLORFILTER (V4L2_CID_USER_S2255_BASE + 0)
337 /* frame prefix size (sent once every frame) */
338 #define PREFIX_SIZE 512
340 /* Channels on box are in reverse order */
341 static unsigned long G_chnmap
[MAX_CHANNELS
] = {3, 2, 1, 0};
345 static int s2255_start_readpipe(struct s2255_dev
*dev
);
346 static void s2255_stop_readpipe(struct s2255_dev
*dev
);
347 static int s2255_start_acquire(struct s2255_vc
*vc
);
348 static int s2255_stop_acquire(struct s2255_vc
*vc
);
349 static void s2255_fillbuff(struct s2255_vc
*vc
, struct s2255_buffer
*buf
,
351 static int s2255_set_mode(struct s2255_vc
*vc
, struct s2255_mode
*mode
);
352 static int s2255_board_shutdown(struct s2255_dev
*dev
);
353 static void s2255_fwload_start(struct s2255_dev
*dev
);
354 static void s2255_destroy(struct s2255_dev
*dev
);
355 static long s2255_vendor_req(struct s2255_dev
*dev
, unsigned char req
,
356 u16 index
, u16 value
, void *buf
,
357 s32 buf_len
, int bOut
);
359 /* dev_err macro with driver name */
360 #define S2255_DRIVER_NAME "s2255"
361 #define s2255_dev_err(dev, fmt, arg...) \
362 dev_err(dev, S2255_DRIVER_NAME " - " fmt, ##arg)
364 #define dprintk(dev, level, fmt, arg...) \
365 v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
367 static struct usb_driver s2255_driver
;
369 /* start video number */
370 static int video_nr
= -1; /* /dev/videoN, -1 for autodetect */
372 /* Enable jpeg capture. */
373 static int jpeg_enable
= 1;
375 module_param(debug
, int, 0644);
376 MODULE_PARM_DESC(debug
, "Debug level(0-100) default 0");
377 module_param(video_nr
, int, 0644);
378 MODULE_PARM_DESC(video_nr
, "start video minor(-1 default autodetect)");
379 module_param(jpeg_enable
, int, 0644);
380 MODULE_PARM_DESC(jpeg_enable
, "Jpeg enable(1-on 0-off) default 1");
382 /* USB device table */
383 #define USB_SENSORAY_VID 0x1943
384 static const struct usb_device_id s2255_table
[] = {
385 {USB_DEVICE(USB_SENSORAY_VID
, 0x2255)},
386 {USB_DEVICE(USB_SENSORAY_VID
, 0x2257)}, /*same family as 2255*/
387 { } /* Terminating entry */
389 MODULE_DEVICE_TABLE(usb
, s2255_table
);
391 #define BUFFER_TIMEOUT msecs_to_jiffies(400)
394 /* JPEG formats must be defined last to support jpeg_enable parameter */
395 static const struct s2255_fmt formats
[] = {
397 .name
= "4:2:2, packed, YUYV",
398 .fourcc
= V4L2_PIX_FMT_YUYV
,
402 .name
= "4:2:2, packed, UYVY",
403 .fourcc
= V4L2_PIX_FMT_UYVY
,
406 .name
= "4:2:2, planar, YUV422P",
407 .fourcc
= V4L2_PIX_FMT_YUV422P
,
412 .fourcc
= V4L2_PIX_FMT_GREY
,
416 .fourcc
= V4L2_PIX_FMT_JPEG
,
420 .fourcc
= V4L2_PIX_FMT_MJPEG
,
425 static int norm_maxw(struct s2255_vc
*vc
)
427 return (vc
->std
& V4L2_STD_525_60
) ?
428 LINE_SZ_4CIFS_NTSC
: LINE_SZ_4CIFS_PAL
;
431 static int norm_maxh(struct s2255_vc
*vc
)
433 return (vc
->std
& V4L2_STD_525_60
) ?
434 (NUM_LINES_1CIFS_NTSC
* 2) : (NUM_LINES_1CIFS_PAL
* 2);
437 static int norm_minw(struct s2255_vc
*vc
)
439 return (vc
->std
& V4L2_STD_525_60
) ?
440 LINE_SZ_1CIFS_NTSC
: LINE_SZ_1CIFS_PAL
;
443 static int norm_minh(struct s2255_vc
*vc
)
445 return (vc
->std
& V4L2_STD_525_60
) ?
446 (NUM_LINES_1CIFS_NTSC
) : (NUM_LINES_1CIFS_PAL
);
451 * TODO: fixme: move YUV reordering to hardware
452 * converts 2255 planar format to yuyv or uyvy
454 static void planar422p_to_yuv_packed(const unsigned char *in
,
456 int width
, int height
,
462 unsigned long size
= height
* width
;
464 pY
= (unsigned char *)in
;
465 pCr
= (unsigned char *)in
+ height
* width
;
466 pCb
= (unsigned char *)in
+ height
* width
+ (height
* width
/ 2);
467 for (i
= 0; i
< size
* 2; i
+= 4) {
468 out
[i
] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pY
++ : *pCr
++;
469 out
[i
+ 1] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pCr
++ : *pY
++;
470 out
[i
+ 2] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pY
++ : *pCb
++;
471 out
[i
+ 3] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pCb
++ : *pY
++;
476 static void s2255_reset_dsppower(struct s2255_dev
*dev
)
478 s2255_vendor_req(dev
, 0x40, 0x0000, 0x0001, NULL
, 0, 1);
480 s2255_vendor_req(dev
, 0x50, 0x0000, 0x0000, NULL
, 0, 1);
482 s2255_vendor_req(dev
, 0x10, 0x0000, 0x0000, NULL
, 0, 1);
486 /* kickstarts the firmware loading. from probe
488 static void s2255_timer(struct timer_list
*t
)
490 struct s2255_dev
*dev
= from_timer(dev
, t
, timer
);
491 struct s2255_fw
*data
= dev
->fw_data
;
492 if (usb_submit_urb(data
->fw_urb
, GFP_ATOMIC
) < 0) {
493 pr_err("s2255: can't submit urb\n");
494 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
495 /* wake up anything waiting for the firmware */
496 wake_up(&data
->wait_fw
);
502 /* this loads the firmware asynchronously.
503 Originally this was done synchronously in probe.
504 But it is better to load it asynchronously here than block
505 inside the probe function. Blocking inside probe affects boot time.
506 FW loading is triggered by the timer in the probe function
508 static void s2255_fwchunk_complete(struct urb
*urb
)
510 struct s2255_fw
*data
= urb
->context
;
511 struct usb_device
*udev
= urb
->dev
;
514 dev_err(&udev
->dev
, "URB failed with status %d\n", urb
->status
);
515 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
516 /* wake up anything waiting for the firmware */
517 wake_up(&data
->wait_fw
);
520 if (data
->fw_urb
== NULL
) {
521 s2255_dev_err(&udev
->dev
, "disconnected\n");
522 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
523 /* wake up anything waiting for the firmware */
524 wake_up(&data
->wait_fw
);
527 #define CHUNK_SIZE 512
528 /* all USB transfers must be done with continuous kernel memory.
529 can't allocate more than 128k in current linux kernel, so
530 upload the firmware in chunks
532 if (data
->fw_loaded
< data
->fw_size
) {
533 len
= (data
->fw_loaded
+ CHUNK_SIZE
) > data
->fw_size
?
534 data
->fw_size
% CHUNK_SIZE
: CHUNK_SIZE
;
536 if (len
< CHUNK_SIZE
)
537 memset(data
->pfw_data
, 0, CHUNK_SIZE
);
539 memcpy(data
->pfw_data
,
540 (char *) data
->fw
->data
+ data
->fw_loaded
, len
);
542 usb_fill_bulk_urb(data
->fw_urb
, udev
, usb_sndbulkpipe(udev
, 2),
543 data
->pfw_data
, CHUNK_SIZE
,
544 s2255_fwchunk_complete
, data
);
545 if (usb_submit_urb(data
->fw_urb
, GFP_ATOMIC
) < 0) {
546 dev_err(&udev
->dev
, "failed submit URB\n");
547 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
548 /* wake up anything waiting for the firmware */
549 wake_up(&data
->wait_fw
);
552 data
->fw_loaded
+= len
;
554 atomic_set(&data
->fw_state
, S2255_FW_LOADED_DSPWAIT
);
559 static void s2255_got_frame(struct s2255_vc
*vc
, int jpgsize
)
561 struct s2255_buffer
*buf
;
562 struct s2255_dev
*dev
= to_s2255_dev(vc
->vdev
.v4l2_dev
);
563 unsigned long flags
= 0;
565 spin_lock_irqsave(&vc
->qlock
, flags
);
566 if (list_empty(&vc
->buf_list
)) {
567 dprintk(dev
, 1, "No active queue to serve\n");
568 spin_unlock_irqrestore(&vc
->qlock
, flags
);
571 buf
= list_entry(vc
->buf_list
.next
,
572 struct s2255_buffer
, list
);
573 list_del(&buf
->list
);
574 buf
->vb
.vb2_buf
.timestamp
= ktime_get_ns();
575 buf
->vb
.field
= vc
->field
;
576 buf
->vb
.sequence
= vc
->frame_count
;
577 spin_unlock_irqrestore(&vc
->qlock
, flags
);
579 s2255_fillbuff(vc
, buf
, jpgsize
);
580 /* tell v4l buffer was filled */
581 vb2_buffer_done(&buf
->vb
.vb2_buf
, VB2_BUF_STATE_DONE
);
582 dprintk(dev
, 2, "%s: [buf] [%p]\n", __func__
, buf
);
585 static const struct s2255_fmt
*format_by_fourcc(int fourcc
)
588 for (i
= 0; i
< ARRAY_SIZE(formats
); i
++) {
589 if (-1 == formats
[i
].fourcc
)
591 if (!jpeg_enable
&& ((formats
[i
].fourcc
== V4L2_PIX_FMT_JPEG
) ||
592 (formats
[i
].fourcc
== V4L2_PIX_FMT_MJPEG
)))
594 if (formats
[i
].fourcc
== fourcc
)
600 /* video buffer vmalloc implementation based partly on VIVI driver which is
601 * Copyright (c) 2006 by
602 * Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
603 * Ted Walther <ted--a.t--enumera.com>
604 * John Sokol <sokol--a.t--videotechnology.com>
605 * http://v4l.videotechnology.com/
608 static void s2255_fillbuff(struct s2255_vc
*vc
,
609 struct s2255_buffer
*buf
, int jpgsize
)
613 char *vbuf
= vb2_plane_vaddr(&buf
->vb
.vb2_buf
, 0);
614 unsigned long last_frame
;
615 struct s2255_dev
*dev
= vc
->dev
;
619 last_frame
= vc
->last_frame
;
620 if (last_frame
!= -1) {
622 (const char *)vc
->buffer
.frame
[last_frame
].lpvbits
;
623 switch (vc
->fmt
->fourcc
) {
624 case V4L2_PIX_FMT_YUYV
:
625 case V4L2_PIX_FMT_UYVY
:
626 planar422p_to_yuv_packed((const unsigned char *)tmpbuf
,
631 case V4L2_PIX_FMT_GREY
:
632 memcpy(vbuf
, tmpbuf
, vc
->width
* vc
->height
);
634 case V4L2_PIX_FMT_JPEG
:
635 case V4L2_PIX_FMT_MJPEG
:
636 vb2_set_plane_payload(&buf
->vb
.vb2_buf
, 0, jpgsize
);
637 memcpy(vbuf
, tmpbuf
, jpgsize
);
639 case V4L2_PIX_FMT_YUV422P
:
641 vc
->width
* vc
->height
* 2);
644 pr_info("s2255: unknown format?\n");
648 pr_err("s2255: =======no frame\n");
651 dprintk(dev
, 2, "s2255fill at : Buffer %p size= %d\n",
656 /* ------------------------------------------------------------------
658 ------------------------------------------------------------------*/
660 static int queue_setup(struct vb2_queue
*vq
,
661 unsigned int *nbuffers
, unsigned int *nplanes
,
662 unsigned int sizes
[], struct device
*alloc_devs
[])
664 struct s2255_vc
*vc
= vb2_get_drv_priv(vq
);
665 if (*nbuffers
< S2255_MIN_BUFS
)
666 *nbuffers
= S2255_MIN_BUFS
;
668 sizes
[0] = vc
->width
* vc
->height
* (vc
->fmt
->depth
>> 3);
672 static int buffer_prepare(struct vb2_buffer
*vb
)
674 struct s2255_vc
*vc
= vb2_get_drv_priv(vb
->vb2_queue
);
675 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
676 struct s2255_buffer
*buf
= container_of(vbuf
, struct s2255_buffer
, vb
);
681 dprintk(vc
->dev
, 4, "%s\n", __func__
);
685 if ((w
< norm_minw(vc
)) ||
686 (w
> norm_maxw(vc
)) ||
687 (h
< norm_minh(vc
)) ||
688 (h
> norm_maxh(vc
))) {
689 dprintk(vc
->dev
, 4, "invalid buffer prepare\n");
692 size
= w
* h
* (vc
->fmt
->depth
>> 3);
693 if (vb2_plane_size(vb
, 0) < size
) {
694 dprintk(vc
->dev
, 4, "invalid buffer prepare\n");
698 vb2_set_plane_payload(&buf
->vb
.vb2_buf
, 0, size
);
702 static void buffer_queue(struct vb2_buffer
*vb
)
704 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
705 struct s2255_buffer
*buf
= container_of(vbuf
, struct s2255_buffer
, vb
);
706 struct s2255_vc
*vc
= vb2_get_drv_priv(vb
->vb2_queue
);
707 unsigned long flags
= 0;
708 dprintk(vc
->dev
, 1, "%s\n", __func__
);
709 spin_lock_irqsave(&vc
->qlock
, flags
);
710 list_add_tail(&buf
->list
, &vc
->buf_list
);
711 spin_unlock_irqrestore(&vc
->qlock
, flags
);
714 static int start_streaming(struct vb2_queue
*vq
, unsigned int count
);
715 static void stop_streaming(struct vb2_queue
*vq
);
717 static const struct vb2_ops s2255_video_qops
= {
718 .queue_setup
= queue_setup
,
719 .buf_prepare
= buffer_prepare
,
720 .buf_queue
= buffer_queue
,
721 .start_streaming
= start_streaming
,
722 .stop_streaming
= stop_streaming
,
723 .wait_prepare
= vb2_ops_wait_prepare
,
724 .wait_finish
= vb2_ops_wait_finish
,
727 static int vidioc_querycap(struct file
*file
, void *priv
,
728 struct v4l2_capability
*cap
)
730 struct s2255_vc
*vc
= video_drvdata(file
);
731 struct s2255_dev
*dev
= vc
->dev
;
733 strlcpy(cap
->driver
, "s2255", sizeof(cap
->driver
));
734 strlcpy(cap
->card
, "s2255", sizeof(cap
->card
));
735 usb_make_path(dev
->udev
, cap
->bus_info
, sizeof(cap
->bus_info
));
736 cap
->device_caps
= V4L2_CAP_VIDEO_CAPTURE
| V4L2_CAP_STREAMING
|
738 cap
->capabilities
= cap
->device_caps
| V4L2_CAP_DEVICE_CAPS
;
742 static int vidioc_enum_fmt_vid_cap(struct file
*file
, void *priv
,
743 struct v4l2_fmtdesc
*f
)
745 int index
= f
->index
;
747 if (index
>= ARRAY_SIZE(formats
))
749 if (!jpeg_enable
&& ((formats
[index
].fourcc
== V4L2_PIX_FMT_JPEG
) ||
750 (formats
[index
].fourcc
== V4L2_PIX_FMT_MJPEG
)))
752 strlcpy(f
->description
, formats
[index
].name
, sizeof(f
->description
));
753 f
->pixelformat
= formats
[index
].fourcc
;
757 static int vidioc_g_fmt_vid_cap(struct file
*file
, void *priv
,
758 struct v4l2_format
*f
)
760 struct s2255_vc
*vc
= video_drvdata(file
);
761 int is_ntsc
= vc
->std
& V4L2_STD_525_60
;
763 f
->fmt
.pix
.width
= vc
->width
;
764 f
->fmt
.pix
.height
= vc
->height
;
765 if (f
->fmt
.pix
.height
>=
766 (is_ntsc
? NUM_LINES_1CIFS_NTSC
: NUM_LINES_1CIFS_PAL
) * 2)
767 f
->fmt
.pix
.field
= V4L2_FIELD_INTERLACED
;
769 f
->fmt
.pix
.field
= V4L2_FIELD_TOP
;
770 f
->fmt
.pix
.pixelformat
= vc
->fmt
->fourcc
;
771 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
* (vc
->fmt
->depth
>> 3);
772 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
773 f
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_SMPTE170M
;
778 static int vidioc_try_fmt_vid_cap(struct file
*file
, void *priv
,
779 struct v4l2_format
*f
)
781 const struct s2255_fmt
*fmt
;
782 enum v4l2_field field
;
783 struct s2255_vc
*vc
= video_drvdata(file
);
784 int is_ntsc
= vc
->std
& V4L2_STD_525_60
;
786 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
791 field
= f
->fmt
.pix
.field
;
793 dprintk(vc
->dev
, 50, "%s NTSC: %d suggested width: %d, height: %d\n",
794 __func__
, is_ntsc
, f
->fmt
.pix
.width
, f
->fmt
.pix
.height
);
797 if (f
->fmt
.pix
.height
>= NUM_LINES_1CIFS_NTSC
* 2) {
798 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_NTSC
* 2;
799 field
= V4L2_FIELD_INTERLACED
;
801 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_NTSC
;
802 field
= V4L2_FIELD_TOP
;
804 if (f
->fmt
.pix
.width
>= LINE_SZ_4CIFS_NTSC
)
805 f
->fmt
.pix
.width
= LINE_SZ_4CIFS_NTSC
;
807 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_NTSC
;
810 if (f
->fmt
.pix
.height
>= NUM_LINES_1CIFS_PAL
* 2) {
811 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_PAL
* 2;
812 field
= V4L2_FIELD_INTERLACED
;
814 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_PAL
;
815 field
= V4L2_FIELD_TOP
;
817 if (f
->fmt
.pix
.width
>= LINE_SZ_4CIFS_PAL
)
818 f
->fmt
.pix
.width
= LINE_SZ_4CIFS_PAL
;
820 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_PAL
;
822 f
->fmt
.pix
.field
= field
;
823 f
->fmt
.pix
.bytesperline
= (f
->fmt
.pix
.width
* fmt
->depth
) >> 3;
824 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
825 f
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_SMPTE170M
;
827 dprintk(vc
->dev
, 50, "%s: set width %d height %d field %d\n", __func__
,
828 f
->fmt
.pix
.width
, f
->fmt
.pix
.height
, f
->fmt
.pix
.field
);
832 static int vidioc_s_fmt_vid_cap(struct file
*file
, void *priv
,
833 struct v4l2_format
*f
)
835 struct s2255_vc
*vc
= video_drvdata(file
);
836 const struct s2255_fmt
*fmt
;
837 struct vb2_queue
*q
= &vc
->vb_vidq
;
838 struct s2255_mode mode
;
841 ret
= vidioc_try_fmt_vid_cap(file
, vc
, f
);
846 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
851 if (vb2_is_busy(q
)) {
852 dprintk(vc
->dev
, 1, "queue busy\n");
858 vc
->width
= f
->fmt
.pix
.width
;
859 vc
->height
= f
->fmt
.pix
.height
;
860 vc
->field
= f
->fmt
.pix
.field
;
861 if (vc
->width
> norm_minw(vc
)) {
862 if (vc
->height
> norm_minh(vc
)) {
863 if (vc
->cap_parm
.capturemode
&
864 V4L2_MODE_HIGHQUALITY
)
865 mode
.scale
= SCALE_4CIFSI
;
867 mode
.scale
= SCALE_4CIFS
;
869 mode
.scale
= SCALE_2CIFS
;
872 mode
.scale
= SCALE_1CIFS
;
875 switch (vc
->fmt
->fourcc
) {
876 case V4L2_PIX_FMT_GREY
:
877 mode
.color
&= ~MASK_COLOR
;
878 mode
.color
|= COLOR_Y8
;
880 case V4L2_PIX_FMT_JPEG
:
881 case V4L2_PIX_FMT_MJPEG
:
882 mode
.color
&= ~MASK_COLOR
;
883 mode
.color
|= COLOR_JPG
;
884 mode
.color
|= (vc
->jpegqual
<< 8);
886 case V4L2_PIX_FMT_YUV422P
:
887 mode
.color
&= ~MASK_COLOR
;
888 mode
.color
|= COLOR_YUVPL
;
890 case V4L2_PIX_FMT_YUYV
:
891 case V4L2_PIX_FMT_UYVY
:
893 mode
.color
&= ~MASK_COLOR
;
894 mode
.color
|= COLOR_YUVPK
;
897 if ((mode
.color
& MASK_COLOR
) != (vc
->mode
.color
& MASK_COLOR
))
899 else if (mode
.scale
!= vc
->mode
.scale
)
901 else if (mode
.format
!= vc
->mode
.format
)
904 (void) s2255_set_mode(vc
, &mode
);
909 /* write to the configuration pipe, synchronously */
910 static int s2255_write_config(struct usb_device
*udev
, unsigned char *pbuf
,
917 pipe
= usb_sndbulkpipe(udev
, S2255_CONFIG_EP
);
918 retval
= usb_bulk_msg(udev
, pipe
, pbuf
, size
, &done
, 500);
923 static u32
get_transfer_size(struct s2255_mode
*mode
)
925 int linesPerFrame
= LINE_SZ_DEF
;
926 int pixelsPerLine
= NUM_LINES_DEF
;
929 unsigned int mask_mult
;
934 if (mode
->format
== FORMAT_NTSC
) {
935 switch (mode
->scale
) {
938 linesPerFrame
= NUM_LINES_4CIFS_NTSC
* 2;
939 pixelsPerLine
= LINE_SZ_4CIFS_NTSC
;
942 linesPerFrame
= NUM_LINES_2CIFS_NTSC
;
943 pixelsPerLine
= LINE_SZ_2CIFS_NTSC
;
946 linesPerFrame
= NUM_LINES_1CIFS_NTSC
;
947 pixelsPerLine
= LINE_SZ_1CIFS_NTSC
;
952 } else if (mode
->format
== FORMAT_PAL
) {
953 switch (mode
->scale
) {
956 linesPerFrame
= NUM_LINES_4CIFS_PAL
* 2;
957 pixelsPerLine
= LINE_SZ_4CIFS_PAL
;
960 linesPerFrame
= NUM_LINES_2CIFS_PAL
;
961 pixelsPerLine
= LINE_SZ_2CIFS_PAL
;
964 linesPerFrame
= NUM_LINES_1CIFS_PAL
;
965 pixelsPerLine
= LINE_SZ_1CIFS_PAL
;
971 outImageSize
= linesPerFrame
* pixelsPerLine
;
972 if ((mode
->color
& MASK_COLOR
) != COLOR_Y8
) {
973 /* 2 bytes/pixel if not monochrome */
977 /* total bytes to send including prefix and 4K padding;
978 must be a multiple of USB_READ_SIZE */
979 usbInSize
= outImageSize
+ PREFIX_SIZE
; /* always send prefix */
980 mask_mult
= 0xffffffffUL
- DEF_USB_BLOCK
+ 1;
981 /* if size not a multiple of USB_READ_SIZE */
982 if (usbInSize
& ~mask_mult
)
983 usbInSize
= (usbInSize
& mask_mult
) + (DEF_USB_BLOCK
);
987 static void s2255_print_cfg(struct s2255_dev
*sdev
, struct s2255_mode
*mode
)
989 struct device
*dev
= &sdev
->udev
->dev
;
990 dev_info(dev
, "------------------------------------------------\n");
991 dev_info(dev
, "format: %d\nscale %d\n", mode
->format
, mode
->scale
);
992 dev_info(dev
, "fdec: %d\ncolor %d\n", mode
->fdec
, mode
->color
);
993 dev_info(dev
, "bright: 0x%x\n", mode
->bright
);
994 dev_info(dev
, "------------------------------------------------\n");
998 * set mode is the function which controls the DSP.
999 * the restart parameter in struct s2255_mode should be set whenever
1000 * the image size could change via color format, video system or image
1002 * When the restart parameter is set, we sleep for ONE frame to allow the
1003 * DSP time to get the new frame
1005 static int s2255_set_mode(struct s2255_vc
*vc
,
1006 struct s2255_mode
*mode
)
1009 unsigned long chn_rev
;
1010 struct s2255_dev
*dev
= to_s2255_dev(vc
->vdev
.v4l2_dev
);
1012 __le32
*buffer
= dev
->cmdbuf
;
1014 mutex_lock(&dev
->cmdlock
);
1015 chn_rev
= G_chnmap
[vc
->idx
];
1016 dprintk(dev
, 3, "%s channel: %d\n", __func__
, vc
->idx
);
1017 /* if JPEG, set the quality */
1018 if ((mode
->color
& MASK_COLOR
) == COLOR_JPG
) {
1019 mode
->color
&= ~MASK_COLOR
;
1020 mode
->color
|= COLOR_JPG
;
1021 mode
->color
&= ~MASK_JPG_QUALITY
;
1022 mode
->color
|= (vc
->jpegqual
<< 8);
1026 vc
->req_image_size
= get_transfer_size(mode
);
1027 dprintk(dev
, 1, "%s: reqsize %ld\n", __func__
, vc
->req_image_size
);
1029 buffer
[0] = IN_DATA_TOKEN
;
1030 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
1031 buffer
[2] = CMD_SET_MODE
;
1032 for (i
= 0; i
< sizeof(struct s2255_mode
) / sizeof(u32
); i
++)
1033 buffer
[3 + i
] = cpu_to_le32(((u32
*)&vc
->mode
)[i
]);
1034 vc
->setmode_ready
= 0;
1035 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
1037 s2255_print_cfg(dev
, mode
);
1038 /* wait at least 3 frames before continuing */
1039 if (mode
->restart
) {
1040 wait_event_timeout(vc
->wait_setmode
,
1041 (vc
->setmode_ready
!= 0),
1042 msecs_to_jiffies(S2255_SETMODE_TIMEOUT
));
1043 if (vc
->setmode_ready
!= 1) {
1044 dprintk(dev
, 0, "s2255: no set mode response\n");
1048 /* clear the restart flag */
1049 vc
->mode
.restart
= 0;
1050 dprintk(dev
, 1, "%s chn %d, result: %d\n", __func__
, vc
->idx
, res
);
1051 mutex_unlock(&dev
->cmdlock
);
1055 static int s2255_cmd_status(struct s2255_vc
*vc
, u32
*pstatus
)
1059 struct s2255_dev
*dev
= to_s2255_dev(vc
->vdev
.v4l2_dev
);
1060 __le32
*buffer
= dev
->cmdbuf
;
1062 mutex_lock(&dev
->cmdlock
);
1063 chn_rev
= G_chnmap
[vc
->idx
];
1064 dprintk(dev
, 4, "%s chan %d\n", __func__
, vc
->idx
);
1065 /* form the get vid status command */
1066 buffer
[0] = IN_DATA_TOKEN
;
1067 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
1068 buffer
[2] = CMD_STATUS
;
1070 vc
->vidstatus_ready
= 0;
1071 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
1072 wait_event_timeout(vc
->wait_vidstatus
,
1073 (vc
->vidstatus_ready
!= 0),
1074 msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT
));
1075 if (vc
->vidstatus_ready
!= 1) {
1076 dprintk(dev
, 0, "s2255: no vidstatus response\n");
1079 *pstatus
= vc
->vidstatus
;
1080 dprintk(dev
, 4, "%s, vid status %d\n", __func__
, *pstatus
);
1081 mutex_unlock(&dev
->cmdlock
);
1085 static int start_streaming(struct vb2_queue
*vq
, unsigned int count
)
1087 struct s2255_vc
*vc
= vb2_get_drv_priv(vq
);
1090 vc
->last_frame
= -1;
1091 vc
->bad_payload
= 0;
1093 vc
->frame_count
= 0;
1094 for (j
= 0; j
< SYS_FRAMES
; j
++) {
1095 vc
->buffer
.frame
[j
].ulState
= S2255_READ_IDLE
;
1096 vc
->buffer
.frame
[j
].cur_size
= 0;
1098 return s2255_start_acquire(vc
);
1101 /* abort streaming and wait for last buffer */
1102 static void stop_streaming(struct vb2_queue
*vq
)
1104 struct s2255_vc
*vc
= vb2_get_drv_priv(vq
);
1105 struct s2255_buffer
*buf
, *node
;
1106 unsigned long flags
;
1107 (void) s2255_stop_acquire(vc
);
1108 spin_lock_irqsave(&vc
->qlock
, flags
);
1109 list_for_each_entry_safe(buf
, node
, &vc
->buf_list
, list
) {
1110 list_del(&buf
->list
);
1111 vb2_buffer_done(&buf
->vb
.vb2_buf
, VB2_BUF_STATE_ERROR
);
1112 dprintk(vc
->dev
, 2, "[%p/%d] done\n",
1113 buf
, buf
->vb
.vb2_buf
.index
);
1115 spin_unlock_irqrestore(&vc
->qlock
, flags
);
1118 static int vidioc_s_std(struct file
*file
, void *priv
, v4l2_std_id i
)
1120 struct s2255_vc
*vc
= video_drvdata(file
);
1121 struct s2255_mode mode
;
1122 struct vb2_queue
*q
= &vc
->vb_vidq
;
1125 * Changing the standard implies a format change, which is not allowed
1126 * while buffers for use with streaming have already been allocated.
1132 if (i
& V4L2_STD_525_60
) {
1133 dprintk(vc
->dev
, 4, "%s 60 Hz\n", __func__
);
1134 /* if changing format, reset frame decimation/intervals */
1135 if (mode
.format
!= FORMAT_NTSC
) {
1137 mode
.format
= FORMAT_NTSC
;
1139 vc
->width
= LINE_SZ_4CIFS_NTSC
;
1140 vc
->height
= NUM_LINES_4CIFS_NTSC
* 2;
1142 } else if (i
& V4L2_STD_625_50
) {
1143 dprintk(vc
->dev
, 4, "%s 50 Hz\n", __func__
);
1144 if (mode
.format
!= FORMAT_PAL
) {
1146 mode
.format
= FORMAT_PAL
;
1148 vc
->width
= LINE_SZ_4CIFS_PAL
;
1149 vc
->height
= NUM_LINES_4CIFS_PAL
* 2;
1155 s2255_set_mode(vc
, &mode
);
1159 static int vidioc_g_std(struct file
*file
, void *priv
, v4l2_std_id
*i
)
1161 struct s2255_vc
*vc
= video_drvdata(file
);
1167 /* Sensoray 2255 is a multiple channel capture device.
1168 It does not have a "crossbar" of inputs.
1169 We use one V4L device per channel. The user must
1170 be aware that certain combinations are not allowed.
1171 For instance, you cannot do full FPS on more than 2 channels(2 videodevs)
1172 at once in color(you can do full fps on 4 channels with greyscale.
1174 static int vidioc_enum_input(struct file
*file
, void *priv
,
1175 struct v4l2_input
*inp
)
1177 struct s2255_vc
*vc
= video_drvdata(file
);
1178 struct s2255_dev
*dev
= vc
->dev
;
1181 if (inp
->index
!= 0)
1183 inp
->type
= V4L2_INPUT_TYPE_CAMERA
;
1184 inp
->std
= S2255_NORMS
;
1186 if (dev
->dsp_fw_ver
>= S2255_MIN_DSP_STATUS
) {
1188 rc
= s2255_cmd_status(vc
, &status
);
1189 dprintk(dev
, 4, "s2255_cmd_status rc: %d status %x\n",
1192 inp
->status
= (status
& 0x01) ? 0
1193 : V4L2_IN_ST_NO_SIGNAL
;
1198 strlcpy(inp
->name
, "Composite", sizeof(inp
->name
));
1201 strlcpy(inp
->name
, (vc
->idx
< 2) ? "Composite" : "S-Video",
1208 static int vidioc_g_input(struct file
*file
, void *priv
, unsigned int *i
)
1213 static int vidioc_s_input(struct file
*file
, void *priv
, unsigned int i
)
1220 static int s2255_s_ctrl(struct v4l2_ctrl
*ctrl
)
1222 struct s2255_vc
*vc
=
1223 container_of(ctrl
->handler
, struct s2255_vc
, hdl
);
1224 struct s2255_mode mode
;
1226 /* update the mode to the corresponding value */
1228 case V4L2_CID_BRIGHTNESS
:
1229 mode
.bright
= ctrl
->val
;
1231 case V4L2_CID_CONTRAST
:
1232 mode
.contrast
= ctrl
->val
;
1235 mode
.hue
= ctrl
->val
;
1237 case V4L2_CID_SATURATION
:
1238 mode
.saturation
= ctrl
->val
;
1240 case V4L2_CID_S2255_COLORFILTER
:
1241 mode
.color
&= ~MASK_INPUT_TYPE
;
1242 mode
.color
|= !ctrl
->val
<< 16;
1244 case V4L2_CID_JPEG_COMPRESSION_QUALITY
:
1245 vc
->jpegqual
= ctrl
->val
;
1251 /* set mode here. Note: stream does not need restarted.
1252 some V4L programs restart stream unnecessarily
1255 s2255_set_mode(vc
, &mode
);
1259 static int vidioc_g_jpegcomp(struct file
*file
, void *priv
,
1260 struct v4l2_jpegcompression
*jc
)
1262 struct s2255_vc
*vc
= video_drvdata(file
);
1264 memset(jc
, 0, sizeof(*jc
));
1265 jc
->quality
= vc
->jpegqual
;
1266 dprintk(vc
->dev
, 2, "%s: quality %d\n", __func__
, jc
->quality
);
1270 static int vidioc_s_jpegcomp(struct file
*file
, void *priv
,
1271 const struct v4l2_jpegcompression
*jc
)
1273 struct s2255_vc
*vc
= video_drvdata(file
);
1275 if (jc
->quality
< 0 || jc
->quality
> 100)
1277 v4l2_ctrl_s_ctrl(vc
->jpegqual_ctrl
, jc
->quality
);
1278 dprintk(vc
->dev
, 2, "%s: quality %d\n", __func__
, jc
->quality
);
1282 static int vidioc_g_parm(struct file
*file
, void *priv
,
1283 struct v4l2_streamparm
*sp
)
1285 __u32 def_num
, def_dem
;
1286 struct s2255_vc
*vc
= video_drvdata(file
);
1288 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1290 sp
->parm
.capture
.capability
= V4L2_CAP_TIMEPERFRAME
;
1291 sp
->parm
.capture
.capturemode
= vc
->cap_parm
.capturemode
;
1292 sp
->parm
.capture
.readbuffers
= S2255_MIN_BUFS
;
1293 def_num
= (vc
->mode
.format
== FORMAT_NTSC
) ? 1001 : 1000;
1294 def_dem
= (vc
->mode
.format
== FORMAT_NTSC
) ? 30000 : 25000;
1295 sp
->parm
.capture
.timeperframe
.denominator
= def_dem
;
1296 switch (vc
->mode
.fdec
) {
1299 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1302 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 2;
1305 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 3;
1308 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 5;
1311 dprintk(vc
->dev
, 4, "%s capture mode, %d timeperframe %d/%d\n",
1313 sp
->parm
.capture
.capturemode
,
1314 sp
->parm
.capture
.timeperframe
.numerator
,
1315 sp
->parm
.capture
.timeperframe
.denominator
);
1319 static int vidioc_s_parm(struct file
*file
, void *priv
,
1320 struct v4l2_streamparm
*sp
)
1322 struct s2255_vc
*vc
= video_drvdata(file
);
1323 struct s2255_mode mode
;
1325 __u32 def_num
, def_dem
;
1326 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1329 /* high quality capture mode requires a stream restart */
1330 if ((vc
->cap_parm
.capturemode
!= sp
->parm
.capture
.capturemode
)
1331 && vb2_is_streaming(&vc
->vb_vidq
))
1333 def_num
= (mode
.format
== FORMAT_NTSC
) ? 1001 : 1000;
1334 def_dem
= (mode
.format
== FORMAT_NTSC
) ? 30000 : 25000;
1335 if (def_dem
!= sp
->parm
.capture
.timeperframe
.denominator
)
1336 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1337 else if (sp
->parm
.capture
.timeperframe
.numerator
<= def_num
)
1338 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1339 else if (sp
->parm
.capture
.timeperframe
.numerator
<= (def_num
* 2)) {
1340 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 2;
1342 } else if (sp
->parm
.capture
.timeperframe
.numerator
<= (def_num
* 3)) {
1343 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 3;
1346 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 5;
1350 sp
->parm
.capture
.timeperframe
.denominator
= def_dem
;
1351 sp
->parm
.capture
.readbuffers
= S2255_MIN_BUFS
;
1352 s2255_set_mode(vc
, &mode
);
1353 dprintk(vc
->dev
, 4, "%s capture mode, %d timeperframe %d/%d, fdec %d\n",
1355 sp
->parm
.capture
.capturemode
,
1356 sp
->parm
.capture
.timeperframe
.numerator
,
1357 sp
->parm
.capture
.timeperframe
.denominator
, fdec
);
1361 #define NUM_SIZE_ENUMS 3
1362 static const struct v4l2_frmsize_discrete ntsc_sizes
[] = {
1367 static const struct v4l2_frmsize_discrete pal_sizes
[] = {
1373 static int vidioc_enum_framesizes(struct file
*file
, void *priv
,
1374 struct v4l2_frmsizeenum
*fe
)
1376 struct s2255_vc
*vc
= video_drvdata(file
);
1377 int is_ntsc
= vc
->std
& V4L2_STD_525_60
;
1378 const struct s2255_fmt
*fmt
;
1380 if (fe
->index
>= NUM_SIZE_ENUMS
)
1383 fmt
= format_by_fourcc(fe
->pixel_format
);
1386 fe
->type
= V4L2_FRMSIZE_TYPE_DISCRETE
;
1387 fe
->discrete
= is_ntsc
? ntsc_sizes
[fe
->index
] : pal_sizes
[fe
->index
];
1391 static int vidioc_enum_frameintervals(struct file
*file
, void *priv
,
1392 struct v4l2_frmivalenum
*fe
)
1394 struct s2255_vc
*vc
= video_drvdata(file
);
1395 const struct s2255_fmt
*fmt
;
1396 const struct v4l2_frmsize_discrete
*sizes
;
1397 int is_ntsc
= vc
->std
& V4L2_STD_525_60
;
1398 #define NUM_FRAME_ENUMS 4
1399 int frm_dec
[NUM_FRAME_ENUMS
] = {1, 2, 3, 5};
1402 if (fe
->index
>= NUM_FRAME_ENUMS
)
1405 fmt
= format_by_fourcc(fe
->pixel_format
);
1409 sizes
= is_ntsc
? ntsc_sizes
: pal_sizes
;
1410 for (i
= 0; i
< NUM_SIZE_ENUMS
; i
++, sizes
++)
1411 if (fe
->width
== sizes
->width
&&
1412 fe
->height
== sizes
->height
)
1414 if (i
== NUM_SIZE_ENUMS
)
1417 fe
->type
= V4L2_FRMIVAL_TYPE_DISCRETE
;
1418 fe
->discrete
.denominator
= is_ntsc
? 30000 : 25000;
1419 fe
->discrete
.numerator
= (is_ntsc
? 1001 : 1000) * frm_dec
[fe
->index
];
1420 dprintk(vc
->dev
, 4, "%s discrete %d/%d\n", __func__
,
1421 fe
->discrete
.numerator
,
1422 fe
->discrete
.denominator
);
1426 static int s2255_open(struct file
*file
)
1428 struct s2255_vc
*vc
= video_drvdata(file
);
1429 struct s2255_dev
*dev
= vc
->dev
;
1433 rc
= v4l2_fh_open(file
);
1437 dprintk(dev
, 1, "s2255: %s\n", __func__
);
1438 state
= atomic_read(&dev
->fw_data
->fw_state
);
1440 case S2255_FW_DISCONNECTING
:
1442 case S2255_FW_FAILED
:
1443 s2255_dev_err(&dev
->udev
->dev
,
1444 "firmware load failed. retrying.\n");
1445 s2255_fwload_start(dev
);
1446 wait_event_timeout(dev
->fw_data
->wait_fw
,
1447 ((atomic_read(&dev
->fw_data
->fw_state
)
1448 == S2255_FW_SUCCESS
) ||
1449 (atomic_read(&dev
->fw_data
->fw_state
)
1450 == S2255_FW_DISCONNECTING
)),
1451 msecs_to_jiffies(S2255_LOAD_TIMEOUT
));
1452 /* state may have changed, re-read */
1453 state
= atomic_read(&dev
->fw_data
->fw_state
);
1455 case S2255_FW_NOTLOADED
:
1456 case S2255_FW_LOADED_DSPWAIT
:
1457 /* give S2255_LOAD_TIMEOUT time for firmware to load in case
1458 driver loaded and then device immediately opened */
1459 pr_info("%s waiting for firmware load\n", __func__
);
1460 wait_event_timeout(dev
->fw_data
->wait_fw
,
1461 ((atomic_read(&dev
->fw_data
->fw_state
)
1462 == S2255_FW_SUCCESS
) ||
1463 (atomic_read(&dev
->fw_data
->fw_state
)
1464 == S2255_FW_DISCONNECTING
)),
1465 msecs_to_jiffies(S2255_LOAD_TIMEOUT
));
1466 /* state may have changed, re-read */
1467 state
= atomic_read(&dev
->fw_data
->fw_state
);
1469 case S2255_FW_SUCCESS
:
1473 /* state may have changed in above switch statement */
1475 case S2255_FW_SUCCESS
:
1477 case S2255_FW_FAILED
:
1478 pr_info("2255 firmware load failed.\n");
1480 case S2255_FW_DISCONNECTING
:
1481 pr_info("%s: disconnecting\n", __func__
);
1483 case S2255_FW_LOADED_DSPWAIT
:
1484 case S2255_FW_NOTLOADED
:
1485 pr_info("%s: firmware not loaded, please retry\n",
1488 * Timeout on firmware load means device unusable.
1489 * Set firmware failure state.
1490 * On next s2255_open the firmware will be reloaded.
1492 atomic_set(&dev
->fw_data
->fw_state
,
1496 pr_info("%s: unknown state\n", __func__
);
1499 if (!vc
->configured
) {
1500 /* configure channel to default state */
1501 vc
->fmt
= &formats
[0];
1502 s2255_set_mode(vc
, &vc
->mode
);
1508 static void s2255_destroy(struct s2255_dev
*dev
)
1510 dprintk(dev
, 1, "%s", __func__
);
1511 /* board shutdown stops the read pipe if it is running */
1512 s2255_board_shutdown(dev
);
1513 /* make sure firmware still not trying to load */
1514 del_timer_sync(&dev
->timer
); /* only started in .probe and .open */
1515 if (dev
->fw_data
->fw_urb
) {
1516 usb_kill_urb(dev
->fw_data
->fw_urb
);
1517 usb_free_urb(dev
->fw_data
->fw_urb
);
1518 dev
->fw_data
->fw_urb
= NULL
;
1520 release_firmware(dev
->fw_data
->fw
);
1521 kfree(dev
->fw_data
->pfw_data
);
1522 kfree(dev
->fw_data
);
1523 /* reset the DSP so firmware can be reloaded next time */
1524 s2255_reset_dsppower(dev
);
1525 mutex_destroy(&dev
->lock
);
1526 usb_put_dev(dev
->udev
);
1527 v4l2_device_unregister(&dev
->v4l2_dev
);
1532 static const struct v4l2_file_operations s2255_fops_v4l
= {
1533 .owner
= THIS_MODULE
,
1535 .release
= vb2_fop_release
,
1536 .poll
= vb2_fop_poll
,
1537 .unlocked_ioctl
= video_ioctl2
, /* V4L2 ioctl handler */
1538 .mmap
= vb2_fop_mmap
,
1539 .read
= vb2_fop_read
,
1542 static const struct v4l2_ioctl_ops s2255_ioctl_ops
= {
1543 .vidioc_querycap
= vidioc_querycap
,
1544 .vidioc_enum_fmt_vid_cap
= vidioc_enum_fmt_vid_cap
,
1545 .vidioc_g_fmt_vid_cap
= vidioc_g_fmt_vid_cap
,
1546 .vidioc_try_fmt_vid_cap
= vidioc_try_fmt_vid_cap
,
1547 .vidioc_s_fmt_vid_cap
= vidioc_s_fmt_vid_cap
,
1548 .vidioc_reqbufs
= vb2_ioctl_reqbufs
,
1549 .vidioc_querybuf
= vb2_ioctl_querybuf
,
1550 .vidioc_qbuf
= vb2_ioctl_qbuf
,
1551 .vidioc_dqbuf
= vb2_ioctl_dqbuf
,
1552 .vidioc_s_std
= vidioc_s_std
,
1553 .vidioc_g_std
= vidioc_g_std
,
1554 .vidioc_enum_input
= vidioc_enum_input
,
1555 .vidioc_g_input
= vidioc_g_input
,
1556 .vidioc_s_input
= vidioc_s_input
,
1557 .vidioc_streamon
= vb2_ioctl_streamon
,
1558 .vidioc_streamoff
= vb2_ioctl_streamoff
,
1559 .vidioc_s_jpegcomp
= vidioc_s_jpegcomp
,
1560 .vidioc_g_jpegcomp
= vidioc_g_jpegcomp
,
1561 .vidioc_s_parm
= vidioc_s_parm
,
1562 .vidioc_g_parm
= vidioc_g_parm
,
1563 .vidioc_enum_framesizes
= vidioc_enum_framesizes
,
1564 .vidioc_enum_frameintervals
= vidioc_enum_frameintervals
,
1565 .vidioc_log_status
= v4l2_ctrl_log_status
,
1566 .vidioc_subscribe_event
= v4l2_ctrl_subscribe_event
,
1567 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
1570 static void s2255_video_device_release(struct video_device
*vdev
)
1572 struct s2255_dev
*dev
= to_s2255_dev(vdev
->v4l2_dev
);
1573 struct s2255_vc
*vc
=
1574 container_of(vdev
, struct s2255_vc
, vdev
);
1576 dprintk(dev
, 4, "%s, chnls: %d\n", __func__
,
1577 atomic_read(&dev
->num_channels
));
1579 v4l2_ctrl_handler_free(&vc
->hdl
);
1581 if (atomic_dec_and_test(&dev
->num_channels
))
1586 static const struct video_device
template = {
1588 .fops
= &s2255_fops_v4l
,
1589 .ioctl_ops
= &s2255_ioctl_ops
,
1590 .release
= s2255_video_device_release
,
1591 .tvnorms
= S2255_NORMS
,
1594 static const struct v4l2_ctrl_ops s2255_ctrl_ops
= {
1595 .s_ctrl
= s2255_s_ctrl
,
1598 static const struct v4l2_ctrl_config color_filter_ctrl
= {
1599 .ops
= &s2255_ctrl_ops
,
1600 .name
= "Color Filter",
1601 .id
= V4L2_CID_S2255_COLORFILTER
,
1602 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
1608 static int s2255_probe_v4l(struct s2255_dev
*dev
)
1612 int cur_nr
= video_nr
;
1613 struct s2255_vc
*vc
;
1614 struct vb2_queue
*q
;
1616 ret
= v4l2_device_register(&dev
->interface
->dev
, &dev
->v4l2_dev
);
1619 /* initialize all video 4 linux */
1620 /* register 4 video devices */
1621 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
1623 INIT_LIST_HEAD(&vc
->buf_list
);
1625 v4l2_ctrl_handler_init(&vc
->hdl
, 6);
1626 v4l2_ctrl_new_std(&vc
->hdl
, &s2255_ctrl_ops
,
1627 V4L2_CID_BRIGHTNESS
, -127, 127, 1, DEF_BRIGHT
);
1628 v4l2_ctrl_new_std(&vc
->hdl
, &s2255_ctrl_ops
,
1629 V4L2_CID_CONTRAST
, 0, 255, 1, DEF_CONTRAST
);
1630 v4l2_ctrl_new_std(&vc
->hdl
, &s2255_ctrl_ops
,
1631 V4L2_CID_SATURATION
, 0, 255, 1, DEF_SATURATION
);
1632 v4l2_ctrl_new_std(&vc
->hdl
, &s2255_ctrl_ops
,
1633 V4L2_CID_HUE
, 0, 255, 1, DEF_HUE
);
1634 vc
->jpegqual_ctrl
= v4l2_ctrl_new_std(&vc
->hdl
,
1636 V4L2_CID_JPEG_COMPRESSION_QUALITY
,
1637 0, 100, 1, S2255_DEF_JPEG_QUAL
);
1638 if (dev
->dsp_fw_ver
>= S2255_MIN_DSP_COLORFILTER
&&
1639 (dev
->pid
!= 0x2257 || vc
->idx
<= 1))
1640 v4l2_ctrl_new_custom(&vc
->hdl
, &color_filter_ctrl
,
1642 if (vc
->hdl
.error
) {
1643 ret
= vc
->hdl
.error
;
1644 v4l2_ctrl_handler_free(&vc
->hdl
);
1645 dev_err(&dev
->udev
->dev
, "couldn't register control\n");
1649 q
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1650 q
->io_modes
= VB2_MMAP
| VB2_READ
| VB2_USERPTR
;
1652 q
->lock
= &vc
->vb_lock
;
1653 q
->buf_struct_size
= sizeof(struct s2255_buffer
);
1654 q
->mem_ops
= &vb2_vmalloc_memops
;
1655 q
->ops
= &s2255_video_qops
;
1656 q
->timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
1657 ret
= vb2_queue_init(q
);
1659 dev_err(&dev
->udev
->dev
,
1660 "%s vb2_queue_init 0x%x\n", __func__
, ret
);
1663 /* register video devices */
1664 vc
->vdev
= template;
1666 vc
->vdev
.ctrl_handler
= &vc
->hdl
;
1667 vc
->vdev
.lock
= &dev
->lock
;
1668 vc
->vdev
.v4l2_dev
= &dev
->v4l2_dev
;
1669 video_set_drvdata(&vc
->vdev
, vc
);
1671 ret
= video_register_device(&vc
->vdev
,
1675 ret
= video_register_device(&vc
->vdev
,
1680 dev_err(&dev
->udev
->dev
,
1681 "failed to register video device!\n");
1684 atomic_inc(&dev
->num_channels
);
1685 v4l2_info(&dev
->v4l2_dev
, "V4L2 device registered as %s\n",
1686 video_device_node_name(&vc
->vdev
));
1689 pr_info("Sensoray 2255 V4L driver Revision: %s\n",
1691 /* if no channels registered, return error and probe will fail*/
1692 if (atomic_read(&dev
->num_channels
) == 0) {
1693 v4l2_device_unregister(&dev
->v4l2_dev
);
1696 if (atomic_read(&dev
->num_channels
) != MAX_CHANNELS
)
1697 pr_warn("s2255: Not all channels available.\n");
1701 /* this function moves the usb stream read pipe data
1702 * into the system buffers.
1703 * returns 0 on success, EAGAIN if more data to process( call this
1706 * Received frame structure:
1707 * bytes 0-3: marker : 0x2255DA4AL (S2255_MARKER_FRAME)
1708 * bytes 4-7: channel: 0-3
1709 * bytes 8-11: payload size: size of the frame
1710 * bytes 12-payloadsize+12: frame data
1712 static int save_frame(struct s2255_dev
*dev
, struct s2255_pipeinfo
*pipe_info
)
1718 unsigned long copy_size
;
1721 struct s2255_framei
*frm
;
1722 unsigned char *pdata
;
1723 struct s2255_vc
*vc
;
1724 dprintk(dev
, 100, "buffer to user\n");
1725 vc
= &dev
->vc
[dev
->cc
];
1726 idx
= vc
->cur_frame
;
1727 frm
= &vc
->buffer
.frame
[idx
];
1728 if (frm
->ulState
== S2255_READ_IDLE
) {
1731 __le32
*pdword
; /*data from dsp is little endian */
1733 /* search for marker codes */
1734 pdata
= (unsigned char *)pipe_info
->transfer_buffer
;
1735 pdword
= (__le32
*)pdata
;
1736 for (jj
= 0; jj
< (pipe_info
->cur_transfer_size
- 12); jj
++) {
1738 case S2255_MARKER_FRAME
:
1739 dprintk(dev
, 4, "marker @ offset: %d [%x %x]\n",
1740 jj
, pdata
[0], pdata
[1]);
1741 offset
= jj
+ PREFIX_SIZE
;
1743 cc
= le32_to_cpu(pdword
[1]);
1744 if (cc
>= MAX_CHANNELS
) {
1750 dev
->cc
= G_chnmap
[cc
];
1751 vc
= &dev
->vc
[dev
->cc
];
1752 payload
= le32_to_cpu(pdword
[3]);
1753 if (payload
> vc
->req_image_size
) {
1755 /* discard the bad frame */
1758 vc
->pkt_size
= payload
;
1759 vc
->jpg_size
= le32_to_cpu(pdword
[4]);
1761 case S2255_MARKER_RESPONSE
:
1763 pdata
+= DEF_USB_BLOCK
;
1764 jj
+= DEF_USB_BLOCK
;
1765 if (le32_to_cpu(pdword
[1]) >= MAX_CHANNELS
)
1767 cc
= G_chnmap
[le32_to_cpu(pdword
[1])];
1768 if (cc
>= MAX_CHANNELS
)
1771 switch (pdword
[2]) {
1772 case S2255_RESPONSE_SETMODE
:
1773 /* check if channel valid */
1774 /* set mode ready */
1775 vc
->setmode_ready
= 1;
1776 wake_up(&vc
->wait_setmode
);
1777 dprintk(dev
, 5, "setmode rdy %d\n", cc
);
1779 case S2255_RESPONSE_FW
:
1780 dev
->chn_ready
|= (1 << cc
);
1781 if ((dev
->chn_ready
& 0x0f) != 0x0f)
1783 /* all channels ready */
1784 pr_info("s2255: fw loaded\n");
1785 atomic_set(&dev
->fw_data
->fw_state
,
1787 wake_up(&dev
->fw_data
->wait_fw
);
1789 case S2255_RESPONSE_STATUS
:
1790 vc
->vidstatus
= le32_to_cpu(pdword
[3]);
1791 vc
->vidstatus_ready
= 1;
1792 wake_up(&vc
->wait_vidstatus
);
1793 dprintk(dev
, 5, "vstat %x chan %d\n",
1794 le32_to_cpu(pdword
[3]), cc
);
1797 pr_info("s2255 unknown resp\n");
1811 vc
= &dev
->vc
[dev
->cc
];
1812 idx
= vc
->cur_frame
;
1813 frm
= &vc
->buffer
.frame
[idx
];
1814 /* search done. now find out if should be acquiring on this channel */
1815 if (!vb2_is_streaming(&vc
->vb_vidq
)) {
1816 /* we found a frame, but this channel is turned off */
1817 frm
->ulState
= S2255_READ_IDLE
;
1821 if (frm
->ulState
== S2255_READ_IDLE
) {
1822 frm
->ulState
= S2255_READ_FRAME
;
1826 /* skip the marker 512 bytes (and offset if out of sync) */
1827 psrc
= (u8
*)pipe_info
->transfer_buffer
+ offset
;
1830 if (frm
->lpvbits
== NULL
) {
1831 dprintk(dev
, 1, "s2255 frame buffer == NULL.%p %p %d %d",
1832 frm
, dev
, dev
->cc
, idx
);
1836 pdest
= frm
->lpvbits
+ frm
->cur_size
;
1838 copy_size
= (pipe_info
->cur_transfer_size
- offset
);
1840 size
= vc
->pkt_size
- PREFIX_SIZE
;
1842 /* sanity check on pdest */
1843 if ((copy_size
+ frm
->cur_size
) < vc
->req_image_size
)
1844 memcpy(pdest
, psrc
, copy_size
);
1846 frm
->cur_size
+= copy_size
;
1847 dprintk(dev
, 4, "cur_size: %lu, size: %lu\n", frm
->cur_size
, size
);
1849 if (frm
->cur_size
>= size
) {
1850 dprintk(dev
, 2, "******[%d]Buffer[%d]full*******\n",
1852 vc
->last_frame
= vc
->cur_frame
;
1854 /* end of system frame ring buffer, start at zero */
1855 if ((vc
->cur_frame
== SYS_FRAMES
) ||
1856 (vc
->cur_frame
== vc
->buffer
.dwFrames
))
1859 if (vb2_is_streaming(&vc
->vb_vidq
))
1860 s2255_got_frame(vc
, vc
->jpg_size
);
1862 frm
->ulState
= S2255_READ_IDLE
;
1866 /* done successfully */
1870 static void s2255_read_video_callback(struct s2255_dev
*dev
,
1871 struct s2255_pipeinfo
*pipe_info
)
1874 dprintk(dev
, 50, "callback read video\n");
1876 if (dev
->cc
>= MAX_CHANNELS
) {
1878 dev_err(&dev
->udev
->dev
, "invalid channel\n");
1881 /* otherwise copy to the system buffers */
1882 res
= save_frame(dev
, pipe_info
);
1884 dprintk(dev
, 4, "s2255: read callback failed\n");
1886 dprintk(dev
, 50, "callback read video done\n");
1890 static long s2255_vendor_req(struct s2255_dev
*dev
, unsigned char Request
,
1891 u16 Index
, u16 Value
, void *TransferBuffer
,
1892 s32 TransferBufferLength
, int bOut
)
1897 buf
= kmalloc(TransferBufferLength
, GFP_KERNEL
);
1902 r
= usb_control_msg(dev
->udev
, usb_rcvctrlpipe(dev
->udev
, 0),
1904 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
|
1907 TransferBufferLength
, HZ
* 5);
1910 memcpy(TransferBuffer
, buf
, TransferBufferLength
);
1912 memcpy(buf
, TransferBuffer
, TransferBufferLength
);
1913 r
= usb_control_msg(dev
->udev
, usb_sndctrlpipe(dev
->udev
, 0),
1914 Request
, USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
1916 TransferBufferLength
, HZ
* 5);
1923 * retrieve FX2 firmware version. future use.
1924 * @param dev pointer to device extension
1925 * @return -1 for fail, else returns firmware version as an int(16 bits)
1927 static int s2255_get_fx2fw(struct s2255_dev
*dev
)
1931 unsigned char transBuffer
[64];
1932 ret
= s2255_vendor_req(dev
, S2255_VR_FW
, 0, 0, transBuffer
, 2,
1935 dprintk(dev
, 2, "get fw error: %x\n", ret
);
1936 fw
= transBuffer
[0] + (transBuffer
[1] << 8);
1937 dprintk(dev
, 2, "Get FW %x %x\n", transBuffer
[0], transBuffer
[1]);
1942 * Create the system ring buffer to copy frames into from the
1945 static int s2255_create_sys_buffers(struct s2255_vc
*vc
)
1948 unsigned long reqsize
;
1949 vc
->buffer
.dwFrames
= SYS_FRAMES
;
1950 /* always allocate maximum size(PAL) for system buffers */
1951 reqsize
= SYS_FRAMES_MAXSIZE
;
1953 if (reqsize
> SYS_FRAMES_MAXSIZE
)
1954 reqsize
= SYS_FRAMES_MAXSIZE
;
1956 for (i
= 0; i
< SYS_FRAMES
; i
++) {
1957 /* allocate the frames */
1958 vc
->buffer
.frame
[i
].lpvbits
= vmalloc(reqsize
);
1959 vc
->buffer
.frame
[i
].size
= reqsize
;
1960 if (vc
->buffer
.frame
[i
].lpvbits
== NULL
) {
1961 pr_info("out of memory. using less frames\n");
1962 vc
->buffer
.dwFrames
= i
;
1967 /* make sure internal states are set */
1968 for (i
= 0; i
< SYS_FRAMES
; i
++) {
1969 vc
->buffer
.frame
[i
].ulState
= 0;
1970 vc
->buffer
.frame
[i
].cur_size
= 0;
1974 vc
->last_frame
= -1;
1978 static int s2255_release_sys_buffers(struct s2255_vc
*vc
)
1981 for (i
= 0; i
< SYS_FRAMES
; i
++) {
1982 vfree(vc
->buffer
.frame
[i
].lpvbits
);
1983 vc
->buffer
.frame
[i
].lpvbits
= NULL
;
1988 static int s2255_board_init(struct s2255_dev
*dev
)
1990 struct s2255_mode mode_def
= DEF_MODEI_NTSC_CONT
;
1993 struct s2255_pipeinfo
*pipe
= &dev
->pipe
;
1994 dprintk(dev
, 4, "board init: %p", dev
);
1995 memset(pipe
, 0, sizeof(*pipe
));
1997 pipe
->cur_transfer_size
= S2255_USB_XFER_SIZE
;
1998 pipe
->max_transfer_size
= S2255_USB_XFER_SIZE
;
2000 pipe
->transfer_buffer
= kzalloc(pipe
->max_transfer_size
,
2002 if (pipe
->transfer_buffer
== NULL
) {
2003 dprintk(dev
, 1, "out of memory!\n");
2006 /* query the firmware */
2007 fw_ver
= s2255_get_fx2fw(dev
);
2009 pr_info("s2255: usb firmware version %d.%d\n",
2010 (fw_ver
>> 8) & 0xff,
2013 if (fw_ver
< S2255_CUR_USB_FWVER
)
2014 pr_info("s2255: newer USB firmware available\n");
2016 for (j
= 0; j
< MAX_CHANNELS
; j
++) {
2017 struct s2255_vc
*vc
= &dev
->vc
[j
];
2018 vc
->mode
= mode_def
;
2019 if (dev
->pid
== 0x2257 && j
> 1)
2020 vc
->mode
.color
|= (1 << 16);
2021 vc
->jpegqual
= S2255_DEF_JPEG_QUAL
;
2022 vc
->width
= LINE_SZ_4CIFS_NTSC
;
2023 vc
->height
= NUM_LINES_4CIFS_NTSC
* 2;
2024 vc
->std
= V4L2_STD_NTSC_M
;
2025 vc
->fmt
= &formats
[0];
2026 vc
->mode
.restart
= 1;
2027 vc
->req_image_size
= get_transfer_size(&mode_def
);
2028 vc
->frame_count
= 0;
2029 /* create the system buffers */
2030 s2255_create_sys_buffers(vc
);
2032 /* start read pipe */
2033 s2255_start_readpipe(dev
);
2034 dprintk(dev
, 1, "%s: success\n", __func__
);
2038 static int s2255_board_shutdown(struct s2255_dev
*dev
)
2041 dprintk(dev
, 1, "%s: dev: %p", __func__
, dev
);
2043 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2044 if (vb2_is_streaming(&dev
->vc
[i
].vb_vidq
))
2045 s2255_stop_acquire(&dev
->vc
[i
]);
2047 s2255_stop_readpipe(dev
);
2048 for (i
= 0; i
< MAX_CHANNELS
; i
++)
2049 s2255_release_sys_buffers(&dev
->vc
[i
]);
2050 /* release transfer buffer */
2051 kfree(dev
->pipe
.transfer_buffer
);
2055 static void read_pipe_completion(struct urb
*purb
)
2057 struct s2255_pipeinfo
*pipe_info
;
2058 struct s2255_dev
*dev
;
2061 pipe_info
= purb
->context
;
2062 if (pipe_info
== NULL
) {
2063 dev_err(&purb
->dev
->dev
, "no context!\n");
2066 dev
= pipe_info
->dev
;
2068 dev_err(&purb
->dev
->dev
, "no context!\n");
2071 status
= purb
->status
;
2072 /* if shutting down, do not resubmit, exit immediately */
2073 if (status
== -ESHUTDOWN
) {
2074 dprintk(dev
, 2, "%s: err shutdown\n", __func__
);
2075 pipe_info
->err_count
++;
2079 if (pipe_info
->state
== 0) {
2080 dprintk(dev
, 2, "%s: exiting USB pipe", __func__
);
2085 s2255_read_video_callback(dev
, pipe_info
);
2087 pipe_info
->err_count
++;
2088 dprintk(dev
, 1, "%s: failed URB %d\n", __func__
, status
);
2091 pipe
= usb_rcvbulkpipe(dev
->udev
, dev
->read_endpoint
);
2093 usb_fill_bulk_urb(pipe_info
->stream_urb
, dev
->udev
,
2095 pipe_info
->transfer_buffer
,
2096 pipe_info
->cur_transfer_size
,
2097 read_pipe_completion
, pipe_info
);
2099 if (pipe_info
->state
!= 0) {
2100 if (usb_submit_urb(pipe_info
->stream_urb
, GFP_ATOMIC
))
2101 dev_err(&dev
->udev
->dev
, "error submitting urb\n");
2103 dprintk(dev
, 2, "%s :complete state 0\n", __func__
);
2108 static int s2255_start_readpipe(struct s2255_dev
*dev
)
2112 struct s2255_pipeinfo
*pipe_info
= &dev
->pipe
;
2113 pipe
= usb_rcvbulkpipe(dev
->udev
, dev
->read_endpoint
);
2114 dprintk(dev
, 2, "%s: IN %d\n", __func__
, dev
->read_endpoint
);
2115 pipe_info
->state
= 1;
2116 pipe_info
->err_count
= 0;
2117 pipe_info
->stream_urb
= usb_alloc_urb(0, GFP_KERNEL
);
2118 if (!pipe_info
->stream_urb
)
2120 /* transfer buffer allocated in board_init */
2121 usb_fill_bulk_urb(pipe_info
->stream_urb
, dev
->udev
,
2123 pipe_info
->transfer_buffer
,
2124 pipe_info
->cur_transfer_size
,
2125 read_pipe_completion
, pipe_info
);
2126 retval
= usb_submit_urb(pipe_info
->stream_urb
, GFP_KERNEL
);
2128 pr_err("s2255: start read pipe failed\n");
2134 /* starts acquisition process */
2135 static int s2255_start_acquire(struct s2255_vc
*vc
)
2138 unsigned long chn_rev
;
2140 struct s2255_dev
*dev
= to_s2255_dev(vc
->vdev
.v4l2_dev
);
2141 __le32
*buffer
= dev
->cmdbuf
;
2143 mutex_lock(&dev
->cmdlock
);
2144 chn_rev
= G_chnmap
[vc
->idx
];
2145 vc
->last_frame
= -1;
2146 vc
->bad_payload
= 0;
2148 for (j
= 0; j
< SYS_FRAMES
; j
++) {
2149 vc
->buffer
.frame
[j
].ulState
= 0;
2150 vc
->buffer
.frame
[j
].cur_size
= 0;
2153 /* send the start command */
2154 buffer
[0] = IN_DATA_TOKEN
;
2155 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
2156 buffer
[2] = CMD_START
;
2157 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
2159 dev_err(&dev
->udev
->dev
, "CMD_START error\n");
2161 dprintk(dev
, 2, "start acquire exit[%d] %d\n", vc
->idx
, res
);
2162 mutex_unlock(&dev
->cmdlock
);
2166 static int s2255_stop_acquire(struct s2255_vc
*vc
)
2169 unsigned long chn_rev
;
2170 struct s2255_dev
*dev
= to_s2255_dev(vc
->vdev
.v4l2_dev
);
2171 __le32
*buffer
= dev
->cmdbuf
;
2173 mutex_lock(&dev
->cmdlock
);
2174 chn_rev
= G_chnmap
[vc
->idx
];
2175 /* send the stop command */
2176 buffer
[0] = IN_DATA_TOKEN
;
2177 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
2178 buffer
[2] = CMD_STOP
;
2180 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
2182 dev_err(&dev
->udev
->dev
, "CMD_STOP error\n");
2184 dprintk(dev
, 4, "%s: chn %d, res %d\n", __func__
, vc
->idx
, res
);
2185 mutex_unlock(&dev
->cmdlock
);
2189 static void s2255_stop_readpipe(struct s2255_dev
*dev
)
2191 struct s2255_pipeinfo
*pipe
= &dev
->pipe
;
2194 if (pipe
->stream_urb
) {
2196 usb_kill_urb(pipe
->stream_urb
);
2197 usb_free_urb(pipe
->stream_urb
);
2198 pipe
->stream_urb
= NULL
;
2200 dprintk(dev
, 4, "%s", __func__
);
2204 static void s2255_fwload_start(struct s2255_dev
*dev
)
2206 s2255_reset_dsppower(dev
);
2207 dev
->fw_data
->fw_size
= dev
->fw_data
->fw
->size
;
2208 atomic_set(&dev
->fw_data
->fw_state
, S2255_FW_NOTLOADED
);
2209 memcpy(dev
->fw_data
->pfw_data
,
2210 dev
->fw_data
->fw
->data
, CHUNK_SIZE
);
2211 dev
->fw_data
->fw_loaded
= CHUNK_SIZE
;
2212 usb_fill_bulk_urb(dev
->fw_data
->fw_urb
, dev
->udev
,
2213 usb_sndbulkpipe(dev
->udev
, 2),
2214 dev
->fw_data
->pfw_data
,
2215 CHUNK_SIZE
, s2255_fwchunk_complete
,
2217 mod_timer(&dev
->timer
, jiffies
+ HZ
);
2220 /* standard usb probe function */
2221 static int s2255_probe(struct usb_interface
*interface
,
2222 const struct usb_device_id
*id
)
2224 struct s2255_dev
*dev
= NULL
;
2225 struct usb_host_interface
*iface_desc
;
2226 struct usb_endpoint_descriptor
*endpoint
;
2228 int retval
= -ENOMEM
;
2232 /* allocate memory for our device state and initialize it to zero */
2233 dev
= kzalloc(sizeof(struct s2255_dev
), GFP_KERNEL
);
2235 s2255_dev_err(&interface
->dev
, "out of memory\n");
2239 dev
->cmdbuf
= kzalloc(S2255_CMDBUF_SIZE
, GFP_KERNEL
);
2240 if (dev
->cmdbuf
== NULL
) {
2241 s2255_dev_err(&interface
->dev
, "out of memory\n");
2245 atomic_set(&dev
->num_channels
, 0);
2246 dev
->pid
= id
->idProduct
;
2247 dev
->fw_data
= kzalloc(sizeof(struct s2255_fw
), GFP_KERNEL
);
2250 mutex_init(&dev
->lock
);
2251 mutex_init(&dev
->cmdlock
);
2252 /* grab usb_device and save it */
2253 dev
->udev
= usb_get_dev(interface_to_usbdev(interface
));
2254 if (dev
->udev
== NULL
) {
2255 dev_err(&interface
->dev
, "null usb device\n");
2259 dev_dbg(&interface
->dev
, "dev: %p, udev %p interface %p\n",
2260 dev
, dev
->udev
, interface
);
2261 dev
->interface
= interface
;
2262 /* set up the endpoint information */
2263 iface_desc
= interface
->cur_altsetting
;
2264 dev_dbg(&interface
->dev
, "num EP: %d\n",
2265 iface_desc
->desc
.bNumEndpoints
);
2266 for (i
= 0; i
< iface_desc
->desc
.bNumEndpoints
; ++i
) {
2267 endpoint
= &iface_desc
->endpoint
[i
].desc
;
2268 if (!dev
->read_endpoint
&& usb_endpoint_is_bulk_in(endpoint
)) {
2269 /* we found the bulk in endpoint */
2270 dev
->read_endpoint
= endpoint
->bEndpointAddress
;
2274 if (!dev
->read_endpoint
) {
2275 dev_err(&interface
->dev
, "Could not find bulk-in endpoint\n");
2278 timer_setup(&dev
->timer
, s2255_timer
, 0);
2279 init_waitqueue_head(&dev
->fw_data
->wait_fw
);
2280 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2281 struct s2255_vc
*vc
= &dev
->vc
[i
];
2284 init_waitqueue_head(&vc
->wait_setmode
);
2285 init_waitqueue_head(&vc
->wait_vidstatus
);
2286 spin_lock_init(&vc
->qlock
);
2287 mutex_init(&vc
->vb_lock
);
2290 dev
->fw_data
->fw_urb
= usb_alloc_urb(0, GFP_KERNEL
);
2291 if (!dev
->fw_data
->fw_urb
)
2294 dev
->fw_data
->pfw_data
= kzalloc(CHUNK_SIZE
, GFP_KERNEL
);
2295 if (!dev
->fw_data
->pfw_data
) {
2296 dev_err(&interface
->dev
, "out of memory!\n");
2299 /* load the first chunk */
2300 if (request_firmware(&dev
->fw_data
->fw
,
2301 FIRMWARE_FILE_NAME
, &dev
->udev
->dev
)) {
2302 dev_err(&interface
->dev
, "sensoray 2255 failed to get firmware\n");
2305 /* check the firmware is valid */
2306 fw_size
= dev
->fw_data
->fw
->size
;
2307 pdata
= (__le32
*) &dev
->fw_data
->fw
->data
[fw_size
- 8];
2309 if (*pdata
!= S2255_FW_MARKER
) {
2310 dev_err(&interface
->dev
, "Firmware invalid.\n");
2314 /* make sure firmware is the latest */
2316 pRel
= (__le32
*) &dev
->fw_data
->fw
->data
[fw_size
- 4];
2317 pr_info("s2255 dsp fw version %x\n", le32_to_cpu(*pRel
));
2318 dev
->dsp_fw_ver
= le32_to_cpu(*pRel
);
2319 if (dev
->dsp_fw_ver
< S2255_CUR_DSP_FWVER
)
2320 pr_info("s2255: f2255usb.bin out of date.\n");
2321 if (dev
->pid
== 0x2257 &&
2322 dev
->dsp_fw_ver
< S2255_MIN_DSP_COLORFILTER
)
2323 pr_warn("2257 needs firmware %d or above.\n",
2324 S2255_MIN_DSP_COLORFILTER
);
2326 usb_reset_device(dev
->udev
);
2327 /* load 2255 board specific */
2328 retval
= s2255_board_init(dev
);
2330 goto errorBOARDINIT
;
2331 s2255_fwload_start(dev
);
2332 /* loads v4l specific */
2333 retval
= s2255_probe_v4l(dev
);
2335 goto errorBOARDINIT
;
2336 dev_info(&interface
->dev
, "Sensoray 2255 detected\n");
2339 s2255_board_shutdown(dev
);
2341 release_firmware(dev
->fw_data
->fw
);
2343 kfree(dev
->fw_data
->pfw_data
);
2345 usb_free_urb(dev
->fw_data
->fw_urb
);
2347 del_timer_sync(&dev
->timer
);
2349 usb_put_dev(dev
->udev
);
2351 kfree(dev
->fw_data
);
2352 mutex_destroy(&dev
->lock
);
2356 pr_warn("Sensoray 2255 driver load failed: 0x%x\n", retval
);
2360 /* disconnect routine. when board is removed physically or with rmmod */
2361 static void s2255_disconnect(struct usb_interface
*interface
)
2363 struct s2255_dev
*dev
= to_s2255_dev(usb_get_intfdata(interface
));
2365 int channels
= atomic_read(&dev
->num_channels
);
2366 mutex_lock(&dev
->lock
);
2367 v4l2_device_disconnect(&dev
->v4l2_dev
);
2368 mutex_unlock(&dev
->lock
);
2369 /*see comments in the uvc_driver.c usb disconnect function */
2370 atomic_inc(&dev
->num_channels
);
2371 /* unregister each video device. */
2372 for (i
= 0; i
< channels
; i
++)
2373 video_unregister_device(&dev
->vc
[i
].vdev
);
2374 /* wake up any of our timers */
2375 atomic_set(&dev
->fw_data
->fw_state
, S2255_FW_DISCONNECTING
);
2376 wake_up(&dev
->fw_data
->wait_fw
);
2377 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2378 dev
->vc
[i
].setmode_ready
= 1;
2379 wake_up(&dev
->vc
[i
].wait_setmode
);
2380 dev
->vc
[i
].vidstatus_ready
= 1;
2381 wake_up(&dev
->vc
[i
].wait_vidstatus
);
2383 if (atomic_dec_and_test(&dev
->num_channels
))
2385 dev_info(&interface
->dev
, "%s\n", __func__
);
2388 static struct usb_driver s2255_driver
= {
2389 .name
= S2255_DRIVER_NAME
,
2390 .probe
= s2255_probe
,
2391 .disconnect
= s2255_disconnect
,
2392 .id_table
= s2255_table
,
2395 module_usb_driver(s2255_driver
);
2397 MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2398 MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2399 MODULE_LICENSE("GPL");
2400 MODULE_VERSION(S2255_VERSION
);
2401 MODULE_FIRMWARE(FIRMWARE_FILE_NAME
);