This source file includes following definitions.
- sur40_command
- sur40_poke
- sur40_set_preprocessor
- sur40_set_vsvideo
- sur40_set_irlevel
- sur40_init
- sur40_open
- sur40_close
- sur40_report_blob
- sur40_poll
- sur40_process_video
- sur40_input_setup
- sur40_probe
- sur40_disconnect
- sur40_queue_setup
- sur40_buffer_prepare
- sur40_buffer_queue
- return_all_buffers
- sur40_start_streaming
- sur40_stop_streaming
- sur40_vidioc_querycap
- sur40_vidioc_enum_input
- sur40_vidioc_s_input
- sur40_vidioc_g_input
- sur40_vidioc_try_fmt
- sur40_vidioc_s_fmt
- sur40_vidioc_g_fmt
- sur40_s_ctrl
- sur40_ioctl_parm
- sur40_vidioc_enum_fmt
- sur40_vidioc_enum_framesizes
- sur40_vidioc_enum_frameintervals
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <linux/kernel.h>
21 #include <linux/errno.h>
22 #include <linux/delay.h>
23 #include <linux/init.h>
24 #include <linux/slab.h>
25 #include <linux/module.h>
26 #include <linux/completion.h>
27 #include <linux/uaccess.h>
28 #include <linux/usb.h>
29 #include <linux/printk.h>
30 #include <linux/input-polldev.h>
31 #include <linux/input/mt.h>
32 #include <linux/usb/input.h>
33 #include <linux/videodev2.h>
34 #include <media/v4l2-device.h>
35 #include <media/v4l2-dev.h>
36 #include <media/v4l2-ioctl.h>
37 #include <media/v4l2-ctrls.h>
38 #include <media/videobuf2-v4l2.h>
39 #include <media/videobuf2-dma-sg.h>
40
41
42 struct sur40_header {
43
44 __le16 type;
45 __le16 count;
46
47 __le32 packet_id;
48
49 __le32 timestamp;
50 __le32 unknown;
51
52 } __packed;
53
54 struct sur40_blob {
55
56 __le16 blob_id;
57
58 u8 action;
59 u8 type;
60
61 __le16 bb_pos_x;
62 __le16 bb_pos_y;
63
64 __le16 bb_size_x;
65 __le16 bb_size_y;
66
67 __le16 pos_x;
68 __le16 pos_y;
69
70 __le16 ctr_x;
71 __le16 ctr_y;
72
73 __le16 axis_x;
74 __le16 axis_y;
75
76 __le32 angle;
77
78
79 __le32 area;
80
81 u8 padding[24];
82
83 __le32 tag_id;
84 __le32 unknown;
85
86 } __packed;
87
88
89 struct sur40_data {
90 struct sur40_header header;
91 struct sur40_blob blobs[];
92 } __packed;
93
94
95
96 struct sur40_image_header {
97 __le32 magic;
98 __le32 packet_id;
99 __le32 size;
100 __le32 timestamp;
101 __le32 unknown;
102 } __packed;
103
104
105 #define DRIVER_SHORT "sur40"
106 #define DRIVER_LONG "Samsung SUR40"
107 #define DRIVER_AUTHOR "Florian 'floe' Echtler <floe@butterbrot.org>"
108 #define DRIVER_DESC "Surface2.0/SUR40/PixelSense input driver"
109
110
111 #define ID_MICROSOFT 0x045e
112 #define ID_SUR40 0x0775
113
114
115 #define SENSOR_RES_X 1920
116 #define SENSOR_RES_Y 1080
117
118
119 #define TOUCH_ENDPOINT 0x86
120
121
122 #define VIDEO_ENDPOINT 0x82
123
124
125 #define VIDEO_HEADER_MAGIC 0x46425553
126 #define VIDEO_PACKET_SIZE 16384
127
128
129 #define POLL_INTERVAL 1
130
131
132 #define MAX_CONTACTS 64
133
134
135 #define SUR40_GET_VERSION 0xb0
136 #define SUR40_ACCEL_CAPS 0xb3
137 #define SUR40_SENSOR_CAPS 0xc1
138
139 #define SUR40_POKE 0xc5
140 #define SUR40_PEEK 0xc4
141
142 #define SUR40_GET_STATE 0xc5
143 #define SUR40_GET_SENSORS 0xb1
144
145 #define SUR40_BLOB 0x01
146 #define SUR40_TOUCH 0x02
147 #define SUR40_TAG 0x04
148
149
150 #define SUR40_BRIGHTNESS_MAX 0xff
151 #define SUR40_BRIGHTNESS_MIN 0x00
152 #define SUR40_BRIGHTNESS_DEF 0xff
153
154 #define SUR40_CONTRAST_MAX 0x0f
155 #define SUR40_CONTRAST_MIN 0x00
156 #define SUR40_CONTRAST_DEF 0x0a
157
158 #define SUR40_GAIN_MAX 0x09
159 #define SUR40_GAIN_MIN 0x00
160 #define SUR40_GAIN_DEF 0x08
161
162 #define SUR40_BACKLIGHT_MAX 0x01
163 #define SUR40_BACKLIGHT_MIN 0x00
164 #define SUR40_BACKLIGHT_DEF 0x01
165
166 #define sur40_str(s) #s
167 #define SUR40_PARAM_RANGE(lo, hi) " (range " sur40_str(lo) "-" sur40_str(hi) ")"
168
169
170 static uint brightness = SUR40_BRIGHTNESS_DEF;
171 module_param(brightness, uint, 0644);
172 MODULE_PARM_DESC(brightness, "set initial brightness"
173 SUR40_PARAM_RANGE(SUR40_BRIGHTNESS_MIN, SUR40_BRIGHTNESS_MAX));
174 static uint contrast = SUR40_CONTRAST_DEF;
175 module_param(contrast, uint, 0644);
176 MODULE_PARM_DESC(contrast, "set initial contrast"
177 SUR40_PARAM_RANGE(SUR40_CONTRAST_MIN, SUR40_CONTRAST_MAX));
178 static uint gain = SUR40_GAIN_DEF;
179 module_param(gain, uint, 0644);
180 MODULE_PARM_DESC(gain, "set initial gain"
181 SUR40_PARAM_RANGE(SUR40_GAIN_MIN, SUR40_GAIN_MAX));
182
183 static const struct v4l2_pix_format sur40_pix_format[] = {
184 {
185 .pixelformat = V4L2_TCH_FMT_TU08,
186 .width = SENSOR_RES_X / 2,
187 .height = SENSOR_RES_Y / 2,
188 .field = V4L2_FIELD_NONE,
189 .colorspace = V4L2_COLORSPACE_RAW,
190 .bytesperline = SENSOR_RES_X / 2,
191 .sizeimage = (SENSOR_RES_X/2) * (SENSOR_RES_Y/2),
192 },
193 {
194 .pixelformat = V4L2_PIX_FMT_GREY,
195 .width = SENSOR_RES_X / 2,
196 .height = SENSOR_RES_Y / 2,
197 .field = V4L2_FIELD_NONE,
198 .colorspace = V4L2_COLORSPACE_RAW,
199 .bytesperline = SENSOR_RES_X / 2,
200 .sizeimage = (SENSOR_RES_X/2) * (SENSOR_RES_Y/2),
201 }
202 };
203
204
205 struct sur40_state {
206
207 struct usb_device *usbdev;
208 struct device *dev;
209 struct input_polled_dev *input;
210
211 struct v4l2_device v4l2;
212 struct video_device vdev;
213 struct mutex lock;
214 struct v4l2_pix_format pix_fmt;
215 struct v4l2_ctrl_handler hdl;
216
217 struct vb2_queue queue;
218 struct list_head buf_list;
219 spinlock_t qlock;
220 int sequence;
221
222 struct sur40_data *bulk_in_buffer;
223 size_t bulk_in_size;
224 u8 bulk_in_epaddr;
225 u8 vsvideo;
226
227 char phys[64];
228 };
229
230 struct sur40_buffer {
231 struct vb2_v4l2_buffer vb;
232 struct list_head list;
233 };
234
235
236 static const struct video_device sur40_video_device;
237 static const struct vb2_queue sur40_queue;
238 static void sur40_process_video(struct sur40_state *sur40);
239 static int sur40_s_ctrl(struct v4l2_ctrl *ctrl);
240
241 static const struct v4l2_ctrl_ops sur40_ctrl_ops = {
242 .s_ctrl = sur40_s_ctrl,
243 };
244
245
246
247
248
249
250
251
252
253
254
255 static int sur40_command(struct sur40_state *dev,
256 u8 command, u16 index, void *buffer, u16 size)
257 {
258 return usb_control_msg(dev->usbdev, usb_rcvctrlpipe(dev->usbdev, 0),
259 command,
260 USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN,
261 0x00, index, buffer, size, 1000);
262 }
263
264
265 static int sur40_poke(struct sur40_state *dev, u8 offset, u8 value)
266 {
267 int result;
268 u8 index = 0x96;
269
270 result = usb_control_msg(dev->usbdev, usb_sndctrlpipe(dev->usbdev, 0),
271 SUR40_POKE, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
272 0x32, index, NULL, 0, 1000);
273 if (result < 0)
274 goto error;
275 msleep(5);
276
277 result = usb_control_msg(dev->usbdev, usb_sndctrlpipe(dev->usbdev, 0),
278 SUR40_POKE, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
279 0x72, offset, NULL, 0, 1000);
280 if (result < 0)
281 goto error;
282 msleep(5);
283
284 result = usb_control_msg(dev->usbdev, usb_sndctrlpipe(dev->usbdev, 0),
285 SUR40_POKE, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
286 0xb2, value, NULL, 0, 1000);
287 if (result < 0)
288 goto error;
289 msleep(5);
290
291 error:
292 return result;
293 }
294
295 static int sur40_set_preprocessor(struct sur40_state *dev, u8 value)
296 {
297 u8 setting_07[2] = { 0x01, 0x00 };
298 u8 setting_17[2] = { 0x85, 0x80 };
299 int result;
300
301 if (value > 1)
302 return -ERANGE;
303
304 result = usb_control_msg(dev->usbdev, usb_sndctrlpipe(dev->usbdev, 0),
305 SUR40_POKE, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
306 0x07, setting_07[value], NULL, 0, 1000);
307 if (result < 0)
308 goto error;
309 msleep(5);
310
311 result = usb_control_msg(dev->usbdev, usb_sndctrlpipe(dev->usbdev, 0),
312 SUR40_POKE, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT,
313 0x17, setting_17[value], NULL, 0, 1000);
314 if (result < 0)
315 goto error;
316 msleep(5);
317
318 error:
319 return result;
320 }
321
322 static void sur40_set_vsvideo(struct sur40_state *handle, u8 value)
323 {
324 int i;
325
326 for (i = 0; i < 4; i++)
327 sur40_poke(handle, 0x1c+i, value);
328 handle->vsvideo = value;
329 }
330
331 static void sur40_set_irlevel(struct sur40_state *handle, u8 value)
332 {
333 int i;
334
335 for (i = 0; i < 8; i++)
336 sur40_poke(handle, 0x08+(2*i), value);
337 }
338
339
340 static int sur40_init(struct sur40_state *dev)
341 {
342 int result;
343 u8 *buffer;
344
345 buffer = kmalloc(24, GFP_KERNEL);
346 if (!buffer) {
347 result = -ENOMEM;
348 goto error;
349 }
350
351
352 result = sur40_command(dev, SUR40_GET_VERSION, 0x00, buffer, 12);
353 if (result < 0)
354 goto error;
355
356 result = sur40_command(dev, SUR40_GET_VERSION, 0x01, buffer, 12);
357 if (result < 0)
358 goto error;
359
360 result = sur40_command(dev, SUR40_GET_VERSION, 0x02, buffer, 12);
361 if (result < 0)
362 goto error;
363
364 result = sur40_command(dev, SUR40_SENSOR_CAPS, 0x00, buffer, 24);
365 if (result < 0)
366 goto error;
367
368 result = sur40_command(dev, SUR40_ACCEL_CAPS, 0x00, buffer, 5);
369 if (result < 0)
370 goto error;
371
372 result = sur40_command(dev, SUR40_GET_VERSION, 0x03, buffer, 12);
373
374
375
376
377
378 error:
379 kfree(buffer);
380 return result;
381 }
382
383
384
385
386
387
388 static void sur40_open(struct input_polled_dev *polldev)
389 {
390 struct sur40_state *sur40 = polldev->private;
391
392 dev_dbg(sur40->dev, "open\n");
393 sur40_init(sur40);
394 }
395
396
397 static void sur40_close(struct input_polled_dev *polldev)
398 {
399 struct sur40_state *sur40 = polldev->private;
400
401 dev_dbg(sur40->dev, "close\n");
402
403
404
405
406 }
407
408
409
410
411
412 static void sur40_report_blob(struct sur40_blob *blob, struct input_dev *input)
413 {
414 int wide, major, minor;
415 int bb_size_x, bb_size_y, pos_x, pos_y, ctr_x, ctr_y, slotnum;
416
417 if (blob->type != SUR40_TOUCH)
418 return;
419
420 slotnum = input_mt_get_slot_by_key(input, blob->blob_id);
421 if (slotnum < 0 || slotnum >= MAX_CONTACTS)
422 return;
423
424 bb_size_x = le16_to_cpu(blob->bb_size_x);
425 bb_size_y = le16_to_cpu(blob->bb_size_y);
426
427 pos_x = le16_to_cpu(blob->pos_x);
428 pos_y = le16_to_cpu(blob->pos_y);
429
430 ctr_x = le16_to_cpu(blob->ctr_x);
431 ctr_y = le16_to_cpu(blob->ctr_y);
432
433 input_mt_slot(input, slotnum);
434 input_mt_report_slot_state(input, MT_TOOL_FINGER, 1);
435 wide = (bb_size_x > bb_size_y);
436 major = max(bb_size_x, bb_size_y);
437 minor = min(bb_size_x, bb_size_y);
438
439 input_report_abs(input, ABS_MT_POSITION_X, pos_x);
440 input_report_abs(input, ABS_MT_POSITION_Y, pos_y);
441 input_report_abs(input, ABS_MT_TOOL_X, ctr_x);
442 input_report_abs(input, ABS_MT_TOOL_Y, ctr_y);
443
444
445 input_report_abs(input, ABS_MT_ORIENTATION, wide);
446 input_report_abs(input, ABS_MT_TOUCH_MAJOR, major);
447 input_report_abs(input, ABS_MT_TOUCH_MINOR, minor);
448 }
449
450
451 static void sur40_poll(struct input_polled_dev *polldev)
452 {
453 struct sur40_state *sur40 = polldev->private;
454 struct input_dev *input = polldev->input;
455 int result, bulk_read, need_blobs, packet_blobs, i;
456 u32 uninitialized_var(packet_id);
457
458 struct sur40_header *header = &sur40->bulk_in_buffer->header;
459 struct sur40_blob *inblob = &sur40->bulk_in_buffer->blobs[0];
460
461 dev_dbg(sur40->dev, "poll\n");
462
463 need_blobs = -1;
464
465 do {
466
467
468 result = usb_bulk_msg(sur40->usbdev,
469 usb_rcvbulkpipe(sur40->usbdev, sur40->bulk_in_epaddr),
470 sur40->bulk_in_buffer, sur40->bulk_in_size,
471 &bulk_read, 1000);
472
473 dev_dbg(sur40->dev, "received %d bytes\n", bulk_read);
474
475 if (result < 0) {
476 dev_err(sur40->dev, "error in usb_bulk_read\n");
477 return;
478 }
479
480 result = bulk_read - sizeof(struct sur40_header);
481
482 if (result % sizeof(struct sur40_blob) != 0) {
483 dev_err(sur40->dev, "transfer size mismatch\n");
484 return;
485 }
486
487
488 if (need_blobs == -1) {
489 need_blobs = le16_to_cpu(header->count);
490 dev_dbg(sur40->dev, "need %d blobs\n", need_blobs);
491 packet_id = le32_to_cpu(header->packet_id);
492 }
493
494
495
496
497
498
499
500
501
502
503
504
505 packet_blobs = result / sizeof(struct sur40_blob);
506 dev_dbg(sur40->dev, "received %d blobs\n", packet_blobs);
507
508
509 if (packet_blobs > need_blobs)
510 packet_blobs = need_blobs;
511
512 for (i = 0; i < packet_blobs; i++) {
513 need_blobs--;
514 dev_dbg(sur40->dev, "processing blob\n");
515 sur40_report_blob(&(inblob[i]), input);
516 }
517
518 } while (need_blobs > 0);
519
520 input_mt_sync_frame(input);
521 input_sync(input);
522
523 sur40_process_video(sur40);
524 }
525
526
527 static void sur40_process_video(struct sur40_state *sur40)
528 {
529
530 struct sur40_image_header *img = (void *)(sur40->bulk_in_buffer);
531 struct sur40_buffer *new_buf;
532 struct usb_sg_request sgr;
533 struct sg_table *sgt;
534 int result, bulk_read;
535
536 if (!vb2_start_streaming_called(&sur40->queue))
537 return;
538
539
540 spin_lock(&sur40->qlock);
541 if (list_empty(&sur40->buf_list)) {
542 dev_dbg(sur40->dev, "buffer queue empty\n");
543 spin_unlock(&sur40->qlock);
544 return;
545 }
546 new_buf = list_entry(sur40->buf_list.next, struct sur40_buffer, list);
547 list_del(&new_buf->list);
548 spin_unlock(&sur40->qlock);
549
550 dev_dbg(sur40->dev, "buffer acquired\n");
551
552
553 result = usb_bulk_msg(sur40->usbdev,
554 usb_rcvbulkpipe(sur40->usbdev, VIDEO_ENDPOINT),
555 sur40->bulk_in_buffer, sur40->bulk_in_size,
556 &bulk_read, 1000);
557
558 if (result < 0) {
559 dev_err(sur40->dev, "error in usb_bulk_read\n");
560 goto err_poll;
561 }
562
563 if (bulk_read != sizeof(struct sur40_image_header)) {
564 dev_err(sur40->dev, "received %d bytes (%zd expected)\n",
565 bulk_read, sizeof(struct sur40_image_header));
566 goto err_poll;
567 }
568
569 if (le32_to_cpu(img->magic) != VIDEO_HEADER_MAGIC) {
570 dev_err(sur40->dev, "image magic mismatch\n");
571 goto err_poll;
572 }
573
574 if (le32_to_cpu(img->size) != sur40->pix_fmt.sizeimage) {
575 dev_err(sur40->dev, "image size mismatch\n");
576 goto err_poll;
577 }
578
579 dev_dbg(sur40->dev, "header acquired\n");
580
581 sgt = vb2_dma_sg_plane_desc(&new_buf->vb.vb2_buf, 0);
582
583 result = usb_sg_init(&sgr, sur40->usbdev,
584 usb_rcvbulkpipe(sur40->usbdev, VIDEO_ENDPOINT), 0,
585 sgt->sgl, sgt->nents, sur40->pix_fmt.sizeimage, 0);
586 if (result < 0) {
587 dev_err(sur40->dev, "error %d in usb_sg_init\n", result);
588 goto err_poll;
589 }
590
591 usb_sg_wait(&sgr);
592 if (sgr.status < 0) {
593 dev_err(sur40->dev, "error %d in usb_sg_wait\n", sgr.status);
594 goto err_poll;
595 }
596
597 dev_dbg(sur40->dev, "image acquired\n");
598
599
600 if (sur40->sequence == -1)
601 return;
602
603
604 new_buf->vb.vb2_buf.timestamp = ktime_get_ns();
605 new_buf->vb.sequence = sur40->sequence++;
606 new_buf->vb.field = V4L2_FIELD_NONE;
607 vb2_buffer_done(&new_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
608 dev_dbg(sur40->dev, "buffer marked done\n");
609 return;
610
611 err_poll:
612 vb2_buffer_done(&new_buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
613 }
614
615
616 static void sur40_input_setup(struct input_dev *input_dev)
617 {
618 __set_bit(EV_KEY, input_dev->evbit);
619 __set_bit(EV_ABS, input_dev->evbit);
620
621 input_set_abs_params(input_dev, ABS_MT_POSITION_X,
622 0, SENSOR_RES_X, 0, 0);
623 input_set_abs_params(input_dev, ABS_MT_POSITION_Y,
624 0, SENSOR_RES_Y, 0, 0);
625
626 input_set_abs_params(input_dev, ABS_MT_TOOL_X,
627 0, SENSOR_RES_X, 0, 0);
628 input_set_abs_params(input_dev, ABS_MT_TOOL_Y,
629 0, SENSOR_RES_Y, 0, 0);
630
631
632
633 input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
634 0, SENSOR_RES_X, 0, 0);
635 input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR,
636 0, SENSOR_RES_Y, 0, 0);
637
638 input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0);
639
640 input_mt_init_slots(input_dev, MAX_CONTACTS,
641 INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
642 }
643
644
645 static int sur40_probe(struct usb_interface *interface,
646 const struct usb_device_id *id)
647 {
648 struct usb_device *usbdev = interface_to_usbdev(interface);
649 struct sur40_state *sur40;
650 struct usb_host_interface *iface_desc;
651 struct usb_endpoint_descriptor *endpoint;
652 struct input_polled_dev *poll_dev;
653 int error;
654
655
656 iface_desc = interface->cur_altsetting;
657 if (iface_desc->desc.bInterfaceClass != 0xFF)
658 return -ENODEV;
659
660 if (iface_desc->desc.bNumEndpoints < 5)
661 return -ENODEV;
662
663
664 endpoint = &iface_desc->endpoint[4].desc;
665 if (endpoint->bEndpointAddress != TOUCH_ENDPOINT)
666 return -ENODEV;
667
668
669 sur40 = kzalloc(sizeof(struct sur40_state), GFP_KERNEL);
670 if (!sur40)
671 return -ENOMEM;
672
673 poll_dev = input_allocate_polled_device();
674 if (!poll_dev) {
675 error = -ENOMEM;
676 goto err_free_dev;
677 }
678
679
680 INIT_LIST_HEAD(&sur40->buf_list);
681 spin_lock_init(&sur40->qlock);
682 mutex_init(&sur40->lock);
683
684
685 poll_dev->private = sur40;
686 poll_dev->poll_interval = POLL_INTERVAL;
687 poll_dev->open = sur40_open;
688 poll_dev->poll = sur40_poll;
689 poll_dev->close = sur40_close;
690
691
692 sur40_input_setup(poll_dev->input);
693
694 poll_dev->input->name = DRIVER_LONG;
695 usb_to_input_id(usbdev, &poll_dev->input->id);
696 usb_make_path(usbdev, sur40->phys, sizeof(sur40->phys));
697 strlcat(sur40->phys, "/input0", sizeof(sur40->phys));
698 poll_dev->input->phys = sur40->phys;
699 poll_dev->input->dev.parent = &interface->dev;
700
701 sur40->usbdev = usbdev;
702 sur40->dev = &interface->dev;
703 sur40->input = poll_dev;
704
705
706 sur40->bulk_in_size = usb_endpoint_maxp(endpoint);
707 sur40->bulk_in_epaddr = endpoint->bEndpointAddress;
708 sur40->bulk_in_buffer = kmalloc(sur40->bulk_in_size, GFP_KERNEL);
709 if (!sur40->bulk_in_buffer) {
710 dev_err(&interface->dev, "Unable to allocate input buffer.");
711 error = -ENOMEM;
712 goto err_free_polldev;
713 }
714
715
716 error = input_register_polled_device(poll_dev);
717 if (error) {
718 dev_err(&interface->dev,
719 "Unable to register polled input device.");
720 goto err_free_buffer;
721 }
722
723
724 snprintf(sur40->v4l2.name, sizeof(sur40->v4l2.name), "%s", DRIVER_LONG);
725 error = v4l2_device_register(sur40->dev, &sur40->v4l2);
726 if (error) {
727 dev_err(&interface->dev,
728 "Unable to register video master device.");
729 goto err_unreg_v4l2;
730 }
731
732
733 sur40->queue = sur40_queue;
734 sur40->queue.drv_priv = sur40;
735 sur40->queue.lock = &sur40->lock;
736 sur40->queue.dev = sur40->dev;
737
738
739 error = vb2_queue_init(&sur40->queue);
740 if (error)
741 goto err_unreg_v4l2;
742
743 sur40->pix_fmt = sur40_pix_format[0];
744 sur40->vdev = sur40_video_device;
745 sur40->vdev.v4l2_dev = &sur40->v4l2;
746 sur40->vdev.lock = &sur40->lock;
747 sur40->vdev.queue = &sur40->queue;
748 video_set_drvdata(&sur40->vdev, sur40);
749
750
751 v4l2_ctrl_handler_init(&sur40->hdl, 4);
752 sur40->v4l2.ctrl_handler = &sur40->hdl;
753 sur40->vsvideo = (SUR40_CONTRAST_DEF << 4) | SUR40_GAIN_DEF;
754
755 v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops, V4L2_CID_BRIGHTNESS,
756 SUR40_BRIGHTNESS_MIN, SUR40_BRIGHTNESS_MAX, 1, clamp(brightness,
757 (uint)SUR40_BRIGHTNESS_MIN, (uint)SUR40_BRIGHTNESS_MAX));
758
759 v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops, V4L2_CID_CONTRAST,
760 SUR40_CONTRAST_MIN, SUR40_CONTRAST_MAX, 1, clamp(contrast,
761 (uint)SUR40_CONTRAST_MIN, (uint)SUR40_CONTRAST_MAX));
762
763 v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops, V4L2_CID_GAIN,
764 SUR40_GAIN_MIN, SUR40_GAIN_MAX, 1, clamp(gain,
765 (uint)SUR40_GAIN_MIN, (uint)SUR40_GAIN_MAX));
766
767 v4l2_ctrl_new_std(&sur40->hdl, &sur40_ctrl_ops,
768 V4L2_CID_BACKLIGHT_COMPENSATION, SUR40_BACKLIGHT_MIN,
769 SUR40_BACKLIGHT_MAX, 1, SUR40_BACKLIGHT_DEF);
770
771 v4l2_ctrl_handler_setup(&sur40->hdl);
772
773 if (sur40->hdl.error) {
774 dev_err(&interface->dev,
775 "Unable to register video controls.");
776 v4l2_ctrl_handler_free(&sur40->hdl);
777 goto err_unreg_v4l2;
778 }
779
780 error = video_register_device(&sur40->vdev, VFL_TYPE_TOUCH, -1);
781 if (error) {
782 dev_err(&interface->dev,
783 "Unable to register video subdevice.");
784 goto err_unreg_video;
785 }
786
787
788 usb_set_intfdata(interface, sur40);
789 dev_dbg(&interface->dev, "%s is now attached\n", DRIVER_DESC);
790
791 return 0;
792
793 err_unreg_video:
794 video_unregister_device(&sur40->vdev);
795 err_unreg_v4l2:
796 v4l2_device_unregister(&sur40->v4l2);
797 err_free_buffer:
798 kfree(sur40->bulk_in_buffer);
799 err_free_polldev:
800 input_free_polled_device(sur40->input);
801 err_free_dev:
802 kfree(sur40);
803
804 return error;
805 }
806
807
808 static void sur40_disconnect(struct usb_interface *interface)
809 {
810 struct sur40_state *sur40 = usb_get_intfdata(interface);
811
812 v4l2_ctrl_handler_free(&sur40->hdl);
813 video_unregister_device(&sur40->vdev);
814 v4l2_device_unregister(&sur40->v4l2);
815
816 input_unregister_polled_device(sur40->input);
817 input_free_polled_device(sur40->input);
818 kfree(sur40->bulk_in_buffer);
819 kfree(sur40);
820
821 usb_set_intfdata(interface, NULL);
822 dev_dbg(&interface->dev, "%s is now disconnected\n", DRIVER_DESC);
823 }
824
825
826
827
828
829
830
831
832 static int sur40_queue_setup(struct vb2_queue *q,
833 unsigned int *nbuffers, unsigned int *nplanes,
834 unsigned int sizes[], struct device *alloc_devs[])
835 {
836 struct sur40_state *sur40 = vb2_get_drv_priv(q);
837
838 if (q->num_buffers + *nbuffers < 3)
839 *nbuffers = 3 - q->num_buffers;
840
841 if (*nplanes)
842 return sizes[0] < sur40->pix_fmt.sizeimage ? -EINVAL : 0;
843
844 *nplanes = 1;
845 sizes[0] = sur40->pix_fmt.sizeimage;
846
847 return 0;
848 }
849
850
851
852
853
854 static int sur40_buffer_prepare(struct vb2_buffer *vb)
855 {
856 struct sur40_state *sur40 = vb2_get_drv_priv(vb->vb2_queue);
857 unsigned long size = sur40->pix_fmt.sizeimage;
858
859 if (vb2_plane_size(vb, 0) < size) {
860 dev_err(&sur40->usbdev->dev, "buffer too small (%lu < %lu)\n",
861 vb2_plane_size(vb, 0), size);
862 return -EINVAL;
863 }
864
865 vb2_set_plane_payload(vb, 0, size);
866 return 0;
867 }
868
869
870
871
872 static void sur40_buffer_queue(struct vb2_buffer *vb)
873 {
874 struct sur40_state *sur40 = vb2_get_drv_priv(vb->vb2_queue);
875 struct sur40_buffer *buf = (struct sur40_buffer *)vb;
876
877 spin_lock(&sur40->qlock);
878 list_add_tail(&buf->list, &sur40->buf_list);
879 spin_unlock(&sur40->qlock);
880 }
881
882 static void return_all_buffers(struct sur40_state *sur40,
883 enum vb2_buffer_state state)
884 {
885 struct sur40_buffer *buf, *node;
886
887 spin_lock(&sur40->qlock);
888 list_for_each_entry_safe(buf, node, &sur40->buf_list, list) {
889 vb2_buffer_done(&buf->vb.vb2_buf, state);
890 list_del(&buf->list);
891 }
892 spin_unlock(&sur40->qlock);
893 }
894
895
896
897
898
899
900
901 static int sur40_start_streaming(struct vb2_queue *vq, unsigned int count)
902 {
903 struct sur40_state *sur40 = vb2_get_drv_priv(vq);
904
905 sur40->sequence = 0;
906 return 0;
907 }
908
909
910
911
912
913 static void sur40_stop_streaming(struct vb2_queue *vq)
914 {
915 struct sur40_state *sur40 = vb2_get_drv_priv(vq);
916 vb2_wait_for_all_buffers(vq);
917 sur40->sequence = -1;
918
919
920 return_all_buffers(sur40, VB2_BUF_STATE_ERROR);
921 }
922
923
924 static int sur40_vidioc_querycap(struct file *file, void *priv,
925 struct v4l2_capability *cap)
926 {
927 struct sur40_state *sur40 = video_drvdata(file);
928
929 strlcpy(cap->driver, DRIVER_SHORT, sizeof(cap->driver));
930 strlcpy(cap->card, DRIVER_LONG, sizeof(cap->card));
931 usb_make_path(sur40->usbdev, cap->bus_info, sizeof(cap->bus_info));
932 return 0;
933 }
934
935 static int sur40_vidioc_enum_input(struct file *file, void *priv,
936 struct v4l2_input *i)
937 {
938 if (i->index != 0)
939 return -EINVAL;
940 i->type = V4L2_INPUT_TYPE_TOUCH;
941 i->std = V4L2_STD_UNKNOWN;
942 strlcpy(i->name, "In-Cell Sensor", sizeof(i->name));
943 i->capabilities = 0;
944 return 0;
945 }
946
947 static int sur40_vidioc_s_input(struct file *file, void *priv, unsigned int i)
948 {
949 return (i == 0) ? 0 : -EINVAL;
950 }
951
952 static int sur40_vidioc_g_input(struct file *file, void *priv, unsigned int *i)
953 {
954 *i = 0;
955 return 0;
956 }
957
958 static int sur40_vidioc_try_fmt(struct file *file, void *priv,
959 struct v4l2_format *f)
960 {
961 switch (f->fmt.pix.pixelformat) {
962 case V4L2_PIX_FMT_GREY:
963 f->fmt.pix = sur40_pix_format[1];
964 break;
965
966 default:
967 f->fmt.pix = sur40_pix_format[0];
968 break;
969 }
970
971 return 0;
972 }
973
974 static int sur40_vidioc_s_fmt(struct file *file, void *priv,
975 struct v4l2_format *f)
976 {
977 struct sur40_state *sur40 = video_drvdata(file);
978
979 switch (f->fmt.pix.pixelformat) {
980 case V4L2_PIX_FMT_GREY:
981 sur40->pix_fmt = sur40_pix_format[1];
982 break;
983
984 default:
985 sur40->pix_fmt = sur40_pix_format[0];
986 break;
987 }
988
989 f->fmt.pix = sur40->pix_fmt;
990 return 0;
991 }
992
993 static int sur40_vidioc_g_fmt(struct file *file, void *priv,
994 struct v4l2_format *f)
995 {
996 struct sur40_state *sur40 = video_drvdata(file);
997
998 f->fmt.pix = sur40->pix_fmt;
999 return 0;
1000 }
1001
1002 static int sur40_s_ctrl(struct v4l2_ctrl *ctrl)
1003 {
1004 struct sur40_state *sur40 = container_of(ctrl->handler,
1005 struct sur40_state, hdl);
1006 u8 value = sur40->vsvideo;
1007
1008 switch (ctrl->id) {
1009 case V4L2_CID_BRIGHTNESS:
1010 sur40_set_irlevel(sur40, ctrl->val);
1011 break;
1012 case V4L2_CID_CONTRAST:
1013 value = (value & 0x0f) | (ctrl->val << 4);
1014 sur40_set_vsvideo(sur40, value);
1015 break;
1016 case V4L2_CID_GAIN:
1017 value = (value & 0xf0) | (ctrl->val);
1018 sur40_set_vsvideo(sur40, value);
1019 break;
1020 case V4L2_CID_BACKLIGHT_COMPENSATION:
1021 sur40_set_preprocessor(sur40, ctrl->val);
1022 break;
1023 }
1024 return 0;
1025 }
1026
1027 static int sur40_ioctl_parm(struct file *file, void *priv,
1028 struct v4l2_streamparm *p)
1029 {
1030 if (p->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1031 return -EINVAL;
1032
1033 p->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
1034 p->parm.capture.timeperframe.numerator = 1;
1035 p->parm.capture.timeperframe.denominator = 60;
1036 p->parm.capture.readbuffers = 3;
1037 return 0;
1038 }
1039
1040 static int sur40_vidioc_enum_fmt(struct file *file, void *priv,
1041 struct v4l2_fmtdesc *f)
1042 {
1043 if (f->index >= ARRAY_SIZE(sur40_pix_format))
1044 return -EINVAL;
1045
1046 f->pixelformat = sur40_pix_format[f->index].pixelformat;
1047 f->flags = 0;
1048 return 0;
1049 }
1050
1051 static int sur40_vidioc_enum_framesizes(struct file *file, void *priv,
1052 struct v4l2_frmsizeenum *f)
1053 {
1054 struct sur40_state *sur40 = video_drvdata(file);
1055
1056 if ((f->index != 0) || ((f->pixel_format != V4L2_TCH_FMT_TU08)
1057 && (f->pixel_format != V4L2_PIX_FMT_GREY)))
1058 return -EINVAL;
1059
1060 f->type = V4L2_FRMSIZE_TYPE_DISCRETE;
1061 f->discrete.width = sur40->pix_fmt.width;
1062 f->discrete.height = sur40->pix_fmt.height;
1063 return 0;
1064 }
1065
1066 static int sur40_vidioc_enum_frameintervals(struct file *file, void *priv,
1067 struct v4l2_frmivalenum *f)
1068 {
1069 struct sur40_state *sur40 = video_drvdata(file);
1070
1071 if ((f->index > 0) || ((f->pixel_format != V4L2_TCH_FMT_TU08)
1072 && (f->pixel_format != V4L2_PIX_FMT_GREY))
1073 || (f->width != sur40->pix_fmt.width)
1074 || (f->height != sur40->pix_fmt.height))
1075 return -EINVAL;
1076
1077 f->type = V4L2_FRMIVAL_TYPE_DISCRETE;
1078 f->discrete.denominator = 60;
1079 f->discrete.numerator = 1;
1080 return 0;
1081 }
1082
1083
1084 static const struct usb_device_id sur40_table[] = {
1085 { USB_DEVICE(ID_MICROSOFT, ID_SUR40) },
1086 { }
1087 };
1088 MODULE_DEVICE_TABLE(usb, sur40_table);
1089
1090
1091 static const struct vb2_ops sur40_queue_ops = {
1092 .queue_setup = sur40_queue_setup,
1093 .buf_prepare = sur40_buffer_prepare,
1094 .buf_queue = sur40_buffer_queue,
1095 .start_streaming = sur40_start_streaming,
1096 .stop_streaming = sur40_stop_streaming,
1097 .wait_prepare = vb2_ops_wait_prepare,
1098 .wait_finish = vb2_ops_wait_finish,
1099 };
1100
1101 static const struct vb2_queue sur40_queue = {
1102 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
1103
1104
1105
1106
1107
1108 .io_modes = VB2_MMAP | VB2_READ | VB2_DMABUF,
1109 .buf_struct_size = sizeof(struct sur40_buffer),
1110 .ops = &sur40_queue_ops,
1111 .mem_ops = &vb2_dma_sg_memops,
1112 .timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC,
1113 .min_buffers_needed = 3,
1114 };
1115
1116 static const struct v4l2_file_operations sur40_video_fops = {
1117 .owner = THIS_MODULE,
1118 .open = v4l2_fh_open,
1119 .release = vb2_fop_release,
1120 .unlocked_ioctl = video_ioctl2,
1121 .read = vb2_fop_read,
1122 .mmap = vb2_fop_mmap,
1123 .poll = vb2_fop_poll,
1124 };
1125
1126 static const struct v4l2_ioctl_ops sur40_video_ioctl_ops = {
1127
1128 .vidioc_querycap = sur40_vidioc_querycap,
1129
1130 .vidioc_enum_fmt_vid_cap = sur40_vidioc_enum_fmt,
1131 .vidioc_try_fmt_vid_cap = sur40_vidioc_try_fmt,
1132 .vidioc_s_fmt_vid_cap = sur40_vidioc_s_fmt,
1133 .vidioc_g_fmt_vid_cap = sur40_vidioc_g_fmt,
1134
1135 .vidioc_enum_framesizes = sur40_vidioc_enum_framesizes,
1136 .vidioc_enum_frameintervals = sur40_vidioc_enum_frameintervals,
1137
1138 .vidioc_g_parm = sur40_ioctl_parm,
1139 .vidioc_s_parm = sur40_ioctl_parm,
1140
1141 .vidioc_enum_input = sur40_vidioc_enum_input,
1142 .vidioc_g_input = sur40_vidioc_g_input,
1143 .vidioc_s_input = sur40_vidioc_s_input,
1144
1145 .vidioc_reqbufs = vb2_ioctl_reqbufs,
1146 .vidioc_create_bufs = vb2_ioctl_create_bufs,
1147 .vidioc_querybuf = vb2_ioctl_querybuf,
1148 .vidioc_qbuf = vb2_ioctl_qbuf,
1149 .vidioc_dqbuf = vb2_ioctl_dqbuf,
1150 .vidioc_expbuf = vb2_ioctl_expbuf,
1151
1152 .vidioc_streamon = vb2_ioctl_streamon,
1153 .vidioc_streamoff = vb2_ioctl_streamoff,
1154 };
1155
1156 static const struct video_device sur40_video_device = {
1157 .name = DRIVER_LONG,
1158 .fops = &sur40_video_fops,
1159 .ioctl_ops = &sur40_video_ioctl_ops,
1160 .release = video_device_release_empty,
1161 .device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TOUCH |
1162 V4L2_CAP_READWRITE | V4L2_CAP_STREAMING,
1163 };
1164
1165
1166 static struct usb_driver sur40_driver = {
1167 .name = DRIVER_SHORT,
1168 .probe = sur40_probe,
1169 .disconnect = sur40_disconnect,
1170 .id_table = sur40_table,
1171 };
1172
1173 module_usb_driver(sur40_driver);
1174
1175 MODULE_AUTHOR(DRIVER_AUTHOR);
1176 MODULE_DESCRIPTION(DRIVER_DESC);
1177 MODULE_LICENSE("GPL");