se401.c (19498B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * GSPCA Endpoints (formerly known as AOX) se401 USB Camera sub Driver 4 * 5 * Copyright (C) 2011 Hans de Goede <hdegoede@redhat.com> 6 * 7 * Based on the v4l1 se401 driver which is: 8 * 9 * Copyright (c) 2000 Jeroen B. Vreeken (pe1rxq@amsat.org) 10 */ 11 12#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 13 14#define MODULE_NAME "se401" 15 16#define BULK_SIZE 4096 17#define PACKET_SIZE 1024 18#define READ_REQ_SIZE 64 19#define MAX_MODES ((READ_REQ_SIZE - 6) / 4) 20/* The se401 compression algorithm uses a fixed quant factor, which 21 can be configured by setting the high nibble of the SE401_OPERATINGMODE 22 feature. This needs to exactly match what is in libv4l! */ 23#define SE401_QUANT_FACT 8 24 25#include <linux/input.h> 26#include <linux/slab.h> 27#include "gspca.h" 28#include "se401.h" 29 30MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>"); 31MODULE_DESCRIPTION("Endpoints se401"); 32MODULE_LICENSE("GPL"); 33 34/* exposure change state machine states */ 35enum { 36 EXPO_CHANGED, 37 EXPO_DROP_FRAME, 38 EXPO_NO_CHANGE, 39}; 40 41/* specific webcam descriptor */ 42struct sd { 43 struct gspca_dev gspca_dev; /* !! must be the first item */ 44 struct { /* exposure/freq control cluster */ 45 struct v4l2_ctrl *exposure; 46 struct v4l2_ctrl *freq; 47 }; 48 bool has_brightness; 49 struct v4l2_pix_format fmts[MAX_MODES]; 50 int pixels_read; 51 int packet_read; 52 u8 packet[PACKET_SIZE]; 53 u8 restart_stream; 54 u8 button_state; 55 u8 resetlevel; 56 u8 resetlevel_frame_count; 57 int resetlevel_adjust_dir; 58 int expo_change_state; 59}; 60 61 62static void se401_write_req(struct gspca_dev *gspca_dev, u16 req, u16 value, 63 int silent) 64{ 65 int err; 66 67 if (gspca_dev->usb_err < 0) 68 return; 69 70 err = usb_control_msg(gspca_dev->dev, 71 usb_sndctrlpipe(gspca_dev->dev, 0), req, 72 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 73 value, 0, NULL, 0, 1000); 74 if (err < 0) { 75 if (!silent) 76 pr_err("write req failed req %#04x val %#04x error %d\n", 77 req, value, err); 78 gspca_dev->usb_err = err; 79 } 80} 81 82static void se401_read_req(struct gspca_dev *gspca_dev, u16 req, int silent) 83{ 84 int err; 85 86 if (gspca_dev->usb_err < 0) 87 return; 88 89 if (USB_BUF_SZ < READ_REQ_SIZE) { 90 pr_err("USB_BUF_SZ too small!!\n"); 91 gspca_dev->usb_err = -ENOBUFS; 92 return; 93 } 94 95 err = usb_control_msg(gspca_dev->dev, 96 usb_rcvctrlpipe(gspca_dev->dev, 0), req, 97 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 98 0, 0, gspca_dev->usb_buf, READ_REQ_SIZE, 1000); 99 if (err < 0) { 100 if (!silent) 101 pr_err("read req failed req %#04x error %d\n", 102 req, err); 103 gspca_dev->usb_err = err; 104 /* 105 * Make sure the buffer is zeroed to avoid uninitialized 106 * values. 107 */ 108 memset(gspca_dev->usb_buf, 0, READ_REQ_SIZE); 109 } 110} 111 112static void se401_set_feature(struct gspca_dev *gspca_dev, 113 u16 selector, u16 param) 114{ 115 int err; 116 117 if (gspca_dev->usb_err < 0) 118 return; 119 120 err = usb_control_msg(gspca_dev->dev, 121 usb_sndctrlpipe(gspca_dev->dev, 0), 122 SE401_REQ_SET_EXT_FEATURE, 123 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 124 param, selector, NULL, 0, 1000); 125 if (err < 0) { 126 pr_err("set feature failed sel %#04x param %#04x error %d\n", 127 selector, param, err); 128 gspca_dev->usb_err = err; 129 } 130} 131 132static int se401_get_feature(struct gspca_dev *gspca_dev, u16 selector) 133{ 134 int err; 135 136 if (gspca_dev->usb_err < 0) 137 return gspca_dev->usb_err; 138 139 if (USB_BUF_SZ < 2) { 140 pr_err("USB_BUF_SZ too small!!\n"); 141 gspca_dev->usb_err = -ENOBUFS; 142 return gspca_dev->usb_err; 143 } 144 145 err = usb_control_msg(gspca_dev->dev, 146 usb_rcvctrlpipe(gspca_dev->dev, 0), 147 SE401_REQ_GET_EXT_FEATURE, 148 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 149 0, selector, gspca_dev->usb_buf, 2, 1000); 150 if (err < 0) { 151 pr_err("get feature failed sel %#04x error %d\n", 152 selector, err); 153 gspca_dev->usb_err = err; 154 return err; 155 } 156 return gspca_dev->usb_buf[0] | (gspca_dev->usb_buf[1] << 8); 157} 158 159static void setbrightness(struct gspca_dev *gspca_dev, s32 val) 160{ 161 /* HDG: this does not seem to do anything on my cam */ 162 se401_write_req(gspca_dev, SE401_REQ_SET_BRT, val, 0); 163} 164 165static void setgain(struct gspca_dev *gspca_dev, s32 val) 166{ 167 u16 gain = 63 - val; 168 169 /* red color gain */ 170 se401_set_feature(gspca_dev, HV7131_REG_ARCG, gain); 171 /* green color gain */ 172 se401_set_feature(gspca_dev, HV7131_REG_AGCG, gain); 173 /* blue color gain */ 174 se401_set_feature(gspca_dev, HV7131_REG_ABCG, gain); 175} 176 177static void setexposure(struct gspca_dev *gspca_dev, s32 val, s32 freq) 178{ 179 struct sd *sd = (struct sd *) gspca_dev; 180 int integration = val << 6; 181 u8 expose_h, expose_m, expose_l; 182 183 /* Do this before the set_feature calls, for proper timing wrt 184 the interrupt driven pkt_scan. Note we may still race but that 185 is not a big issue, the expo change state machine is merely for 186 avoiding underexposed frames getting send out, if one sneaks 187 through so be it */ 188 sd->expo_change_state = EXPO_CHANGED; 189 190 if (freq == V4L2_CID_POWER_LINE_FREQUENCY_50HZ) 191 integration = integration - integration % 106667; 192 if (freq == V4L2_CID_POWER_LINE_FREQUENCY_60HZ) 193 integration = integration - integration % 88889; 194 195 expose_h = (integration >> 16); 196 expose_m = (integration >> 8); 197 expose_l = integration; 198 199 /* integration time low */ 200 se401_set_feature(gspca_dev, HV7131_REG_TITL, expose_l); 201 /* integration time mid */ 202 se401_set_feature(gspca_dev, HV7131_REG_TITM, expose_m); 203 /* integration time high */ 204 se401_set_feature(gspca_dev, HV7131_REG_TITU, expose_h); 205} 206 207static int sd_config(struct gspca_dev *gspca_dev, 208 const struct usb_device_id *id) 209{ 210 struct sd *sd = (struct sd *)gspca_dev; 211 struct cam *cam = &gspca_dev->cam; 212 u8 *cd = gspca_dev->usb_buf; 213 int i, j, n; 214 int widths[MAX_MODES], heights[MAX_MODES]; 215 216 /* Read the camera descriptor */ 217 se401_read_req(gspca_dev, SE401_REQ_GET_CAMERA_DESCRIPTOR, 1); 218 if (gspca_dev->usb_err) { 219 /* Sometimes after being idle for a while the se401 won't 220 respond and needs a good kicking */ 221 usb_reset_device(gspca_dev->dev); 222 gspca_dev->usb_err = 0; 223 se401_read_req(gspca_dev, SE401_REQ_GET_CAMERA_DESCRIPTOR, 0); 224 } 225 226 /* Some cameras start with their LED on */ 227 se401_write_req(gspca_dev, SE401_REQ_LED_CONTROL, 0, 0); 228 if (gspca_dev->usb_err) 229 return gspca_dev->usb_err; 230 231 if (cd[1] != 0x41) { 232 pr_err("Wrong descriptor type\n"); 233 return -ENODEV; 234 } 235 236 if (!(cd[2] & SE401_FORMAT_BAYER)) { 237 pr_err("Bayer format not supported!\n"); 238 return -ENODEV; 239 } 240 241 if (cd[3]) 242 pr_info("ExtraFeatures: %d\n", cd[3]); 243 244 n = cd[4] | (cd[5] << 8); 245 if (n > MAX_MODES) { 246 pr_err("Too many frame sizes\n"); 247 return -ENODEV; 248 } 249 250 for (i = 0; i < n ; i++) { 251 widths[i] = cd[6 + i * 4 + 0] | (cd[6 + i * 4 + 1] << 8); 252 heights[i] = cd[6 + i * 4 + 2] | (cd[6 + i * 4 + 3] << 8); 253 } 254 255 for (i = 0; i < n ; i++) { 256 sd->fmts[i].width = widths[i]; 257 sd->fmts[i].height = heights[i]; 258 sd->fmts[i].field = V4L2_FIELD_NONE; 259 sd->fmts[i].colorspace = V4L2_COLORSPACE_SRGB; 260 sd->fmts[i].priv = 1; 261 262 /* janggu compression only works for 1/4th or 1/16th res */ 263 for (j = 0; j < n; j++) { 264 if (widths[j] / 2 == widths[i] && 265 heights[j] / 2 == heights[i]) { 266 sd->fmts[i].priv = 2; 267 break; 268 } 269 } 270 /* 1/16th if available too is better then 1/4th, because 271 we then use a larger area of the sensor */ 272 for (j = 0; j < n; j++) { 273 if (widths[j] / 4 == widths[i] && 274 heights[j] / 4 == heights[i]) { 275 sd->fmts[i].priv = 4; 276 break; 277 } 278 } 279 280 if (sd->fmts[i].priv == 1) { 281 /* Not a 1/4th or 1/16th res, use bayer */ 282 sd->fmts[i].pixelformat = V4L2_PIX_FMT_SBGGR8; 283 sd->fmts[i].bytesperline = widths[i]; 284 sd->fmts[i].sizeimage = widths[i] * heights[i]; 285 pr_info("Frame size: %dx%d bayer\n", 286 widths[i], heights[i]); 287 } else { 288 /* Found a match use janggu compression */ 289 sd->fmts[i].pixelformat = V4L2_PIX_FMT_SE401; 290 sd->fmts[i].bytesperline = 0; 291 sd->fmts[i].sizeimage = widths[i] * heights[i] * 3; 292 pr_info("Frame size: %dx%d 1/%dth janggu\n", 293 widths[i], heights[i], 294 sd->fmts[i].priv * sd->fmts[i].priv); 295 } 296 } 297 298 cam->cam_mode = sd->fmts; 299 cam->nmodes = n; 300 cam->bulk = 1; 301 cam->bulk_size = BULK_SIZE; 302 cam->bulk_nurbs = 4; 303 sd->resetlevel = 0x2d; /* Set initial resetlevel */ 304 305 /* See if the camera supports brightness */ 306 se401_read_req(gspca_dev, SE401_REQ_GET_BRT, 1); 307 sd->has_brightness = !!gspca_dev->usb_err; 308 gspca_dev->usb_err = 0; 309 310 return 0; 311} 312 313/* this function is called at probe and resume time */ 314static int sd_init(struct gspca_dev *gspca_dev) 315{ 316 return 0; 317} 318 319/* function called at start time before URB creation */ 320static int sd_isoc_init(struct gspca_dev *gspca_dev) 321{ 322 gspca_dev->alt = 1; /* Ignore the bogus isoc alt settings */ 323 324 return gspca_dev->usb_err; 325} 326 327/* -- start the camera -- */ 328static int sd_start(struct gspca_dev *gspca_dev) 329{ 330 struct sd *sd = (struct sd *)gspca_dev; 331 int mult = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv; 332 int mode = 0; 333 334 se401_write_req(gspca_dev, SE401_REQ_CAMERA_POWER, 1, 1); 335 if (gspca_dev->usb_err) { 336 /* Sometimes after being idle for a while the se401 won't 337 respond and needs a good kicking */ 338 usb_reset_device(gspca_dev->dev); 339 gspca_dev->usb_err = 0; 340 se401_write_req(gspca_dev, SE401_REQ_CAMERA_POWER, 1, 0); 341 } 342 se401_write_req(gspca_dev, SE401_REQ_LED_CONTROL, 1, 0); 343 344 se401_set_feature(gspca_dev, HV7131_REG_MODE_B, 0x05); 345 346 /* set size + mode */ 347 se401_write_req(gspca_dev, SE401_REQ_SET_WIDTH, 348 gspca_dev->pixfmt.width * mult, 0); 349 se401_write_req(gspca_dev, SE401_REQ_SET_HEIGHT, 350 gspca_dev->pixfmt.height * mult, 0); 351 /* 352 * HDG: disabled this as it does not seem to do anything 353 * se401_write_req(gspca_dev, SE401_REQ_SET_OUTPUT_MODE, 354 * SE401_FORMAT_BAYER, 0); 355 */ 356 357 switch (mult) { 358 case 1: /* Raw bayer */ 359 mode = 0x03; break; 360 case 2: /* 1/4th janggu */ 361 mode = SE401_QUANT_FACT << 4; break; 362 case 4: /* 1/16th janggu */ 363 mode = (SE401_QUANT_FACT << 4) | 0x02; break; 364 } 365 se401_set_feature(gspca_dev, SE401_OPERATINGMODE, mode); 366 367 se401_set_feature(gspca_dev, HV7131_REG_ARLV, sd->resetlevel); 368 369 sd->packet_read = 0; 370 sd->pixels_read = 0; 371 sd->restart_stream = 0; 372 sd->resetlevel_frame_count = 0; 373 sd->resetlevel_adjust_dir = 0; 374 sd->expo_change_state = EXPO_NO_CHANGE; 375 376 se401_write_req(gspca_dev, SE401_REQ_START_CONTINUOUS_CAPTURE, 0, 0); 377 378 return gspca_dev->usb_err; 379} 380 381static void sd_stopN(struct gspca_dev *gspca_dev) 382{ 383 se401_write_req(gspca_dev, SE401_REQ_STOP_CONTINUOUS_CAPTURE, 0, 0); 384 se401_write_req(gspca_dev, SE401_REQ_LED_CONTROL, 0, 0); 385 se401_write_req(gspca_dev, SE401_REQ_CAMERA_POWER, 0, 0); 386} 387 388static void sd_dq_callback(struct gspca_dev *gspca_dev) 389{ 390 struct sd *sd = (struct sd *)gspca_dev; 391 unsigned int ahrc, alrc; 392 int oldreset, adjust_dir; 393 394 /* Restart the stream if requested do so by pkt_scan */ 395 if (sd->restart_stream) { 396 sd_stopN(gspca_dev); 397 sd_start(gspca_dev); 398 sd->restart_stream = 0; 399 } 400 401 /* Automatically adjust sensor reset level 402 Hyundai have some really nice docs about this and other sensor 403 related stuff on their homepage: www.hei.co.kr */ 404 sd->resetlevel_frame_count++; 405 if (sd->resetlevel_frame_count < 20) 406 return; 407 408 /* For some reason this normally read-only register doesn't get reset 409 to zero after reading them just once... */ 410 se401_get_feature(gspca_dev, HV7131_REG_HIREFNOH); 411 se401_get_feature(gspca_dev, HV7131_REG_HIREFNOL); 412 se401_get_feature(gspca_dev, HV7131_REG_LOREFNOH); 413 se401_get_feature(gspca_dev, HV7131_REG_LOREFNOL); 414 ahrc = 256*se401_get_feature(gspca_dev, HV7131_REG_HIREFNOH) + 415 se401_get_feature(gspca_dev, HV7131_REG_HIREFNOL); 416 alrc = 256*se401_get_feature(gspca_dev, HV7131_REG_LOREFNOH) + 417 se401_get_feature(gspca_dev, HV7131_REG_LOREFNOL); 418 419 /* Not an exact science, but it seems to work pretty well... */ 420 oldreset = sd->resetlevel; 421 if (alrc > 10) { 422 while (alrc >= 10 && sd->resetlevel < 63) { 423 sd->resetlevel++; 424 alrc /= 2; 425 } 426 } else if (ahrc > 20) { 427 while (ahrc >= 20 && sd->resetlevel > 0) { 428 sd->resetlevel--; 429 ahrc /= 2; 430 } 431 } 432 /* Detect ping-pong-ing and halve adjustment to avoid overshoot */ 433 if (sd->resetlevel > oldreset) 434 adjust_dir = 1; 435 else 436 adjust_dir = -1; 437 if (sd->resetlevel_adjust_dir && 438 sd->resetlevel_adjust_dir != adjust_dir) 439 sd->resetlevel = oldreset + (sd->resetlevel - oldreset) / 2; 440 441 if (sd->resetlevel != oldreset) { 442 sd->resetlevel_adjust_dir = adjust_dir; 443 se401_set_feature(gspca_dev, HV7131_REG_ARLV, sd->resetlevel); 444 } 445 446 sd->resetlevel_frame_count = 0; 447} 448 449static void sd_complete_frame(struct gspca_dev *gspca_dev, u8 *data, int len) 450{ 451 struct sd *sd = (struct sd *)gspca_dev; 452 453 switch (sd->expo_change_state) { 454 case EXPO_CHANGED: 455 /* The exposure was changed while this frame 456 was being send, so this frame is ok */ 457 sd->expo_change_state = EXPO_DROP_FRAME; 458 break; 459 case EXPO_DROP_FRAME: 460 /* The exposure was changed while this frame 461 was being captured, drop it! */ 462 gspca_dev->last_packet_type = DISCARD_PACKET; 463 sd->expo_change_state = EXPO_NO_CHANGE; 464 break; 465 case EXPO_NO_CHANGE: 466 break; 467 } 468 gspca_frame_add(gspca_dev, LAST_PACKET, data, len); 469} 470 471static void sd_pkt_scan_janggu(struct gspca_dev *gspca_dev, u8 *data, int len) 472{ 473 struct sd *sd = (struct sd *)gspca_dev; 474 int imagesize = gspca_dev->pixfmt.width * gspca_dev->pixfmt.height; 475 int i, plen, bits, pixels, info, count; 476 477 if (sd->restart_stream) 478 return; 479 480 /* Sometimes a 1024 bytes garbage bulk packet is send between frames */ 481 if (gspca_dev->last_packet_type == LAST_PACKET && len == 1024) { 482 gspca_dev->last_packet_type = DISCARD_PACKET; 483 return; 484 } 485 486 i = 0; 487 while (i < len) { 488 /* Read header if not already be present from prev bulk pkt */ 489 if (sd->packet_read < 4) { 490 count = 4 - sd->packet_read; 491 if (count > len - i) 492 count = len - i; 493 memcpy(&sd->packet[sd->packet_read], &data[i], count); 494 sd->packet_read += count; 495 i += count; 496 if (sd->packet_read < 4) 497 break; 498 } 499 bits = sd->packet[3] + (sd->packet[2] << 8); 500 pixels = sd->packet[1] + ((sd->packet[0] & 0x3f) << 8); 501 info = (sd->packet[0] & 0xc0) >> 6; 502 plen = ((bits + 47) >> 4) << 1; 503 /* Sanity checks */ 504 if (plen > 1024) { 505 pr_err("invalid packet len %d restarting stream\n", 506 plen); 507 goto error; 508 } 509 if (info == 3) { 510 pr_err("unknown frame info value restarting stream\n"); 511 goto error; 512 } 513 514 /* Read (remainder of) packet contents */ 515 count = plen - sd->packet_read; 516 if (count > len - i) 517 count = len - i; 518 memcpy(&sd->packet[sd->packet_read], &data[i], count); 519 sd->packet_read += count; 520 i += count; 521 if (sd->packet_read < plen) 522 break; 523 524 sd->pixels_read += pixels; 525 sd->packet_read = 0; 526 527 switch (info) { 528 case 0: /* Frame data */ 529 gspca_frame_add(gspca_dev, INTER_PACKET, sd->packet, 530 plen); 531 break; 532 case 1: /* EOF */ 533 if (sd->pixels_read != imagesize) { 534 pr_err("frame size %d expected %d\n", 535 sd->pixels_read, imagesize); 536 goto error; 537 } 538 sd_complete_frame(gspca_dev, sd->packet, plen); 539 return; /* Discard the rest of the bulk packet !! */ 540 case 2: /* SOF */ 541 gspca_frame_add(gspca_dev, FIRST_PACKET, sd->packet, 542 plen); 543 sd->pixels_read = pixels; 544 break; 545 } 546 } 547 return; 548 549error: 550 sd->restart_stream = 1; 551 /* Give userspace a 0 bytes frame, so our dq callback gets 552 called and it can restart the stream */ 553 gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0); 554 gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0); 555} 556 557static void sd_pkt_scan_bayer(struct gspca_dev *gspca_dev, u8 *data, int len) 558{ 559 struct cam *cam = &gspca_dev->cam; 560 int imagesize = cam->cam_mode[gspca_dev->curr_mode].sizeimage; 561 562 if (gspca_dev->image_len == 0) { 563 gspca_frame_add(gspca_dev, FIRST_PACKET, data, len); 564 return; 565 } 566 567 if (gspca_dev->image_len + len >= imagesize) { 568 sd_complete_frame(gspca_dev, data, len); 569 return; 570 } 571 572 gspca_frame_add(gspca_dev, INTER_PACKET, data, len); 573} 574 575static void sd_pkt_scan(struct gspca_dev *gspca_dev, u8 *data, int len) 576{ 577 int mult = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv; 578 579 if (len == 0) 580 return; 581 582 if (mult == 1) /* mult == 1 means raw bayer */ 583 sd_pkt_scan_bayer(gspca_dev, data, len); 584 else 585 sd_pkt_scan_janggu(gspca_dev, data, len); 586} 587 588#if IS_ENABLED(CONFIG_INPUT) 589static int sd_int_pkt_scan(struct gspca_dev *gspca_dev, u8 *data, int len) 590{ 591 struct sd *sd = (struct sd *)gspca_dev; 592 u8 state; 593 594 if (len != 2) 595 return -EINVAL; 596 597 switch (data[0]) { 598 case 0: 599 case 1: 600 state = data[0]; 601 break; 602 default: 603 return -EINVAL; 604 } 605 if (sd->button_state != state) { 606 input_report_key(gspca_dev->input_dev, KEY_CAMERA, state); 607 input_sync(gspca_dev->input_dev); 608 sd->button_state = state; 609 } 610 611 return 0; 612} 613#endif 614 615static int sd_s_ctrl(struct v4l2_ctrl *ctrl) 616{ 617 struct gspca_dev *gspca_dev = 618 container_of(ctrl->handler, struct gspca_dev, ctrl_handler); 619 struct sd *sd = (struct sd *)gspca_dev; 620 621 gspca_dev->usb_err = 0; 622 623 if (!gspca_dev->streaming) 624 return 0; 625 626 switch (ctrl->id) { 627 case V4L2_CID_BRIGHTNESS: 628 setbrightness(gspca_dev, ctrl->val); 629 break; 630 case V4L2_CID_GAIN: 631 setgain(gspca_dev, ctrl->val); 632 break; 633 case V4L2_CID_EXPOSURE: 634 setexposure(gspca_dev, ctrl->val, sd->freq->val); 635 break; 636 } 637 return gspca_dev->usb_err; 638} 639 640static const struct v4l2_ctrl_ops sd_ctrl_ops = { 641 .s_ctrl = sd_s_ctrl, 642}; 643 644static int sd_init_controls(struct gspca_dev *gspca_dev) 645{ 646 struct sd *sd = (struct sd *)gspca_dev; 647 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; 648 649 gspca_dev->vdev.ctrl_handler = hdl; 650 v4l2_ctrl_handler_init(hdl, 4); 651 if (sd->has_brightness) 652 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 653 V4L2_CID_BRIGHTNESS, 0, 255, 1, 15); 654 /* max is really 63 but > 50 is not pretty */ 655 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 656 V4L2_CID_GAIN, 0, 50, 1, 25); 657 sd->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 658 V4L2_CID_EXPOSURE, 0, 32767, 1, 15000); 659 sd->freq = v4l2_ctrl_new_std_menu(hdl, &sd_ctrl_ops, 660 V4L2_CID_POWER_LINE_FREQUENCY, 661 V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0, 0); 662 663 if (hdl->error) { 664 pr_err("Could not initialize controls\n"); 665 return hdl->error; 666 } 667 v4l2_ctrl_cluster(2, &sd->exposure); 668 return 0; 669} 670 671/* sub-driver description */ 672static const struct sd_desc sd_desc = { 673 .name = MODULE_NAME, 674 .config = sd_config, 675 .init = sd_init, 676 .init_controls = sd_init_controls, 677 .isoc_init = sd_isoc_init, 678 .start = sd_start, 679 .stopN = sd_stopN, 680 .dq_callback = sd_dq_callback, 681 .pkt_scan = sd_pkt_scan, 682#if IS_ENABLED(CONFIG_INPUT) 683 .int_pkt_scan = sd_int_pkt_scan, 684#endif 685}; 686 687/* -- module initialisation -- */ 688static const struct usb_device_id device_table[] = { 689 {USB_DEVICE(0x03e8, 0x0004)}, /* Endpoints/Aox SE401 */ 690 {USB_DEVICE(0x0471, 0x030b)}, /* Philips PCVC665K */ 691 {USB_DEVICE(0x047d, 0x5001)}, /* Kensington 67014 */ 692 {USB_DEVICE(0x047d, 0x5002)}, /* Kensington 6701(5/7) */ 693 {USB_DEVICE(0x047d, 0x5003)}, /* Kensington 67016 */ 694 {} 695}; 696MODULE_DEVICE_TABLE(usb, device_table); 697 698/* -- device connect -- */ 699static int sd_probe(struct usb_interface *intf, 700 const struct usb_device_id *id) 701{ 702 return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd), 703 THIS_MODULE); 704} 705 706static int sd_pre_reset(struct usb_interface *intf) 707{ 708 return 0; 709} 710 711static int sd_post_reset(struct usb_interface *intf) 712{ 713 return 0; 714} 715 716static struct usb_driver sd_driver = { 717 .name = MODULE_NAME, 718 .id_table = device_table, 719 .probe = sd_probe, 720 .disconnect = gspca_disconnect, 721#ifdef CONFIG_PM 722 .suspend = gspca_suspend, 723 .resume = gspca_resume, 724 .reset_resume = gspca_resume, 725#endif 726 .pre_reset = sd_pre_reset, 727 .post_reset = sd_post_reset, 728}; 729 730module_usb_driver(sd_driver);