1 /* DVB USB framework compliant Linux driver for the Opera1 DVB-S Card
3 * Copyright (C) 2006 Mario Hlawitschka (dh1pa@amsat.org)
4 * Copyright (C) 2006 Marco Gittler (g.marco@freenet.de)
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation, version 2.
10 * see Documentation/dvb/README.dvb-usb for more information
13 #define DVB_USB_LOG_PREFIX "opera"
18 #define OPERA_READ_MSG 0
19 #define OPERA_WRITE_MSG 1
20 #define OPERA_I2C_TUNER 0xd1
22 #define READ_FX2_REG_REQ 0xba
23 #define READ_MAC_ADDR 0x08
24 #define OPERA_WRITE_FX2 0xbb
25 #define OPERA_TUNER_REQ 0xb1
26 #define REG_1F_SYMBOLRATE_BYTE0 0x1f
27 #define REG_20_SYMBOLRATE_BYTE1 0x20
28 #define REG_21_SYMBOLRATE_BYTE2 0x21
30 #define ADDR_B600_VOLTAGE_13V (0x02)
31 #define ADDR_B601_VOLTAGE_18V (0x03)
32 #define ADDR_B1A6_STREAM_CTRL (0x04)
33 #define ADDR_B880_READ_REMOTE (0x05)
38 struct opera_rc_keys
{
43 static int dvb_usb_opera1_debug
;
44 module_param_named(debug
, dvb_usb_opera1_debug
, int, 0644);
45 MODULE_PARM_DESC(debug
,
46 "set debugging level (1=info,xfer=2,pll=4,ts=8,err=16,rc=32,fw=64 (or-able))."
47 DVB_USB_DEBUG_STATUS
);
49 static int opera1_xilinx_rw(struct usb_device
*dev
, u8 request
, u16 value
,
50 u8
* data
, u16 len
, int flags
)
56 unsigned int pipe
= (flags
== OPERA_READ_MSG
) ?
57 usb_rcvctrlpipe(dev
,0) : usb_sndctrlpipe(dev
, 0);
58 u8 request_type
= (flags
== OPERA_READ_MSG
) ? USB_DIR_IN
: USB_DIR_OUT
;
60 if (flags
== OPERA_WRITE_MSG
)
61 memcpy(u8buf
, data
, len
);
63 usb_control_msg(dev
, pipe
, request
, request_type
| USB_TYPE_VENDOR
,
64 value
, 0x0, u8buf
, len
, 2000);
66 if (request
== OPERA_TUNER_REQ
) {
67 if (usb_control_msg(dev
, usb_rcvctrlpipe(dev
, 0),
68 OPERA_TUNER_REQ
, USB_DIR_IN
| USB_TYPE_VENDOR
,
69 0x01, 0x0, &r
, 1, 2000)<1 || r
!=0x08)
72 if (flags
== OPERA_READ_MSG
)
73 memcpy(data
, u8buf
, len
);
79 static int opera1_usb_i2c_msgxfer(struct dvb_usb_device
*dev
, u16 addr
,
87 info("no usb_device");
90 if (mutex_lock_interruptible(&dev
->usb_mutex
) < 0)
94 case ADDR_B600_VOLTAGE_13V
:
98 case ADDR_B601_VOLTAGE_18V
:
102 case ADDR_B1A6_STREAM_CTRL
:
106 case ADDR_B880_READ_REMOTE
:
114 ret
= opera1_xilinx_rw(dev
->udev
, request
,
116 addr
&0x01?OPERA_READ_MSG
:OPERA_WRITE_MSG
);
118 mutex_unlock(&dev
->usb_mutex
);
122 static int opera1_i2c_xfer(struct i2c_adapter
*adap
, struct i2c_msg msg
[],
125 struct dvb_usb_device
*d
= i2c_get_adapdata(adap
);
130 if (mutex_lock_interruptible(&d
->i2c_mutex
) < 0)
133 for (i
= 0; i
< num
; i
++) {
134 if ((tmp
= opera1_usb_i2c_msgxfer(d
,
135 (msg
[i
].addr
<<1)|(msg
[i
].flags
&I2C_M_RD
?0x01:0),
141 if (dvb_usb_opera1_debug
& 0x10)
142 info("sending i2c mesage %d %d", tmp
, msg
[i
].len
);
144 mutex_unlock(&d
->i2c_mutex
);
148 static u32
opera1_i2c_func(struct i2c_adapter
*adapter
)
153 static struct i2c_algorithm opera1_i2c_algo
= {
154 .master_xfer
= opera1_i2c_xfer
,
155 .functionality
= opera1_i2c_func
,
158 static int opera1_set_voltage(struct dvb_frontend
*fe
, fe_sec_voltage_t voltage
)
160 static u8 command_13v
[1]={0x00};
161 static u8 command_18v
[1]={0x01};
162 struct i2c_msg msg
[] = {
163 {.addr
= ADDR_B600_VOLTAGE_13V
,.flags
= 0,.buf
= command_13v
,.len
= 1},
165 struct dvb_usb_adapter
*udev_adap
=
166 (struct dvb_usb_adapter
*)(fe
->dvb
->priv
);
167 if (voltage
== SEC_VOLTAGE_18
) {
168 msg
[0].addr
= ADDR_B601_VOLTAGE_18V
;
169 msg
[0].buf
= command_18v
;
171 i2c_transfer(&udev_adap
->dev
->i2c_adap
, msg
, 1);
175 static int opera1_stv0299_set_symbol_rate(struct dvb_frontend
*fe
, u32 srate
,
178 stv0299_writereg(fe
, 0x13, 0x98);
179 stv0299_writereg(fe
, 0x14, 0x95);
180 stv0299_writereg(fe
, REG_1F_SYMBOLRATE_BYTE0
, (ratio
>> 16) & 0xff);
181 stv0299_writereg(fe
, REG_20_SYMBOLRATE_BYTE1
, (ratio
>> 8) & 0xff);
182 stv0299_writereg(fe
, REG_21_SYMBOLRATE_BYTE2
, (ratio
) & 0xf0);
186 static u8 opera1_inittab
[] = {
215 REG_1F_SYMBOLRATE_BYTE0
, 0x06,
216 REG_20_SYMBOLRATE_BYTE1
, 0x50,
217 REG_21_SYMBOLRATE_BYTE2
, 0x10,
240 static struct stv0299_config opera1_stv0299_config
= {
241 .demod_address
= 0xd0>>1,
246 .lock_output
= STV0229_LOCKOUTPUT_0
,
247 .volt13_op0_op1
= STV0299_VOLT13_OP0
,
248 .inittab
= opera1_inittab
,
249 .set_symbol_rate
= opera1_stv0299_set_symbol_rate
,
252 static int opera1_frontend_attach(struct dvb_usb_adapter
*d
)
255 dvb_attach(stv0299_attach
, &opera1_stv0299_config
,
256 &d
->dev
->i2c_adap
)) != NULL
) {
257 d
->fe
->ops
.set_voltage
= opera1_set_voltage
;
260 info("not attached stv0299");
264 static int opera1_tuner_attach(struct dvb_usb_adapter
*adap
)
267 dvb_pll_attach
, adap
->fe
, 0xc0>>1,
268 &adap
->dev
->i2c_adap
, DVB_PLL_OPERA1
273 static int opera1_power_ctrl(struct dvb_usb_device
*d
, int onoff
)
275 u8 val
= onoff
? 0x01 : 0x00;
277 if (dvb_usb_opera1_debug
)
278 info("power %s", onoff
? "on" : "off");
279 return opera1_xilinx_rw(d
->udev
, 0xb7, val
,
280 &val
, 1, OPERA_WRITE_MSG
);
283 static int opera1_streaming_ctrl(struct dvb_usb_adapter
*adap
, int onoff
)
285 static u8 buf_start
[2] = { 0xff, 0x03 };
286 static u8 buf_stop
[2] = { 0xff, 0x00 };
287 struct i2c_msg start_tuner
[] = {
288 {.addr
= ADDR_B1A6_STREAM_CTRL
,.buf
= onoff
? buf_start
: buf_stop
,.len
= 2},
290 if (dvb_usb_opera1_debug
)
291 info("streaming %s", onoff
? "on" : "off");
292 i2c_transfer(&adap
->dev
->i2c_adap
, start_tuner
, 1);
296 static int opera1_pid_filter(struct dvb_usb_adapter
*adap
, int index
, u16 pid
,
300 struct i2c_msg msg
[] = {
301 {.addr
= ADDR_B1A6_STREAM_CTRL
,.buf
= b_pid
,.len
= 3},
303 if (dvb_usb_opera1_debug
)
304 info("pidfilter index: %d pid: %d %s", index
, pid
,
305 onoff
? "on" : "off");
306 b_pid
[0] = (2 * index
) + 4;
307 b_pid
[1] = onoff
? (pid
& 0xff) : (0x00);
308 b_pid
[2] = onoff
? ((pid
>> 8) & 0xff) : (0x00);
309 i2c_transfer(&adap
->dev
->i2c_adap
, msg
, 1);
313 static int opera1_pid_filter_control(struct dvb_usb_adapter
*adap
, int onoff
)
317 struct i2c_msg msg
[] = {
318 {.addr
= ADDR_B1A6_STREAM_CTRL
,.buf
= b_pid
,.len
= 3},
320 if (dvb_usb_opera1_debug
)
321 info("%s hw-pidfilter", onoff
? "enable" : "disable");
322 for (; u
< 0x7e; u
+= 2) {
326 i2c_transfer(&adap
->dev
->i2c_adap
, msg
, 1);
331 static struct dvb_usb_rc_key opera1_rc_keys
[] = {
342 {0x09, 0xf6, KEY_UP
}, /*chanup */
343 {0x1b, 0xe5, KEY_DOWN
}, /*chandown */
344 {0x5d, 0xa3, KEY_LEFT
}, /*voldown */
345 {0x5f, 0xa1, KEY_RIGHT
}, /*volup */
346 {0x07, 0xf8, KEY_SPACE
}, /*tab */
347 {0x1f, 0xe1, KEY_ENTER
}, /*play ok */
348 {0x1b, 0xe4, KEY_Z
}, /*zoom */
349 {0x59, 0xa6, KEY_M
}, /*mute */
350 {0x5b, 0xa5, KEY_F
}, /*tv/f */
351 {0x19, 0xe7, KEY_R
}, /*rec */
352 {0x01, 0xfe, KEY_S
}, /*Stop */
353 {0x03, 0xfd, KEY_P
}, /*pause */
354 {0x03, 0xfc, KEY_W
}, /*<- -> */
355 {0x07, 0xf9, KEY_C
}, /*capture */
356 {0x47, 0xb9, KEY_Q
}, /*exit */
357 {0x43, 0xbc, KEY_O
}, /*power */
361 static int opera1_rc_query(struct dvb_usb_device
*dev
, u32
* event
, int *state
)
363 struct opera1_state
*opst
= dev
->priv
;
365 const u16 startmarker1
= 0x10ed;
366 const u16 startmarker2
= 0x11ec;
367 struct i2c_msg read_remote
[] = {
368 {.addr
= ADDR_B880_READ_REMOTE
,.buf
= rcbuffer
,.flags
= I2C_M_RD
,.len
= 32},
373 if (i2c_transfer(&dev
->i2c_adap
, read_remote
, 1) == 1) {
374 for (i
= 0; i
< 32; i
++) {
378 send_key
= send_key
<< 1;
380 if (send_key
& 0x8000)
381 send_key
= (send_key
<< 1) | (send_key
>> 15 & 0x01);
383 if (send_key
== 0xffff && opst
->last_key_pressed
!= 0) {
384 *state
= REMOTE_KEY_REPEAT
;
385 *event
= opst
->last_key_pressed
;
388 for (; send_key
!= 0;) {
389 if (send_key
>> 16 == startmarker2
) {
391 } else if (send_key
>> 16 == startmarker1
) {
393 (send_key
& 0xfffeffff) | (startmarker1
<< 16);
402 send_key
= (send_key
& 0xffff) | 0x0100;
404 for (i
= 0; i
< ARRAY_SIZE(opera1_rc_keys
); i
++) {
405 if ((opera1_rc_keys
[i
].custom
* 256 +
406 opera1_rc_keys
[i
].data
) == (send_key
& 0xffff)) {
407 *state
= REMOTE_KEY_PRESSED
;
408 *event
= opera1_rc_keys
[i
].event
;
409 opst
->last_key_pressed
=
410 opera1_rc_keys
[i
].event
;
413 opst
->last_key_pressed
= 0;
416 *state
= REMOTE_NO_KEY_PRESSED
;
420 static struct usb_device_id opera1_table
[] = {
421 {USB_DEVICE(USB_VID_CYPRESS
, USB_PID_OPERA1_COLD
)},
422 {USB_DEVICE(USB_VID_OPERA1
, USB_PID_OPERA1_WARM
)},
426 MODULE_DEVICE_TABLE(usb
, opera1_table
);
428 static int opera1_read_mac_address(struct dvb_usb_device
*d
, u8 mac
[6])
430 u8 command
[] = { READ_MAC_ADDR
};
431 opera1_xilinx_rw(d
->udev
, 0xb1, 0xa0, command
, 1, OPERA_WRITE_MSG
);
432 opera1_xilinx_rw(d
->udev
, 0xb1, 0xa1, mac
, 6, OPERA_READ_MSG
);
435 static int opera1_xilinx_load_firmware(struct usb_device
*dev
,
436 const char *filename
)
438 const struct firmware
*fw
= NULL
;
440 int ret
= 0, i
,fpgasize
=40;
442 info("start downloading fpga firmware %s",filename
);
444 if ((ret
= request_firmware(&fw
, filename
, &dev
->dev
)) != 0) {
445 err("did not find the firmware file. (%s) "
446 "Please see linux/Documentation/dvb/ for more details on firmware-problems.",
450 p
= kmalloc(fw
->size
, GFP_KERNEL
);
451 opera1_xilinx_rw(dev
, 0xbc, 0x00, &testval
, 1, OPERA_READ_MSG
);
452 if (p
!= NULL
&& testval
!= 0x67) {
454 u8 reset
= 0, fpga_command
= 0;
455 memcpy(p
, fw
->data
, fw
->size
);
457 opera1_xilinx_rw(dev
, 0xbc, 0xaa, &fpga_command
, 1,
459 for (i
= 0; i
< fw
->size
;) {
460 if ( (fw
->size
- i
) <fpgasize
){
465 (dev
, OPERA_WRITE_FX2
, 0x0, b
, fpgasize
,
466 OPERA_WRITE_MSG
) != fpgasize
468 err("error while transferring firmware");
474 /* restart the CPU */
475 if (ret
|| opera1_xilinx_rw
476 (dev
, 0xa0, 0xe600, &reset
, 1,
477 OPERA_WRITE_MSG
) != 1) {
478 err("could not restart the USB controller CPU.");
485 release_firmware(fw
);
490 static struct dvb_usb_device_properties opera1_properties
= {
491 .caps
= DVB_USB_IS_AN_I2C_ADAPTER
,
492 .usb_ctrl
= CYPRESS_FX2
,
493 .firmware
= "dvb-usb-opera-01.fw",
494 .size_of_priv
= sizeof(struct opera1_state
),
496 .power_ctrl
= opera1_power_ctrl
,
497 .i2c_algo
= &opera1_i2c_algo
,
499 .rc_key_map
= opera1_rc_keys
,
500 .rc_key_map_size
= ARRAY_SIZE(opera1_rc_keys
),
502 .rc_query
= opera1_rc_query
,
503 .read_mac_address
= opera1_read_mac_address
,
504 .generic_bulk_ctrl_endpoint
= 0x00,
505 /* parameter for the MPEG2-data transfer */
509 .frontend_attach
= opera1_frontend_attach
,
510 .streaming_ctrl
= opera1_streaming_ctrl
,
511 .tuner_attach
= opera1_tuner_attach
,
513 DVB_USB_ADAP_HAS_PID_FILTER
|
514 DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF
,
515 .pid_filter
= opera1_pid_filter
,
516 .pid_filter_ctrl
= opera1_pid_filter_control
,
517 .pid_filter_count
= 252,
530 .num_device_descs
= 1,
532 {"Opera1 DVB-S USB2.0",
533 {&opera1_table
[0], NULL
},
534 {&opera1_table
[1], NULL
},
539 static int opera1_probe(struct usb_interface
*intf
,
540 const struct usb_device_id
*id
)
542 struct usb_device
*udev
= interface_to_usbdev(intf
);
544 if (udev
->descriptor
.idProduct
== USB_PID_OPERA1_WARM
&&
545 udev
->descriptor
.idVendor
== USB_VID_OPERA1
&&
546 opera1_xilinx_load_firmware(udev
, "dvb-usb-opera1-fpga-01.fw") != 0
551 if (dvb_usb_device_init(intf
, &opera1_properties
, THIS_MODULE
, NULL
) != 0)
556 static struct usb_driver opera1_driver
= {
558 .probe
= opera1_probe
,
559 .disconnect
= dvb_usb_device_exit
,
560 .id_table
= opera1_table
,
563 static int __init
opera1_module_init(void)
566 if ((result
= usb_register(&opera1_driver
))) {
567 err("usb_register failed. Error number %d", result
);
572 static void __exit
opera1_module_exit(void)
574 usb_deregister(&opera1_driver
);
577 module_init(opera1_module_init
);
578 module_exit(opera1_module_exit
);
580 MODULE_AUTHOR("Mario Hlawitschka (c) dh1pa@amsat.org");
581 MODULE_AUTHOR("Marco Gittler (c) g.marco@freenet.de");
582 MODULE_DESCRIPTION("Driver for Opera1 DVB-S device");
583 MODULE_VERSION("0.1");
584 MODULE_LICENSE("GPL");