4 * Copyright (C) 2005 Mike Isely <isely@pobox.com>
5 * Copyright (C) 2004 Aurelien Alleaume <slts@free.fr>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "pvrusb2-i2c-cmd-v4l2.h"
23 #include "pvrusb2-hdw-internal.h"
24 #include "pvrusb2-debug.h"
25 #include <linux/videodev2.h>
26 #include <media/v4l2-common.h>
28 static void set_standard(struct pvr2_hdw
*hdw
)
30 pvr2_trace(PVR2_TRACE_CHIPS
,"i2c v4l2 set_standard");
32 if (hdw
->input_val
== PVR2_CVAL_INPUT_RADIO
) {
33 pvr2_i2c_core_cmd(hdw
,AUDC_SET_RADIO
,NULL
);
36 vs
= hdw
->std_mask_cur
;
37 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_STD
,&vs
);
39 hdw
->tuner_signal_stale
= !0;
40 hdw
->cropcap_stale
= !0;
44 static int check_standard(struct pvr2_hdw
*hdw
)
46 return (hdw
->input_dirty
!= 0) || (hdw
->std_dirty
!= 0);
50 const struct pvr2_i2c_op pvr2_i2c_op_v4l2_standard
= {
51 .check
= check_standard
,
52 .update
= set_standard
,
53 .name
= "v4l2_standard",
57 static void set_bcsh(struct pvr2_hdw
*hdw
)
59 struct v4l2_control ctrl
;
60 pvr2_trace(PVR2_TRACE_CHIPS
,"i2c v4l2 set_bcsh"
61 " b=%d c=%d s=%d h=%d",
62 hdw
->brightness_val
,hdw
->contrast_val
,
63 hdw
->saturation_val
,hdw
->hue_val
);
64 memset(&ctrl
,0,sizeof(ctrl
));
65 ctrl
.id
= V4L2_CID_BRIGHTNESS
;
66 ctrl
.value
= hdw
->brightness_val
;
67 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_CTRL
,&ctrl
);
68 ctrl
.id
= V4L2_CID_CONTRAST
;
69 ctrl
.value
= hdw
->contrast_val
;
70 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_CTRL
,&ctrl
);
71 ctrl
.id
= V4L2_CID_SATURATION
;
72 ctrl
.value
= hdw
->saturation_val
;
73 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_CTRL
,&ctrl
);
74 ctrl
.id
= V4L2_CID_HUE
;
75 ctrl
.value
= hdw
->hue_val
;
76 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_CTRL
,&ctrl
);
80 static int check_bcsh(struct pvr2_hdw
*hdw
)
82 return (hdw
->brightness_dirty
||
83 hdw
->contrast_dirty
||
84 hdw
->saturation_dirty
||
89 const struct pvr2_i2c_op pvr2_i2c_op_v4l2_bcsh
= {
96 static void set_volume(struct pvr2_hdw
*hdw
)
98 struct v4l2_control ctrl
;
99 pvr2_trace(PVR2_TRACE_CHIPS
,
100 "i2c v4l2 set_volume"
101 "(vol=%d bal=%d bas=%d treb=%d mute=%d)",
107 memset(&ctrl
,0,sizeof(ctrl
));
108 ctrl
.id
= V4L2_CID_AUDIO_MUTE
;
109 ctrl
.value
= hdw
->mute_val
? 1 : 0;
110 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_CTRL
,&ctrl
);
111 ctrl
.id
= V4L2_CID_AUDIO_VOLUME
;
112 ctrl
.value
= hdw
->volume_val
;
113 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_CTRL
,&ctrl
);
114 ctrl
.id
= V4L2_CID_AUDIO_BALANCE
;
115 ctrl
.value
= hdw
->balance_val
;
116 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_CTRL
,&ctrl
);
117 ctrl
.id
= V4L2_CID_AUDIO_BASS
;
118 ctrl
.value
= hdw
->bass_val
;
119 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_CTRL
,&ctrl
);
120 ctrl
.id
= V4L2_CID_AUDIO_TREBLE
;
121 ctrl
.value
= hdw
->treble_val
;
122 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_CTRL
,&ctrl
);
126 static int check_volume(struct pvr2_hdw
*hdw
)
128 return (hdw
->volume_dirty
||
129 hdw
->balance_dirty
||
136 const struct pvr2_i2c_op pvr2_i2c_op_v4l2_volume
= {
137 .check
= check_volume
,
138 .update
= set_volume
,
139 .name
= "v4l2_volume",
143 static void set_audiomode(struct pvr2_hdw
*hdw
)
145 struct v4l2_tuner vt
;
146 memset(&vt
,0,sizeof(vt
));
147 vt
.audmode
= hdw
->audiomode_val
;
148 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_TUNER
,&vt
);
152 static int check_audiomode(struct pvr2_hdw
*hdw
)
154 return (hdw
->input_dirty
||
155 hdw
->audiomode_dirty
);
159 const struct pvr2_i2c_op pvr2_i2c_op_v4l2_audiomode
= {
160 .check
= check_audiomode
,
161 .update
= set_audiomode
,
162 .name
= "v4l2_audiomode",
166 static void set_frequency(struct pvr2_hdw
*hdw
)
169 struct v4l2_frequency freq
;
170 fv
= pvr2_hdw_get_cur_freq(hdw
);
171 pvr2_trace(PVR2_TRACE_CHIPS
,"i2c v4l2 set_freq(%lu)",fv
);
172 if (hdw
->tuner_signal_stale
) {
173 pvr2_i2c_core_status_poll(hdw
);
175 memset(&freq
,0,sizeof(freq
));
176 if (hdw
->tuner_signal_info
.capability
& V4L2_TUNER_CAP_LOW
) {
177 // ((fv * 1000) / 62500)
178 freq
.frequency
= (fv
* 2) / 125;
180 freq
.frequency
= fv
/ 62500;
182 /* tuner-core currently doesn't seem to care about this, but
183 let's set it anyway for completeness. */
184 if (hdw
->input_val
== PVR2_CVAL_INPUT_RADIO
) {
185 freq
.type
= V4L2_TUNER_RADIO
;
187 freq
.type
= V4L2_TUNER_ANALOG_TV
;
190 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_FREQUENCY
,&freq
);
194 static int check_frequency(struct pvr2_hdw
*hdw
)
196 return hdw
->freqDirty
!= 0;
200 const struct pvr2_i2c_op pvr2_i2c_op_v4l2_frequency
= {
201 .check
= check_frequency
,
202 .update
= set_frequency
,
207 static void set_size(struct pvr2_hdw
*hdw
)
209 struct v4l2_format fmt
;
211 memset(&fmt
,0,sizeof(fmt
));
213 fmt
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
214 fmt
.fmt
.pix
.width
= hdw
->res_hor_val
;
215 fmt
.fmt
.pix
.height
= hdw
->res_ver_val
;
217 pvr2_trace(PVR2_TRACE_CHIPS
,"i2c v4l2 set_size(%dx%d)",
218 fmt
.fmt
.pix
.width
,fmt
.fmt
.pix
.height
);
220 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_FMT
,&fmt
);
224 static int check_size(struct pvr2_hdw
*hdw
)
226 return (hdw
->res_hor_dirty
|| hdw
->res_ver_dirty
);
230 const struct pvr2_i2c_op pvr2_i2c_op_v4l2_size
= {
237 static void set_crop(struct pvr2_hdw
*hdw
)
239 struct v4l2_crop crop
;
241 memset(&crop
, 0, sizeof crop
);
242 crop
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
243 crop
.c
.left
= hdw
->cropl_val
;
244 crop
.c
.top
= hdw
->cropt_val
;
245 crop
.c
.height
= hdw
->croph_val
;
246 crop
.c
.width
= hdw
->cropw_val
;
248 pvr2_trace(PVR2_TRACE_CHIPS
,
249 "i2c v4l2 set_crop crop=%d:%d:%d:%d",
250 crop
.c
.width
, crop
.c
.height
, crop
.c
.left
, crop
.c
.top
);
252 pvr2_i2c_core_cmd(hdw
, VIDIOC_S_CROP
, &crop
);
255 static int check_crop(struct pvr2_hdw
*hdw
)
257 return (hdw
->cropl_dirty
|| hdw
->cropt_dirty
||
258 hdw
->cropw_dirty
|| hdw
->croph_dirty
);
261 const struct pvr2_i2c_op pvr2_i2c_op_v4l2_crop
= {
268 static void do_log(struct pvr2_hdw
*hdw
)
270 pvr2_trace(PVR2_TRACE_CHIPS
,"i2c v4l2 do_log()");
271 pvr2_i2c_core_cmd(hdw
,VIDIOC_LOG_STATUS
,NULL
);
276 static int check_log(struct pvr2_hdw
*hdw
)
278 return hdw
->log_requested
!= 0;
282 const struct pvr2_i2c_op pvr2_i2c_op_v4l2_log
= {
289 void pvr2_v4l2_cmd_stream(struct pvr2_i2c_client
*cp
,int fl
)
291 pvr2_i2c_client_cmd(cp
,
292 (fl
? VIDIOC_STREAMON
: VIDIOC_STREAMOFF
),NULL
);
296 void pvr2_v4l2_cmd_status_poll(struct pvr2_i2c_client
*cp
)
299 struct pvr2_hdw
*hdw
= cp
->hdw
;
300 if (hdw
->cropcap_stale
) {
301 hdw
->cropcap_info
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
302 stat
= pvr2_i2c_client_cmd(cp
, VIDIOC_CROPCAP
,
305 /* Check was successful, so the data is no
306 longer considered stale. */
307 hdw
->cropcap_stale
= 0;
310 pvr2_i2c_client_cmd(cp
, VIDIOC_G_TUNER
, &hdw
->tuner_signal_info
);
315 Stuff for Emacs to see, in order to encourage consistent editing style:
316 *** Local Variables: ***
318 *** fill-column: 70 ***
320 *** c-basic-offset: 8 ***