5 * Copyright (C) 2005 Mike Isely <isely@pobox.com>
6 * Copyright (C) 2004 Aurelien Alleaume <slts@free.fr>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "pvrusb2-i2c-cmd-v4l2.h"
24 #include "pvrusb2-hdw-internal.h"
25 #include "pvrusb2-debug.h"
26 #include <linux/videodev2.h>
27 #include <media/v4l2-common.h>
29 static void set_standard(struct pvr2_hdw
*hdw
)
31 pvr2_trace(PVR2_TRACE_CHIPS
,"i2c v4l2 set_standard");
33 if (hdw
->input_val
== PVR2_CVAL_INPUT_RADIO
) {
34 pvr2_i2c_core_cmd(hdw
,AUDC_SET_RADIO
,NULL
);
37 vs
= hdw
->std_mask_cur
;
38 pvr2_i2c_core_cmd(hdw
,VIDIOC_S_STD
,&vs
);
40 hdw
->tuner_signal_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 do_log(struct pvr2_hdw
*hdw
)
239 pvr2_trace(PVR2_TRACE_CHIPS
,"i2c v4l2 do_log()");
240 pvr2_i2c_core_cmd(hdw
,VIDIOC_LOG_STATUS
,NULL
);
245 static int check_log(struct pvr2_hdw
*hdw
)
247 return hdw
->log_requested
!= 0;
251 const struct pvr2_i2c_op pvr2_i2c_op_v4l2_log
= {
258 void pvr2_v4l2_cmd_stream(struct pvr2_i2c_client
*cp
,int fl
)
260 pvr2_i2c_client_cmd(cp
,
261 (fl
? VIDIOC_STREAMON
: VIDIOC_STREAMOFF
),NULL
);
265 void pvr2_v4l2_cmd_status_poll(struct pvr2_i2c_client
*cp
)
267 pvr2_i2c_client_cmd(cp
,VIDIOC_G_TUNER
,&cp
->hdw
->tuner_signal_info
);
272 Stuff for Emacs to see, in order to encourage consistent editing style:
273 *** Local Variables: ***
275 *** fill-column: 70 ***
277 *** c-basic-offset: 8 ***