1 // SPDX-License-Identifier: GPL-2.0-only
2 /* DVB USB compliant Linux driver for the AZUREWAVE DVB-S/S2 USB2.0 (AZ6027)
5 * Copyright (C) 2009 Adams.Xu <adams.xu@azwave.com.cn>
7 * see Documentation/driver-api/media/drivers/dvb-usb.rst for more information
11 #include "stb0899_drv.h"
12 #include "stb0899_reg.h"
13 #include "stb0899_cfg.h"
16 #include "stb6100_cfg.h"
17 #include <media/dvb_ca_en50221.h>
19 int dvb_usb_az6027_debug
;
20 module_param_named(debug
, dvb_usb_az6027_debug
, int, 0644);
21 MODULE_PARM_DESC(debug
, "set debugging level (1=info,xfer=2,rc=4 (or-able))." DVB_USB_DEBUG_STATUS
);
23 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr
);
25 struct az6027_device_state
{
26 struct dvb_ca_en50221 ca
;
27 struct mutex ca_mutex
;
31 static const struct stb0899_s1_reg az6027_stb0899_s1_init_1
[] = {
33 /* 0x0000000b, SYSREG */
34 { STB0899_DEV_ID
, 0x30 },
35 { STB0899_DISCNTRL1
, 0x32 },
36 { STB0899_DISCNTRL2
, 0x80 },
37 { STB0899_DISRX_ST0
, 0x04 },
38 { STB0899_DISRX_ST1
, 0x00 },
39 { STB0899_DISPARITY
, 0x00 },
40 { STB0899_DISSTATUS
, 0x20 },
41 { STB0899_DISF22
, 0x99 },
42 { STB0899_DISF22RX
, 0xa8 },
44 { STB0899_ACRPRESC
, 0x11 },
45 { STB0899_ACRDIV1
, 0x0a },
46 { STB0899_ACRDIV2
, 0x05 },
47 { STB0899_DACR1
, 0x00 },
48 { STB0899_DACR2
, 0x00 },
49 { STB0899_OUTCFG
, 0x00 },
50 { STB0899_MODECFG
, 0x00 },
51 { STB0899_IRQSTATUS_3
, 0xfe },
52 { STB0899_IRQSTATUS_2
, 0x03 },
53 { STB0899_IRQSTATUS_1
, 0x7c },
54 { STB0899_IRQSTATUS_0
, 0xf4 },
55 { STB0899_IRQMSK_3
, 0xf3 },
56 { STB0899_IRQMSK_2
, 0xfc },
57 { STB0899_IRQMSK_1
, 0xff },
58 { STB0899_IRQMSK_0
, 0xff },
59 { STB0899_IRQCFG
, 0x00 },
60 { STB0899_I2CCFG
, 0x88 },
61 { STB0899_I2CRPT
, 0x58 },
62 { STB0899_IOPVALUE5
, 0x00 },
63 { STB0899_IOPVALUE4
, 0x33 },
64 { STB0899_IOPVALUE3
, 0x6d },
65 { STB0899_IOPVALUE2
, 0x90 },
66 { STB0899_IOPVALUE1
, 0x60 },
67 { STB0899_IOPVALUE0
, 0x00 },
68 { STB0899_GPIO00CFG
, 0x82 },
69 { STB0899_GPIO01CFG
, 0x82 },
70 { STB0899_GPIO02CFG
, 0x82 },
71 { STB0899_GPIO03CFG
, 0x82 },
72 { STB0899_GPIO04CFG
, 0x82 },
73 { STB0899_GPIO05CFG
, 0x82 },
74 { STB0899_GPIO06CFG
, 0x82 },
75 { STB0899_GPIO07CFG
, 0x82 },
76 { STB0899_GPIO08CFG
, 0x82 },
77 { STB0899_GPIO09CFG
, 0x82 },
78 { STB0899_GPIO10CFG
, 0x82 },
79 { STB0899_GPIO11CFG
, 0x82 },
80 { STB0899_GPIO12CFG
, 0x82 },
81 { STB0899_GPIO13CFG
, 0x82 },
82 { STB0899_GPIO14CFG
, 0x82 },
83 { STB0899_GPIO15CFG
, 0x82 },
84 { STB0899_GPIO16CFG
, 0x82 },
85 { STB0899_GPIO17CFG
, 0x82 },
86 { STB0899_GPIO18CFG
, 0x82 },
87 { STB0899_GPIO19CFG
, 0x82 },
88 { STB0899_GPIO20CFG
, 0x82 },
89 { STB0899_SDATCFG
, 0xb8 },
90 { STB0899_SCLTCFG
, 0xba },
91 { STB0899_AGCRFCFG
, 0x1c }, /* 0x11 */
92 { STB0899_GPIO22
, 0x82 }, /* AGCBB2CFG */
93 { STB0899_GPIO21
, 0x91 }, /* AGCBB1CFG */
94 { STB0899_DIRCLKCFG
, 0x82 },
95 { STB0899_CLKOUT27CFG
, 0x7e },
96 { STB0899_STDBYCFG
, 0x82 },
97 { STB0899_CS0CFG
, 0x82 },
98 { STB0899_CS1CFG
, 0x82 },
99 { STB0899_DISEQCOCFG
, 0x20 },
100 { STB0899_GPIO32CFG
, 0x82 },
101 { STB0899_GPIO33CFG
, 0x82 },
102 { STB0899_GPIO34CFG
, 0x82 },
103 { STB0899_GPIO35CFG
, 0x82 },
104 { STB0899_GPIO36CFG
, 0x82 },
105 { STB0899_GPIO37CFG
, 0x82 },
106 { STB0899_GPIO38CFG
, 0x82 },
107 { STB0899_GPIO39CFG
, 0x82 },
108 { STB0899_NCOARSE
, 0x17 }, /* 0x15 = 27 Mhz Clock, F/3 = 198MHz, F/6 = 99MHz */
109 { STB0899_SYNTCTRL
, 0x02 }, /* 0x00 = CLK from CLKI, 0x02 = CLK from XTALI */
110 { STB0899_FILTCTRL
, 0x00 },
111 { STB0899_SYSCTRL
, 0x01 },
112 { STB0899_STOPCLK1
, 0x20 },
113 { STB0899_STOPCLK2
, 0x00 },
114 { STB0899_INTBUFSTATUS
, 0x00 },
115 { STB0899_INTBUFCTRL
, 0x0a },
119 static const struct stb0899_s1_reg az6027_stb0899_s1_init_3
[] = {
120 { STB0899_DEMOD
, 0x00 },
121 { STB0899_RCOMPC
, 0xc9 },
122 { STB0899_AGC1CN
, 0x01 },
123 { STB0899_AGC1REF
, 0x10 },
124 { STB0899_RTC
, 0x23 },
125 { STB0899_TMGCFG
, 0x4e },
126 { STB0899_AGC2REF
, 0x34 },
127 { STB0899_TLSR
, 0x84 },
128 { STB0899_CFD
, 0xf7 },
129 { STB0899_ACLC
, 0x87 },
130 { STB0899_BCLC
, 0x94 },
131 { STB0899_EQON
, 0x41 },
132 { STB0899_LDT
, 0xf1 },
133 { STB0899_LDT2
, 0xe3 },
134 { STB0899_EQUALREF
, 0xb4 },
135 { STB0899_TMGRAMP
, 0x10 },
136 { STB0899_TMGTHD
, 0x30 },
137 { STB0899_IDCCOMP
, 0xfd },
138 { STB0899_QDCCOMP
, 0xff },
139 { STB0899_POWERI
, 0x0c },
140 { STB0899_POWERQ
, 0x0f },
141 { STB0899_RCOMP
, 0x6c },
142 { STB0899_AGCIQIN
, 0x80 },
143 { STB0899_AGC2I1
, 0x06 },
144 { STB0899_AGC2I2
, 0x00 },
145 { STB0899_TLIR
, 0x30 },
146 { STB0899_RTF
, 0x7f },
147 { STB0899_DSTATUS
, 0x00 },
148 { STB0899_LDI
, 0xbc },
149 { STB0899_CFRM
, 0xea },
150 { STB0899_CFRL
, 0x31 },
151 { STB0899_NIRM
, 0x2b },
152 { STB0899_NIRL
, 0x80 },
153 { STB0899_ISYMB
, 0x1d },
154 { STB0899_QSYMB
, 0xa6 },
155 { STB0899_SFRH
, 0x2f },
156 { STB0899_SFRM
, 0x68 },
157 { STB0899_SFRL
, 0x40 },
158 { STB0899_SFRUPH
, 0x2f },
159 { STB0899_SFRUPM
, 0x68 },
160 { STB0899_SFRUPL
, 0x40 },
161 { STB0899_EQUAI1
, 0x02 },
162 { STB0899_EQUAQ1
, 0xff },
163 { STB0899_EQUAI2
, 0x04 },
164 { STB0899_EQUAQ2
, 0x05 },
165 { STB0899_EQUAI3
, 0x02 },
166 { STB0899_EQUAQ3
, 0xfd },
167 { STB0899_EQUAI4
, 0x03 },
168 { STB0899_EQUAQ4
, 0x07 },
169 { STB0899_EQUAI5
, 0x08 },
170 { STB0899_EQUAQ5
, 0xf5 },
171 { STB0899_DSTATUS2
, 0x00 },
172 { STB0899_VSTATUS
, 0x00 },
173 { STB0899_VERROR
, 0x86 },
174 { STB0899_IQSWAP
, 0x2a },
175 { STB0899_ECNT1M
, 0x00 },
176 { STB0899_ECNT1L
, 0x00 },
177 { STB0899_ECNT2M
, 0x00 },
178 { STB0899_ECNT2L
, 0x00 },
179 { STB0899_ECNT3M
, 0x0a },
180 { STB0899_ECNT3L
, 0xad },
181 { STB0899_FECAUTO1
, 0x06 },
182 { STB0899_FECM
, 0x01 },
183 { STB0899_VTH12
, 0xb0 },
184 { STB0899_VTH23
, 0x7a },
185 { STB0899_VTH34
, 0x58 },
186 { STB0899_VTH56
, 0x38 },
187 { STB0899_VTH67
, 0x34 },
188 { STB0899_VTH78
, 0x24 },
189 { STB0899_PRVIT
, 0xff },
190 { STB0899_VITSYNC
, 0x19 },
191 { STB0899_RSULC
, 0xb1 }, /* DVB = 0xb1, DSS = 0xa1 */
192 { STB0899_TSULC
, 0x42 },
193 { STB0899_RSLLC
, 0x41 },
194 { STB0899_TSLPL
, 0x12 },
195 { STB0899_TSCFGH
, 0x0c },
196 { STB0899_TSCFGM
, 0x00 },
197 { STB0899_TSCFGL
, 0x00 },
198 { STB0899_TSOUT
, 0x69 }, /* 0x0d for CAM */
199 { STB0899_RSSYNCDEL
, 0x00 },
200 { STB0899_TSINHDELH
, 0x02 },
201 { STB0899_TSINHDELM
, 0x00 },
202 { STB0899_TSINHDELL
, 0x00 },
203 { STB0899_TSLLSTKM
, 0x1b },
204 { STB0899_TSLLSTKL
, 0xb3 },
205 { STB0899_TSULSTKM
, 0x00 },
206 { STB0899_TSULSTKL
, 0x00 },
207 { STB0899_PCKLENUL
, 0xbc },
208 { STB0899_PCKLENLL
, 0xcc },
209 { STB0899_RSPCKLEN
, 0xbd },
210 { STB0899_TSSTATUS
, 0x90 },
211 { STB0899_ERRCTRL1
, 0xb6 },
212 { STB0899_ERRCTRL2
, 0x95 },
213 { STB0899_ERRCTRL3
, 0x8d },
214 { STB0899_DMONMSK1
, 0x27 },
215 { STB0899_DMONMSK0
, 0x03 },
216 { STB0899_DEMAPVIT
, 0x5c },
217 { STB0899_PLPARM
, 0x19 },
218 { STB0899_PDELCTRL
, 0x48 },
219 { STB0899_PDELCTRL2
, 0x00 },
220 { STB0899_BBHCTRL1
, 0x00 },
221 { STB0899_BBHCTRL2
, 0x00 },
222 { STB0899_HYSTTHRESH
, 0x77 },
223 { STB0899_MATCSTM
, 0x00 },
224 { STB0899_MATCSTL
, 0x00 },
225 { STB0899_UPLCSTM
, 0x00 },
226 { STB0899_UPLCSTL
, 0x00 },
227 { STB0899_DFLCSTM
, 0x00 },
228 { STB0899_DFLCSTL
, 0x00 },
229 { STB0899_SYNCCST
, 0x00 },
230 { STB0899_SYNCDCSTM
, 0x00 },
231 { STB0899_SYNCDCSTL
, 0x00 },
232 { STB0899_ISI_ENTRY
, 0x00 },
233 { STB0899_ISI_BIT_EN
, 0x00 },
234 { STB0899_MATSTRM
, 0xf0 },
235 { STB0899_MATSTRL
, 0x02 },
236 { STB0899_UPLSTRM
, 0x45 },
237 { STB0899_UPLSTRL
, 0x60 },
238 { STB0899_DFLSTRM
, 0xe3 },
239 { STB0899_DFLSTRL
, 0x00 },
240 { STB0899_SYNCSTR
, 0x47 },
241 { STB0899_SYNCDSTRM
, 0x05 },
242 { STB0899_SYNCDSTRL
, 0x18 },
243 { STB0899_CFGPDELSTATUS1
, 0x19 },
244 { STB0899_CFGPDELSTATUS2
, 0x2b },
245 { STB0899_BBFERRORM
, 0x00 },
246 { STB0899_BBFERRORL
, 0x01 },
247 { STB0899_UPKTERRORM
, 0x00 },
248 { STB0899_UPKTERRORL
, 0x00 },
254 static struct stb0899_config az6027_stb0899_config
= {
255 .init_dev
= az6027_stb0899_s1_init_1
,
256 .init_s2_demod
= stb0899_s2_init_2
,
257 .init_s1_demod
= az6027_stb0899_s1_init_3
,
258 .init_s2_fec
= stb0899_s2_init_4
,
259 .init_tst
= stb0899_s1_init_5
,
261 .demod_address
= 0xd0, /* 0x68, 0xd0 >> 1 */
263 .xtal_freq
= 27000000,
264 .inversion
= IQ_SWAP_ON
,
269 .esno_ave
= STB0899_DVBS2_ESNO_AVE
,
270 .esno_quant
= STB0899_DVBS2_ESNO_QUANT
,
271 .avframes_coarse
= STB0899_DVBS2_AVFRAMES_COARSE
,
272 .avframes_fine
= STB0899_DVBS2_AVFRAMES_FINE
,
273 .miss_threshold
= STB0899_DVBS2_MISS_THRESHOLD
,
274 .uwp_threshold_acq
= STB0899_DVBS2_UWP_THRESHOLD_ACQ
,
275 .uwp_threshold_track
= STB0899_DVBS2_UWP_THRESHOLD_TRACK
,
276 .uwp_threshold_sof
= STB0899_DVBS2_UWP_THRESHOLD_SOF
,
277 .sof_search_timeout
= STB0899_DVBS2_SOF_SEARCH_TIMEOUT
,
279 .btr_nco_bits
= STB0899_DVBS2_BTR_NCO_BITS
,
280 .btr_gain_shift_offset
= STB0899_DVBS2_BTR_GAIN_SHIFT_OFFSET
,
281 .crl_nco_bits
= STB0899_DVBS2_CRL_NCO_BITS
,
282 .ldpc_max_iter
= STB0899_DVBS2_LDPC_MAX_ITER
,
284 .tuner_get_frequency
= stb6100_get_frequency
,
285 .tuner_set_frequency
= stb6100_set_frequency
,
286 .tuner_set_bandwidth
= stb6100_set_bandwidth
,
287 .tuner_get_bandwidth
= stb6100_get_bandwidth
,
288 .tuner_set_rfsiggain
= NULL
,
291 static struct stb6100_config az6027_stb6100_config
= {
292 .tuner_address
= 0xc0,
293 .refclock
= 27000000,
297 /* check for mutex FIXME */
298 static int az6027_usb_in_op(struct dvb_usb_device
*d
, u8 req
,
299 u16 value
, u16 index
, u8
*b
, int blen
)
302 if (mutex_lock_interruptible(&d
->usb_mutex
))
305 ret
= usb_control_msg(d
->udev
,
306 usb_rcvctrlpipe(d
->udev
, 0),
308 USB_TYPE_VENDOR
| USB_DIR_IN
,
316 warn("usb in operation failed. (%d)", ret
);
321 deb_xfer("in: req. %02x, val: %04x, ind: %04x, buffer: ", req
, value
, index
);
322 debug_dump(b
, blen
, deb_xfer
);
324 mutex_unlock(&d
->usb_mutex
);
328 static int az6027_usb_out_op(struct dvb_usb_device
*d
,
337 deb_xfer("out: req. %02x, val: %04x, ind: %04x, buffer: ", req
, value
, index
);
338 debug_dump(b
, blen
, deb_xfer
);
340 if (mutex_lock_interruptible(&d
->usb_mutex
))
343 ret
= usb_control_msg(d
->udev
,
344 usb_sndctrlpipe(d
->udev
, 0),
346 USB_TYPE_VENDOR
| USB_DIR_OUT
,
354 warn("usb out operation failed. (%d)", ret
);
355 mutex_unlock(&d
->usb_mutex
);
358 mutex_unlock(&d
->usb_mutex
);
363 static int az6027_streaming_ctrl(struct dvb_usb_adapter
*adap
, int onoff
)
371 deb_info("%s %d", __func__
, onoff
);
378 ret
= az6027_usb_out_op(adap
->dev
, req
, value
, index
, NULL
, blen
);
380 warn("usb out operation failed. (%d)", ret
);
385 /* keys for the enclosed remote control */
386 static struct rc_map_table rc_map_az6027_table
[] = {
391 /* remote control stuff (does not work with my box) */
392 static int az6027_rc_query(struct dvb_usb_device
*d
, u32
*event
, int *state
)
394 *state
= REMOTE_NO_KEY_PRESSED
;
399 int az6027_power_ctrl(struct dvb_usb_device *d, int onoff)
402 return az6027_usb_out_op(d,0xBC,v,3,NULL,1);
406 static int az6027_ci_read_attribute_mem(struct dvb_ca_en50221
*ca
,
410 struct dvb_usb_device
*d
= ca
->data
;
411 struct az6027_device_state
*state
= d
->priv
;
423 b
= kmalloc(12, GFP_KERNEL
);
427 mutex_lock(&state
->ca_mutex
);
434 ret
= az6027_usb_in_op(d
, req
, value
, index
, b
, blen
);
436 warn("usb in operation failed. (%d)", ret
);
442 mutex_unlock(&state
->ca_mutex
);
447 static int az6027_ci_write_attribute_mem(struct dvb_ca_en50221
*ca
,
452 struct dvb_usb_device
*d
= ca
->data
;
453 struct az6027_device_state
*state
= d
->priv
;
461 deb_info("%s %d", __func__
, slot
);
465 mutex_lock(&state
->ca_mutex
);
471 ret
= az6027_usb_out_op(d
, req
, value1
, index
, NULL
, blen
);
473 warn("usb out operation failed. (%d)", ret
);
475 mutex_unlock(&state
->ca_mutex
);
479 static int az6027_ci_read_cam_control(struct dvb_ca_en50221
*ca
,
483 struct dvb_usb_device
*d
= ca
->data
;
484 struct az6027_device_state
*state
= d
->priv
;
496 b
= kmalloc(12, GFP_KERNEL
);
500 mutex_lock(&state
->ca_mutex
);
507 ret
= az6027_usb_in_op(d
, req
, value
, index
, b
, blen
);
509 warn("usb in operation failed. (%d)", ret
);
513 warn("Read CI IO error");
516 deb_info("read cam data = %x from 0x%x", b
[1], value
);
519 mutex_unlock(&state
->ca_mutex
);
524 static int az6027_ci_write_cam_control(struct dvb_ca_en50221
*ca
,
529 struct dvb_usb_device
*d
= ca
->data
;
530 struct az6027_device_state
*state
= d
->priv
;
541 mutex_lock(&state
->ca_mutex
);
547 ret
= az6027_usb_out_op(d
, req
, value1
, index
, NULL
, blen
);
549 warn("usb out operation failed. (%d)", ret
);
554 mutex_unlock(&state
->ca_mutex
);
558 static int CI_CamReady(struct dvb_ca_en50221
*ca
, int slot
)
560 struct dvb_usb_device
*d
= ca
->data
;
569 b
= kmalloc(12, GFP_KERNEL
);
578 ret
= az6027_usb_in_op(d
, req
, value
, index
, b
, blen
);
580 warn("usb in operation failed. (%d)", ret
);
589 static int az6027_ci_slot_reset(struct dvb_ca_en50221
*ca
, int slot
)
591 struct dvb_usb_device
*d
= ca
->data
;
592 struct az6027_device_state
*state
= d
->priv
;
600 mutex_lock(&state
->ca_mutex
);
607 ret
= az6027_usb_out_op(d
, req
, value
, index
, NULL
, blen
);
609 warn("usb out operation failed. (%d)", ret
);
619 ret
= az6027_usb_out_op(d
, req
, value
, index
, NULL
, blen
);
621 warn("usb out operation failed. (%d)", ret
);
625 for (i
= 0; i
< 15; i
++) {
628 if (CI_CamReady(ca
, slot
)) {
629 deb_info("CAM Ready");
636 mutex_unlock(&state
->ca_mutex
);
640 static int az6027_ci_slot_shutdown(struct dvb_ca_en50221
*ca
, int slot
)
645 static int az6027_ci_slot_ts_enable(struct dvb_ca_en50221
*ca
, int slot
)
647 struct dvb_usb_device
*d
= ca
->data
;
648 struct az6027_device_state
*state
= d
->priv
;
656 deb_info("%s", __func__
);
657 mutex_lock(&state
->ca_mutex
);
663 ret
= az6027_usb_out_op(d
, req
, value
, index
, NULL
, blen
);
665 warn("usb out operation failed. (%d)", ret
);
670 mutex_unlock(&state
->ca_mutex
);
674 static int az6027_ci_poll_slot_status(struct dvb_ca_en50221
*ca
, int slot
, int open
)
676 struct dvb_usb_device
*d
= ca
->data
;
677 struct az6027_device_state
*state
= d
->priv
;
685 b
= kmalloc(12, GFP_KERNEL
);
688 mutex_lock(&state
->ca_mutex
);
695 ret
= az6027_usb_in_op(d
, req
, value
, index
, b
, blen
);
697 warn("usb in operation failed. (%d)", ret
);
702 if (!ret
&& b
[0] == 1) {
703 ret
= DVB_CA_EN50221_POLL_CAM_PRESENT
|
704 DVB_CA_EN50221_POLL_CAM_READY
;
707 mutex_unlock(&state
->ca_mutex
);
713 static void az6027_ci_uninit(struct dvb_usb_device
*d
)
715 struct az6027_device_state
*state
;
717 deb_info("%s", __func__
);
726 if (NULL
== state
->ca
.data
)
729 dvb_ca_en50221_release(&state
->ca
);
731 memset(&state
->ca
, 0, sizeof(state
->ca
));
735 static int az6027_ci_init(struct dvb_usb_adapter
*a
)
737 struct dvb_usb_device
*d
= a
->dev
;
738 struct az6027_device_state
*state
= d
->priv
;
741 deb_info("%s", __func__
);
743 mutex_init(&state
->ca_mutex
);
745 state
->ca
.owner
= THIS_MODULE
;
746 state
->ca
.read_attribute_mem
= az6027_ci_read_attribute_mem
;
747 state
->ca
.write_attribute_mem
= az6027_ci_write_attribute_mem
;
748 state
->ca
.read_cam_control
= az6027_ci_read_cam_control
;
749 state
->ca
.write_cam_control
= az6027_ci_write_cam_control
;
750 state
->ca
.slot_reset
= az6027_ci_slot_reset
;
751 state
->ca
.slot_shutdown
= az6027_ci_slot_shutdown
;
752 state
->ca
.slot_ts_enable
= az6027_ci_slot_ts_enable
;
753 state
->ca
.poll_slot_status
= az6027_ci_poll_slot_status
;
756 ret
= dvb_ca_en50221_init(&a
->dvb_adap
,
761 err("Cannot initialize CI: Error %d.", ret
);
762 memset(&state
->ca
, 0, sizeof(state
->ca
));
766 deb_info("CI initialized.");
772 static int az6027_read_mac_addr(struct dvb_usb_device *d, u8 mac[6])
774 az6027_usb_in_op(d, 0xb7, 6, 0, &mac[0], 6);
779 static int az6027_set_voltage(struct dvb_frontend
*fe
,
780 enum fe_sec_voltage voltage
)
784 struct dvb_usb_adapter
*adap
= fe
->dvb
->priv
;
786 struct i2c_msg i2c_msg
= {
801 i2c_transfer(&adap
->dev
->i2c_adap
, &i2c_msg
, 1);
806 i2c_transfer(&adap
->dev
->i2c_adap
, &i2c_msg
, 1);
809 case SEC_VOLTAGE_OFF
:
811 i2c_transfer(&adap
->dev
->i2c_adap
, &i2c_msg
, 1);
821 static int az6027_frontend_poweron(struct dvb_usb_adapter
*adap
)
830 value
= 1; /* power on */
834 ret
= az6027_usb_out_op(adap
->dev
, req
, value
, index
, NULL
, blen
);
840 static int az6027_frontend_reset(struct dvb_usb_adapter
*adap
)
848 /* reset demodulator */
850 value
= 1; /* high */
854 ret
= az6027_usb_out_op(adap
->dev
, req
, value
, index
, NULL
, blen
);
862 msleep_interruptible(200);
864 ret
= az6027_usb_out_op(adap
->dev
, req
, value
, index
, NULL
, blen
);
868 msleep_interruptible(200);
875 ret
= az6027_usb_out_op(adap
->dev
, req
, value
, index
, NULL
, blen
);
879 msleep_interruptible(200);
883 static int az6027_frontend_tsbypass(struct dvb_usb_adapter
*adap
, int onoff
)
897 ret
= az6027_usb_out_op(adap
->dev
, req
, value
, index
, NULL
, blen
);
904 static int az6027_frontend_attach(struct dvb_usb_adapter
*adap
)
907 az6027_frontend_poweron(adap
);
908 az6027_frontend_reset(adap
);
910 deb_info("adap = %p, dev = %p\n", adap
, adap
->dev
);
911 adap
->fe_adap
[0].fe
= stb0899_attach(&az6027_stb0899_config
, &adap
->dev
->i2c_adap
);
913 if (adap
->fe_adap
[0].fe
) {
914 deb_info("found STB0899 DVB-S/DVB-S2 frontend @0x%02x", az6027_stb0899_config
.demod_address
);
915 if (stb6100_attach(adap
->fe_adap
[0].fe
, &az6027_stb6100_config
, &adap
->dev
->i2c_adap
)) {
916 deb_info("found STB6100 DVB-S/DVB-S2 frontend @0x%02x", az6027_stb6100_config
.tuner_address
);
917 adap
->fe_adap
[0].fe
->ops
.set_voltage
= az6027_set_voltage
;
918 az6027_ci_init(adap
);
920 adap
->fe_adap
[0].fe
= NULL
;
923 warn("no front-end attached\n");
925 az6027_frontend_tsbypass(adap
, 0);
930 static struct dvb_usb_device_properties az6027_properties
;
932 static void az6027_usb_disconnect(struct usb_interface
*intf
)
934 struct dvb_usb_device
*d
= usb_get_intfdata(intf
);
936 dvb_usb_device_exit(intf
);
940 static int az6027_usb_probe(struct usb_interface
*intf
,
941 const struct usb_device_id
*id
)
943 return dvb_usb_device_init(intf
,
951 static int az6027_i2c_xfer(struct i2c_adapter
*adap
, struct i2c_msg msg
[], int num
)
953 struct dvb_usb_device
*d
= i2c_get_adapdata(adap
);
954 int i
= 0, j
= 0, len
= 0;
961 data
= kmalloc(256, GFP_KERNEL
);
965 if (mutex_lock_interruptible(&d
->i2c_mutex
) < 0) {
971 warn("more than 2 i2c messages at a time is not handled yet. TODO.");
973 for (i
= 0; i
< num
; i
++) {
975 if (msg
[i
].addr
== 0x99) {
978 if (msg
[i
].len
< 1) {
982 value
= msg
[i
].buf
[0] & 0x00ff;
984 az6027_usb_out_op(d
, req
, value
, index
, data
, length
);
987 if (msg
[i
].addr
== 0xd0) {
988 /* write/read request */
989 if (i
+ 1 < num
&& (msg
[i
+ 1].flags
& I2C_M_RD
)) {
991 if (msg
[i
].len
< 1) {
995 index
= (((msg
[i
].buf
[0] << 8) & 0xff00) | (msg
[i
].buf
[1] & 0x00ff));
996 value
= msg
[i
].addr
+ (msg
[i
].len
<< 8);
997 length
= msg
[i
+ 1].len
+ 6;
998 az6027_usb_in_op(d
, req
, value
, index
, data
, length
);
999 len
= msg
[i
+ 1].len
;
1000 for (j
= 0; j
< len
; j
++)
1001 msg
[i
+ 1].buf
[j
] = data
[j
+ 5];
1006 /* demod 16bit addr */
1008 if (msg
[i
].len
< 1) {
1012 index
= (((msg
[i
].buf
[0] << 8) & 0xff00) | (msg
[i
].buf
[1] & 0x00ff));
1013 value
= msg
[i
].addr
+ (2 << 8);
1014 length
= msg
[i
].len
- 2;
1015 len
= msg
[i
].len
- 2;
1016 for (j
= 0; j
< len
; j
++)
1017 data
[j
] = msg
[i
].buf
[j
+ 2];
1018 az6027_usb_out_op(d
, req
, value
, index
, data
, length
);
1022 if (msg
[i
].addr
== 0xc0) {
1023 if (msg
[i
].flags
& I2C_M_RD
) {
1027 value
= msg
[i
].addr
;
1028 length
= msg
[i
].len
+ 6;
1029 az6027_usb_in_op(d
, req
, value
, index
, data
, length
);
1031 for (j
= 0; j
< len
; j
++)
1032 msg
[i
].buf
[j
] = data
[j
+ 5];
1037 if (msg
[i
].len
< 1) {
1041 index
= msg
[i
].buf
[0] & 0x00FF;
1042 value
= msg
[i
].addr
+ (1 << 8);
1043 length
= msg
[i
].len
- 1;
1044 len
= msg
[i
].len
- 1;
1046 for (j
= 0; j
< len
; j
++)
1047 data
[j
] = msg
[i
].buf
[j
+ 1];
1049 az6027_usb_out_op(d
, req
, value
, index
, data
, length
);
1053 mutex_unlock(&d
->i2c_mutex
);
1060 static u32
az6027_i2c_func(struct i2c_adapter
*adapter
)
1062 return I2C_FUNC_I2C
;
1065 static struct i2c_algorithm az6027_i2c_algo
= {
1066 .master_xfer
= az6027_i2c_xfer
,
1067 .functionality
= az6027_i2c_func
,
1070 static int az6027_identify_state(struct usb_device
*udev
,
1071 const struct dvb_usb_device_properties
*props
,
1072 const struct dvb_usb_device_description
**desc
,
1078 b
= kmalloc(16, GFP_KERNEL
);
1082 ret
= usb_control_msg(udev
,
1083 usb_rcvctrlpipe(udev
, 0),
1085 USB_TYPE_VENDOR
| USB_DIR_IN
,
1090 USB_CTRL_GET_TIMEOUT
);
1094 deb_info("cold: %d\n", *cold
);
1101 TERRATEC_DVBS2CI_V1
,
1102 TERRATEC_DVBS2CI_V2
,
1103 TECHNISAT_USB2_HDCI_V1
,
1104 TECHNISAT_USB2_HDCI_V2
,
1106 ELGATO_EYETV_SAT_V2
,
1107 ELGATO_EYETV_SAT_V3
,
1110 static struct usb_device_id az6027_usb_table
[] = {
1111 DVB_USB_DEV(AZUREWAVE
, AZUREWAVE_AZ6027
),
1112 DVB_USB_DEV(TERRATEC
, TERRATEC_DVBS2CI_V1
),
1113 DVB_USB_DEV(TERRATEC
, TERRATEC_DVBS2CI_V2
),
1114 DVB_USB_DEV(TECHNISAT
, TECHNISAT_USB2_HDCI_V1
),
1115 DVB_USB_DEV(TECHNISAT
, TECHNISAT_USB2_HDCI_V2
),
1116 DVB_USB_DEV(ELGATO
, ELGATO_EYETV_SAT
),
1117 DVB_USB_DEV(ELGATO
, ELGATO_EYETV_SAT_V2
),
1118 DVB_USB_DEV(ELGATO
, ELGATO_EYETV_SAT_V3
),
1122 MODULE_DEVICE_TABLE(usb
, az6027_usb_table
);
1124 static struct dvb_usb_device_properties az6027_properties
= {
1125 .caps
= DVB_USB_IS_AN_I2C_ADAPTER
,
1126 .usb_ctrl
= CYPRESS_FX2
,
1127 .firmware
= "dvb-usb-az6027-03.fw",
1130 .size_of_priv
= sizeof(struct az6027_device_state
),
1131 .identify_state
= az6027_identify_state
,
1137 .streaming_ctrl
= az6027_streaming_ctrl
,
1138 .frontend_attach
= az6027_frontend_attach
,
1140 /* parameter for the MPEG2-data transfer */
1155 .power_ctrl = az6027_power_ctrl,
1156 .read_mac_address = az6027_read_mac_addr,
1159 .rc_map_table
= rc_map_az6027_table
,
1160 .rc_map_size
= ARRAY_SIZE(rc_map_az6027_table
),
1162 .rc_query
= az6027_rc_query
,
1165 .i2c_algo
= &az6027_i2c_algo
,
1167 .num_device_descs
= 8,
1170 .name
= "AZUREWAVE DVB-S/S2 USB2.0 (AZ6027)",
1171 .cold_ids
= { &az6027_usb_table
[AZUREWAVE_AZ6027
], NULL
},
1172 .warm_ids
= { NULL
},
1174 .name
= "TERRATEC S7",
1175 .cold_ids
= { &az6027_usb_table
[TERRATEC_DVBS2CI_V1
], NULL
},
1176 .warm_ids
= { NULL
},
1178 .name
= "TERRATEC S7 MKII",
1179 .cold_ids
= { &az6027_usb_table
[TERRATEC_DVBS2CI_V2
], NULL
},
1180 .warm_ids
= { NULL
},
1182 .name
= "Technisat SkyStar USB 2 HD CI",
1183 .cold_ids
= { &az6027_usb_table
[TECHNISAT_USB2_HDCI_V1
], NULL
},
1184 .warm_ids
= { NULL
},
1186 .name
= "Technisat SkyStar USB 2 HD CI",
1187 .cold_ids
= { &az6027_usb_table
[TECHNISAT_USB2_HDCI_V2
], NULL
},
1188 .warm_ids
= { NULL
},
1190 .name
= "Elgato EyeTV Sat",
1191 .cold_ids
= { &az6027_usb_table
[ELGATO_EYETV_SAT
], NULL
},
1192 .warm_ids
= { NULL
},
1194 .name
= "Elgato EyeTV Sat",
1195 .cold_ids
= { &az6027_usb_table
[ELGATO_EYETV_SAT_V2
], NULL
},
1196 .warm_ids
= { NULL
},
1198 .name
= "Elgato EyeTV Sat",
1199 .cold_ids
= { &az6027_usb_table
[ELGATO_EYETV_SAT_V3
], NULL
},
1200 .warm_ids
= { NULL
},
1206 /* usb specific object needed to register this driver with the usb subsystem */
1207 static struct usb_driver az6027_usb_driver
= {
1208 .name
= "dvb_usb_az6027",
1209 .probe
= az6027_usb_probe
,
1210 .disconnect
= az6027_usb_disconnect
,
1211 .id_table
= az6027_usb_table
,
1214 module_usb_driver(az6027_usb_driver
);
1216 MODULE_AUTHOR("Adams Xu <Adams.xu@azwave.com.cn>");
1217 MODULE_DESCRIPTION("Driver for AZUREWAVE DVB-S/S2 USB2.0 (AZ6027)");
1218 MODULE_VERSION("1.0");
1219 MODULE_LICENSE("GPL");