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
param_attr_init(dcam_state_t * softc_p,dcam1394_param_attr_t param_attr)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
param_attr_set(dcam1394_param_attr_t param_attr,uint_t param,uint_t subparam,uint_t attr_bmap)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
dcam1394_ioctl_param_get(dcam_state_t * softc_p,dcam1394_param_list_t param_list)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
dcam1394_ioctl_param_set(dcam_state_t * softc_p,int is_ctrl_file,dcam1394_param_list_t param_list)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
dcam1394_param_get(dcam_state_t * softc_p,uint_t param,uint_t subparam,uint_t * val_p)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
dcam1394_param_set(dcam_state_t * softc_p,uint_t param,uint_t subparam,uint_t val)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
feature_get(dcam_state_t * softc_p,uint_t feature_csr_offs,uint_t feature_elm_inq_reg_offs,uint_t subparam,uint_t * val_p)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
feature_set(dcam_state_t * softc_p,uint_t feature_csr_offs,uint_t subparam,uint_t val)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
param_cap_power_ctrl_get(dcam_state_t * softc_p,uint_t * val_p)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
param_cap_vid_mode_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_cap_frame_rate_get(dcam_state_t * softc_p,uint_t param,uint_t subparam,uint_t * val_p)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
param_power_get(dcam_state_t * softc_p,uint_t * val_p)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
param_power_set(dcam_state_t * softc_p,uint_t val)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
param_vid_mode_get(dcam_state_t * softc_p,uint_t * val_p)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
param_vid_mode_set(dcam_state_t * softc_p,uint_t val)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
param_frame_rate_get(dcam_state_t * softc_p,uint_t * val_p)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
param_frame_rate_set(dcam_state_t * softc_p,uint_t val)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
param_ring_buff_capacity_get(dcam_state_t * softc_p,uint_t * val_p)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
param_ring_buff_capacity_set(dcam_state_t * softc_p,uint_t val)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
param_ring_buff_num_frames_ready_get(dcam_state_t * softc_p,uint_t * val_p)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
param_ring_buff_read_ptr_incr_get(dcam_state_t * softc_p,uint_t * val_p)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
param_ring_buff_read_ptr_incr_set(dcam_state_t * softc_p,uint_t val)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
param_frame_num_bytes_get(dcam_state_t * softc_p,uint_t * val_p)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
param_status_get(dcam_state_t * softc_p,uint_t * val_p)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
param_brightness_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_brightness_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_exposure_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_exposure_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_sharpness_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_sharpness_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_white_balance_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_white_balance_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_hue_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_hue_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_saturation_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_saturation_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_gamma_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_gamma_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_shutter_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_shutter_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_gain_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_gain_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_iris_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_iris_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_focus_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_focus_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_zoom_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_zoom_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_pan_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_pan_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
param_tilt_get(dcam_state_t * softc_p,uint_t subparam,uint_t * val_p)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
param_tilt_set(dcam_state_t * softc_p,uint_t subparam,uint_t val)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
feature_csr_val_construct(uint_t subparam,uint_t param_val,uint_t init_val)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
feature_csr_val_subparam_extract(uint_t subparam,uint_t reg_val)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
feature_elm_inq_reg_val_subparam_extract(uint_t subparam,uint_t reg_val)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