sorry missing patch itself is in this post.
Signed-of-by Marco Gittler <[EMAIL PROTECTED]>
Signed-of-by: Mario Hlawitschka <[EMAIL PROTECTED]>
[EMAIL PROTECTED] schrieb:
here the corrected patch for the opera dvb s1 usb-box
i hope it is now nicer than last time.
some hints about the code are also welcome.
firmware files can put somewhere here ?
thx
Signed-of-by Marco Gittler <[EMAIL PROTECTED]>
Signed-of-by: Mario Hlawitschka <[EMAIL PROTECTED]>
_______________________________________________
linux-dvb mailing list
[EMAIL PROTECTED]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
diff -r b5be3479f070 linux/drivers/media/dvb/dvb-usb/Kconfig
--- a/linux/drivers/media/dvb/dvb-usb/Kconfig Sat Apr 14 16:19:13 2007 -0300
+++ b/linux/drivers/media/dvb/dvb-usb/Kconfig Fri Mar 02 19:04:20 2007 +0200
@@ -110,6 +110,7 @@ config DVB_USB_CXUSB
Medion MD95700 hybrid USB2.0 device.
DViCO FusionHDTV (Bluebird) USB2.0 devices
+
config DVB_USB_M920X
tristate "Uli m920x DVB-T USB2.0 support"
@@ -211,3 +212,11 @@ config DVB_USB_DTT200U
The receivers are also known as DTT200U (Yakumo) and UB300 (Yuan).
The WT-220U and its clones are pen-sized.
+
+config DVB_USB_OPERA1
+ tristate "Opera1 DVB-S USB2.0 receiver"
+ depends on DVB_USB
+ select DVB_STV0299
+ #if !DVB_FE_CUSTOMISE
+ help
+ Say Y here to support the Opera DVB-S USB2.0 receiver.
diff -r b5be3479f070 linux/drivers/media/dvb/dvb-usb/Makefile
--- a/linux/drivers/media/dvb/dvb-usb/Makefile Sat Apr 14 16:19:13 2007 -0300
+++ b/linux/drivers/media/dvb/dvb-usb/Makefile Sun Apr 15 12:08:27 2007 +0200
@@ -51,4 +51,8 @@ dvb-usb-dib0700-objs = dib0700_core.o di
dvb-usb-dib0700-objs = dib0700_core.o dib0700_devices.o
obj-$(CONFIG_DVB_USB_DIB0700) += dvb-usb-dib0700.o
+dvb-usb-opera-objs = opera1.o
+obj-$(CONFIG_DVB_USB_OPERA1) += dvb-usb-opera.o
+
+
EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
diff -r b5be3479f070 linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
--- a/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h Sat Apr 14 16:19:13
2007 -0300
+++ b/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h Sun Apr 15 11:57:27
2007 +0200
@@ -38,6 +38,7 @@
#define USB_VID_ULTIMA_ELECTRONIC 0x05d8
#define USB_VID_UNIWILL 0x1584
#define USB_VID_WIDEVIEW 0x14aa
+#define USB_VID_OPERA1 0x695C
/* Product IDs */
#define USB_PID_ADSTECH_USB2_COLD 0xa333
@@ -142,6 +143,8 @@
#define USB_PID_GENPIX_8PSK_WARM 0x0201
#define USB_PID_SIGMATEK_DVB_110 0x6610
#define USB_PID_MSI_DIGI_VOX_MINI_II 0x1513
+#define USB_PID_OPERA1_COLD 0x2830
+#define USB_PID_OPERA1_WARM 0x3829
#endif
diff -r b5be3479f070 linux/drivers/media/dvb/dvb-usb/opera1.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/linux/drivers/media/dvb/dvb-usb/opera1.c Sun Apr 15 12:05:45 2007 +0200
@@ -0,0 +1,574 @@
+/* DVB USB framework compliant Linux driver for the Opera1 DVB-S Card
+*
+* Copyright (C) 2006 Mario Hlawitschka ([EMAIL PROTECTED])
+* Copyright (C) 2006 Marco Gittler ([EMAIL PROTECTED])
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
Free
+* Software Foundation, version 2.
+*
+* see Documentation/dvb/README.dvb-usb for more information
+*/
+#include "opera1.h"
+#include "linux/module.h"
+#include "linux/init.h"
+#include "linux/firmware.h"
+#include "dvb-usb.h"
+#include "dvb-pll.h"
+#include "stv0299.h"
+
+
+#define OPERA_READ_MSG 0
+#define OPERA_WRITE_MSG 1
+#define OPERA_I2C_TUNER 0xd1
+
+#define READ_FX2_REG_REQ 0xBA
+#define OPERA_WRITE_FX2 0xBB
+#define OPERA_TUNER_REQ 0xB1
+
+
+struct opera1_state{
+ u32 last_key_pressed;
+};
+struct opera_rc_keys {
+ u32 keycode;
+ u32 event;
+};
+static const u8* xilinx_init="\x90\x6e\xc5\xfa\x32\xd0\x73\x23\x1e";
+static int opera1_xilinx_load_firmware(struct usb_device *dev, const char
*filename);
+
+int dvb_usb_opera1_debug;
+module_param_named(debug,dvb_usb_opera1_debug, int, 0644);
+MODULE_PARM_DESC(debug, "set debugging level
(1=info,xfer=2,pll=4,ts=8,err=16,rc=32,fw=64 (or-able))." DVB_USB_DEBUG_STATUS);
+//struct mutex mymutex;
+
+static int opera1_xilinx_rw(struct usb_device*dev, u8 request, u16 value,
u8*data, u16 len,int flags){
+
+ int ret=0,t=0;
+ u8 r[10];
+ u8 u8buf[len];
+ unsigned int
pipe=(flags==OPERA_READ_MSG)?usb_rcvctrlpipe(dev,0):usb_sndctrlpipe(dev,0);
+ u8 request_type=(flags==OPERA_READ_MSG)?USB_DIR_IN:USB_DIR_OUT;
+
+ memset(r,0,10);
+ //if (mutex_lock_interruptible(&mymutex)){
+ // return -EAGAIN;
+ //}
+
+ if (flags==OPERA_WRITE_MSG)
+ memcpy(u8buf,data,len);
+ ret=usb_control_msg(dev, pipe,request, request_type|
USB_TYPE_VENDOR,value, 0x0 /*index*/, u8buf,len, 2000);
+ //msleep(20);
+ if (request==OPERA_TUNER_REQ){
+ t=usb_control_msg(dev, usb_rcvctrlpipe(dev,0),
+ OPERA_TUNER_REQ, USB_DIR_IN|USB_TYPE_VENDOR, 0x01,0x0/*index*/,
r, 10, 2000);
+ }
+ if (flags==OPERA_READ_MSG)
+ memcpy(data,u8buf,len);
+ //mutex_unlock(&mymutex);
+ return ret;
+
+}
+
+/* I2C */
+
+static int opera1_usb_i2c_msgxfer(struct dvb_usb_device* dev, u16 addr, u8*
buf, u16 len, int flag)
+{
+ int ret=0;
+ u8 request;
+ u16 value;
+
+ if (dev==NULL){
+ info ("no usb_device");
+ return -EINVAL;
+ }
+ if (mutex_lock_interruptible(&dev->usb_mutex) < 0)
+ return -EAGAIN;
+
+ request=(addr&0xff00) >> 8;
+ if (!request)
+ request=0xb1;
+ value=(addr&0xff);
+ if (flag & OPERA_READ_MSG){
+ value|=0x01;
+ }
+ if (request==0xa0)
+ value=0xe600;
+ ret=opera1_xilinx_rw(dev->udev,request,value,buf,len,flag);
+
+ mutex_unlock(&dev->usb_mutex);
+ return ret;
+}
+
+static int opera1_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int
num)
+{
+ struct dvb_usb_device *d = i2c_get_adapdata(adap);
+ int i=0,tmp=0;
+
+ if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
+ return -EAGAIN;
+
+ if (d){
+ for (i=0;i<num;i++){
+ if ((tmp=opera1_usb_i2c_msgxfer(d,
+ msg[i].addr,msg[i].buf,msg[i].len,
+
(msg[i].flags==I2C_M_RD?OPERA_READ_MSG:OPERA_WRITE_MSG)))
+ !=msg[i].len){
+
+ break;
+ }
+ if (dvb_usb_opera1_debug& 0x10)
+ info("sending i2c mesage %d
%d",tmp,msg[i].len);
+ }
+ }
+
+ mutex_unlock(&d->i2c_mutex);
+ return num;
+}
+static u32 opera1_i2c_func(struct i2c_adapter *adapter)
+{
+ return I2C_FUNC_I2C;
+}
+
+static struct i2c_algorithm opera1_i2c_algo = {
+ .master_xfer = opera1_i2c_xfer,
+ .functionality = opera1_i2c_func,
+};
+
+static int opera1_set_voltage (struct dvb_frontend* fe, fe_sec_voltage_t
voltage)
+{
+ struct i2c_msg msg[]={
+ {.addr=0xb600,.flags=0,.buf="\x00",.len=1}, //13 V
+ };
+ struct dvb_usb_adapter* udev_adap=(struct
dvb_usb_adapter*)(fe->dvb->priv);
+ if (voltage==SEC_VOLTAGE_18){
+ msg[0].addr=0xb601;
+ msg[0].buf="\x01";
+ }
+ i2c_transfer(&udev_adap->dev->i2c_adap, msg, 1);
+ return 0;
+}
+
+static int opera1_stv0299_set_symbol_rate(struct dvb_frontend *fe, u32 srate,
u32 ratio){
+ stv0299_writereg(fe, 0x13, 0x98);
+ stv0299_writereg(fe, 0x14, 0x95);
+ stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
+ stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
+ stv0299_writereg(fe, 0x21, (ratio) & 0xf0);
+
+ return 0;
+
+}
+static u8 opera1_inittab[]={
+ 0x00 ,0xa1 ,
+ 0x01 ,0x15 ,
+ 0x02 ,0x00 ,
+ 0x03 ,0x00 ,
+ 0x04 ,0x7d ,
+ 0x05 ,0x05 ,
+ 0x06 ,0x02 ,
+ 0x07 ,0x00 ,
+ 0x0b, 0x00 ,
+ 0x0c ,0x01 ,
+ 0x0d ,0x81 ,
+ 0x0e ,0x44 ,
+ 0x0f ,0x19 ,
+ 0x10 ,0x3f ,
+ 0x11 ,0x84 ,
+ 0x12 ,0xda ,
+ 0x13 ,0x98 ,
+ 0x14 ,0x95 ,
+ 0x15 ,0xc9 ,
+ 0x16 ,0xeb ,
+ 0x17 ,0x00 ,
+ 0x18 ,0x19 ,
+ 0x19 ,0x8b ,
+ 0x1a ,0x00 ,
+ 0x1b ,0x82 ,
+ 0x1c,0x7f ,
+ 0x1d,0x00 ,
+ 0x1e,0x00 ,
+ 0x1f,0x06 ,
+ 0x20,0x50 ,
+ 0x21,0x10 ,
+ 0x22,0x00 ,
+ 0x23,0x00 ,
+ 0x24,0x37 ,
+ 0x25,0xbc ,
+ 0x26,0x00 ,
+ 0x27,0x00 ,
+ 0x28,0x00 ,
+ 0x29,0x1e ,
+ 0x2a,0x14 ,
+ 0x2b,0x1f ,
+ 0x2c,0x09 ,
+ 0x2d,0x0a ,
+ 0x2e,0x00 ,
+ 0x2f,0x00 ,
+ 0x30,0x00,
+ 0x31,0x1f ,
+ 0x32,0x19 ,
+ 0x33,0xfc ,
+ 0x34,0x13,
+ 0xff,0xff,
+};
+
+static struct stv0299_config opera1_stv0299_config={
+ .demod_address= 0xd0,
+ .min_delay_ms=100,
+ .mclk=88000000UL,
+ .invert=1,
+ .skip_reinit=0,
+ .lock_output=STV0229_LOCKOUTPUT_0,
+ .volt13_op0_op1=STV0299_VOLT13_OP0,
+ .inittab=opera1_inittab,
+ .set_symbol_rate=opera1_stv0299_set_symbol_rate,
+};
+
+static int opera1_frontend_attach(struct dvb_usb_adapter *d){
+
+ if
((d->fe=dvb_attach(stv0299_attach,&opera1_stv0299_config,&d->dev->i2c_adap))!=NULL){
+ d->fe->ops.set_voltage=opera1_set_voltage;
+ return 0;
+ }
+ info ("not attached stv0299");
+ return -EIO;
+}
+
+static int opera1_tuner_attach(struct dvb_usb_adapter *adap)
+{
+ adap->pll_addr=0xc0;
+ adap->pll_desc=&dvb_pll_opera1;
+ adap->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c;
+ return 0;
+}
+
+static int opera1_power_ctrl(struct dvb_usb_device *d, int onoff)
+{
+ int addr=onoff?0xb701:0xb700;
+ u8 val=onoff?0x01:0x00;
+ if (dvb_usb_opera1_debug)
+ info("power %s",onoff?"on":"off");
+ return opera1_usb_i2c_msgxfer(d,addr,&val,1,OPERA_WRITE_MSG);
+}
+static int opera1_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
+{
+
+ struct i2c_msg start_tuner[]={
+ {.addr=0xb1a6,.buf=onoff?"\xff\x03":"\xff\x00",.len=2},
+ };
+ if (dvb_usb_opera1_debug)
+ info("streaming %s",onoff?"on":"off");
+ i2c_transfer(&adap->dev->i2c_adap,start_tuner,1);
+ return 0;
+}
+static int opera1_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
int onoff)
+{
+
+ u8 b_pid[3];
+ struct i2c_msg msg[]={
+ {.addr=0xb1a6,.buf=b_pid,.len=3},
+ };
+ if (dvb_usb_opera1_debug)
+ info("pidfilter index: %d pid: %d
%s",index,pid,onoff?"on":"off");
+ b_pid[0]=(2*index)+4;
+ b_pid[1]=onoff?(pid&0xff):(0x00);
+ b_pid[2]=onoff?((pid>>8)&0xff):(0x00);
+ i2c_transfer(&adap->dev->i2c_adap,msg,1);
+ return 0;
+}
+static int opera1_pid_filter_control(struct dvb_usb_adapter *adap, int onoff){
+ int u=0x04;
+ u8 b_pid[3];
+ struct i2c_msg msg[]={
+ {.addr=0xb1a6,.buf=b_pid,.len=3},
+ };
+ if (dvb_usb_opera1_debug)
+ info("%s hw-pidfilter",onoff?"enable":"disable");
+ for ( ;u<0x7e;u+=2){
+ b_pid[0]=u;
+ b_pid[1]=0;
+ b_pid[2]=0x80;
+ i2c_transfer(&adap->dev->i2c_adap,msg,1);
+ }
+ return 0;
+}
+
+
+static struct dvb_usb_rc_key opera1_rc_keys[]={
+ {0x5f,0xa0,KEY_1},
+ {0x51,0xaf,KEY_2},
+ {0x5d,0xa2,KEY_3},
+ {0x41,0xbe,KEY_4},
+
+ {0x0b,0xf5,KEY_5},
+ {0x43,0xbd,KEY_6},
+ {0x47,0xb8,KEY_7},
+ {0x49,0xb6,KEY_8},
+ {0x05,0xfa,KEY_9},
+ {0x45,0xba,KEY_0},
+
+ {0x09,0xf6,KEY_UP},//chanup
+ {0x1b,0xe5,KEY_DOWN},//chandown
+ {0x5d,0xa3,KEY_LEFT},//voldown
+ {0x5f,0xa1,KEY_RIGHT},//volup
+ {0x07,0xf8,KEY_SPACE},//tab
+ {0x1f,0xe1,KEY_ENTER},//play ok
+ {0x1b,0xe4,KEY_Z},//zoom
+ {0x59,0xa6,KEY_M},//mute
+ {0x5b,0xa5,KEY_F},//tv/f
+ {0x19,0xe7,KEY_R},//rec
+ {0x01,0xfe,KEY_S},//Stop
+ {0x03,0xfd,KEY_P},//pause
+ {0x03,0xfc,KEY_W},//<- ->
+ {0x07,0xf9,KEY_C},//capture
+ {0x47,0xb9,KEY_Q},//exit
+ {0x43,0xbc,KEY_O},//power7
+
+};
+
+static int opera1_rc_query(struct dvb_usb_device *dev, u32 *event, int *state)
+{
+ struct opera1_state* opst=dev->priv;
+ u8 rcbuffer[32];
+ const u16 startmarker1=0x10ed;
+ const u16 startmarker2=0x11ec;
+ struct i2c_msg read_remote[]={
+ {.addr=0xb880,.buf=rcbuffer,.flags=I2C_M_RD,.len=32},
+ };
+ int i=0;
+ u32 send_key=0;
+ memset(rcbuffer,0,32);
+
+ if (i2c_transfer(&dev->i2c_adap,read_remote,1)==1){
+ for (i=0;i<32;i++)
+ {
+ if (rcbuffer[i] )
+ send_key|=1;
+ if (i<31)
+ send_key =send_key << 1;
+ }
+ if (send_key&0x8000)
+ send_key=(send_key<<1)|(send_key>>15&0x01);
+
+ if (send_key==0xffff && opst->last_key_pressed!=0){
+ *state=REMOTE_KEY_REPEAT;
+ *event=opst->last_key_pressed;
+ return 0;
+ }
+ for (;send_key!=0;){
+ if (send_key>>16==startmarker2){
+ break;
+ }else if (send_key>>16==startmarker1){
+
send_key=(send_key&0xfffeffff)|(startmarker1<<16);
+ break;
+ }else
+ send_key>>=1;
+ }
+
+ if (send_key==0)
+ return 0;
+
+ send_key=(send_key&0xffff)|0x0100;
+
+ for (i=0;i< ARRAY_SIZE(opera1_rc_keys);i++){
+ if (
(opera1_rc_keys[i].custom*256+opera1_rc_keys[i].data)==(send_key&0xffff))
+ {
+ *state = REMOTE_KEY_PRESSED;
+ *event=opera1_rc_keys[i].event;
+ opst->last_key_pressed=opera1_rc_keys[i].event;
+ break;
+ }
+ opst->last_key_pressed=0;
+ }
+ }else
+ *state = REMOTE_NO_KEY_PRESSED;
+ return 0;
+}
+
+
+/* do not change the order of the ID table */
+static struct usb_device_id opera1_table [] = {
+/* 00 */ { USB_DEVICE(USB_VID_CYPRESS, USB_PID_OPERA1_COLD
) },
+ { USB_DEVICE(USB_VID_OPERA1, USB_PID_OPERA1_WARM
) },
+ { } /* Terminating entry */
+};
+MODULE_DEVICE_TABLE (usb, opera1_table);
+static int opera1_firmware_download(struct usb_device *udev, const struct
firmware *fw)
+{
+
+ int ret = usb_cypress_load_firmware(udev,fw,CYPRESS_FX2);
+ const struct firmware *fw1=NULL;
+
+ if(ret==0)
+ {
+ if ((ret = request_firmware(&fw1, "opera1-2.fw", &udev->dev))
!= 0) {
+ err("did not find the firmware file. (%s) "
+ "Please see linux/Documentation/dvb/
for more details on firmware-problems. (%d)",
+ "opera1-2.fw",ret);
+
+ }else{
+ ret = usb_cypress_load_firmware(udev,fw1,CYPRESS_FX2);
+ release_firmware(fw1);
+ if (ret!=0)
+ info("error loading firmware1 %d,%d",-EIO,ret);
+
+ }
+ }
+ return ret;
+
+}
+static int opera1_read_mac_address (struct dvb_usb_device *d, u8 mac[6]){
+ opera1_xilinx_rw(d->udev,0xb1,0xa0,"\x08",1,OPERA_WRITE_MSG);
+ opera1_xilinx_rw(d->udev,0xb1,0xa1,mac,6,OPERA_READ_MSG);
+ return 0;
+}
+static int opera1_xilinx_load_firmware(struct usb_device *dev, const char
*filename)
+{
+ const struct firmware *fw = NULL;
+ u8 *b,*p;
+ int ret = 0,i;
+ u8 dummydata[10],testval;
+ memcpy(dummydata, xilinx_init, 9);
+ info("start downloading fpga firmware");
+
+ if ((ret = request_firmware(&fw, filename, &dev->dev)) != 0) {
+ err("did not find the firmware file. (%s) "
+ "Please see linux/Documentation/dvb/ for more
details on firmware-problems.",
+ filename);
+ return ret;
+ }else{
+ p = kmalloc(fw->size,GFP_KERNEL);
+ opera1_xilinx_rw(dev,0xbc,0x00,&testval,1,OPERA_READ_MSG);
+ if (p != NULL && testval!=0x67) {
+
+ u8 reset;
+ memcpy(p,fw->data,fw->size);
+ // clear fpga ?
+
opera1_xilinx_rw(dev,0xbc,0xaa,"\x00",1,OPERA_WRITE_MSG);
+ for(i = 0; p[i] != 0 && i < fw->size; ) {
+ b = (u8 *) p+i;
+ if (
+
opera1_xilinx_rw(dev,OPERA_WRITE_FX2,0x0, b+1, b[0],OPERA_WRITE_MSG) != b[0]
+ ) {
+ err("error while transferring
firmware");
+ ret = -EINVAL;
+ break;
+ }
+ i = i+ 1 + b[0];
+ }
+ /* restart the CPU */
+ reset = 0;
+ if (ret ||
(opera1_xilinx_rw(dev,0xa0,0xe600,&reset,1,OPERA_WRITE_MSG)!=1)) {
+ err("could not restart the USB controller
CPU.");
+ ret = -EINVAL;
+ }
+ kfree(p);
+ }
+ }
+ if (fw){
+ release_firmware(fw);
+ }
+ return ret;
+}
+
+static struct dvb_usb_device_properties opera1_properties = {
+ .caps = DVB_USB_IS_AN_I2C_ADAPTER,
+ .usb_ctrl = DEVICE_SPECIFIC,
+ .firmware = "opera1.fw",
+ .download_firmware = opera1_firmware_download,
+ .size_of_priv = sizeof(struct opera1_state),
+
+ .power_ctrl = opera1_power_ctrl,
+ .i2c_algo = &opera1_i2c_algo,
+
+ .rc_key_map = opera1_rc_keys,
+ .rc_key_map_size= ARRAY_SIZE(opera1_rc_keys),
+ .rc_interval = 200,
+ .rc_query=opera1_rc_query,
+ .read_mac_address=opera1_read_mac_address,
+ .generic_bulk_ctrl_endpoint = 0x00,
+ /* parameter for the MPEG2-data transfer */
+ .num_adapters = 1,
+ .adapter={
+ {
+ .frontend_attach = opera1_frontend_attach,
+ .streaming_ctrl = opera1_streaming_ctrl,
+ .tuner_attach=opera1_tuner_attach,
+ .caps=DVB_USB_ADAP_HAS_PID_FILTER
|DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
+ .pid_filter = opera1_pid_filter,
+ .pid_filter_ctrl=opera1_pid_filter_control,
+ .pid_filter_count = 252,
+ .stream = {
+ .type = USB_BULK,
+ .count = 10,
+ .endpoint = 0x82,
+ .u = {
+ .bulk = {
+ .buffersize = 4096,//0x200,
+ }
+ }
+ },
+ }
+ },
+
+ .num_device_descs = 1,
+ .devices = {
+ { "Opera1 DVB-S USB2.0",
+ { &opera1_table[0], NULL },
+ { &opera1_table[1], NULL },
+ },
+ }
+};
+
+
+static int opera1_probe(struct usb_interface *intf,
+ const struct
usb_device_id *id)
+{
+ struct dvb_usb_device *d;
+ struct usb_device* udev=interface_to_usbdev(intf);
+
+ if (udev->descriptor.idProduct==USB_PID_OPERA1_WARM &&
+ udev->descriptor.idVendor==USB_VID_OPERA1 &&
+ (d==NULL || opera1_xilinx_load_firmware(udev,"opera1-fpga.fw")!=0 )
+ ){
+ return -EINVAL;
+ }
+
+ if (dvb_usb_device_init(intf,&opera1_properties,THIS_MODULE,&d) != 0)
+ return -EINVAL;
+
+ return 0;
+}
+
+static struct usb_driver opera1_driver = {
+ .name = "opera1",
+ .probe = opera1_probe,
+ .disconnect = dvb_usb_device_exit,
+ .id_table = opera1_table,
+};
+
+static int __init opera1_module_init(void)
+{
+ int result=0;
+// mutex_init(&mymutex);
+ if ((result = usb_register(&opera1_driver))) {
+ err("usb_register failed. Error number %d",result);
+ }
+ return result;
+}
+
+static void __exit opera1_module_exit(void)
+{
+ usb_deregister(&opera1_driver);
+}
+
+module_init (opera1_module_init);
+module_exit (opera1_module_exit);
+
+MODULE_AUTHOR("Mario Hlawitschka (c) [EMAIL PROTECTED]");
+MODULE_AUTHOR("Marco Gittler (c) [EMAIL PROTECTED]");
+MODULE_DESCRIPTION("Driver for Opera1 DVB-S device");
+MODULE_VERSION("0.1");
+MODULE_LICENSE("GPL");
+
diff -r b5be3479f070 linux/drivers/media/dvb/dvb-usb/opera1.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/linux/drivers/media/dvb/dvb-usb/opera1.h Sun Apr 15 11:58:00 2007 +0200
@@ -0,0 +1,7 @@
+#ifndef _OPERA1_H_
+#define _OPERA1_H_
+
+#define DVB_USB_LOG_PREFIX "opera"
+extern int dvb_usb_opera1_debug;
+#define deb_xfer(args...) dprintk(dvb_usb_opera1_debug,0x02,args)
+#endif
diff -r b5be3479f070 linux/drivers/media/dvb/frontends/dvb-pll.c
--- a/linux/drivers/media/dvb/frontends/dvb-pll.c Sat Apr 14 16:19:13
2007 -0300
+++ b/linux/drivers/media/dvb/frontends/dvb-pll.c Sun Apr 15 12:01:47
2007 +0200
@@ -451,6 +451,31 @@ struct dvb_pll_desc dvb_pll_thomson_fe66
}
};
EXPORT_SYMBOL(dvb_pll_thomson_fe6600);
+static void opera1_bw(u8 *buf, u32 freq, int bandwidth)
+{
+ if (bandwidth == BANDWIDTH_8_MHZ)
+ buf[2] |= 0x08;
+}
+
+struct dvb_pll_desc dvb_pll_opera1 = {
+ .name = "Opera Tuner",
+ .min = 900000,
+ .max = 2250000,
+ .iffreq= 0,
+ .setbw = opera1_bw,
+ .count = 8,
+ .entries = {
+ { 1064000, 500, 0xe5, 0xc6 },
+ { 1169000, 500, 0xe5, 0xe6 },
+ { 1299000, 500, 0xe5, 0x24 },
+ { 1444000, 500, 0xe5, 0x44 },
+ { 1606000, 500, 0xe5, 0x64 },
+ { 1777000, 500, 0xe5, 0x84 },
+ { 1941000, 500, 0xe5, 0xa4 },
+ { 2250000, 500, 0xe5, 0xc4 },
+ }
+};
+EXPORT_SYMBOL(dvb_pll_opera1);
struct dvb_pll_priv {
/* i2c details */
diff -r b5be3479f070 linux/drivers/media/dvb/frontends/dvb-pll.h
--- a/linux/drivers/media/dvb/frontends/dvb-pll.h Sat Apr 14 16:19:13
2007 -0300
+++ b/linux/drivers/media/dvb/frontends/dvb-pll.h Sun Apr 15 19:52:10
2007 +0200
@@ -48,6 +48,7 @@ extern struct dvb_pll_desc dvb_pll_phili
extern struct dvb_pll_desc dvb_pll_philips_td1316;
extern struct dvb_pll_desc dvb_pll_thomson_fe6600;
+extern struct dvb_pll_desc dvb_pll_opera1;
extern int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf,
u32 freq, int bandwidth);
_______________________________________________
linux-dvb mailing list
[EMAIL PROTECTED]
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb