1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * dcam_param.c 29 * 30 * dcam1394 driver. Device parameter access. 31 */ 32 33 #include <sys/1394/targets/dcam1394/dcam.h> 34 #include <sys/1394/targets/dcam1394/dcam_param.h> 35 #include <sys/1394/targets/dcam1394/dcam_reg.h> 36 37 /* index by vid_mode */ 38 int g_frame_num_bytes[] = { 39 57600, /* vid mode 0 */ 40 153600, /* vid mode 1 */ 41 460800, /* vid mode 2 */ 42 614400, /* vid mode 3 */ 43 921600, /* vid mode 4 */ 44 307200 /* vid mode 5 */ 45 }; 46 47 48 static uint_t feature_csr_val_construct(uint_t subparam, uint_t param_val, 49 uint_t init_val); 50 static uint_t feature_csr_val_subparam_extract(uint_t subparam, 51 uint_t feature_csr_val); 52 static uint_t feature_elm_inq_reg_val_subparam_extract(uint_t subparam, 53 uint_t reg_val); 54 55 56 /* 57 * param_attr_init 58 */ 59 int 60 param_attr_init(dcam_state_t *softc_p, dcam1394_param_attr_t param_attr) 61 { 62 int err, ret_err; 63 uint_t attr_bmap, cap_on_off, cap_power_ctrl, cap_read; 64 uint_t param, presence, subparam; 65 66 bzero(param_attr, sizeof (dcam1394_param_attr_t)); 67 68 ret_err = DDI_SUCCESS; 69 70 /* 71 * power ctrl cap 72 */ 73 param = DCAM1394_PARAM_CAP_POWER_CTRL; 74 subparam = DCAM1394_SUBPARAM_NONE; 75 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 76 param_attr_set(param_attr, param, subparam, attr_bmap); 77 78 /* 79 * video mode cap 80 */ 81 param = DCAM1394_PARAM_CAP_VID_MODE; 82 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 83 84 for (subparam = DCAM1394_SUBPARAM_VID_MODE_0; 85 subparam <= DCAM1394_SUBPARAM_VID_MODE_5; subparam++) { 86 param_attr_set(param_attr, param, subparam, attr_bmap); 87 } 88 89 /* 90 * frame rate cap 91 */ 92 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 93 94 for (param = DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_0; 95 param <= DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_5; param++) { 96 97 for (subparam = DCAM1394_SUBPARAM_FRAME_RATE_0; 98 subparam <= DCAM1394_SUBPARAM_FRAME_RATE_4; subparam++) { 99 param_attr_set(param_attr, param, subparam, attr_bmap); 100 } 101 } 102 103 /* 104 * power 105 */ 106 param = DCAM1394_PARAM_POWER; 107 subparam = DCAM1394_SUBPARAM_NONE; 108 err = dcam1394_param_get(softc_p, DCAM1394_PARAM_CAP_POWER_CTRL, 109 DCAM1394_SUBPARAM_NONE, &cap_power_ctrl); 110 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 111 112 if (cap_power_ctrl) { 113 attr_bmap |= CAP_SET; 114 } 115 param_attr_set(param_attr, param, subparam, attr_bmap); 116 117 /* 118 * video mode 119 */ 120 param = DCAM1394_PARAM_VID_MODE; 121 subparam = DCAM1394_SUBPARAM_NONE; 122 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET | CAP_SET; 123 param_attr_set(param_attr, param, subparam, attr_bmap); 124 125 /* 126 * frame rate 127 */ 128 param = DCAM1394_PARAM_FRAME_RATE; 129 subparam = DCAM1394_SUBPARAM_NONE; 130 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET | CAP_SET; 131 param_attr_set(param_attr, param, subparam, attr_bmap); 132 133 /* 134 * ring buffer capacity 135 */ 136 param = DCAM1394_PARAM_RING_BUFF_CAPACITY; 137 subparam = DCAM1394_SUBPARAM_NONE; 138 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET | CAP_SET; 139 param_attr_set(param_attr, param, subparam, attr_bmap); 140 141 /* 142 * ring buffer: num frames ready 143 */ 144 param = DCAM1394_PARAM_RING_BUFF_NUM_FRAMES_READY; 145 subparam = DCAM1394_SUBPARAM_NONE; 146 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 147 param_attr_set(param_attr, param, subparam, attr_bmap); 148 149 /* 150 * ring buffer: read ptr increment stride 151 */ 152 param = DCAM1394_PARAM_RING_BUFF_READ_PTR_INCR; 153 subparam = DCAM1394_SUBPARAM_NONE; 154 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET | CAP_SET; 155 param_attr_set(param_attr, param, subparam, attr_bmap); 156 157 /* 158 * frame size 159 */ 160 param = DCAM1394_PARAM_FRAME_NUM_BYTES; 161 subparam = DCAM1394_SUBPARAM_NONE; 162 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 163 param_attr_set(param_attr, param, subparam, attr_bmap); 164 165 /* 166 * cam status 167 */ 168 param = DCAM1394_PARAM_STATUS; 169 subparam = DCAM1394_SUBPARAM_NONE; 170 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 171 param_attr_set(param_attr, param, subparam, attr_bmap); 172 173 /* 174 * features 175 */ 176 for (param = DCAM1394_PARAM_BRIGHTNESS; param <= DCAM1394_PARAM_TILT; 177 param++) { 178 179 /* 180 * get feature presence 181 * If the operation to read the parameter fails, then act as 182 * though the feature is not implemented (because it isn't), 183 * don't report a DDI failure (as was previously done). 184 */ 185 err = dcam1394_param_get(softc_p, param, 186 DCAM1394_SUBPARAM_PRESENCE, &presence); 187 188 if (!err) { 189 /* feature presence */ 190 subparam = DCAM1394_SUBPARAM_PRESENCE; 191 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 192 param_attr_set(param_attr, param, subparam, attr_bmap); 193 194 if (presence) { 195 /* feature cap read */ 196 subparam = DCAM1394_SUBPARAM_CAP_READ; 197 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 198 param_attr_set(param_attr, param, 199 subparam, attr_bmap); 200 201 /* feature cap on/off */ 202 subparam = DCAM1394_SUBPARAM_CAP_ON_OFF; 203 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 204 param_attr_set(param_attr, param, 205 subparam, attr_bmap); 206 207 /* feature cap ctrl auto */ 208 subparam = DCAM1394_SUBPARAM_CAP_CTRL_AUTO; 209 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 210 param_attr_set(param_attr, param, 211 subparam, attr_bmap); 212 213 /* feature cap ctrl manual */ 214 subparam = DCAM1394_SUBPARAM_CAP_CTRL_MANUAL; 215 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 216 param_attr_set(param_attr, param, 217 subparam, attr_bmap); 218 219 /* feature min val */ 220 subparam = DCAM1394_SUBPARAM_MIN_VAL; 221 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 222 param_attr_set(param_attr, param, 223 subparam, attr_bmap); 224 225 /* feature max val */ 226 subparam = DCAM1394_SUBPARAM_MAX_VAL; 227 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 228 param_attr_set(param_attr, param, 229 subparam, attr_bmap); 230 231 /* feature on/off */ 232 subparam = DCAM1394_SUBPARAM_ON_OFF; 233 234 err = dcam1394_param_get(softc_p, param, 235 DCAM1394_SUBPARAM_CAP_ON_OFF, &cap_on_off); 236 237 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET; 238 239 if (cap_on_off) { 240 attr_bmap |= (CAP_SET | CAP_CTRL_SET); 241 } 242 243 param_attr_set(param_attr, param, 244 subparam, attr_bmap); 245 246 /* feature control mode */ 247 subparam = DCAM1394_SUBPARAM_CTRL_MODE; 248 attr_bmap = IS_VALID | IS_PRESENT | CAP_GET | 249 CAP_SET | CAP_CTRL_SET; 250 251 param_attr_set(param_attr, param, 252 subparam, attr_bmap); 253 254 /* get value read-out capability */ 255 err = dcam1394_param_get(softc_p, param, 256 DCAM1394_SUBPARAM_CAP_READ, 257 &cap_read); 258 259 if (param == DCAM1394_PARAM_WHITE_BALANCE) { 260 /* 261 * white balance feature: u, v value 262 */ 263 subparam = DCAM1394_SUBPARAM_U_VALUE; 264 attr_bmap = IS_VALID | IS_PRESENT | 265 CAP_SET | CAP_CTRL_SET; 266 267 if (cap_read) { 268 attr_bmap |= CAP_GET; 269 } 270 271 param_attr_set(param_attr, param, 272 subparam, attr_bmap); 273 274 subparam = DCAM1394_SUBPARAM_V_VALUE; 275 attr_bmap = IS_VALID | IS_PRESENT | 276 CAP_SET | CAP_CTRL_SET; 277 278 if (cap_read) { 279 attr_bmap |= CAP_GET; 280 } 281 282 param_attr_set(param_attr, param, 283 subparam, attr_bmap); 284 285 } else { 286 /* feature value */ 287 subparam = DCAM1394_SUBPARAM_VALUE; 288 attr_bmap = IS_VALID | IS_PRESENT | 289 CAP_SET | CAP_CTRL_SET; 290 291 if (cap_read) { 292 attr_bmap |= CAP_GET; 293 } 294 295 param_attr_set(param_attr, param, 296 subparam, attr_bmap); 297 } 298 299 } 300 301 } 302 } 303 304 return (ret_err); 305 } 306 307 308 /* 309 * param_attr_set 310 */ 311 void 312 param_attr_set(dcam1394_param_attr_t param_attr, uint_t param, 313 uint_t subparam, uint_t attr_bmap) 314 { 315 param_attr[param][subparam] = attr_bmap; 316 } 317 318 319 /* 320 * dcam1394_ioctl_param_get 321 * 322 * softc's param_attr field must be initialized via param_attr_init() 323 * before using this function. 324 */ 325 int 326 dcam1394_ioctl_param_get(dcam_state_t *softc_p, 327 dcam1394_param_list_t param_list) 328 { 329 int err, ret_err; 330 int param, subparam; 331 uint_t cap_get, is_present, is_valid, val; 332 333 ret_err = 0; 334 335 for (param = 0; param < DCAM1394_NUM_PARAM; param++) { 336 for (subparam = 0; 337 subparam < DCAM1394_NUM_SUBPARAM; 338 subparam++) { 339 340 if (param_list[param][subparam].flag) { 341 is_valid = 342 softc_p->param_attr[param][subparam] & 343 IS_VALID; 344 is_present = 345 softc_p->param_attr[param][subparam] & 346 IS_PRESENT; 347 cap_get = 348 softc_p->param_attr[param][subparam] & 349 CAP_GET; 350 351 if (is_valid && is_present && cap_get) { 352 if (err = dcam1394_param_get(softc_p, 353 param, subparam, &val)) { 354 355 param_list[param][subparam].err = 1; 356 ret_err = 1; 357 } 358 359 if (!err) { 360 param_list[param][subparam].val = 361 val; 362 } 363 } else { 364 param_list[param][subparam].err = 1; 365 ret_err = 1; 366 } 367 } 368 } 369 } 370 371 return (ret_err); 372 } 373 374 375 /* 376 * dcam1394_ioctl_param_set 377 * softc's param_attr field must be initialized via param_attr_init() 378 * before using this function. 379 */ 380 int 381 dcam1394_ioctl_param_set(dcam_state_t *softc_p, int is_ctrl_file, 382 dcam1394_param_list_t param_list) 383 { 384 int param, subparam; 385 int ret_err; 386 uint_t cap_set, is_present, is_valid, val; 387 388 ret_err = 0; 389 390 for (param = 0; param < DCAM1394_NUM_PARAM; param++) { 391 for (subparam = 0; 392 subparam < DCAM1394_NUM_SUBPARAM; 393 subparam++) { 394 if (param_list[param][subparam].flag) { 395 is_valid = 396 softc_p->param_attr[param][subparam] & 397 IS_VALID; 398 is_present = 399 softc_p->param_attr[param][subparam] & 400 IS_PRESENT; 401 402 cap_set = is_ctrl_file ? 403 (softc_p->param_attr[param][subparam] 404 & CAP_CTRL_SET) : 405 (softc_p->param_attr[param][subparam] 406 & CAP_SET); 407 408 if (is_valid && is_present && cap_set) { 409 val = param_list[param][subparam].val; 410 411 if (dcam1394_param_set(softc_p, 412 param, subparam, val)) { 413 414 param_list[param][subparam].err = 1; 415 ret_err = 1; 416 } 417 } else { 418 param_list[param][subparam].err = 1; 419 ret_err = 1; 420 } 421 } 422 } 423 } 424 425 return (ret_err); 426 } 427 428 429 /* 430 * dcam1394_param_get 431 */ 432 int 433 dcam1394_param_get(dcam_state_t *softc_p, uint_t param, uint_t subparam, 434 uint_t *val_p) 435 { 436 int err; 437 438 switch (param) { 439 440 case DCAM1394_PARAM_CAP_POWER_CTRL: 441 err = param_cap_power_ctrl_get(softc_p, val_p); 442 break; 443 444 case DCAM1394_PARAM_CAP_VID_MODE: 445 err = param_cap_vid_mode_get(softc_p, subparam, val_p); 446 break; 447 448 case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_0: 449 case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_1: 450 case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_2: 451 case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_3: 452 case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_4: 453 case DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_5: 454 err = param_cap_frame_rate_get(softc_p, param, subparam, val_p); 455 break; 456 457 case DCAM1394_PARAM_POWER: 458 err = param_power_get(softc_p, val_p); 459 break; 460 461 case DCAM1394_PARAM_VID_MODE: 462 err = param_vid_mode_get(softc_p, val_p); 463 break; 464 465 case DCAM1394_PARAM_FRAME_RATE: 466 err = param_frame_rate_get(softc_p, val_p); 467 break; 468 469 case DCAM1394_PARAM_RING_BUFF_CAPACITY: 470 err = param_ring_buff_capacity_get(softc_p, val_p); 471 break; 472 473 case DCAM1394_PARAM_RING_BUFF_NUM_FRAMES_READY: 474 err = param_ring_buff_num_frames_ready_get(softc_p, val_p); 475 break; 476 477 case DCAM1394_PARAM_RING_BUFF_READ_PTR_INCR: 478 err = param_ring_buff_read_ptr_incr_get(softc_p, val_p); 479 break; 480 481 case DCAM1394_PARAM_FRAME_NUM_BYTES: 482 err = param_frame_num_bytes_get(softc_p, val_p); 483 break; 484 485 case DCAM1394_PARAM_STATUS: 486 err = param_status_get(softc_p, val_p); 487 break; 488 489 case DCAM1394_PARAM_BRIGHTNESS: 490 err = param_brightness_get(softc_p, subparam, val_p); 491 break; 492 493 case DCAM1394_PARAM_EXPOSURE: 494 err = param_exposure_get(softc_p, subparam, val_p); 495 break; 496 497 case DCAM1394_PARAM_SHARPNESS: 498 err = param_sharpness_get(softc_p, subparam, val_p); 499 break; 500 501 case DCAM1394_PARAM_WHITE_BALANCE: 502 err = param_white_balance_get(softc_p, subparam, val_p); 503 break; 504 505 case DCAM1394_PARAM_HUE: 506 err = param_hue_get(softc_p, subparam, val_p); 507 break; 508 509 case DCAM1394_PARAM_SATURATION: 510 err = param_saturation_get(softc_p, subparam, val_p); 511 break; 512 513 case DCAM1394_PARAM_GAMMA: 514 err = param_gamma_get(softc_p, subparam, val_p); 515 break; 516 517 case DCAM1394_PARAM_SHUTTER: 518 err = param_shutter_get(softc_p, subparam, val_p); 519 break; 520 521 case DCAM1394_PARAM_GAIN: 522 err = param_gain_get(softc_p, subparam, val_p); 523 break; 524 525 case DCAM1394_PARAM_IRIS: 526 err = param_iris_get(softc_p, subparam, val_p); 527 break; 528 529 case DCAM1394_PARAM_FOCUS: 530 err = param_focus_get(softc_p, subparam, val_p); 531 break; 532 533 case DCAM1394_PARAM_ZOOM: 534 err = param_zoom_get(softc_p, subparam, val_p); 535 break; 536 537 case DCAM1394_PARAM_PAN: 538 err = param_pan_get(softc_p, subparam, val_p); 539 break; 540 541 case DCAM1394_PARAM_TILT: 542 err = param_tilt_get(softc_p, subparam, val_p); 543 break; 544 545 default: 546 err = 1; 547 break; 548 } 549 550 return (err); 551 } 552 553 554 /* 555 * dcam1394_param_set 556 */ 557 int 558 dcam1394_param_set(dcam_state_t *softc_p, uint_t param, uint_t subparam, 559 uint_t val) 560 { 561 int err; 562 563 switch (param) { 564 565 case DCAM1394_PARAM_POWER: 566 err = param_power_set(softc_p, val); 567 break; 568 569 case DCAM1394_PARAM_VID_MODE: 570 err = param_vid_mode_set(softc_p, val); 571 break; 572 573 case DCAM1394_PARAM_FRAME_RATE: 574 err = param_frame_rate_set(softc_p, val); 575 break; 576 577 case DCAM1394_PARAM_RING_BUFF_CAPACITY: 578 err = param_ring_buff_capacity_set(softc_p, val); 579 break; 580 581 case DCAM1394_PARAM_RING_BUFF_READ_PTR_INCR: 582 err = param_ring_buff_read_ptr_incr_set(softc_p, val); 583 break; 584 585 case DCAM1394_PARAM_BRIGHTNESS: 586 err = param_brightness_set(softc_p, subparam, val); 587 break; 588 589 case DCAM1394_PARAM_EXPOSURE: 590 err = param_exposure_set(softc_p, subparam, val); 591 break; 592 593 case DCAM1394_PARAM_SHARPNESS: 594 err = param_sharpness_set(softc_p, subparam, val); 595 break; 596 597 case DCAM1394_PARAM_WHITE_BALANCE: 598 err = param_white_balance_set(softc_p, subparam, val); 599 break; 600 601 case DCAM1394_PARAM_HUE: 602 err = param_hue_set(softc_p, subparam, val); 603 break; 604 605 case DCAM1394_PARAM_SATURATION: 606 err = param_saturation_set(softc_p, subparam, val); 607 break; 608 609 case DCAM1394_PARAM_GAMMA: 610 err = param_gamma_set(softc_p, subparam, val); 611 break; 612 613 case DCAM1394_PARAM_SHUTTER: 614 err = param_shutter_set(softc_p, subparam, val); 615 break; 616 617 case DCAM1394_PARAM_GAIN: 618 err = param_gain_set(softc_p, subparam, val); 619 break; 620 621 case DCAM1394_PARAM_IRIS: 622 err = param_iris_set(softc_p, subparam, val); 623 break; 624 625 case DCAM1394_PARAM_FOCUS: 626 err = param_focus_set(softc_p, subparam, val); 627 break; 628 629 case DCAM1394_PARAM_ZOOM: 630 err = param_zoom_set(softc_p, subparam, val); 631 break; 632 633 case DCAM1394_PARAM_PAN: 634 err = param_pan_set(softc_p, subparam, val); 635 break; 636 637 case DCAM1394_PARAM_TILT: 638 err = param_tilt_set(softc_p, subparam, val); 639 break; 640 641 default: 642 err = 1; 643 break; 644 } 645 646 return (err); 647 } 648 649 650 /* 651 * feature_get 652 */ 653 int 654 feature_get(dcam_state_t *softc_p, uint_t feature_csr_offs, 655 uint_t feature_elm_inq_reg_offs, uint_t subparam, uint_t *val_p) 656 { 657 dcam1394_reg_io_t reg_io; 658 uint_t val; 659 660 switch (subparam) { 661 662 case DCAM1394_SUBPARAM_PRESENCE: 663 case DCAM1394_SUBPARAM_ON_OFF: 664 case DCAM1394_SUBPARAM_CTRL_MODE: 665 case DCAM1394_SUBPARAM_VALUE: 666 case DCAM1394_SUBPARAM_U_VALUE: 667 case DCAM1394_SUBPARAM_V_VALUE: 668 reg_io.offs = feature_csr_offs + 669 DCAM1394_REG_OFFS_FEATURE_CSR_BASE; 670 671 if (dcam_reg_read(softc_p, ®_io)) { 672 return (1); 673 } 674 675 val = feature_csr_val_subparam_extract(subparam, reg_io.val); 676 break; 677 678 case DCAM1394_SUBPARAM_CAP_READ: 679 case DCAM1394_SUBPARAM_CAP_ON_OFF: 680 case DCAM1394_SUBPARAM_CAP_CTRL_AUTO: 681 case DCAM1394_SUBPARAM_CAP_CTRL_MANUAL: 682 case DCAM1394_SUBPARAM_MIN_VAL: 683 case DCAM1394_SUBPARAM_MAX_VAL: 684 reg_io.offs = feature_elm_inq_reg_offs + 685 DCAM1394_REG_OFFS_FEATURE_ELM_INQ_BASE; 686 687 if (dcam_reg_read(softc_p, ®_io)) { 688 return (1); 689 } 690 691 val = feature_elm_inq_reg_val_subparam_extract(subparam, 692 reg_io.val); 693 694 break; 695 696 default: 697 return (1); 698 } 699 700 *val_p = val; 701 702 return (0); 703 } 704 705 706 /* 707 * feature_set 708 */ 709 int 710 feature_set(dcam_state_t *softc_p, uint_t feature_csr_offs, 711 uint_t subparam, uint_t val) 712 { 713 dcam1394_reg_io_t reg_io; 714 715 reg_io.offs = feature_csr_offs + DCAM1394_REG_OFFS_FEATURE_CSR_BASE; 716 717 if (dcam_reg_read(softc_p, ®_io)) { 718 return (1); 719 } 720 721 reg_io.val = feature_csr_val_construct(subparam, val, reg_io.val); 722 723 if (dcam_reg_write(softc_p, ®_io)) { 724 return (1); 725 } 726 727 return (0); 728 } 729 730 731 /* 732 * param_cap_power_ctrl_get 733 */ 734 int 735 param_cap_power_ctrl_get(dcam_state_t *softc_p, uint_t *val_p) 736 { 737 dcam1394_reg_io_t reg_io; 738 739 reg_io.offs = DCAM1394_REG_OFFS_BASIC_FUNC_INQ; 740 741 if (dcam_reg_read(softc_p, ®_io)) { 742 return (1); 743 } 744 745 *val_p = (reg_io.val & DCAM1394_MASK_CAM_POWER_CTRL) >> 746 DCAM1394_SHIFT_CAM_POWER_CTRL; 747 748 return (0); 749 } 750 751 752 /* 753 * param_cap_vid_mode_get 754 * dcam spec: sec 1.2.1.1 755 */ 756 int 757 param_cap_vid_mode_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 758 { 759 dcam1394_reg_io_t reg_io; 760 uint_t mask, shift, vid_mode; 761 762 vid_mode = subparam - DCAM1394_SUBPARAM_VID_MODE_0; 763 reg_io.offs = DCAM1394_REG_OFFS_VID_MODE_INQ; 764 765 if (dcam_reg_read(softc_p, ®_io)) { 766 return (1); 767 } 768 769 mask = 1 << (31 - vid_mode); 770 shift = 31 - vid_mode; 771 772 *val_p = (reg_io.val & mask) >> shift; 773 774 return (0); 775 } 776 777 778 /* 779 * param_cap_frame_rate_get() 780 * dcam spec: sec 1.2.2 781 */ 782 int 783 param_cap_frame_rate_get(dcam_state_t *softc_p, uint_t param, 784 uint_t subparam, uint_t *val_p) 785 { 786 dcam1394_reg_io_t reg_io; 787 uint_t frame_rate, mask, shift, vid_mode; 788 789 vid_mode = param - DCAM1394_PARAM_CAP_FRAME_RATE_VID_MODE_0; 790 frame_rate = subparam - DCAM1394_SUBPARAM_FRAME_RATE_0; 791 792 reg_io.offs = DCAM1394_REG_OFFS_FRAME_RATE_INQ_BASE + (4 * vid_mode); 793 794 if (dcam_reg_read(softc_p, ®_io)) { 795 return (1); 796 } 797 798 mask = 1 << (31 - (frame_rate + 1)); 799 shift = 31 - (frame_rate + 1); 800 801 *val_p = (reg_io.val & mask) >> shift; 802 803 return (0); 804 } 805 806 807 /* 808 * param_power_get 809 */ 810 int 811 param_power_get(dcam_state_t *softc_p, uint_t *val_p) 812 { 813 dcam1394_reg_io_t reg_io; 814 815 reg_io.offs = DCAM1394_REG_OFFS_CAMERA_POWER; 816 817 if (dcam_reg_read(softc_p, ®_io)) { 818 return (1); 819 } 820 821 *val_p = reg_io.val >> DCAM1394_SHIFT_CAMERA_POWER; 822 823 return (0); 824 } 825 826 827 /* 828 * param_power_set() 829 */ 830 int 831 param_power_set(dcam_state_t *softc_p, uint_t val) 832 { 833 dcam1394_reg_io_t reg_io; 834 835 reg_io.offs = DCAM1394_REG_OFFS_CAMERA_POWER; 836 reg_io.val = val << DCAM1394_SHIFT_CAMERA_POWER; 837 838 if (dcam_reg_write(softc_p, ®_io)) { 839 return (1); 840 } 841 842 return (0); 843 } 844 845 846 /* 847 * param_vid_mode_get 848 */ 849 int 850 param_vid_mode_get(dcam_state_t *softc_p, uint_t *val_p) 851 { 852 dcam1394_reg_io_t reg_io; 853 854 reg_io.offs = DCAM1394_REG_OFFS_CUR_V_MODE; 855 856 if (dcam_reg_read(softc_p, ®_io)) { 857 return (1); 858 } 859 860 *val_p = reg_io.val >> DCAM1394_SHIFT_CUR_V_MODE; 861 862 return (0); 863 } 864 865 866 /* 867 * param_vid_mode_set 868 */ 869 int 870 param_vid_mode_set(dcam_state_t *softc_p, uint_t val) 871 { 872 dcam1394_reg_io_t reg_io; 873 uint_t vid_mode; 874 875 vid_mode = val - DCAM1394_VID_MODE_0; 876 877 reg_io.offs = DCAM1394_REG_OFFS_CUR_V_MODE; 878 reg_io.val = vid_mode << DCAM1394_SHIFT_CUR_V_MODE; 879 880 if (dcam_reg_write(softc_p, ®_io)) { 881 return (1); 882 } 883 884 softc_p->cur_vid_mode = val; 885 886 /* 887 * if we are currently receiving frames, we need to do a restart 888 * so that the new vid mode value takes effect 889 */ 890 if (softc_p->flags & DCAM1394_FLAG_FRAME_RCV_INIT) { 891 (void) dcam_frame_rcv_stop(softc_p); 892 (void) dcam1394_ioctl_frame_rcv_start(softc_p); 893 } 894 895 return (0); 896 } 897 898 899 /* 900 * param_frame_rate_get 901 */ 902 int 903 param_frame_rate_get(dcam_state_t *softc_p, uint_t *val_p) 904 { 905 dcam1394_reg_io_t reg_io; 906 uint_t frame_rate; 907 908 reg_io.offs = DCAM1394_REG_OFFS_CUR_V_FRM_RATE; 909 910 if (dcam_reg_read(softc_p, ®_io)) { 911 return (1); 912 } 913 914 frame_rate = reg_io.val >> DCAM1394_SHIFT_CUR_V_FRM_RATE; 915 916 *val_p = frame_rate - 1 + DCAM1394_FRAME_RATE_0; 917 918 return (0); 919 } 920 921 922 /* 923 * param_frame_rate_set 924 */ 925 int 926 param_frame_rate_set(dcam_state_t *softc_p, uint_t val) 927 { 928 dcam1394_reg_io_t reg_io; 929 uint_t frame_rate; 930 931 /* if we are currently receiving frames, stop the camera */ 932 if (softc_p->flags & DCAM1394_FLAG_FRAME_RCV_INIT) { 933 (void) dcam_frame_rcv_stop(softc_p); 934 935 frame_rate = val - DCAM1394_FRAME_RATE_0 + 1; 936 937 reg_io.offs = DCAM1394_REG_OFFS_CUR_V_FRM_RATE; 938 reg_io.val = frame_rate << DCAM1394_SHIFT_CUR_V_FRM_RATE; 939 940 if (dcam_reg_write(softc_p, ®_io)) { 941 return (1); 942 } 943 944 /* 945 * Update the state info. 946 * note: the driver maintains frame rate in an array 947 * whereas the the camera uses predefined values whose 948 * lowest frame rate starts at 6 949 */ 950 softc_p->cur_frame_rate = val - 6; 951 952 /* restart the camera */ 953 (void) dcam1394_ioctl_frame_rcv_start(softc_p); 954 } else { 955 frame_rate = val - DCAM1394_FRAME_RATE_0 + 1; 956 957 reg_io.offs = DCAM1394_REG_OFFS_CUR_V_FRM_RATE; 958 reg_io.val = frame_rate << DCAM1394_SHIFT_CUR_V_FRM_RATE; 959 960 if (dcam_reg_write(softc_p, ®_io)) { 961 return (1); 962 } 963 964 /* see note above re skewing of value by 6 */ 965 softc_p->cur_frame_rate = val - 6; 966 } 967 968 return (0); 969 } 970 971 972 /* 973 * param_ring_buff_capacity_get() 974 */ 975 int 976 param_ring_buff_capacity_get(dcam_state_t *softc_p, uint_t *val_p) 977 { 978 *val_p = softc_p->cur_ring_buff_capacity; 979 980 return (0); 981 } 982 983 984 /* 985 * param_ring_buff_capacity_set 986 */ 987 int 988 param_ring_buff_capacity_set(dcam_state_t *softc_p, uint_t val) 989 { 990 /* bounds check */ 991 if ((val < 2) || (val > 30)) { 992 return (1); 993 } 994 995 /* update our state info */ 996 softc_p->cur_ring_buff_capacity = val; 997 998 999 /* 1000 * if we are currently receiving frames, we need to do a restart 1001 * so that the new buff_capacity value takes effect 1002 */ 1003 if (softc_p->flags & DCAM1394_FLAG_FRAME_RCV_INIT) { 1004 (void) dcam_frame_rcv_stop(softc_p); 1005 (void) dcam1394_ioctl_frame_rcv_start(softc_p); 1006 } 1007 return (0); 1008 } 1009 1010 1011 /* 1012 * param_ring_buff_num_frames_ready_get() 1013 */ 1014 int 1015 param_ring_buff_num_frames_ready_get(dcam_state_t *softc_p, uint_t *val_p) 1016 { 1017 size_t read_pos, write_pos; 1018 1019 /* 1020 * note: currently we support only one read_ptr_id, so the 1021 * following logic will work. If multiple read_ptr_id's are 1022 * supported, this function call will need to receive a 1023 * read_ptr_id 1024 */ 1025 1026 if (softc_p->ring_buff_p == NULL) { 1027 return (1); 1028 } 1029 1030 mutex_enter(&softc_p->dcam_frame_is_done_mutex); 1031 1032 read_pos = ring_buff_read_ptr_pos_get(softc_p->ring_buff_p, 0); 1033 write_pos = ring_buff_write_ptr_pos_get(softc_p->ring_buff_p); 1034 1035 if (read_pos < write_pos) { 1036 *val_p = write_pos - read_pos; 1037 } else { 1038 *val_p = (softc_p->ring_buff_p->num_buffs + write_pos) - 1039 read_pos; 1040 } 1041 1042 mutex_exit(&softc_p->dcam_frame_is_done_mutex); 1043 1044 return (0); 1045 } 1046 1047 1048 /* 1049 * param_ring_buff_read_ptr_incr_get() 1050 */ 1051 1052 int 1053 param_ring_buff_read_ptr_incr_get(dcam_state_t *softc_p, uint_t *val_p) 1054 { 1055 if (softc_p->ring_buff_p == NULL) { 1056 return (1); 1057 } 1058 1059 *val_p = softc_p->ring_buff_p->read_ptr_incr_val; 1060 1061 return (0); 1062 } 1063 1064 1065 /* 1066 * param_ring_buff_read_ptr_incr_set 1067 */ 1068 int 1069 param_ring_buff_read_ptr_incr_set(dcam_state_t *softc_p, uint_t val) 1070 { 1071 if (softc_p->ring_buff_p == NULL) { 1072 return (1); 1073 } 1074 1075 softc_p->ring_buff_p->read_ptr_incr_val = val; 1076 1077 return (0); 1078 } 1079 1080 1081 /* 1082 * param_frame_num_bytes_get 1083 */ 1084 int 1085 param_frame_num_bytes_get(dcam_state_t *softc_p, uint_t *val_p) 1086 { 1087 if (softc_p == NULL) { 1088 return (1); 1089 } 1090 1091 *val_p = g_frame_num_bytes[softc_p->cur_vid_mode]; 1092 1093 return (0); 1094 } 1095 1096 1097 /* 1098 * param_status_get() 1099 */ 1100 1101 int 1102 param_status_get(dcam_state_t *softc_p, uint_t *val_p) 1103 { 1104 mutex_enter(&softc_p->dcam_frame_is_done_mutex); 1105 1106 *val_p = softc_p->param_status; 1107 softc_p->param_status = 0; 1108 1109 mutex_exit(&softc_p->dcam_frame_is_done_mutex); 1110 1111 return (0); 1112 } 1113 1114 1115 /* 1116 * param_brightness_get 1117 */ 1118 int 1119 param_brightness_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1120 { 1121 int ret_val; 1122 uint_t feature_csr_offs; 1123 uint_t feature_elm_inq_reg_offs; 1124 1125 feature_csr_offs = DCAM1394_REG_OFFS_BRIGHTNESS_CSR; 1126 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_BRIGHTNESS_INQ; 1127 1128 ret_val = feature_get(softc_p, feature_csr_offs, 1129 feature_elm_inq_reg_offs, subparam, val_p); 1130 1131 return (ret_val); 1132 } 1133 1134 1135 /* 1136 * param_brightness_set() 1137 */ 1138 int 1139 param_brightness_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1140 { 1141 int ret_val; 1142 uint_t feature_csr_offs; 1143 1144 feature_csr_offs = DCAM1394_REG_OFFS_BRIGHTNESS_CSR; 1145 1146 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1147 1148 return (ret_val); 1149 } 1150 1151 1152 /* 1153 * param_exposure_get 1154 */ 1155 int 1156 param_exposure_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1157 { 1158 int ret_val; 1159 uint_t feature_csr_offs; 1160 uint_t feature_elm_inq_reg_offs; 1161 1162 feature_csr_offs = DCAM1394_REG_OFFS_EXPOSURE_CSR; 1163 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_EXPOSURE_INQ; 1164 1165 ret_val = feature_get(softc_p, feature_csr_offs, 1166 feature_elm_inq_reg_offs, subparam, val_p); 1167 1168 return (ret_val); 1169 } 1170 1171 1172 /* 1173 * param_exposure_set 1174 */ 1175 int 1176 param_exposure_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1177 { 1178 int ret_val; 1179 uint_t feature_csr_offs; 1180 1181 feature_csr_offs = DCAM1394_REG_OFFS_EXPOSURE_CSR; 1182 1183 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1184 1185 return (ret_val); 1186 } 1187 1188 1189 /* 1190 * param_sharpness_get 1191 */ 1192 int 1193 param_sharpness_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1194 { 1195 int ret_val; 1196 uint_t feature_csr_offs; 1197 uint_t feature_elm_inq_reg_offs; 1198 1199 feature_csr_offs = DCAM1394_REG_OFFS_SHARPNESS_CSR; 1200 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_SHARPNESS_INQ; 1201 1202 ret_val = feature_get(softc_p, feature_csr_offs, 1203 feature_elm_inq_reg_offs, subparam, val_p); 1204 1205 return (ret_val); 1206 } 1207 1208 1209 /* 1210 * param_sharpness_set 1211 */ 1212 int 1213 param_sharpness_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1214 { 1215 int ret_val; 1216 uint_t feature_csr_offs; 1217 1218 feature_csr_offs = DCAM1394_REG_OFFS_SHARPNESS_CSR; 1219 1220 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1221 1222 return (ret_val); 1223 } 1224 1225 1226 /* 1227 * param_white_balance_get 1228 */ 1229 int 1230 param_white_balance_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1231 { 1232 int ret_val; 1233 uint_t feature_csr_offs; 1234 uint_t feature_elm_inq_reg_offs; 1235 1236 feature_csr_offs = DCAM1394_REG_OFFS_WHITE_BALANCE_CSR; 1237 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_WHITE_BALANCE_INQ; 1238 1239 ret_val = feature_get(softc_p, feature_csr_offs, 1240 feature_elm_inq_reg_offs, subparam, val_p); 1241 1242 return (ret_val); 1243 } 1244 1245 1246 /* 1247 * param_white_balance_set 1248 */ 1249 int 1250 param_white_balance_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1251 { 1252 int ret_val; 1253 uint_t feature_csr_offs; 1254 1255 feature_csr_offs = DCAM1394_REG_OFFS_WHITE_BALANCE_CSR; 1256 1257 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1258 1259 return (ret_val); 1260 } 1261 1262 1263 /* 1264 * param_hue_get 1265 */ 1266 int 1267 param_hue_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1268 { 1269 int ret_val; 1270 uint_t feature_csr_offs; 1271 uint_t feature_elm_inq_reg_offs; 1272 1273 feature_csr_offs = DCAM1394_REG_OFFS_HUE_CSR; 1274 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_HUE_INQ; 1275 1276 ret_val = feature_get(softc_p, feature_csr_offs, 1277 feature_elm_inq_reg_offs, subparam, val_p); 1278 1279 return (ret_val); 1280 } 1281 1282 1283 /* 1284 * param_hue_set 1285 */ 1286 int 1287 param_hue_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1288 { 1289 int ret_val; 1290 uint_t feature_csr_offs; 1291 1292 feature_csr_offs = DCAM1394_REG_OFFS_HUE_CSR; 1293 1294 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1295 1296 return (ret_val); 1297 } 1298 1299 1300 /* 1301 * param_saturation_get 1302 */ 1303 int 1304 param_saturation_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1305 { 1306 int ret_val; 1307 uint_t feature_csr_offs; 1308 uint_t feature_elm_inq_reg_offs; 1309 1310 feature_csr_offs = DCAM1394_REG_OFFS_SATURATION_CSR; 1311 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_SATURATION_INQ; 1312 1313 ret_val = feature_get(softc_p, feature_csr_offs, 1314 feature_elm_inq_reg_offs, subparam, val_p); 1315 1316 return (ret_val); 1317 } 1318 1319 1320 /* 1321 * param_saturation_set 1322 */ 1323 int 1324 param_saturation_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1325 { 1326 int ret_val; 1327 uint_t feature_csr_offs; 1328 1329 feature_csr_offs = DCAM1394_REG_OFFS_SATURATION_CSR; 1330 1331 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1332 1333 return (ret_val); 1334 } 1335 1336 1337 /* 1338 * param_gamma_get 1339 */ 1340 int 1341 param_gamma_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1342 { 1343 int ret_val; 1344 uint_t feature_csr_offs; 1345 uint_t feature_elm_inq_reg_offs; 1346 1347 feature_csr_offs = DCAM1394_REG_OFFS_GAMMA_CSR; 1348 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_GAMMA_INQ; 1349 1350 ret_val = feature_get(softc_p, feature_csr_offs, 1351 feature_elm_inq_reg_offs, subparam, val_p); 1352 1353 return (ret_val); 1354 } 1355 1356 1357 /* 1358 * param_gamma_set 1359 */ 1360 int 1361 param_gamma_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1362 { 1363 int ret_val; 1364 uint_t feature_csr_offs; 1365 1366 feature_csr_offs = DCAM1394_REG_OFFS_GAMMA_CSR; 1367 1368 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1369 1370 return (ret_val); 1371 } 1372 1373 1374 /* 1375 * param_shutter_get 1376 */ 1377 int 1378 param_shutter_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1379 { 1380 int ret_val; 1381 uint_t feature_csr_offs; 1382 uint_t feature_elm_inq_reg_offs; 1383 1384 feature_csr_offs = DCAM1394_REG_OFFS_SHUTTER_CSR; 1385 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_SHUTTER_INQ; 1386 1387 ret_val = feature_get(softc_p, feature_csr_offs, 1388 feature_elm_inq_reg_offs, subparam, val_p); 1389 1390 return (ret_val); 1391 } 1392 1393 1394 /* 1395 * param_shutter_set 1396 */ 1397 int 1398 param_shutter_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1399 { 1400 int ret_val; 1401 uint_t feature_csr_offs; 1402 1403 feature_csr_offs = DCAM1394_REG_OFFS_SHUTTER_CSR; 1404 1405 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1406 1407 return (ret_val); 1408 } 1409 1410 1411 /* 1412 * param_gain_get 1413 */ 1414 int 1415 param_gain_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1416 { 1417 int ret_val; 1418 uint_t feature_csr_offs; 1419 uint_t feature_elm_inq_reg_offs; 1420 1421 feature_csr_offs = DCAM1394_REG_OFFS_GAIN_CSR; 1422 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_GAIN_INQ; 1423 1424 ret_val = feature_get(softc_p, feature_csr_offs, 1425 feature_elm_inq_reg_offs, subparam, val_p); 1426 1427 return (ret_val); 1428 } 1429 1430 1431 /* 1432 * param_gain_set 1433 */ 1434 int 1435 param_gain_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1436 { 1437 int ret_val; 1438 uint_t feature_csr_offs; 1439 1440 feature_csr_offs = DCAM1394_REG_OFFS_GAIN_CSR; 1441 1442 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1443 1444 return (ret_val); 1445 } 1446 1447 1448 /* 1449 * param_iris_get 1450 */ 1451 int 1452 param_iris_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1453 { 1454 int ret_val; 1455 uint_t feature_csr_offs; 1456 uint_t feature_elm_inq_reg_offs; 1457 1458 feature_csr_offs = DCAM1394_REG_OFFS_IRIS_CSR; 1459 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_IRIS_INQ; 1460 1461 ret_val = feature_get(softc_p, feature_csr_offs, 1462 feature_elm_inq_reg_offs, subparam, val_p); 1463 1464 switch (subparam) { 1465 case DCAM1394_SUBPARAM_PRESENCE: 1466 *val_p = 0; 1467 break; 1468 case DCAM1394_SUBPARAM_ON_OFF: 1469 *val_p = 1; 1470 break; 1471 case DCAM1394_SUBPARAM_MIN_VAL: 1472 case DCAM1394_SUBPARAM_MAX_VAL: 1473 case DCAM1394_SUBPARAM_VALUE: 1474 *val_p = 4; 1475 break; 1476 default: 1477 break; 1478 } 1479 1480 return (ret_val); 1481 } 1482 1483 1484 /* 1485 * param_iris_set 1486 */ 1487 int 1488 param_iris_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1489 { 1490 int ret_val; 1491 uint_t feature_csr_offs; 1492 1493 feature_csr_offs = DCAM1394_REG_OFFS_IRIS_CSR; 1494 1495 if (subparam == DCAM1394_SUBPARAM_ON_OFF) { 1496 val = 1; 1497 } else if (subparam == DCAM1394_SUBPARAM_VALUE) { 1498 val = 4; 1499 } 1500 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1501 1502 return (ret_val); 1503 } 1504 1505 1506 /* 1507 * param_focus_get 1508 */ 1509 int 1510 param_focus_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1511 { 1512 int ret_val; 1513 uint_t feature_csr_offs; 1514 uint_t feature_elm_inq_reg_offs; 1515 1516 feature_csr_offs = DCAM1394_REG_OFFS_FOCUS_CSR; 1517 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_FOCUS_INQ; 1518 1519 ret_val = feature_get(softc_p, feature_csr_offs, 1520 feature_elm_inq_reg_offs, subparam, val_p); 1521 1522 return (ret_val); 1523 } 1524 1525 1526 /* 1527 * param_focus_set 1528 */ 1529 int 1530 param_focus_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1531 { 1532 int ret_val; 1533 uint_t feature_csr_offs; 1534 1535 feature_csr_offs = DCAM1394_REG_OFFS_FOCUS_CSR; 1536 1537 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1538 1539 return (ret_val); 1540 } 1541 1542 1543 /* 1544 * param_zoom_get 1545 */ 1546 int 1547 param_zoom_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1548 { 1549 int ret_val; 1550 uint_t feature_csr_offs; 1551 uint_t feature_elm_inq_reg_offs; 1552 1553 feature_csr_offs = DCAM1394_REG_OFFS_ZOOM_CSR; 1554 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_ZOOM_INQ; 1555 1556 ret_val = feature_get(softc_p, feature_csr_offs, 1557 feature_elm_inq_reg_offs, subparam, val_p); 1558 1559 return (ret_val); 1560 } 1561 1562 1563 /* 1564 * param_zoom_set 1565 */ 1566 int 1567 param_zoom_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1568 { 1569 int ret_val; 1570 uint_t feature_csr_offs; 1571 1572 feature_csr_offs = DCAM1394_REG_OFFS_ZOOM_CSR; 1573 1574 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1575 1576 return (ret_val); 1577 } 1578 1579 1580 /* 1581 * param_pan_get 1582 */ 1583 int 1584 param_pan_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1585 { 1586 int ret_val; 1587 uint_t feature_csr_offs; 1588 uint_t feature_elm_inq_reg_offs; 1589 1590 feature_csr_offs = DCAM1394_REG_OFFS_PAN_CSR; 1591 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_PAN_INQ; 1592 1593 ret_val = feature_get(softc_p, feature_csr_offs, 1594 feature_elm_inq_reg_offs, subparam, val_p); 1595 1596 return (ret_val); 1597 } 1598 1599 1600 /* 1601 * param_pan_set 1602 */ 1603 int 1604 param_pan_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1605 { 1606 int ret_val; 1607 uint_t feature_csr_offs; 1608 1609 feature_csr_offs = DCAM1394_REG_OFFS_PAN_CSR; 1610 1611 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1612 1613 return (ret_val); 1614 } 1615 1616 1617 /* 1618 * param_tilt_get 1619 */ 1620 int 1621 param_tilt_get(dcam_state_t *softc_p, uint_t subparam, uint_t *val_p) 1622 { 1623 int ret_val; 1624 uint_t feature_csr_offs; 1625 uint_t feature_elm_inq_reg_offs; 1626 1627 feature_csr_offs = DCAM1394_REG_OFFS_TILT_CSR; 1628 feature_elm_inq_reg_offs = DCAM1394_REG_OFFS_TILT_INQ; 1629 1630 ret_val = feature_get(softc_p, feature_csr_offs, 1631 feature_elm_inq_reg_offs, subparam, val_p); 1632 1633 return (ret_val); 1634 } 1635 1636 1637 /* 1638 * param_tilt_set 1639 */ 1640 int 1641 param_tilt_set(dcam_state_t *softc_p, uint_t subparam, uint_t val) 1642 { 1643 int ret_val; 1644 uint_t feature_csr_offs; 1645 1646 feature_csr_offs = DCAM1394_REG_OFFS_TILT_CSR; 1647 1648 ret_val = feature_set(softc_p, feature_csr_offs, subparam, val); 1649 1650 return (ret_val); 1651 } 1652 1653 1654 /* 1655 * feature_csr_val_construct 1656 */ 1657 static uint_t 1658 feature_csr_val_construct(uint_t subparam, uint_t param_val, uint_t init_val) 1659 { 1660 uint_t ret_val; 1661 1662 switch (subparam) { 1663 1664 case DCAM1394_SUBPARAM_ON_OFF: 1665 ret_val = (init_val & ~(DCAM1394_MASK_ON_OFF)) | 1666 (param_val << DCAM1394_SHIFT_ON_OFF); 1667 break; 1668 1669 case DCAM1394_SUBPARAM_CTRL_MODE: 1670 ret_val = (init_val & ~(DCAM1394_MASK_A_M_MODE)) | 1671 (param_val << DCAM1394_SHIFT_A_M_MODE); 1672 break; 1673 1674 case DCAM1394_SUBPARAM_VALUE: 1675 ret_val = (init_val & ~(DCAM1394_MASK_VALUE)) | 1676 (param_val << DCAM1394_SHIFT_VALUE); 1677 break; 1678 1679 case DCAM1394_SUBPARAM_U_VALUE: 1680 ret_val = (init_val & ~(DCAM1394_MASK_U_VALUE)) | 1681 (param_val << DCAM1394_SHIFT_U_VALUE); 1682 break; 1683 1684 case DCAM1394_SUBPARAM_V_VALUE: 1685 ret_val = (init_val & ~(DCAM1394_MASK_V_VALUE)) | 1686 (param_val << DCAM1394_SHIFT_V_VALUE); 1687 break; 1688 1689 default: 1690 break; 1691 1692 } 1693 1694 return (ret_val); 1695 } 1696 1697 1698 /* 1699 * feature_csr_val_subparam_extract 1700 */ 1701 static uint_t 1702 feature_csr_val_subparam_extract(uint_t subparam, uint_t reg_val) 1703 { 1704 uint_t ret_val; 1705 1706 switch (subparam) { 1707 1708 case DCAM1394_SUBPARAM_PRESENCE: 1709 ret_val = (reg_val & DCAM1394_MASK_PRESENCE_INQ) >> 1710 DCAM1394_SHIFT_PRESENCE_INQ; 1711 break; 1712 1713 case DCAM1394_SUBPARAM_ON_OFF: 1714 ret_val = (reg_val & DCAM1394_MASK_ON_OFF) >> 1715 DCAM1394_SHIFT_ON_OFF; 1716 break; 1717 1718 case DCAM1394_SUBPARAM_CTRL_MODE: 1719 ret_val = (reg_val & DCAM1394_MASK_A_M_MODE) >> 1720 DCAM1394_SHIFT_A_M_MODE; 1721 break; 1722 1723 case DCAM1394_SUBPARAM_VALUE: 1724 ret_val = (reg_val & DCAM1394_MASK_VALUE) >> 1725 DCAM1394_SHIFT_VALUE; 1726 break; 1727 1728 case DCAM1394_SUBPARAM_U_VALUE: 1729 ret_val = (reg_val & DCAM1394_MASK_U_VALUE) >> 1730 DCAM1394_SHIFT_U_VALUE; 1731 break; 1732 1733 case DCAM1394_SUBPARAM_V_VALUE: 1734 1735 ret_val = (reg_val & DCAM1394_MASK_V_VALUE) >> 1736 DCAM1394_SHIFT_V_VALUE; 1737 break; 1738 1739 default: 1740 1741 ret_val = 0; 1742 1743 break; 1744 1745 } 1746 1747 return (ret_val); 1748 1749 } 1750 1751 1752 /* 1753 * feature_elm_inq_reg_val_subparam_extract 1754 */ 1755 static uint_t 1756 feature_elm_inq_reg_val_subparam_extract(uint_t subparam, 1757 uint_t reg_val) 1758 { 1759 uint_t ret_val; 1760 1761 switch (subparam) { 1762 1763 case DCAM1394_SUBPARAM_CAP_READ: 1764 ret_val = (reg_val & DCAM1394_MASK_READOUT_INQ) >> 1765 DCAM1394_SHIFT_READOUT_INQ; 1766 break; 1767 1768 case DCAM1394_SUBPARAM_CAP_ON_OFF: 1769 ret_val = (reg_val & DCAM1394_MASK_ON_OFF_INQ) >> 1770 DCAM1394_SHIFT_ON_OFF_INQ; 1771 break; 1772 1773 case DCAM1394_SUBPARAM_CAP_CTRL_AUTO: 1774 ret_val = (reg_val & DCAM1394_MASK_AUTO_INQ) >> 1775 DCAM1394_SHIFT_AUTO_INQ; 1776 break; 1777 1778 case DCAM1394_SUBPARAM_CAP_CTRL_MANUAL: 1779 ret_val = (reg_val & DCAM1394_MASK_MANUAL_INQ) >> 1780 DCAM1394_SHIFT_MANUAL_INQ; 1781 break; 1782 1783 case DCAM1394_SUBPARAM_MIN_VAL: 1784 ret_val = (reg_val & DCAM1394_MASK_MIN_VAL) >> 1785 DCAM1394_SHIFT_MIN_VAL; 1786 break; 1787 1788 case DCAM1394_SUBPARAM_MAX_VAL: 1789 ret_val = (reg_val & DCAM1394_MASK_MAX_VAL) >> 1790 DCAM1394_SHIFT_MAX_VAL; 1791 break; 1792 1793 default: 1794 ret_val = 0; 1795 break; 1796 1797 } 1798 1799 return (ret_val); 1800 } 1801