1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * s2255drv.c - a driver for the Sensoray 2255 USB video capture device
5 * Copyright (C) 2007-2014 by Sensoray Company Inc.
8 * Some video buffer code based on vivi driver:
10 * Sensoray 2255 device supports 4 simultaneous channels.
11 * The channels are not "crossbar" inputs, they are physically
12 * attached to separate video decoders.
14 * Because of USB2.0 bandwidth limitations. There is only a
15 * certain amount of data which may be transferred at one time.
17 * Example maximum bandwidth utilization:
19 * -full size, color mode YUYV or YUV422P: 2 channels at once
20 * -full or half size Grey scale: all 4 channels at once
21 * -half size, color mode YUYV or YUV422P: all 4 channels at once
22 * -full size, color mode YUYV or YUV422P 1/2 frame rate: all 4 channels
26 #include <linux/module.h>
27 #include <linux/firmware.h>
28 #include <linux/kernel.h>
29 #include <linux/mutex.h>
30 #include <linux/slab.h>
31 #include <linux/videodev2.h>
33 #include <linux/vmalloc.h>
34 #include <linux/usb.h>
35 #include <media/videobuf2-v4l2.h>
36 #include <media/videobuf2-vmalloc.h>
37 #include <media/v4l2-common.h>
38 #include <media/v4l2-device.h>
39 #include <media/v4l2-ioctl.h>
40 #include <media/v4l2-ctrls.h>
41 #include <media/v4l2-event.h>
43 #define S2255_VERSION "1.25.1"
44 #define FIRMWARE_FILE_NAME "f2255usb.bin"
46 /* default JPEG quality */
47 #define S2255_DEF_JPEG_QUAL 50
48 /* vendor request in */
50 /* vendor request out */
51 #define S2255_VR_OUT 1
53 #define S2255_VR_FW 0x30
54 /* USB endpoint number for configuring the device */
55 #define S2255_CONFIG_EP 2
56 /* maximum time for DSP to start responding after last FW word loaded(ms) */
57 #define S2255_DSP_BOOTTIME 800
58 /* maximum time to wait for firmware to load (ms) */
59 #define S2255_LOAD_TIMEOUT (5000 + S2255_DSP_BOOTTIME)
60 #define S2255_MIN_BUFS 2
61 #define S2255_SETMODE_TIMEOUT 500
62 #define S2255_VIDSTATUS_TIMEOUT 350
63 #define S2255_MARKER_FRAME cpu_to_le32(0x2255DA4AL)
64 #define S2255_MARKER_RESPONSE cpu_to_le32(0x2255ACACL)
65 #define S2255_RESPONSE_SETMODE cpu_to_le32(0x01)
66 #define S2255_RESPONSE_FW cpu_to_le32(0x10)
67 #define S2255_RESPONSE_STATUS cpu_to_le32(0x20)
68 #define S2255_USB_XFER_SIZE (16 * 1024)
69 #define MAX_CHANNELS 4
71 /* maximum size is PAL full size plus room for the marker header(s) */
72 #define SYS_FRAMES_MAXSIZE (720*288*2*2 + 4096)
73 #define DEF_USB_BLOCK S2255_USB_XFER_SIZE
74 #define LINE_SZ_4CIFS_NTSC 640
75 #define LINE_SZ_2CIFS_NTSC 640
76 #define LINE_SZ_1CIFS_NTSC 320
77 #define LINE_SZ_4CIFS_PAL 704
78 #define LINE_SZ_2CIFS_PAL 704
79 #define LINE_SZ_1CIFS_PAL 352
80 #define NUM_LINES_4CIFS_NTSC 240
81 #define NUM_LINES_2CIFS_NTSC 240
82 #define NUM_LINES_1CIFS_NTSC 240
83 #define NUM_LINES_4CIFS_PAL 288
84 #define NUM_LINES_2CIFS_PAL 288
85 #define NUM_LINES_1CIFS_PAL 288
86 #define LINE_SZ_DEF 640
87 #define NUM_LINES_DEF 240
90 /* predefined settings */
94 #define SCALE_4CIFS 1 /* 640x480(NTSC) or 704x576(PAL) */
95 #define SCALE_2CIFS 2 /* 640x240(NTSC) or 704x288(PAL) */
96 #define SCALE_1CIFS 3 /* 320x240(NTSC) or 352x288(PAL) */
97 /* SCALE_4CIFSI is the 2 fields interpolated into one */
98 #define SCALE_4CIFSI 4 /* 640x480(NTSC) or 704x576(PAL) high quality */
100 #define COLOR_YUVPL 1 /* YUV planar */
101 #define COLOR_YUVPK 2 /* YUV packed */
102 #define COLOR_Y8 4 /* monochrome */
103 #define COLOR_JPG 5 /* JPEG */
105 #define MASK_COLOR 0x000000ff
106 #define MASK_JPG_QUALITY 0x0000ff00
107 #define MASK_INPUT_TYPE 0x000f0000
108 /* frame decimation. */
109 #define FDEC_1 1 /* capture every frame. default */
110 #define FDEC_2 2 /* capture every 2nd frame */
111 #define FDEC_3 3 /* capture every 3rd frame */
112 #define FDEC_5 5 /* capture every 5th frame */
114 /*-------------------------------------------------------
115 * Default mode parameters.
116 *-------------------------------------------------------*/
117 #define DEF_SCALE SCALE_4CIFS
118 #define DEF_COLOR COLOR_YUVPL
119 #define DEF_FDEC FDEC_1
121 #define DEF_CONTRAST 0x5c
122 #define DEF_SATURATION 0x80
125 /* usb config commands */
126 #define IN_DATA_TOKEN cpu_to_le32(0x2255c0de)
127 #define CMD_2255 0xc2255000
128 #define CMD_SET_MODE cpu_to_le32((CMD_2255 | 0x10))
129 #define CMD_START cpu_to_le32((CMD_2255 | 0x20))
130 #define CMD_STOP cpu_to_le32((CMD_2255 | 0x30))
131 #define CMD_STATUS cpu_to_le32((CMD_2255 | 0x40))
134 u32 format
; /* input video format (NTSC, PAL) */
135 u32 scale
; /* output video scale */
136 u32 color
; /* output video color format */
137 u32 fdec
; /* frame decimation */
138 u32 bright
; /* brightness */
139 u32 contrast
; /* contrast */
140 u32 saturation
; /* saturation */
141 u32 hue
; /* hue (NTSC only)*/
142 u32 single
; /* capture 1 frame at a time (!=0), continuously (==0)*/
143 u32 usb_block
; /* block size. should be 4096 of DEF_USB_BLOCK */
144 u32 restart
; /* if DSP requires restart */
148 #define S2255_READ_IDLE 0
149 #define S2255_READ_FRAME 1
151 /* frame structure */
152 struct s2255_framei
{
154 unsigned long ulState
; /* ulState:S2255_READ_IDLE, S2255_READ_FRAME*/
155 void *lpvbits
; /* image data */
156 unsigned long cur_size
; /* current data copied to it */
159 /* image buffer structure */
160 struct s2255_bufferi
{
161 unsigned long dwFrames
; /* number of frames in buffer */
162 struct s2255_framei frame
[SYS_FRAMES
]; /* array of FRAME structures */
165 #define DEF_MODEI_NTSC_CONT {FORMAT_NTSC, DEF_SCALE, DEF_COLOR, \
166 DEF_FDEC, DEF_BRIGHT, DEF_CONTRAST, DEF_SATURATION, \
167 DEF_HUE, 0, DEF_USB_BLOCK, 0}
169 /* for firmware loading, fw_state */
170 #define S2255_FW_NOTLOADED 0
171 #define S2255_FW_LOADED_DSPWAIT 1
172 #define S2255_FW_SUCCESS 2
173 #define S2255_FW_FAILED 3
174 #define S2255_FW_DISCONNECTING 4
175 #define S2255_FW_MARKER cpu_to_le32(0x22552f2f)
176 /* 2255 read states */
177 #define S2255_READ_IDLE 0
178 #define S2255_READ_FRAME 1
185 wait_queue_head_t wait_fw
;
186 const struct firmware
*fw
;
189 struct s2255_pipeinfo
{
190 u32 max_transfer_size
;
191 u32 cur_transfer_size
;
195 void *dev
; /* back pointer to s2255_dev struct*/
200 struct s2255_fmt
; /*forward declaration */
203 /* 2255 video channel */
205 struct s2255_dev
*dev
;
206 struct video_device vdev
;
207 struct v4l2_ctrl_handler hdl
;
208 struct v4l2_ctrl
*jpegqual_ctrl
;
210 struct list_head buf_list
;
211 struct s2255_bufferi buffer
;
212 struct s2255_mode mode
;
214 /* jpeg compression */
216 /* capture parameters (for high quality mode full size) */
217 struct v4l2_captureparm cap_parm
;
220 /* allocated image size */
221 unsigned long req_image_size
;
222 /* received packet size */
223 unsigned long pkt_size
;
225 unsigned long frame_count
;
228 /* if channel configured to default state */
230 wait_queue_head_t wait_setmode
;
232 /* video status items */
234 wait_queue_head_t wait_vidstatus
;
238 enum v4l2_field field
;
239 const struct s2255_fmt
*fmt
;
240 int idx
; /* channel number on device, 0-3 */
241 struct vb2_queue vb_vidq
;
242 struct mutex vb_lock
; /* streaming lock */
248 struct s2255_vc vc
[MAX_CHANNELS
];
249 struct v4l2_device v4l2_dev
;
250 refcount_t num_channels
;
252 struct mutex lock
; /* channels[].vdev.lock */
253 struct mutex cmdlock
; /* protects cmdbuf */
254 struct usb_device
*udev
;
255 struct usb_interface
*interface
;
257 struct timer_list timer
;
258 struct s2255_fw
*fw_data
;
259 struct s2255_pipeinfo pipe
;
260 u32 cc
; /* current channel */
263 /* dsp firmware version (f2255usb.bin) */
265 u16 pid
; /* product id */
266 #define S2255_CMDBUF_SIZE 512
270 static inline struct s2255_dev
*to_s2255_dev(struct v4l2_device
*v4l2_dev
)
272 return container_of(v4l2_dev
, struct s2255_dev
, v4l2_dev
);
280 /* buffer for one video frame */
281 struct s2255_buffer
{
282 /* common v4l buffer stuff -- must be first */
283 struct vb2_v4l2_buffer vb
;
284 struct list_head list
;
288 /* current cypress EEPROM firmware version */
289 #define S2255_CUR_USB_FWVER ((3 << 8) | 12)
290 /* current DSP FW version */
291 #define S2255_CUR_DSP_FWVER 10104
292 /* Need DSP version 5+ for video status feature */
293 #define S2255_MIN_DSP_STATUS 5
294 #define S2255_MIN_DSP_COLORFILTER 8
295 #define S2255_NORMS (V4L2_STD_ALL)
297 /* private V4L2 controls */
300 * The following chart displays how COLORFILTER should be set
301 * =========================================================
302 * = fourcc = COLORFILTER =
303 * = ===============================
305 * =========================================================
306 * = V4L2_PIX_FMT_GREY(Y8) = monochrome from = monochrome=
307 * = = s-video or = composite =
308 * = = B/W camera = input =
309 * =========================================================
310 * = other = color, svideo = color, =
312 * =========================================================
315 * channels 0-3 on 2255 are composite
316 * channels 0-1 on 2257 are composite, 2-3 are s-video
317 * If COLORFILTER is 0 with a composite color camera connected,
318 * the output will appear monochrome but hatching
320 * COLORFILTER is different from "color killer" and "color effects"
323 #define S2255_V4L2_YC_ON 1
324 #define S2255_V4L2_YC_OFF 0
325 #define V4L2_CID_S2255_COLORFILTER (V4L2_CID_USER_S2255_BASE + 0)
327 /* frame prefix size (sent once every frame) */
328 #define PREFIX_SIZE 512
330 /* Channels on box are in reverse order */
331 static unsigned long G_chnmap
[MAX_CHANNELS
] = {3, 2, 1, 0};
335 static int s2255_start_readpipe(struct s2255_dev
*dev
);
336 static void s2255_stop_readpipe(struct s2255_dev
*dev
);
337 static int s2255_start_acquire(struct s2255_vc
*vc
);
338 static int s2255_stop_acquire(struct s2255_vc
*vc
);
339 static void s2255_fillbuff(struct s2255_vc
*vc
, struct s2255_buffer
*buf
,
341 static int s2255_set_mode(struct s2255_vc
*vc
, struct s2255_mode
*mode
);
342 static int s2255_board_shutdown(struct s2255_dev
*dev
);
343 static void s2255_fwload_start(struct s2255_dev
*dev
);
344 static void s2255_destroy(struct s2255_dev
*dev
);
345 static long s2255_vendor_req(struct s2255_dev
*dev
, unsigned char req
,
346 u16 index
, u16 value
, void *buf
,
347 s32 buf_len
, int bOut
);
349 /* dev_err macro with driver name */
350 #define S2255_DRIVER_NAME "s2255"
351 #define s2255_dev_err(dev, fmt, arg...) \
352 dev_err(dev, S2255_DRIVER_NAME " - " fmt, ##arg)
354 #define dprintk(dev, level, fmt, arg...) \
355 v4l2_dbg(level, debug, &dev->v4l2_dev, fmt, ## arg)
357 static struct usb_driver s2255_driver
;
359 /* start video number */
360 static int video_nr
= -1; /* /dev/videoN, -1 for autodetect */
362 /* Enable jpeg capture. */
363 static int jpeg_enable
= 1;
365 module_param(debug
, int, 0644);
366 MODULE_PARM_DESC(debug
, "Debug level(0-100) default 0");
367 module_param(video_nr
, int, 0644);
368 MODULE_PARM_DESC(video_nr
, "start video minor(-1 default autodetect)");
369 module_param(jpeg_enable
, int, 0644);
370 MODULE_PARM_DESC(jpeg_enable
, "Jpeg enable(1-on 0-off) default 1");
372 /* USB device table */
373 #define USB_SENSORAY_VID 0x1943
374 static const struct usb_device_id s2255_table
[] = {
375 {USB_DEVICE(USB_SENSORAY_VID
, 0x2255)},
376 {USB_DEVICE(USB_SENSORAY_VID
, 0x2257)}, /*same family as 2255*/
377 { } /* Terminating entry */
379 MODULE_DEVICE_TABLE(usb
, s2255_table
);
381 #define BUFFER_TIMEOUT msecs_to_jiffies(400)
384 /* JPEG formats must be defined last to support jpeg_enable parameter */
385 static const struct s2255_fmt formats
[] = {
387 .fourcc
= V4L2_PIX_FMT_YUYV
,
391 .fourcc
= V4L2_PIX_FMT_UYVY
,
394 .fourcc
= V4L2_PIX_FMT_YUV422P
,
398 .fourcc
= V4L2_PIX_FMT_GREY
,
401 .fourcc
= V4L2_PIX_FMT_JPEG
,
404 .fourcc
= V4L2_PIX_FMT_MJPEG
,
409 static int norm_maxw(struct s2255_vc
*vc
)
411 return (vc
->std
& V4L2_STD_525_60
) ?
412 LINE_SZ_4CIFS_NTSC
: LINE_SZ_4CIFS_PAL
;
415 static int norm_maxh(struct s2255_vc
*vc
)
417 return (vc
->std
& V4L2_STD_525_60
) ?
418 (NUM_LINES_1CIFS_NTSC
* 2) : (NUM_LINES_1CIFS_PAL
* 2);
421 static int norm_minw(struct s2255_vc
*vc
)
423 return (vc
->std
& V4L2_STD_525_60
) ?
424 LINE_SZ_1CIFS_NTSC
: LINE_SZ_1CIFS_PAL
;
427 static int norm_minh(struct s2255_vc
*vc
)
429 return (vc
->std
& V4L2_STD_525_60
) ?
430 (NUM_LINES_1CIFS_NTSC
) : (NUM_LINES_1CIFS_PAL
);
435 * TODO: fixme: move YUV reordering to hardware
436 * converts 2255 planar format to yuyv or uyvy
438 static void planar422p_to_yuv_packed(const unsigned char *in
,
440 int width
, int height
,
446 unsigned long size
= height
* width
;
448 pY
= (unsigned char *)in
;
449 pCr
= (unsigned char *)in
+ height
* width
;
450 pCb
= (unsigned char *)in
+ height
* width
+ (height
* width
/ 2);
451 for (i
= 0; i
< size
* 2; i
+= 4) {
452 out
[i
] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pY
++ : *pCr
++;
453 out
[i
+ 1] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pCr
++ : *pY
++;
454 out
[i
+ 2] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pY
++ : *pCb
++;
455 out
[i
+ 3] = (fmt
== V4L2_PIX_FMT_YUYV
) ? *pCb
++ : *pY
++;
460 static void s2255_reset_dsppower(struct s2255_dev
*dev
)
462 s2255_vendor_req(dev
, 0x40, 0x0000, 0x0001, NULL
, 0, 1);
464 s2255_vendor_req(dev
, 0x50, 0x0000, 0x0000, NULL
, 0, 1);
466 s2255_vendor_req(dev
, 0x10, 0x0000, 0x0000, NULL
, 0, 1);
470 /* kickstarts the firmware loading. from probe
472 static void s2255_timer(struct timer_list
*t
)
474 struct s2255_dev
*dev
= from_timer(dev
, t
, timer
);
475 struct s2255_fw
*data
= dev
->fw_data
;
476 if (usb_submit_urb(data
->fw_urb
, GFP_ATOMIC
) < 0) {
477 pr_err("s2255: can't submit urb\n");
478 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
479 /* wake up anything waiting for the firmware */
480 wake_up(&data
->wait_fw
);
486 /* this loads the firmware asynchronously.
487 Originally this was done synchronously in probe.
488 But it is better to load it asynchronously here than block
489 inside the probe function. Blocking inside probe affects boot time.
490 FW loading is triggered by the timer in the probe function
492 static void s2255_fwchunk_complete(struct urb
*urb
)
494 struct s2255_fw
*data
= urb
->context
;
495 struct usb_device
*udev
= urb
->dev
;
498 dev_err(&udev
->dev
, "URB failed with status %d\n", urb
->status
);
499 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
500 /* wake up anything waiting for the firmware */
501 wake_up(&data
->wait_fw
);
504 if (data
->fw_urb
== NULL
) {
505 s2255_dev_err(&udev
->dev
, "disconnected\n");
506 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
507 /* wake up anything waiting for the firmware */
508 wake_up(&data
->wait_fw
);
511 #define CHUNK_SIZE 512
512 /* all USB transfers must be done with continuous kernel memory.
513 can't allocate more than 128k in current linux kernel, so
514 upload the firmware in chunks
516 if (data
->fw_loaded
< data
->fw_size
) {
517 len
= (data
->fw_loaded
+ CHUNK_SIZE
) > data
->fw_size
?
518 data
->fw_size
% CHUNK_SIZE
: CHUNK_SIZE
;
520 if (len
< CHUNK_SIZE
)
521 memset(data
->pfw_data
, 0, CHUNK_SIZE
);
523 memcpy(data
->pfw_data
,
524 (char *) data
->fw
->data
+ data
->fw_loaded
, len
);
526 usb_fill_bulk_urb(data
->fw_urb
, udev
, usb_sndbulkpipe(udev
, 2),
527 data
->pfw_data
, CHUNK_SIZE
,
528 s2255_fwchunk_complete
, data
);
529 if (usb_submit_urb(data
->fw_urb
, GFP_ATOMIC
) < 0) {
530 dev_err(&udev
->dev
, "failed submit URB\n");
531 atomic_set(&data
->fw_state
, S2255_FW_FAILED
);
532 /* wake up anything waiting for the firmware */
533 wake_up(&data
->wait_fw
);
536 data
->fw_loaded
+= len
;
538 atomic_set(&data
->fw_state
, S2255_FW_LOADED_DSPWAIT
);
543 static void s2255_got_frame(struct s2255_vc
*vc
, int jpgsize
)
545 struct s2255_buffer
*buf
;
546 struct s2255_dev
*dev
= to_s2255_dev(vc
->vdev
.v4l2_dev
);
547 unsigned long flags
= 0;
549 spin_lock_irqsave(&vc
->qlock
, flags
);
550 if (list_empty(&vc
->buf_list
)) {
551 dprintk(dev
, 1, "No active queue to serve\n");
552 spin_unlock_irqrestore(&vc
->qlock
, flags
);
555 buf
= list_entry(vc
->buf_list
.next
,
556 struct s2255_buffer
, list
);
557 list_del(&buf
->list
);
558 buf
->vb
.vb2_buf
.timestamp
= ktime_get_ns();
559 buf
->vb
.field
= vc
->field
;
560 buf
->vb
.sequence
= vc
->frame_count
;
561 spin_unlock_irqrestore(&vc
->qlock
, flags
);
563 s2255_fillbuff(vc
, buf
, jpgsize
);
564 /* tell v4l buffer was filled */
565 vb2_buffer_done(&buf
->vb
.vb2_buf
, VB2_BUF_STATE_DONE
);
566 dprintk(dev
, 2, "%s: [buf] [%p]\n", __func__
, buf
);
569 static const struct s2255_fmt
*format_by_fourcc(int fourcc
)
572 for (i
= 0; i
< ARRAY_SIZE(formats
); i
++) {
573 if (-1 == formats
[i
].fourcc
)
575 if (!jpeg_enable
&& ((formats
[i
].fourcc
== V4L2_PIX_FMT_JPEG
) ||
576 (formats
[i
].fourcc
== V4L2_PIX_FMT_MJPEG
)))
578 if (formats
[i
].fourcc
== fourcc
)
584 /* video buffer vmalloc implementation based partly on VIVI driver which is
585 * Copyright (c) 2006 by
586 * Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
587 * Ted Walther <ted--a.t--enumera.com>
588 * John Sokol <sokol--a.t--videotechnology.com>
589 * http://v4l.videotechnology.com/
592 static void s2255_fillbuff(struct s2255_vc
*vc
,
593 struct s2255_buffer
*buf
, int jpgsize
)
597 char *vbuf
= vb2_plane_vaddr(&buf
->vb
.vb2_buf
, 0);
598 unsigned long last_frame
;
599 struct s2255_dev
*dev
= vc
->dev
;
603 last_frame
= vc
->last_frame
;
604 if (last_frame
!= -1) {
606 (const char *)vc
->buffer
.frame
[last_frame
].lpvbits
;
607 switch (vc
->fmt
->fourcc
) {
608 case V4L2_PIX_FMT_YUYV
:
609 case V4L2_PIX_FMT_UYVY
:
610 planar422p_to_yuv_packed((const unsigned char *)tmpbuf
,
615 case V4L2_PIX_FMT_GREY
:
616 memcpy(vbuf
, tmpbuf
, vc
->width
* vc
->height
);
618 case V4L2_PIX_FMT_JPEG
:
619 case V4L2_PIX_FMT_MJPEG
:
620 vb2_set_plane_payload(&buf
->vb
.vb2_buf
, 0, jpgsize
);
621 memcpy(vbuf
, tmpbuf
, jpgsize
);
623 case V4L2_PIX_FMT_YUV422P
:
625 vc
->width
* vc
->height
* 2);
628 pr_info("s2255: unknown format?\n");
632 pr_err("s2255: =======no frame\n");
635 dprintk(dev
, 2, "s2255fill at : Buffer %p size= %d\n",
640 /* ------------------------------------------------------------------
642 ------------------------------------------------------------------*/
644 static int queue_setup(struct vb2_queue
*vq
,
645 unsigned int *nbuffers
, unsigned int *nplanes
,
646 unsigned int sizes
[], struct device
*alloc_devs
[])
648 struct s2255_vc
*vc
= vb2_get_drv_priv(vq
);
649 if (*nbuffers
< S2255_MIN_BUFS
)
650 *nbuffers
= S2255_MIN_BUFS
;
652 sizes
[0] = vc
->width
* vc
->height
* (vc
->fmt
->depth
>> 3);
656 static int buffer_prepare(struct vb2_buffer
*vb
)
658 struct s2255_vc
*vc
= vb2_get_drv_priv(vb
->vb2_queue
);
659 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
660 struct s2255_buffer
*buf
= container_of(vbuf
, struct s2255_buffer
, vb
);
665 dprintk(vc
->dev
, 4, "%s\n", __func__
);
669 if ((w
< norm_minw(vc
)) ||
670 (w
> norm_maxw(vc
)) ||
671 (h
< norm_minh(vc
)) ||
672 (h
> norm_maxh(vc
))) {
673 dprintk(vc
->dev
, 4, "invalid buffer prepare\n");
676 size
= w
* h
* (vc
->fmt
->depth
>> 3);
677 if (vb2_plane_size(vb
, 0) < size
) {
678 dprintk(vc
->dev
, 4, "invalid buffer prepare\n");
682 vb2_set_plane_payload(&buf
->vb
.vb2_buf
, 0, size
);
686 static void buffer_queue(struct vb2_buffer
*vb
)
688 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
689 struct s2255_buffer
*buf
= container_of(vbuf
, struct s2255_buffer
, vb
);
690 struct s2255_vc
*vc
= vb2_get_drv_priv(vb
->vb2_queue
);
691 unsigned long flags
= 0;
692 dprintk(vc
->dev
, 1, "%s\n", __func__
);
693 spin_lock_irqsave(&vc
->qlock
, flags
);
694 list_add_tail(&buf
->list
, &vc
->buf_list
);
695 spin_unlock_irqrestore(&vc
->qlock
, flags
);
698 static int start_streaming(struct vb2_queue
*vq
, unsigned int count
);
699 static void stop_streaming(struct vb2_queue
*vq
);
701 static const struct vb2_ops s2255_video_qops
= {
702 .queue_setup
= queue_setup
,
703 .buf_prepare
= buffer_prepare
,
704 .buf_queue
= buffer_queue
,
705 .start_streaming
= start_streaming
,
706 .stop_streaming
= stop_streaming
,
709 static int vidioc_querycap(struct file
*file
, void *priv
,
710 struct v4l2_capability
*cap
)
712 struct s2255_vc
*vc
= video_drvdata(file
);
713 struct s2255_dev
*dev
= vc
->dev
;
715 strscpy(cap
->driver
, "s2255", sizeof(cap
->driver
));
716 strscpy(cap
->card
, "s2255", sizeof(cap
->card
));
717 usb_make_path(dev
->udev
, cap
->bus_info
, sizeof(cap
->bus_info
));
721 static int vidioc_enum_fmt_vid_cap(struct file
*file
, void *priv
,
722 struct v4l2_fmtdesc
*f
)
724 int index
= f
->index
;
726 if (index
>= ARRAY_SIZE(formats
))
728 if (!jpeg_enable
&& ((formats
[index
].fourcc
== V4L2_PIX_FMT_JPEG
) ||
729 (formats
[index
].fourcc
== V4L2_PIX_FMT_MJPEG
)))
731 f
->pixelformat
= formats
[index
].fourcc
;
735 static int vidioc_g_fmt_vid_cap(struct file
*file
, void *priv
,
736 struct v4l2_format
*f
)
738 struct s2255_vc
*vc
= video_drvdata(file
);
739 int is_ntsc
= vc
->std
& V4L2_STD_525_60
;
741 f
->fmt
.pix
.width
= vc
->width
;
742 f
->fmt
.pix
.height
= vc
->height
;
743 if (f
->fmt
.pix
.height
>=
744 (is_ntsc
? NUM_LINES_1CIFS_NTSC
: NUM_LINES_1CIFS_PAL
) * 2)
745 f
->fmt
.pix
.field
= V4L2_FIELD_INTERLACED
;
747 f
->fmt
.pix
.field
= V4L2_FIELD_TOP
;
748 f
->fmt
.pix
.pixelformat
= vc
->fmt
->fourcc
;
749 f
->fmt
.pix
.bytesperline
= f
->fmt
.pix
.width
* (vc
->fmt
->depth
>> 3);
750 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
751 f
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_SMPTE170M
;
755 static int vidioc_try_fmt_vid_cap(struct file
*file
, void *priv
,
756 struct v4l2_format
*f
)
758 const struct s2255_fmt
*fmt
;
759 enum v4l2_field field
;
760 struct s2255_vc
*vc
= video_drvdata(file
);
761 int is_ntsc
= vc
->std
& V4L2_STD_525_60
;
763 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
768 dprintk(vc
->dev
, 50, "%s NTSC: %d suggested width: %d, height: %d\n",
769 __func__
, is_ntsc
, f
->fmt
.pix
.width
, f
->fmt
.pix
.height
);
772 if (f
->fmt
.pix
.height
>= NUM_LINES_1CIFS_NTSC
* 2) {
773 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_NTSC
* 2;
774 field
= V4L2_FIELD_INTERLACED
;
776 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_NTSC
;
777 field
= V4L2_FIELD_TOP
;
779 if (f
->fmt
.pix
.width
>= LINE_SZ_4CIFS_NTSC
)
780 f
->fmt
.pix
.width
= LINE_SZ_4CIFS_NTSC
;
782 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_NTSC
;
785 if (f
->fmt
.pix
.height
>= NUM_LINES_1CIFS_PAL
* 2) {
786 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_PAL
* 2;
787 field
= V4L2_FIELD_INTERLACED
;
789 f
->fmt
.pix
.height
= NUM_LINES_1CIFS_PAL
;
790 field
= V4L2_FIELD_TOP
;
792 if (f
->fmt
.pix
.width
>= LINE_SZ_4CIFS_PAL
)
793 f
->fmt
.pix
.width
= LINE_SZ_4CIFS_PAL
;
795 f
->fmt
.pix
.width
= LINE_SZ_1CIFS_PAL
;
797 f
->fmt
.pix
.field
= field
;
798 f
->fmt
.pix
.bytesperline
= (f
->fmt
.pix
.width
* fmt
->depth
) >> 3;
799 f
->fmt
.pix
.sizeimage
= f
->fmt
.pix
.height
* f
->fmt
.pix
.bytesperline
;
800 f
->fmt
.pix
.colorspace
= V4L2_COLORSPACE_SMPTE170M
;
801 dprintk(vc
->dev
, 50, "%s: set width %d height %d field %d\n", __func__
,
802 f
->fmt
.pix
.width
, f
->fmt
.pix
.height
, f
->fmt
.pix
.field
);
806 static int vidioc_s_fmt_vid_cap(struct file
*file
, void *priv
,
807 struct v4l2_format
*f
)
809 struct s2255_vc
*vc
= video_drvdata(file
);
810 const struct s2255_fmt
*fmt
;
811 struct vb2_queue
*q
= &vc
->vb_vidq
;
812 struct s2255_mode mode
;
815 ret
= vidioc_try_fmt_vid_cap(file
, vc
, f
);
820 fmt
= format_by_fourcc(f
->fmt
.pix
.pixelformat
);
825 if (vb2_is_busy(q
)) {
826 dprintk(vc
->dev
, 1, "queue busy\n");
832 vc
->width
= f
->fmt
.pix
.width
;
833 vc
->height
= f
->fmt
.pix
.height
;
834 vc
->field
= f
->fmt
.pix
.field
;
835 if (vc
->width
> norm_minw(vc
)) {
836 if (vc
->height
> norm_minh(vc
)) {
837 if (vc
->cap_parm
.capturemode
&
838 V4L2_MODE_HIGHQUALITY
)
839 mode
.scale
= SCALE_4CIFSI
;
841 mode
.scale
= SCALE_4CIFS
;
843 mode
.scale
= SCALE_2CIFS
;
846 mode
.scale
= SCALE_1CIFS
;
849 switch (vc
->fmt
->fourcc
) {
850 case V4L2_PIX_FMT_GREY
:
851 mode
.color
&= ~MASK_COLOR
;
852 mode
.color
|= COLOR_Y8
;
854 case V4L2_PIX_FMT_JPEG
:
855 case V4L2_PIX_FMT_MJPEG
:
856 mode
.color
&= ~MASK_COLOR
;
857 mode
.color
|= COLOR_JPG
;
858 mode
.color
|= (vc
->jpegqual
<< 8);
860 case V4L2_PIX_FMT_YUV422P
:
861 mode
.color
&= ~MASK_COLOR
;
862 mode
.color
|= COLOR_YUVPL
;
864 case V4L2_PIX_FMT_YUYV
:
865 case V4L2_PIX_FMT_UYVY
:
867 mode
.color
&= ~MASK_COLOR
;
868 mode
.color
|= COLOR_YUVPK
;
871 if ((mode
.color
& MASK_COLOR
) != (vc
->mode
.color
& MASK_COLOR
))
873 else if (mode
.scale
!= vc
->mode
.scale
)
875 else if (mode
.format
!= vc
->mode
.format
)
878 (void) s2255_set_mode(vc
, &mode
);
883 /* write to the configuration pipe, synchronously */
884 static int s2255_write_config(struct usb_device
*udev
, unsigned char *pbuf
,
891 pipe
= usb_sndbulkpipe(udev
, S2255_CONFIG_EP
);
892 retval
= usb_bulk_msg(udev
, pipe
, pbuf
, size
, &done
, 500);
897 static u32
get_transfer_size(struct s2255_mode
*mode
)
899 int linesPerFrame
= LINE_SZ_DEF
;
900 int pixelsPerLine
= NUM_LINES_DEF
;
903 unsigned int mask_mult
;
908 if (mode
->format
== FORMAT_NTSC
) {
909 switch (mode
->scale
) {
912 linesPerFrame
= NUM_LINES_4CIFS_NTSC
* 2;
913 pixelsPerLine
= LINE_SZ_4CIFS_NTSC
;
916 linesPerFrame
= NUM_LINES_2CIFS_NTSC
;
917 pixelsPerLine
= LINE_SZ_2CIFS_NTSC
;
920 linesPerFrame
= NUM_LINES_1CIFS_NTSC
;
921 pixelsPerLine
= LINE_SZ_1CIFS_NTSC
;
926 } else if (mode
->format
== FORMAT_PAL
) {
927 switch (mode
->scale
) {
930 linesPerFrame
= NUM_LINES_4CIFS_PAL
* 2;
931 pixelsPerLine
= LINE_SZ_4CIFS_PAL
;
934 linesPerFrame
= NUM_LINES_2CIFS_PAL
;
935 pixelsPerLine
= LINE_SZ_2CIFS_PAL
;
938 linesPerFrame
= NUM_LINES_1CIFS_PAL
;
939 pixelsPerLine
= LINE_SZ_1CIFS_PAL
;
945 outImageSize
= linesPerFrame
* pixelsPerLine
;
946 if ((mode
->color
& MASK_COLOR
) != COLOR_Y8
) {
947 /* 2 bytes/pixel if not monochrome */
951 /* total bytes to send including prefix and 4K padding;
952 must be a multiple of USB_READ_SIZE */
953 usbInSize
= outImageSize
+ PREFIX_SIZE
; /* always send prefix */
954 mask_mult
= 0xffffffffUL
- DEF_USB_BLOCK
+ 1;
955 /* if size not a multiple of USB_READ_SIZE */
956 if (usbInSize
& ~mask_mult
)
957 usbInSize
= (usbInSize
& mask_mult
) + (DEF_USB_BLOCK
);
961 static void s2255_print_cfg(struct s2255_dev
*sdev
, struct s2255_mode
*mode
)
963 struct device
*dev
= &sdev
->udev
->dev
;
964 dev_info(dev
, "------------------------------------------------\n");
965 dev_info(dev
, "format: %d\nscale %d\n", mode
->format
, mode
->scale
);
966 dev_info(dev
, "fdec: %d\ncolor %d\n", mode
->fdec
, mode
->color
);
967 dev_info(dev
, "bright: 0x%x\n", mode
->bright
);
968 dev_info(dev
, "------------------------------------------------\n");
972 * set mode is the function which controls the DSP.
973 * the restart parameter in struct s2255_mode should be set whenever
974 * the image size could change via color format, video system or image
976 * When the restart parameter is set, we sleep for ONE frame to allow the
977 * DSP time to get the new frame
979 static int s2255_set_mode(struct s2255_vc
*vc
,
980 struct s2255_mode
*mode
)
983 unsigned long chn_rev
;
984 struct s2255_dev
*dev
= to_s2255_dev(vc
->vdev
.v4l2_dev
);
986 __le32
*buffer
= dev
->cmdbuf
;
988 mutex_lock(&dev
->cmdlock
);
989 chn_rev
= G_chnmap
[vc
->idx
];
990 dprintk(dev
, 3, "%s channel: %d\n", __func__
, vc
->idx
);
991 /* if JPEG, set the quality */
992 if ((mode
->color
& MASK_COLOR
) == COLOR_JPG
) {
993 mode
->color
&= ~MASK_COLOR
;
994 mode
->color
|= COLOR_JPG
;
995 mode
->color
&= ~MASK_JPG_QUALITY
;
996 mode
->color
|= (vc
->jpegqual
<< 8);
1000 vc
->req_image_size
= get_transfer_size(mode
);
1001 dprintk(dev
, 1, "%s: reqsize %ld\n", __func__
, vc
->req_image_size
);
1003 buffer
[0] = IN_DATA_TOKEN
;
1004 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
1005 buffer
[2] = CMD_SET_MODE
;
1006 for (i
= 0; i
< sizeof(struct s2255_mode
) / sizeof(u32
); i
++)
1007 buffer
[3 + i
] = cpu_to_le32(((u32
*)&vc
->mode
)[i
]);
1008 vc
->setmode_ready
= 0;
1009 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
1011 s2255_print_cfg(dev
, mode
);
1012 /* wait at least 3 frames before continuing */
1013 if (mode
->restart
) {
1014 wait_event_timeout(vc
->wait_setmode
,
1015 (vc
->setmode_ready
!= 0),
1016 msecs_to_jiffies(S2255_SETMODE_TIMEOUT
));
1017 if (vc
->setmode_ready
!= 1) {
1018 dprintk(dev
, 0, "s2255: no set mode response\n");
1022 /* clear the restart flag */
1023 vc
->mode
.restart
= 0;
1024 dprintk(dev
, 1, "%s chn %d, result: %d\n", __func__
, vc
->idx
, res
);
1025 mutex_unlock(&dev
->cmdlock
);
1029 static int s2255_cmd_status(struct s2255_vc
*vc
, u32
*pstatus
)
1033 struct s2255_dev
*dev
= to_s2255_dev(vc
->vdev
.v4l2_dev
);
1034 __le32
*buffer
= dev
->cmdbuf
;
1036 mutex_lock(&dev
->cmdlock
);
1037 chn_rev
= G_chnmap
[vc
->idx
];
1038 dprintk(dev
, 4, "%s chan %d\n", __func__
, vc
->idx
);
1039 /* form the get vid status command */
1040 buffer
[0] = IN_DATA_TOKEN
;
1041 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
1042 buffer
[2] = CMD_STATUS
;
1044 vc
->vidstatus_ready
= 0;
1045 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
1046 wait_event_timeout(vc
->wait_vidstatus
,
1047 (vc
->vidstatus_ready
!= 0),
1048 msecs_to_jiffies(S2255_VIDSTATUS_TIMEOUT
));
1049 if (vc
->vidstatus_ready
!= 1) {
1050 dprintk(dev
, 0, "s2255: no vidstatus response\n");
1053 *pstatus
= vc
->vidstatus
;
1054 dprintk(dev
, 4, "%s, vid status %d\n", __func__
, *pstatus
);
1055 mutex_unlock(&dev
->cmdlock
);
1059 static int start_streaming(struct vb2_queue
*vq
, unsigned int count
)
1061 struct s2255_vc
*vc
= vb2_get_drv_priv(vq
);
1064 vc
->last_frame
= -1;
1065 vc
->bad_payload
= 0;
1067 vc
->frame_count
= 0;
1068 for (j
= 0; j
< SYS_FRAMES
; j
++) {
1069 vc
->buffer
.frame
[j
].ulState
= S2255_READ_IDLE
;
1070 vc
->buffer
.frame
[j
].cur_size
= 0;
1072 return s2255_start_acquire(vc
);
1075 /* abort streaming and wait for last buffer */
1076 static void stop_streaming(struct vb2_queue
*vq
)
1078 struct s2255_vc
*vc
= vb2_get_drv_priv(vq
);
1079 struct s2255_buffer
*buf
, *node
;
1080 unsigned long flags
;
1081 (void) s2255_stop_acquire(vc
);
1082 spin_lock_irqsave(&vc
->qlock
, flags
);
1083 list_for_each_entry_safe(buf
, node
, &vc
->buf_list
, list
) {
1084 list_del(&buf
->list
);
1085 vb2_buffer_done(&buf
->vb
.vb2_buf
, VB2_BUF_STATE_ERROR
);
1086 dprintk(vc
->dev
, 2, "[%p/%d] done\n",
1087 buf
, buf
->vb
.vb2_buf
.index
);
1089 spin_unlock_irqrestore(&vc
->qlock
, flags
);
1092 static int vidioc_s_std(struct file
*file
, void *priv
, v4l2_std_id i
)
1094 struct s2255_vc
*vc
= video_drvdata(file
);
1095 struct s2255_mode mode
;
1096 struct vb2_queue
*q
= &vc
->vb_vidq
;
1099 * Changing the standard implies a format change, which is not allowed
1100 * while buffers for use with streaming have already been allocated.
1106 if (i
& V4L2_STD_525_60
) {
1107 dprintk(vc
->dev
, 4, "%s 60 Hz\n", __func__
);
1108 /* if changing format, reset frame decimation/intervals */
1109 if (mode
.format
!= FORMAT_NTSC
) {
1111 mode
.format
= FORMAT_NTSC
;
1113 vc
->width
= LINE_SZ_4CIFS_NTSC
;
1114 vc
->height
= NUM_LINES_4CIFS_NTSC
* 2;
1116 } else if (i
& V4L2_STD_625_50
) {
1117 dprintk(vc
->dev
, 4, "%s 50 Hz\n", __func__
);
1118 if (mode
.format
!= FORMAT_PAL
) {
1120 mode
.format
= FORMAT_PAL
;
1122 vc
->width
= LINE_SZ_4CIFS_PAL
;
1123 vc
->height
= NUM_LINES_4CIFS_PAL
* 2;
1129 s2255_set_mode(vc
, &mode
);
1133 static int vidioc_g_std(struct file
*file
, void *priv
, v4l2_std_id
*i
)
1135 struct s2255_vc
*vc
= video_drvdata(file
);
1141 /* Sensoray 2255 is a multiple channel capture device.
1142 It does not have a "crossbar" of inputs.
1143 We use one V4L device per channel. The user must
1144 be aware that certain combinations are not allowed.
1145 For instance, you cannot do full FPS on more than 2 channels(2 videodevs)
1146 at once in color(you can do full fps on 4 channels with greyscale.
1148 static int vidioc_enum_input(struct file
*file
, void *priv
,
1149 struct v4l2_input
*inp
)
1151 struct s2255_vc
*vc
= video_drvdata(file
);
1152 struct s2255_dev
*dev
= vc
->dev
;
1155 if (inp
->index
!= 0)
1157 inp
->type
= V4L2_INPUT_TYPE_CAMERA
;
1158 inp
->std
= S2255_NORMS
;
1160 if (dev
->dsp_fw_ver
>= S2255_MIN_DSP_STATUS
) {
1162 rc
= s2255_cmd_status(vc
, &status
);
1163 dprintk(dev
, 4, "s2255_cmd_status rc: %d status %x\n",
1166 inp
->status
= (status
& 0x01) ? 0
1167 : V4L2_IN_ST_NO_SIGNAL
;
1172 strscpy(inp
->name
, "Composite", sizeof(inp
->name
));
1175 strscpy(inp
->name
, (vc
->idx
< 2) ? "Composite" : "S-Video",
1182 static int vidioc_g_input(struct file
*file
, void *priv
, unsigned int *i
)
1187 static int vidioc_s_input(struct file
*file
, void *priv
, unsigned int i
)
1194 static int s2255_s_ctrl(struct v4l2_ctrl
*ctrl
)
1196 struct s2255_vc
*vc
=
1197 container_of(ctrl
->handler
, struct s2255_vc
, hdl
);
1198 struct s2255_mode mode
;
1200 /* update the mode to the corresponding value */
1202 case V4L2_CID_BRIGHTNESS
:
1203 mode
.bright
= ctrl
->val
;
1205 case V4L2_CID_CONTRAST
:
1206 mode
.contrast
= ctrl
->val
;
1209 mode
.hue
= ctrl
->val
;
1211 case V4L2_CID_SATURATION
:
1212 mode
.saturation
= ctrl
->val
;
1214 case V4L2_CID_S2255_COLORFILTER
:
1215 mode
.color
&= ~MASK_INPUT_TYPE
;
1216 mode
.color
|= !ctrl
->val
<< 16;
1218 case V4L2_CID_JPEG_COMPRESSION_QUALITY
:
1219 vc
->jpegqual
= ctrl
->val
;
1225 /* set mode here. Note: stream does not need restarted.
1226 some V4L programs restart stream unnecessarily
1229 s2255_set_mode(vc
, &mode
);
1233 static int vidioc_g_jpegcomp(struct file
*file
, void *priv
,
1234 struct v4l2_jpegcompression
*jc
)
1236 struct s2255_vc
*vc
= video_drvdata(file
);
1238 memset(jc
, 0, sizeof(*jc
));
1239 jc
->quality
= vc
->jpegqual
;
1240 dprintk(vc
->dev
, 2, "%s: quality %d\n", __func__
, jc
->quality
);
1244 static int vidioc_s_jpegcomp(struct file
*file
, void *priv
,
1245 const struct v4l2_jpegcompression
*jc
)
1247 struct s2255_vc
*vc
= video_drvdata(file
);
1249 if (jc
->quality
< 0 || jc
->quality
> 100)
1251 v4l2_ctrl_s_ctrl(vc
->jpegqual_ctrl
, jc
->quality
);
1252 dprintk(vc
->dev
, 2, "%s: quality %d\n", __func__
, jc
->quality
);
1256 static int vidioc_g_parm(struct file
*file
, void *priv
,
1257 struct v4l2_streamparm
*sp
)
1259 __u32 def_num
, def_dem
;
1260 struct s2255_vc
*vc
= video_drvdata(file
);
1262 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1264 sp
->parm
.capture
.capability
= V4L2_CAP_TIMEPERFRAME
;
1265 sp
->parm
.capture
.capturemode
= vc
->cap_parm
.capturemode
;
1266 sp
->parm
.capture
.readbuffers
= S2255_MIN_BUFS
;
1267 def_num
= (vc
->mode
.format
== FORMAT_NTSC
) ? 1001 : 1000;
1268 def_dem
= (vc
->mode
.format
== FORMAT_NTSC
) ? 30000 : 25000;
1269 sp
->parm
.capture
.timeperframe
.denominator
= def_dem
;
1270 switch (vc
->mode
.fdec
) {
1273 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1276 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 2;
1279 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 3;
1282 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 5;
1285 dprintk(vc
->dev
, 4, "%s capture mode, %d timeperframe %d/%d\n",
1287 sp
->parm
.capture
.capturemode
,
1288 sp
->parm
.capture
.timeperframe
.numerator
,
1289 sp
->parm
.capture
.timeperframe
.denominator
);
1293 static int vidioc_s_parm(struct file
*file
, void *priv
,
1294 struct v4l2_streamparm
*sp
)
1296 struct s2255_vc
*vc
= video_drvdata(file
);
1297 struct s2255_mode mode
;
1299 __u32 def_num
, def_dem
;
1300 if (sp
->type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
1303 /* high quality capture mode requires a stream restart */
1304 if ((vc
->cap_parm
.capturemode
!= sp
->parm
.capture
.capturemode
)
1305 && vb2_is_streaming(&vc
->vb_vidq
))
1307 def_num
= (mode
.format
== FORMAT_NTSC
) ? 1001 : 1000;
1308 def_dem
= (mode
.format
== FORMAT_NTSC
) ? 30000 : 25000;
1309 if (def_dem
!= sp
->parm
.capture
.timeperframe
.denominator
)
1310 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1311 else if (sp
->parm
.capture
.timeperframe
.numerator
<= def_num
)
1312 sp
->parm
.capture
.timeperframe
.numerator
= def_num
;
1313 else if (sp
->parm
.capture
.timeperframe
.numerator
<= (def_num
* 2)) {
1314 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 2;
1316 } else if (sp
->parm
.capture
.timeperframe
.numerator
<= (def_num
* 3)) {
1317 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 3;
1320 sp
->parm
.capture
.timeperframe
.numerator
= def_num
* 5;
1324 sp
->parm
.capture
.timeperframe
.denominator
= def_dem
;
1325 sp
->parm
.capture
.readbuffers
= S2255_MIN_BUFS
;
1326 s2255_set_mode(vc
, &mode
);
1327 dprintk(vc
->dev
, 4, "%s capture mode, %d timeperframe %d/%d, fdec %d\n",
1329 sp
->parm
.capture
.capturemode
,
1330 sp
->parm
.capture
.timeperframe
.numerator
,
1331 sp
->parm
.capture
.timeperframe
.denominator
, fdec
);
1335 #define NUM_SIZE_ENUMS 3
1336 static const struct v4l2_frmsize_discrete ntsc_sizes
[] = {
1341 static const struct v4l2_frmsize_discrete pal_sizes
[] = {
1347 static int vidioc_enum_framesizes(struct file
*file
, void *priv
,
1348 struct v4l2_frmsizeenum
*fe
)
1350 struct s2255_vc
*vc
= video_drvdata(file
);
1351 int is_ntsc
= vc
->std
& V4L2_STD_525_60
;
1352 const struct s2255_fmt
*fmt
;
1354 if (fe
->index
>= NUM_SIZE_ENUMS
)
1357 fmt
= format_by_fourcc(fe
->pixel_format
);
1360 fe
->type
= V4L2_FRMSIZE_TYPE_DISCRETE
;
1361 fe
->discrete
= is_ntsc
? ntsc_sizes
[fe
->index
] : pal_sizes
[fe
->index
];
1365 static int vidioc_enum_frameintervals(struct file
*file
, void *priv
,
1366 struct v4l2_frmivalenum
*fe
)
1368 struct s2255_vc
*vc
= video_drvdata(file
);
1369 const struct s2255_fmt
*fmt
;
1370 const struct v4l2_frmsize_discrete
*sizes
;
1371 int is_ntsc
= vc
->std
& V4L2_STD_525_60
;
1372 #define NUM_FRAME_ENUMS 4
1373 int frm_dec
[NUM_FRAME_ENUMS
] = {1, 2, 3, 5};
1376 if (fe
->index
>= NUM_FRAME_ENUMS
)
1379 fmt
= format_by_fourcc(fe
->pixel_format
);
1383 sizes
= is_ntsc
? ntsc_sizes
: pal_sizes
;
1384 for (i
= 0; i
< NUM_SIZE_ENUMS
; i
++, sizes
++)
1385 if (fe
->width
== sizes
->width
&&
1386 fe
->height
== sizes
->height
)
1388 if (i
== NUM_SIZE_ENUMS
)
1391 fe
->type
= V4L2_FRMIVAL_TYPE_DISCRETE
;
1392 fe
->discrete
.denominator
= is_ntsc
? 30000 : 25000;
1393 fe
->discrete
.numerator
= (is_ntsc
? 1001 : 1000) * frm_dec
[fe
->index
];
1394 dprintk(vc
->dev
, 4, "%s discrete %d/%d\n", __func__
,
1395 fe
->discrete
.numerator
,
1396 fe
->discrete
.denominator
);
1400 static int s2255_open(struct file
*file
)
1402 struct s2255_vc
*vc
= video_drvdata(file
);
1403 struct s2255_dev
*dev
= vc
->dev
;
1407 rc
= v4l2_fh_open(file
);
1411 dprintk(dev
, 1, "s2255: %s\n", __func__
);
1412 state
= atomic_read(&dev
->fw_data
->fw_state
);
1414 case S2255_FW_DISCONNECTING
:
1416 case S2255_FW_FAILED
:
1417 s2255_dev_err(&dev
->udev
->dev
,
1418 "firmware load failed. retrying.\n");
1419 s2255_fwload_start(dev
);
1420 wait_event_timeout(dev
->fw_data
->wait_fw
,
1421 ((atomic_read(&dev
->fw_data
->fw_state
)
1422 == S2255_FW_SUCCESS
) ||
1423 (atomic_read(&dev
->fw_data
->fw_state
)
1424 == S2255_FW_DISCONNECTING
)),
1425 msecs_to_jiffies(S2255_LOAD_TIMEOUT
));
1426 /* state may have changed, re-read */
1427 state
= atomic_read(&dev
->fw_data
->fw_state
);
1429 case S2255_FW_NOTLOADED
:
1430 case S2255_FW_LOADED_DSPWAIT
:
1431 /* give S2255_LOAD_TIMEOUT time for firmware to load in case
1432 driver loaded and then device immediately opened */
1433 pr_info("%s waiting for firmware load\n", __func__
);
1434 wait_event_timeout(dev
->fw_data
->wait_fw
,
1435 ((atomic_read(&dev
->fw_data
->fw_state
)
1436 == S2255_FW_SUCCESS
) ||
1437 (atomic_read(&dev
->fw_data
->fw_state
)
1438 == S2255_FW_DISCONNECTING
)),
1439 msecs_to_jiffies(S2255_LOAD_TIMEOUT
));
1440 /* state may have changed, re-read */
1441 state
= atomic_read(&dev
->fw_data
->fw_state
);
1443 case S2255_FW_SUCCESS
:
1447 /* state may have changed in above switch statement */
1449 case S2255_FW_SUCCESS
:
1451 case S2255_FW_FAILED
:
1452 pr_info("2255 firmware load failed.\n");
1454 case S2255_FW_DISCONNECTING
:
1455 pr_info("%s: disconnecting\n", __func__
);
1457 case S2255_FW_LOADED_DSPWAIT
:
1458 case S2255_FW_NOTLOADED
:
1459 pr_info("%s: firmware not loaded, please retry\n",
1462 * Timeout on firmware load means device unusable.
1463 * Set firmware failure state.
1464 * On next s2255_open the firmware will be reloaded.
1466 atomic_set(&dev
->fw_data
->fw_state
,
1470 pr_info("%s: unknown state\n", __func__
);
1473 if (!vc
->configured
) {
1474 /* configure channel to default state */
1475 vc
->fmt
= &formats
[0];
1476 s2255_set_mode(vc
, &vc
->mode
);
1482 static void s2255_destroy(struct s2255_dev
*dev
)
1484 dprintk(dev
, 1, "%s", __func__
);
1485 /* board shutdown stops the read pipe if it is running */
1486 s2255_board_shutdown(dev
);
1487 /* make sure firmware still not trying to load */
1488 timer_shutdown_sync(&dev
->timer
); /* only started in .probe and .open */
1489 if (dev
->fw_data
->fw_urb
) {
1490 usb_kill_urb(dev
->fw_data
->fw_urb
);
1491 usb_free_urb(dev
->fw_data
->fw_urb
);
1492 dev
->fw_data
->fw_urb
= NULL
;
1494 release_firmware(dev
->fw_data
->fw
);
1495 kfree(dev
->fw_data
->pfw_data
);
1496 kfree(dev
->fw_data
);
1497 /* reset the DSP so firmware can be reloaded next time */
1498 s2255_reset_dsppower(dev
);
1499 mutex_destroy(&dev
->lock
);
1500 usb_put_dev(dev
->udev
);
1501 v4l2_device_unregister(&dev
->v4l2_dev
);
1506 static const struct v4l2_file_operations s2255_fops_v4l
= {
1507 .owner
= THIS_MODULE
,
1509 .release
= vb2_fop_release
,
1510 .poll
= vb2_fop_poll
,
1511 .unlocked_ioctl
= video_ioctl2
, /* V4L2 ioctl handler */
1512 .mmap
= vb2_fop_mmap
,
1513 .read
= vb2_fop_read
,
1516 static const struct v4l2_ioctl_ops s2255_ioctl_ops
= {
1517 .vidioc_querycap
= vidioc_querycap
,
1518 .vidioc_enum_fmt_vid_cap
= vidioc_enum_fmt_vid_cap
,
1519 .vidioc_g_fmt_vid_cap
= vidioc_g_fmt_vid_cap
,
1520 .vidioc_try_fmt_vid_cap
= vidioc_try_fmt_vid_cap
,
1521 .vidioc_s_fmt_vid_cap
= vidioc_s_fmt_vid_cap
,
1522 .vidioc_reqbufs
= vb2_ioctl_reqbufs
,
1523 .vidioc_querybuf
= vb2_ioctl_querybuf
,
1524 .vidioc_qbuf
= vb2_ioctl_qbuf
,
1525 .vidioc_dqbuf
= vb2_ioctl_dqbuf
,
1526 .vidioc_s_std
= vidioc_s_std
,
1527 .vidioc_g_std
= vidioc_g_std
,
1528 .vidioc_enum_input
= vidioc_enum_input
,
1529 .vidioc_g_input
= vidioc_g_input
,
1530 .vidioc_s_input
= vidioc_s_input
,
1531 .vidioc_streamon
= vb2_ioctl_streamon
,
1532 .vidioc_streamoff
= vb2_ioctl_streamoff
,
1533 .vidioc_s_jpegcomp
= vidioc_s_jpegcomp
,
1534 .vidioc_g_jpegcomp
= vidioc_g_jpegcomp
,
1535 .vidioc_s_parm
= vidioc_s_parm
,
1536 .vidioc_g_parm
= vidioc_g_parm
,
1537 .vidioc_enum_framesizes
= vidioc_enum_framesizes
,
1538 .vidioc_enum_frameintervals
= vidioc_enum_frameintervals
,
1539 .vidioc_log_status
= v4l2_ctrl_log_status
,
1540 .vidioc_subscribe_event
= v4l2_ctrl_subscribe_event
,
1541 .vidioc_unsubscribe_event
= v4l2_event_unsubscribe
,
1544 static void s2255_video_device_release(struct video_device
*vdev
)
1546 struct s2255_dev
*dev
= to_s2255_dev(vdev
->v4l2_dev
);
1547 struct s2255_vc
*vc
=
1548 container_of(vdev
, struct s2255_vc
, vdev
);
1550 dprintk(dev
, 4, "%s, chnls: %d\n", __func__
,
1551 refcount_read(&dev
->num_channels
));
1553 v4l2_ctrl_handler_free(&vc
->hdl
);
1555 if (refcount_dec_and_test(&dev
->num_channels
))
1560 static const struct video_device
template = {
1562 .fops
= &s2255_fops_v4l
,
1563 .ioctl_ops
= &s2255_ioctl_ops
,
1564 .release
= s2255_video_device_release
,
1565 .tvnorms
= S2255_NORMS
,
1568 static const struct v4l2_ctrl_ops s2255_ctrl_ops
= {
1569 .s_ctrl
= s2255_s_ctrl
,
1572 static const struct v4l2_ctrl_config color_filter_ctrl
= {
1573 .ops
= &s2255_ctrl_ops
,
1574 .name
= "Color Filter",
1575 .id
= V4L2_CID_S2255_COLORFILTER
,
1576 .type
= V4L2_CTRL_TYPE_BOOLEAN
,
1582 static int s2255_probe_v4l(struct s2255_dev
*dev
)
1586 int cur_nr
= video_nr
;
1587 struct s2255_vc
*vc
;
1588 struct vb2_queue
*q
;
1590 ret
= v4l2_device_register(&dev
->interface
->dev
, &dev
->v4l2_dev
);
1593 /* initialize all video 4 linux */
1594 /* register 4 video devices */
1595 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
1597 INIT_LIST_HEAD(&vc
->buf_list
);
1599 v4l2_ctrl_handler_init(&vc
->hdl
, 6);
1600 v4l2_ctrl_new_std(&vc
->hdl
, &s2255_ctrl_ops
,
1601 V4L2_CID_BRIGHTNESS
, -127, 127, 1, DEF_BRIGHT
);
1602 v4l2_ctrl_new_std(&vc
->hdl
, &s2255_ctrl_ops
,
1603 V4L2_CID_CONTRAST
, 0, 255, 1, DEF_CONTRAST
);
1604 v4l2_ctrl_new_std(&vc
->hdl
, &s2255_ctrl_ops
,
1605 V4L2_CID_SATURATION
, 0, 255, 1, DEF_SATURATION
);
1606 v4l2_ctrl_new_std(&vc
->hdl
, &s2255_ctrl_ops
,
1607 V4L2_CID_HUE
, 0, 255, 1, DEF_HUE
);
1608 vc
->jpegqual_ctrl
= v4l2_ctrl_new_std(&vc
->hdl
,
1610 V4L2_CID_JPEG_COMPRESSION_QUALITY
,
1611 0, 100, 1, S2255_DEF_JPEG_QUAL
);
1612 if (dev
->dsp_fw_ver
>= S2255_MIN_DSP_COLORFILTER
&&
1613 (dev
->pid
!= 0x2257 || vc
->idx
<= 1))
1614 v4l2_ctrl_new_custom(&vc
->hdl
, &color_filter_ctrl
,
1616 if (vc
->hdl
.error
) {
1617 ret
= vc
->hdl
.error
;
1618 v4l2_ctrl_handler_free(&vc
->hdl
);
1619 dev_err(&dev
->udev
->dev
, "couldn't register control\n");
1623 q
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1624 q
->io_modes
= VB2_MMAP
| VB2_READ
| VB2_USERPTR
;
1626 q
->lock
= &vc
->vb_lock
;
1627 q
->buf_struct_size
= sizeof(struct s2255_buffer
);
1628 q
->mem_ops
= &vb2_vmalloc_memops
;
1629 q
->ops
= &s2255_video_qops
;
1630 q
->timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
1631 ret
= vb2_queue_init(q
);
1633 dev_err(&dev
->udev
->dev
,
1634 "%s vb2_queue_init 0x%x\n", __func__
, ret
);
1637 /* register video devices */
1638 vc
->vdev
= template;
1640 vc
->vdev
.ctrl_handler
= &vc
->hdl
;
1641 vc
->vdev
.lock
= &dev
->lock
;
1642 vc
->vdev
.v4l2_dev
= &dev
->v4l2_dev
;
1643 vc
->vdev
.device_caps
= V4L2_CAP_VIDEO_CAPTURE
|
1644 V4L2_CAP_STREAMING
| V4L2_CAP_READWRITE
;
1645 video_set_drvdata(&vc
->vdev
, vc
);
1647 ret
= video_register_device(&vc
->vdev
,
1651 ret
= video_register_device(&vc
->vdev
,
1656 dev_err(&dev
->udev
->dev
,
1657 "failed to register video device!\n");
1660 refcount_inc(&dev
->num_channels
);
1661 v4l2_info(&dev
->v4l2_dev
, "V4L2 device registered as %s\n",
1662 video_device_node_name(&vc
->vdev
));
1665 pr_info("Sensoray 2255 V4L driver Revision: %s\n",
1667 /* if no channels registered, return error and probe will fail*/
1668 if (refcount_read(&dev
->num_channels
) == 0) {
1669 v4l2_device_unregister(&dev
->v4l2_dev
);
1672 if (refcount_read(&dev
->num_channels
) != MAX_CHANNELS
)
1673 pr_warn("s2255: Not all channels available.\n");
1677 /* this function moves the usb stream read pipe data
1678 * into the system buffers.
1679 * returns 0 on success, EAGAIN if more data to process( call this
1682 * Received frame structure:
1683 * bytes 0-3: marker : 0x2255DA4AL (S2255_MARKER_FRAME)
1684 * bytes 4-7: channel: 0-3
1685 * bytes 8-11: payload size: size of the frame
1686 * bytes 12-payloadsize+12: frame data
1688 static int save_frame(struct s2255_dev
*dev
, struct s2255_pipeinfo
*pipe_info
)
1694 unsigned long copy_size
;
1697 struct s2255_framei
*frm
;
1698 unsigned char *pdata
;
1699 struct s2255_vc
*vc
;
1700 dprintk(dev
, 100, "buffer to user\n");
1701 vc
= &dev
->vc
[dev
->cc
];
1702 idx
= vc
->cur_frame
;
1703 frm
= &vc
->buffer
.frame
[idx
];
1704 if (frm
->ulState
== S2255_READ_IDLE
) {
1707 __le32
*pdword
; /*data from dsp is little endian */
1709 /* search for marker codes */
1710 pdata
= (unsigned char *)pipe_info
->transfer_buffer
;
1711 pdword
= (__le32
*)pdata
;
1712 for (jj
= 0; jj
< (pipe_info
->cur_transfer_size
- 12); jj
++) {
1714 case S2255_MARKER_FRAME
:
1715 dprintk(dev
, 4, "marker @ offset: %d [%x %x]\n",
1716 jj
, pdata
[0], pdata
[1]);
1717 offset
= jj
+ PREFIX_SIZE
;
1719 cc
= le32_to_cpu(pdword
[1]);
1720 if (cc
>= MAX_CHANNELS
) {
1726 dev
->cc
= G_chnmap
[cc
];
1727 vc
= &dev
->vc
[dev
->cc
];
1728 payload
= le32_to_cpu(pdword
[3]);
1729 if (payload
> vc
->req_image_size
) {
1731 /* discard the bad frame */
1734 vc
->pkt_size
= payload
;
1735 vc
->jpg_size
= le32_to_cpu(pdword
[4]);
1737 case S2255_MARKER_RESPONSE
:
1739 pdata
+= DEF_USB_BLOCK
;
1740 jj
+= DEF_USB_BLOCK
;
1741 if (le32_to_cpu(pdword
[1]) >= MAX_CHANNELS
)
1743 cc
= G_chnmap
[le32_to_cpu(pdword
[1])];
1744 if (cc
>= MAX_CHANNELS
)
1747 switch (pdword
[2]) {
1748 case S2255_RESPONSE_SETMODE
:
1749 /* check if channel valid */
1750 /* set mode ready */
1751 vc
->setmode_ready
= 1;
1752 wake_up(&vc
->wait_setmode
);
1753 dprintk(dev
, 5, "setmode rdy %d\n", cc
);
1755 case S2255_RESPONSE_FW
:
1756 dev
->chn_ready
|= (1 << cc
);
1757 if ((dev
->chn_ready
& 0x0f) != 0x0f)
1759 /* all channels ready */
1760 pr_info("s2255: fw loaded\n");
1761 atomic_set(&dev
->fw_data
->fw_state
,
1763 wake_up(&dev
->fw_data
->wait_fw
);
1765 case S2255_RESPONSE_STATUS
:
1766 vc
->vidstatus
= le32_to_cpu(pdword
[3]);
1767 vc
->vidstatus_ready
= 1;
1768 wake_up(&vc
->wait_vidstatus
);
1769 dprintk(dev
, 5, "vstat %x chan %d\n",
1770 le32_to_cpu(pdword
[3]), cc
);
1773 pr_info("s2255 unknown resp\n");
1787 vc
= &dev
->vc
[dev
->cc
];
1788 idx
= vc
->cur_frame
;
1789 frm
= &vc
->buffer
.frame
[idx
];
1790 /* search done. now find out if should be acquiring on this channel */
1791 if (!vb2_is_streaming(&vc
->vb_vidq
)) {
1792 /* we found a frame, but this channel is turned off */
1793 frm
->ulState
= S2255_READ_IDLE
;
1797 if (frm
->ulState
== S2255_READ_IDLE
) {
1798 frm
->ulState
= S2255_READ_FRAME
;
1802 /* skip the marker 512 bytes (and offset if out of sync) */
1803 psrc
= (u8
*)pipe_info
->transfer_buffer
+ offset
;
1806 if (frm
->lpvbits
== NULL
) {
1807 dprintk(dev
, 1, "s2255 frame buffer == NULL.%p %p %d %d",
1808 frm
, dev
, dev
->cc
, idx
);
1812 pdest
= frm
->lpvbits
+ frm
->cur_size
;
1814 copy_size
= (pipe_info
->cur_transfer_size
- offset
);
1816 size
= vc
->pkt_size
- PREFIX_SIZE
;
1818 /* sanity check on pdest */
1819 if ((copy_size
+ frm
->cur_size
) < vc
->req_image_size
)
1820 memcpy(pdest
, psrc
, copy_size
);
1822 frm
->cur_size
+= copy_size
;
1823 dprintk(dev
, 4, "cur_size: %lu, size: %lu\n", frm
->cur_size
, size
);
1825 if (frm
->cur_size
>= size
) {
1826 dprintk(dev
, 2, "******[%d]Buffer[%d]full*******\n",
1828 vc
->last_frame
= vc
->cur_frame
;
1830 /* end of system frame ring buffer, start at zero */
1831 if ((vc
->cur_frame
== SYS_FRAMES
) ||
1832 (vc
->cur_frame
== vc
->buffer
.dwFrames
))
1835 if (vb2_is_streaming(&vc
->vb_vidq
))
1836 s2255_got_frame(vc
, vc
->jpg_size
);
1838 frm
->ulState
= S2255_READ_IDLE
;
1842 /* done successfully */
1846 static void s2255_read_video_callback(struct s2255_dev
*dev
,
1847 struct s2255_pipeinfo
*pipe_info
)
1850 dprintk(dev
, 50, "callback read video\n");
1852 if (dev
->cc
>= MAX_CHANNELS
) {
1854 dev_err(&dev
->udev
->dev
, "invalid channel\n");
1857 /* otherwise copy to the system buffers */
1858 res
= save_frame(dev
, pipe_info
);
1860 dprintk(dev
, 4, "s2255: read callback failed\n");
1862 dprintk(dev
, 50, "callback read video done\n");
1866 static long s2255_vendor_req(struct s2255_dev
*dev
, unsigned char Request
,
1867 u16 Index
, u16 Value
, void *TransferBuffer
,
1868 s32 TransferBufferLength
, int bOut
)
1873 buf
= kmalloc(TransferBufferLength
, GFP_KERNEL
);
1878 r
= usb_control_msg(dev
->udev
, usb_rcvctrlpipe(dev
->udev
, 0),
1880 USB_TYPE_VENDOR
| USB_RECIP_DEVICE
|
1883 TransferBufferLength
, USB_CTRL_SET_TIMEOUT
);
1886 memcpy(TransferBuffer
, buf
, TransferBufferLength
);
1888 memcpy(buf
, TransferBuffer
, TransferBufferLength
);
1889 r
= usb_control_msg(dev
->udev
, usb_sndctrlpipe(dev
->udev
, 0),
1890 Request
, USB_TYPE_VENDOR
| USB_RECIP_DEVICE
,
1892 TransferBufferLength
, USB_CTRL_SET_TIMEOUT
);
1899 * retrieve FX2 firmware version. future use.
1900 * @param dev pointer to device extension
1901 * @return -1 for fail, else returns firmware version as an int(16 bits)
1903 static int s2255_get_fx2fw(struct s2255_dev
*dev
)
1907 u8 transBuffer
[2] = {};
1909 ret
= s2255_vendor_req(dev
, S2255_VR_FW
, 0, 0, transBuffer
,
1910 sizeof(transBuffer
), S2255_VR_IN
);
1912 dprintk(dev
, 2, "get fw error: %x\n", ret
);
1913 fw
= transBuffer
[0] + (transBuffer
[1] << 8);
1914 dprintk(dev
, 2, "Get FW %x %x\n", transBuffer
[0], transBuffer
[1]);
1919 * Create the system ring buffer to copy frames into from the
1922 static int s2255_create_sys_buffers(struct s2255_vc
*vc
)
1925 unsigned long reqsize
;
1926 vc
->buffer
.dwFrames
= SYS_FRAMES
;
1927 /* always allocate maximum size(PAL) for system buffers */
1928 reqsize
= SYS_FRAMES_MAXSIZE
;
1930 if (reqsize
> SYS_FRAMES_MAXSIZE
)
1931 reqsize
= SYS_FRAMES_MAXSIZE
;
1933 for (i
= 0; i
< SYS_FRAMES
; i
++) {
1934 /* allocate the frames */
1935 vc
->buffer
.frame
[i
].lpvbits
= vmalloc(reqsize
);
1936 vc
->buffer
.frame
[i
].size
= reqsize
;
1937 if (vc
->buffer
.frame
[i
].lpvbits
== NULL
) {
1938 pr_info("out of memory. using less frames\n");
1939 vc
->buffer
.dwFrames
= i
;
1944 /* make sure internal states are set */
1945 for (i
= 0; i
< SYS_FRAMES
; i
++) {
1946 vc
->buffer
.frame
[i
].ulState
= 0;
1947 vc
->buffer
.frame
[i
].cur_size
= 0;
1951 vc
->last_frame
= -1;
1955 static int s2255_release_sys_buffers(struct s2255_vc
*vc
)
1958 for (i
= 0; i
< SYS_FRAMES
; i
++) {
1959 vfree(vc
->buffer
.frame
[i
].lpvbits
);
1960 vc
->buffer
.frame
[i
].lpvbits
= NULL
;
1965 static int s2255_board_init(struct s2255_dev
*dev
)
1967 struct s2255_mode mode_def
= DEF_MODEI_NTSC_CONT
;
1970 struct s2255_pipeinfo
*pipe
= &dev
->pipe
;
1971 dprintk(dev
, 4, "board init: %p", dev
);
1972 memset(pipe
, 0, sizeof(*pipe
));
1974 pipe
->cur_transfer_size
= S2255_USB_XFER_SIZE
;
1975 pipe
->max_transfer_size
= S2255_USB_XFER_SIZE
;
1977 pipe
->transfer_buffer
= kzalloc(pipe
->max_transfer_size
,
1979 if (pipe
->transfer_buffer
== NULL
) {
1980 dprintk(dev
, 1, "out of memory!\n");
1983 /* query the firmware */
1984 fw_ver
= s2255_get_fx2fw(dev
);
1986 pr_info("s2255: usb firmware version %d.%d\n",
1987 (fw_ver
>> 8) & 0xff,
1990 if (fw_ver
< S2255_CUR_USB_FWVER
)
1991 pr_info("s2255: newer USB firmware available\n");
1993 for (j
= 0; j
< MAX_CHANNELS
; j
++) {
1994 struct s2255_vc
*vc
= &dev
->vc
[j
];
1995 vc
->mode
= mode_def
;
1996 if (dev
->pid
== 0x2257 && j
> 1)
1997 vc
->mode
.color
|= (1 << 16);
1998 vc
->jpegqual
= S2255_DEF_JPEG_QUAL
;
1999 vc
->width
= LINE_SZ_4CIFS_NTSC
;
2000 vc
->height
= NUM_LINES_4CIFS_NTSC
* 2;
2001 vc
->std
= V4L2_STD_NTSC_M
;
2002 vc
->fmt
= &formats
[0];
2003 vc
->mode
.restart
= 1;
2004 vc
->req_image_size
= get_transfer_size(&mode_def
);
2005 vc
->frame_count
= 0;
2006 /* create the system buffers */
2007 s2255_create_sys_buffers(vc
);
2009 /* start read pipe */
2010 s2255_start_readpipe(dev
);
2011 dprintk(dev
, 1, "%s: success\n", __func__
);
2015 static int s2255_board_shutdown(struct s2255_dev
*dev
)
2018 dprintk(dev
, 1, "%s: dev: %p", __func__
, dev
);
2020 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2021 if (vb2_is_streaming(&dev
->vc
[i
].vb_vidq
))
2022 s2255_stop_acquire(&dev
->vc
[i
]);
2024 s2255_stop_readpipe(dev
);
2025 for (i
= 0; i
< MAX_CHANNELS
; i
++)
2026 s2255_release_sys_buffers(&dev
->vc
[i
]);
2027 /* release transfer buffer */
2028 kfree(dev
->pipe
.transfer_buffer
);
2032 static void read_pipe_completion(struct urb
*purb
)
2034 struct s2255_pipeinfo
*pipe_info
;
2035 struct s2255_dev
*dev
;
2038 pipe_info
= purb
->context
;
2039 if (pipe_info
== NULL
) {
2040 dev_err(&purb
->dev
->dev
, "no context!\n");
2043 dev
= pipe_info
->dev
;
2045 dev_err(&purb
->dev
->dev
, "no context!\n");
2048 status
= purb
->status
;
2049 /* if shutting down, do not resubmit, exit immediately */
2050 if (status
== -ESHUTDOWN
) {
2051 dprintk(dev
, 2, "%s: err shutdown\n", __func__
);
2052 pipe_info
->err_count
++;
2056 if (pipe_info
->state
== 0) {
2057 dprintk(dev
, 2, "%s: exiting USB pipe", __func__
);
2062 s2255_read_video_callback(dev
, pipe_info
);
2064 pipe_info
->err_count
++;
2065 dprintk(dev
, 1, "%s: failed URB %d\n", __func__
, status
);
2068 pipe
= usb_rcvbulkpipe(dev
->udev
, dev
->read_endpoint
);
2070 usb_fill_bulk_urb(pipe_info
->stream_urb
, dev
->udev
,
2072 pipe_info
->transfer_buffer
,
2073 pipe_info
->cur_transfer_size
,
2074 read_pipe_completion
, pipe_info
);
2076 if (pipe_info
->state
!= 0) {
2077 if (usb_submit_urb(pipe_info
->stream_urb
, GFP_ATOMIC
))
2078 dev_err(&dev
->udev
->dev
, "error submitting urb\n");
2080 dprintk(dev
, 2, "%s :complete state 0\n", __func__
);
2085 static int s2255_start_readpipe(struct s2255_dev
*dev
)
2089 struct s2255_pipeinfo
*pipe_info
= &dev
->pipe
;
2090 pipe
= usb_rcvbulkpipe(dev
->udev
, dev
->read_endpoint
);
2091 dprintk(dev
, 2, "%s: IN %d\n", __func__
, dev
->read_endpoint
);
2092 pipe_info
->state
= 1;
2093 pipe_info
->err_count
= 0;
2094 pipe_info
->stream_urb
= usb_alloc_urb(0, GFP_KERNEL
);
2095 if (!pipe_info
->stream_urb
)
2097 /* transfer buffer allocated in board_init */
2098 usb_fill_bulk_urb(pipe_info
->stream_urb
, dev
->udev
,
2100 pipe_info
->transfer_buffer
,
2101 pipe_info
->cur_transfer_size
,
2102 read_pipe_completion
, pipe_info
);
2103 retval
= usb_submit_urb(pipe_info
->stream_urb
, GFP_KERNEL
);
2105 pr_err("s2255: start read pipe failed\n");
2111 /* starts acquisition process */
2112 static int s2255_start_acquire(struct s2255_vc
*vc
)
2115 unsigned long chn_rev
;
2117 struct s2255_dev
*dev
= to_s2255_dev(vc
->vdev
.v4l2_dev
);
2118 __le32
*buffer
= dev
->cmdbuf
;
2120 mutex_lock(&dev
->cmdlock
);
2121 chn_rev
= G_chnmap
[vc
->idx
];
2122 vc
->last_frame
= -1;
2123 vc
->bad_payload
= 0;
2125 for (j
= 0; j
< SYS_FRAMES
; j
++) {
2126 vc
->buffer
.frame
[j
].ulState
= 0;
2127 vc
->buffer
.frame
[j
].cur_size
= 0;
2130 /* send the start command */
2131 buffer
[0] = IN_DATA_TOKEN
;
2132 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
2133 buffer
[2] = CMD_START
;
2134 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
2136 dev_err(&dev
->udev
->dev
, "CMD_START error\n");
2138 dprintk(dev
, 2, "start acquire exit[%d] %d\n", vc
->idx
, res
);
2139 mutex_unlock(&dev
->cmdlock
);
2143 static int s2255_stop_acquire(struct s2255_vc
*vc
)
2146 unsigned long chn_rev
;
2147 struct s2255_dev
*dev
= to_s2255_dev(vc
->vdev
.v4l2_dev
);
2148 __le32
*buffer
= dev
->cmdbuf
;
2150 mutex_lock(&dev
->cmdlock
);
2151 chn_rev
= G_chnmap
[vc
->idx
];
2152 /* send the stop command */
2153 buffer
[0] = IN_DATA_TOKEN
;
2154 buffer
[1] = (__le32
) cpu_to_le32(chn_rev
);
2155 buffer
[2] = CMD_STOP
;
2157 res
= s2255_write_config(dev
->udev
, (unsigned char *)buffer
, 512);
2159 dev_err(&dev
->udev
->dev
, "CMD_STOP error\n");
2161 dprintk(dev
, 4, "%s: chn %d, res %d\n", __func__
, vc
->idx
, res
);
2162 mutex_unlock(&dev
->cmdlock
);
2166 static void s2255_stop_readpipe(struct s2255_dev
*dev
)
2168 struct s2255_pipeinfo
*pipe
= &dev
->pipe
;
2171 if (pipe
->stream_urb
) {
2173 usb_kill_urb(pipe
->stream_urb
);
2174 usb_free_urb(pipe
->stream_urb
);
2175 pipe
->stream_urb
= NULL
;
2177 dprintk(dev
, 4, "%s", __func__
);
2181 static void s2255_fwload_start(struct s2255_dev
*dev
)
2183 s2255_reset_dsppower(dev
);
2184 dev
->fw_data
->fw_size
= dev
->fw_data
->fw
->size
;
2185 atomic_set(&dev
->fw_data
->fw_state
, S2255_FW_NOTLOADED
);
2186 memcpy(dev
->fw_data
->pfw_data
,
2187 dev
->fw_data
->fw
->data
, CHUNK_SIZE
);
2188 dev
->fw_data
->fw_loaded
= CHUNK_SIZE
;
2189 usb_fill_bulk_urb(dev
->fw_data
->fw_urb
, dev
->udev
,
2190 usb_sndbulkpipe(dev
->udev
, 2),
2191 dev
->fw_data
->pfw_data
,
2192 CHUNK_SIZE
, s2255_fwchunk_complete
,
2194 mod_timer(&dev
->timer
, jiffies
+ HZ
);
2197 /* standard usb probe function */
2198 static int s2255_probe(struct usb_interface
*interface
,
2199 const struct usb_device_id
*id
)
2201 struct s2255_dev
*dev
= NULL
;
2202 struct usb_host_interface
*iface_desc
;
2203 struct usb_endpoint_descriptor
*endpoint
;
2205 int retval
= -ENOMEM
;
2209 /* allocate memory for our device state and initialize it to zero */
2210 dev
= kzalloc(sizeof(struct s2255_dev
), GFP_KERNEL
);
2212 s2255_dev_err(&interface
->dev
, "out of memory\n");
2216 dev
->cmdbuf
= kzalloc(S2255_CMDBUF_SIZE
, GFP_KERNEL
);
2217 if (dev
->cmdbuf
== NULL
) {
2218 s2255_dev_err(&interface
->dev
, "out of memory\n");
2222 refcount_set(&dev
->num_channels
, 0);
2223 dev
->pid
= id
->idProduct
;
2224 dev
->fw_data
= kzalloc(sizeof(struct s2255_fw
), GFP_KERNEL
);
2227 mutex_init(&dev
->lock
);
2228 mutex_init(&dev
->cmdlock
);
2229 /* grab usb_device and save it */
2230 dev
->udev
= usb_get_dev(interface_to_usbdev(interface
));
2231 if (dev
->udev
== NULL
) {
2232 dev_err(&interface
->dev
, "null usb device\n");
2236 dev_dbg(&interface
->dev
, "dev: %p, udev %p interface %p\n",
2237 dev
, dev
->udev
, interface
);
2238 dev
->interface
= interface
;
2239 /* set up the endpoint information */
2240 iface_desc
= interface
->cur_altsetting
;
2241 dev_dbg(&interface
->dev
, "num EP: %d\n",
2242 iface_desc
->desc
.bNumEndpoints
);
2243 for (i
= 0; i
< iface_desc
->desc
.bNumEndpoints
; ++i
) {
2244 endpoint
= &iface_desc
->endpoint
[i
].desc
;
2245 if (!dev
->read_endpoint
&& usb_endpoint_is_bulk_in(endpoint
)) {
2246 /* we found the bulk in endpoint */
2247 dev
->read_endpoint
= endpoint
->bEndpointAddress
;
2251 if (!dev
->read_endpoint
) {
2252 dev_err(&interface
->dev
, "Could not find bulk-in endpoint\n");
2255 timer_setup(&dev
->timer
, s2255_timer
, 0);
2256 init_waitqueue_head(&dev
->fw_data
->wait_fw
);
2257 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2258 struct s2255_vc
*vc
= &dev
->vc
[i
];
2261 init_waitqueue_head(&vc
->wait_setmode
);
2262 init_waitqueue_head(&vc
->wait_vidstatus
);
2263 spin_lock_init(&vc
->qlock
);
2264 mutex_init(&vc
->vb_lock
);
2267 dev
->fw_data
->fw_urb
= usb_alloc_urb(0, GFP_KERNEL
);
2268 if (!dev
->fw_data
->fw_urb
)
2271 dev
->fw_data
->pfw_data
= kzalloc(CHUNK_SIZE
, GFP_KERNEL
);
2272 if (!dev
->fw_data
->pfw_data
) {
2273 dev_err(&interface
->dev
, "out of memory!\n");
2276 /* load the first chunk */
2277 if (request_firmware(&dev
->fw_data
->fw
,
2278 FIRMWARE_FILE_NAME
, &dev
->udev
->dev
)) {
2279 dev_err(&interface
->dev
, "sensoray 2255 failed to get firmware\n");
2282 /* check the firmware is valid */
2283 fw_size
= dev
->fw_data
->fw
->size
;
2284 pdata
= (__le32
*) &dev
->fw_data
->fw
->data
[fw_size
- 8];
2286 if (*pdata
!= S2255_FW_MARKER
) {
2287 dev_err(&interface
->dev
, "Firmware invalid.\n");
2291 /* make sure firmware is the latest */
2293 pRel
= (__le32
*) &dev
->fw_data
->fw
->data
[fw_size
- 4];
2294 pr_info("s2255 dsp fw version %x\n", le32_to_cpu(*pRel
));
2295 dev
->dsp_fw_ver
= le32_to_cpu(*pRel
);
2296 if (dev
->dsp_fw_ver
< S2255_CUR_DSP_FWVER
)
2297 pr_info("s2255: f2255usb.bin out of date.\n");
2298 if (dev
->pid
== 0x2257 &&
2299 dev
->dsp_fw_ver
< S2255_MIN_DSP_COLORFILTER
)
2300 pr_warn("2257 needs firmware %d or above.\n",
2301 S2255_MIN_DSP_COLORFILTER
);
2303 usb_reset_device(dev
->udev
);
2304 /* load 2255 board specific */
2305 retval
= s2255_board_init(dev
);
2307 goto errorBOARDINIT
;
2308 s2255_fwload_start(dev
);
2309 /* loads v4l specific */
2310 retval
= s2255_probe_v4l(dev
);
2312 goto errorBOARDINIT
;
2313 dev_info(&interface
->dev
, "Sensoray 2255 detected\n");
2316 s2255_board_shutdown(dev
);
2318 release_firmware(dev
->fw_data
->fw
);
2320 kfree(dev
->fw_data
->pfw_data
);
2322 usb_free_urb(dev
->fw_data
->fw_urb
);
2324 timer_shutdown_sync(&dev
->timer
);
2326 usb_put_dev(dev
->udev
);
2328 kfree(dev
->fw_data
);
2329 mutex_destroy(&dev
->lock
);
2333 pr_warn("Sensoray 2255 driver load failed: 0x%x\n", retval
);
2337 /* disconnect routine. when board is removed physically or with rmmod */
2338 static void s2255_disconnect(struct usb_interface
*interface
)
2340 struct s2255_dev
*dev
= to_s2255_dev(usb_get_intfdata(interface
));
2342 int channels
= refcount_read(&dev
->num_channels
);
2343 mutex_lock(&dev
->lock
);
2344 v4l2_device_disconnect(&dev
->v4l2_dev
);
2345 mutex_unlock(&dev
->lock
);
2346 /*see comments in the uvc_driver.c usb disconnect function */
2347 refcount_inc(&dev
->num_channels
);
2348 /* unregister each video device. */
2349 for (i
= 0; i
< channels
; i
++)
2350 video_unregister_device(&dev
->vc
[i
].vdev
);
2351 /* wake up any of our timers */
2352 atomic_set(&dev
->fw_data
->fw_state
, S2255_FW_DISCONNECTING
);
2353 wake_up(&dev
->fw_data
->wait_fw
);
2354 for (i
= 0; i
< MAX_CHANNELS
; i
++) {
2355 dev
->vc
[i
].setmode_ready
= 1;
2356 wake_up(&dev
->vc
[i
].wait_setmode
);
2357 dev
->vc
[i
].vidstatus_ready
= 1;
2358 wake_up(&dev
->vc
[i
].wait_vidstatus
);
2360 if (refcount_dec_and_test(&dev
->num_channels
))
2362 dev_info(&interface
->dev
, "%s\n", __func__
);
2365 static struct usb_driver s2255_driver
= {
2366 .name
= S2255_DRIVER_NAME
,
2367 .probe
= s2255_probe
,
2368 .disconnect
= s2255_disconnect
,
2369 .id_table
= s2255_table
,
2372 module_usb_driver(s2255_driver
);
2374 MODULE_DESCRIPTION("Sensoray 2255 Video for Linux driver");
2375 MODULE_AUTHOR("Dean Anderson (Sensoray Company Inc.)");
2376 MODULE_LICENSE("GPL");
2377 MODULE_VERSION(S2255_VERSION
);
2378 MODULE_FIRMWARE(FIRMWARE_FILE_NAME
);