diff options
| author | Marco Gittler <g.marco@freenet.de> | 2007-04-23 16:52:58 -0400 |
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-04-27 14:45:59 -0400 |
| commit | 86534e5e8eaeab2f5d2e92cff5e16980750095c6 (patch) | |
| tree | 67a2398455fbff1f19f3de7d0750c9042a418bdd | |
| parent | 12df2f54e5522d89b3de6df62a800a0edeb10dcc (diff) | |
V4L/DVB (5558): Opera: use 7-bit i2c addresses
- the tuner i2c addr now without define (as wanted).
- now 7 bit addr are used (the power_ctrl fkt ist ok so,
because this is a raw write)
- the addr >> 1 , addr << 1 is ok so, i think beause the
read write is now taken from the last bit.
- now i have no datasheet for the device, all taken from usb-logs
Signed-off-by: Marco Gittler <g.marco@freenet.de>
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
| -rw-r--r-- | drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 2 | ||||
| -rw-r--r-- | drivers/media/dvb/dvb-usb/opera1.c | 78 |
2 files changed, 49 insertions, 31 deletions
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h index e4e60619421e..97715f7514d6 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h | |||
| @@ -32,13 +32,13 @@ | |||
| 32 | #define USB_VID_LITEON 0x04ca | 32 | #define USB_VID_LITEON 0x04ca |
| 33 | #define USB_VID_MEDION 0x1660 | 33 | #define USB_VID_MEDION 0x1660 |
| 34 | #define USB_VID_MSI 0x0db0 | 34 | #define USB_VID_MSI 0x0db0 |
| 35 | #define USB_VID_OPERA1 0x695c | ||
| 35 | #define USB_VID_PINNACLE 0x2304 | 36 | #define USB_VID_PINNACLE 0x2304 |
| 36 | #define USB_VID_VISIONPLUS 0x13d3 | 37 | #define USB_VID_VISIONPLUS 0x13d3 |
| 37 | #define USB_VID_TWINHAN 0x1822 | 38 | #define USB_VID_TWINHAN 0x1822 |
| 38 | #define USB_VID_ULTIMA_ELECTRONIC 0x05d8 | 39 | #define USB_VID_ULTIMA_ELECTRONIC 0x05d8 |
| 39 | #define USB_VID_UNIWILL 0x1584 | 40 | #define USB_VID_UNIWILL 0x1584 |
| 40 | #define USB_VID_WIDEVIEW 0x14aa | 41 | #define USB_VID_WIDEVIEW 0x14aa |
| 41 | #define USB_VID_OPERA1 0x695c | ||
| 42 | 42 | ||
| 43 | /* Product IDs */ | 43 | /* Product IDs */ |
| 44 | #define USB_PID_ADSTECH_USB2_COLD 0xa333 | 44 | #define USB_PID_ADSTECH_USB2_COLD 0xa333 |
diff --git a/drivers/media/dvb/dvb-usb/opera1.c b/drivers/media/dvb/dvb-usb/opera1.c index 67c2aa59f74c..518d7ad217df 100644 --- a/drivers/media/dvb/dvb-usb/opera1.c +++ b/drivers/media/dvb/dvb-usb/opera1.c | |||
| @@ -25,6 +25,11 @@ | |||
| 25 | #define REG_20_SYMBOLRATE_BYTE1 0x20 | 25 | #define REG_20_SYMBOLRATE_BYTE1 0x20 |
| 26 | #define REG_21_SYMBOLRATE_BYTE2 0x21 | 26 | #define REG_21_SYMBOLRATE_BYTE2 0x21 |
| 27 | 27 | ||
| 28 | #define ADDR_B600_VOLTAGE_13V (0x02) | ||
| 29 | #define ADDR_B601_VOLTAGE_18V (0x03) | ||
| 30 | #define ADDR_B1A6_STREAM_CTRL (0x04) | ||
| 31 | #define ADDR_B880_READ_REMOTE (0x05) | ||
| 32 | |||
| 28 | struct opera1_state { | 33 | struct opera1_state { |
| 29 | u32 last_key_pressed; | 34 | u32 last_key_pressed; |
| 30 | }; | 35 | }; |
| @@ -70,7 +75,7 @@ static int opera1_xilinx_rw(struct usb_device *dev, u8 request, u16 value, | |||
| 70 | /* I2C */ | 75 | /* I2C */ |
| 71 | 76 | ||
| 72 | static int opera1_usb_i2c_msgxfer(struct dvb_usb_device *dev, u16 addr, | 77 | static int opera1_usb_i2c_msgxfer(struct dvb_usb_device *dev, u16 addr, |
| 73 | u8 * buf, u16 len, int flag) | 78 | u8 * buf, u16 len) |
| 74 | { | 79 | { |
| 75 | int ret = 0; | 80 | int ret = 0; |
| 76 | u8 request; | 81 | u8 request; |
| @@ -83,16 +88,30 @@ static int opera1_usb_i2c_msgxfer(struct dvb_usb_device *dev, u16 addr, | |||
| 83 | if (mutex_lock_interruptible(&dev->usb_mutex) < 0) | 88 | if (mutex_lock_interruptible(&dev->usb_mutex) < 0) |
| 84 | return -EAGAIN; | 89 | return -EAGAIN; |
| 85 | 90 | ||
| 86 | request = (addr & 0xff00) >> 8; | 91 | switch (addr>>1){ |
| 87 | if (!request) | 92 | case ADDR_B600_VOLTAGE_13V: |
| 88 | request = 0xb1; | 93 | request=0xb6; |
| 89 | value = (addr & 0xff); | 94 | value=0x00; |
| 90 | if (flag & OPERA_READ_MSG) { | 95 | break; |
| 91 | value |= 0x01; | 96 | case ADDR_B601_VOLTAGE_18V: |
| 97 | request=0xb6; | ||
| 98 | value=0x01; | ||
| 99 | break; | ||
| 100 | case ADDR_B1A6_STREAM_CTRL: | ||
| 101 | request=0xb1; | ||
| 102 | value=0xa6; | ||
| 103 | break; | ||
| 104 | case ADDR_B880_READ_REMOTE: | ||
| 105 | request=0xb8; | ||
| 106 | value=0x80; | ||
| 107 | break; | ||
| 108 | default: | ||
| 109 | request=0xb1; | ||
| 110 | value=addr; | ||
| 92 | } | 111 | } |
| 93 | if (request == 0xa0) | 112 | ret = opera1_xilinx_rw(dev->udev, request, |
| 94 | value = 0xe600; | 113 | value, buf, len, |
| 95 | ret = opera1_xilinx_rw(dev->udev, request, value, buf, len, flag); | 114 | addr&0x01?OPERA_READ_MSG:OPERA_WRITE_MSG); |
| 96 | 115 | ||
| 97 | mutex_unlock(&dev->usb_mutex); | 116 | mutex_unlock(&dev->usb_mutex); |
| 98 | return ret; | 117 | return ret; |
| @@ -111,13 +130,10 @@ static int opera1_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], | |||
| 111 | 130 | ||
| 112 | for (i = 0; i < num; i++) { | 131 | for (i = 0; i < num; i++) { |
| 113 | if ((tmp = opera1_usb_i2c_msgxfer(d, | 132 | if ((tmp = opera1_usb_i2c_msgxfer(d, |
| 114 | msg[i].addr, | 133 | (msg[i].addr<<1)|(msg[i].flags&I2C_M_RD?0x01:0), |
| 115 | msg[i].buf, | 134 | msg[i].buf, |
| 116 | msg[i].len, | 135 | msg[i].len |
| 117 | (msg[i].flags == | 136 | )!= msg[i].len)) { |
| 118 | I2C_M_RD ? | ||
| 119 | OPERA_READ_MSG : | ||
| 120 | OPERA_WRITE_MSG))!= msg[i].len)) { | ||
| 121 | break; | 137 | break; |
| 122 | } | 138 | } |
| 123 | if (dvb_usb_opera1_debug & 0x10) | 139 | if (dvb_usb_opera1_debug & 0x10) |
| @@ -142,12 +158,12 @@ static int opera1_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) | |||
| 142 | static u8 command_13v[1]={0x00}; | 158 | static u8 command_13v[1]={0x00}; |
| 143 | static u8 command_18v[1]={0x01}; | 159 | static u8 command_18v[1]={0x01}; |
| 144 | struct i2c_msg msg[] = { | 160 | struct i2c_msg msg[] = { |
| 145 | {.addr = 0xb600,.flags = 0,.buf = command_13v,.len = 1}, | 161 | {.addr = ADDR_B600_VOLTAGE_13V,.flags = 0,.buf = command_13v,.len = 1}, |
| 146 | }; | 162 | }; |
| 147 | struct dvb_usb_adapter *udev_adap = | 163 | struct dvb_usb_adapter *udev_adap = |
| 148 | (struct dvb_usb_adapter *)(fe->dvb->priv); | 164 | (struct dvb_usb_adapter *)(fe->dvb->priv); |
| 149 | if (voltage == SEC_VOLTAGE_18) { | 165 | if (voltage == SEC_VOLTAGE_18) { |
| 150 | msg[0].addr = 0xb601; | 166 | msg[0].addr = ADDR_B601_VOLTAGE_18V; |
| 151 | msg[0].buf = command_18v; | 167 | msg[0].buf = command_18v; |
| 152 | } | 168 | } |
| 153 | i2c_transfer(&udev_adap->dev->i2c_adap, msg, 1); | 169 | i2c_transfer(&udev_adap->dev->i2c_adap, msg, 1); |
| @@ -220,7 +236,7 @@ static u8 opera1_inittab[] = { | |||
| 220 | }; | 236 | }; |
| 221 | 237 | ||
| 222 | static struct stv0299_config opera1_stv0299_config = { | 238 | static struct stv0299_config opera1_stv0299_config = { |
| 223 | .demod_address = 0xd0, | 239 | .demod_address = 0xd0>>1, |
| 224 | .min_delay_ms = 100, | 240 | .min_delay_ms = 100, |
| 225 | .mclk = 88000000UL, | 241 | .mclk = 88000000UL, |
| 226 | .invert = 1, | 242 | .invert = 1, |
| @@ -245,19 +261,21 @@ static int opera1_frontend_attach(struct dvb_usb_adapter *d) | |||
| 245 | 261 | ||
| 246 | static int opera1_tuner_attach(struct dvb_usb_adapter *adap) | 262 | static int opera1_tuner_attach(struct dvb_usb_adapter *adap) |
| 247 | { | 263 | { |
| 248 | adap->pll_addr = 0xc0; | 264 | dvb_attach( |
| 249 | adap->pll_desc = &dvb_pll_opera1; | 265 | dvb_pll_attach, adap->fe, 0xc0>>1, |
| 250 | adap->fe->ops.tuner_ops.set_params = dvb_usb_tuner_set_params_i2c; | 266 | &adap->dev->i2c_adap, &dvb_pll_opera1 |
| 267 | ); | ||
| 251 | return 0; | 268 | return 0; |
| 252 | } | 269 | } |
| 253 | 270 | ||
| 254 | static int opera1_power_ctrl(struct dvb_usb_device *d, int onoff) | 271 | static int opera1_power_ctrl(struct dvb_usb_device *d, int onoff) |
| 255 | { | 272 | { |
| 256 | int addr = onoff ? 0xb701 : 0xb700; | ||
| 257 | u8 val = onoff ? 0x01 : 0x00; | 273 | u8 val = onoff ? 0x01 : 0x00; |
| 274 | |||
| 258 | if (dvb_usb_opera1_debug) | 275 | if (dvb_usb_opera1_debug) |
| 259 | info("power %s", onoff ? "on" : "off"); | 276 | info("power %s", onoff ? "on" : "off"); |
| 260 | return opera1_usb_i2c_msgxfer(d, addr, &val, 1, OPERA_WRITE_MSG); | 277 | return opera1_xilinx_rw(d->udev, 0xb7, val, |
| 278 | &val, 1, OPERA_WRITE_MSG); | ||
| 261 | } | 279 | } |
| 262 | 280 | ||
| 263 | static int opera1_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) | 281 | static int opera1_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) |
| @@ -265,7 +283,7 @@ static int opera1_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) | |||
| 265 | static u8 buf_start[2] = { 0xff, 0x03 }; | 283 | static u8 buf_start[2] = { 0xff, 0x03 }; |
| 266 | static u8 buf_stop[2] = { 0xff, 0x00 }; | 284 | static u8 buf_stop[2] = { 0xff, 0x00 }; |
| 267 | struct i2c_msg start_tuner[] = { | 285 | struct i2c_msg start_tuner[] = { |
| 268 | {.addr = 0xb1a6,.buf = onoff ? buf_start : buf_stop,.len = 2}, | 286 | {.addr = ADDR_B1A6_STREAM_CTRL,.buf = onoff ? buf_start : buf_stop,.len = 2}, |
| 269 | }; | 287 | }; |
| 270 | if (dvb_usb_opera1_debug) | 288 | if (dvb_usb_opera1_debug) |
| 271 | info("streaming %s", onoff ? "on" : "off"); | 289 | info("streaming %s", onoff ? "on" : "off"); |
| @@ -278,7 +296,7 @@ static int opera1_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, | |||
| 278 | { | 296 | { |
| 279 | u8 b_pid[3]; | 297 | u8 b_pid[3]; |
| 280 | struct i2c_msg msg[] = { | 298 | struct i2c_msg msg[] = { |
| 281 | {.addr = 0xb1a6,.buf = b_pid,.len = 3}, | 299 | {.addr = ADDR_B1A6_STREAM_CTRL,.buf = b_pid,.len = 3}, |
| 282 | }; | 300 | }; |
| 283 | if (dvb_usb_opera1_debug) | 301 | if (dvb_usb_opera1_debug) |
| 284 | info("pidfilter index: %d pid: %d %s", index, pid, | 302 | info("pidfilter index: %d pid: %d %s", index, pid, |
| @@ -295,7 +313,7 @@ static int opera1_pid_filter_control(struct dvb_usb_adapter *adap, int onoff) | |||
| 295 | int u = 0x04; | 313 | int u = 0x04; |
| 296 | u8 b_pid[3]; | 314 | u8 b_pid[3]; |
| 297 | struct i2c_msg msg[] = { | 315 | struct i2c_msg msg[] = { |
| 298 | {.addr = 0xb1a6,.buf = b_pid,.len = 3}, | 316 | {.addr = ADDR_B1A6_STREAM_CTRL,.buf = b_pid,.len = 3}, |
| 299 | }; | 317 | }; |
| 300 | if (dvb_usb_opera1_debug) | 318 | if (dvb_usb_opera1_debug) |
| 301 | info("%s hw-pidfilter", onoff ? "enable" : "disable"); | 319 | info("%s hw-pidfilter", onoff ? "enable" : "disable"); |
| @@ -345,7 +363,7 @@ static int opera1_rc_query(struct dvb_usb_device *dev, u32 * event, int *state) | |||
| 345 | const u16 startmarker1 = 0x10ed; | 363 | const u16 startmarker1 = 0x10ed; |
| 346 | const u16 startmarker2 = 0x11ec; | 364 | const u16 startmarker2 = 0x11ec; |
| 347 | struct i2c_msg read_remote[] = { | 365 | struct i2c_msg read_remote[] = { |
| 348 | {.addr = 0xb880,.buf = rcbuffer,.flags = I2C_M_RD,.len = 32}, | 366 | {.addr = ADDR_B880_READ_REMOTE,.buf = rcbuffer,.flags = I2C_M_RD,.len = 32}, |
| 349 | }; | 367 | }; |
| 350 | int i = 0; | 368 | int i = 0; |
| 351 | u32 send_key = 0; | 369 | u32 send_key = 0; |
| @@ -467,7 +485,7 @@ static int opera1_xilinx_load_firmware(struct usb_device *dev, | |||
| 467 | static struct dvb_usb_device_properties opera1_properties = { | 485 | static struct dvb_usb_device_properties opera1_properties = { |
| 468 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | 486 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, |
| 469 | .usb_ctrl = CYPRESS_FX2, | 487 | .usb_ctrl = CYPRESS_FX2, |
| 470 | .firmware = "opera.fw", | 488 | .firmware = "dvb-usb-opera-01.fw", |
| 471 | .size_of_priv = sizeof(struct opera1_state), | 489 | .size_of_priv = sizeof(struct opera1_state), |
| 472 | 490 | ||
| 473 | .power_ctrl = opera1_power_ctrl, | 491 | .power_ctrl = opera1_power_ctrl, |
| @@ -522,7 +540,7 @@ static int opera1_probe(struct usb_interface *intf, | |||
| 522 | if (udev->descriptor.idProduct == USB_PID_OPERA1_WARM && | 540 | if (udev->descriptor.idProduct == USB_PID_OPERA1_WARM && |
| 523 | udev->descriptor.idVendor == USB_VID_OPERA1 && | 541 | udev->descriptor.idVendor == USB_VID_OPERA1 && |
| 524 | (d == NULL | 542 | (d == NULL |
| 525 | || opera1_xilinx_load_firmware(udev, "opera1-fpga.fw") != 0) | 543 | || opera1_xilinx_load_firmware(udev, "dvb-usb-opera1-fpga.fw") != 0) |
| 526 | ) { | 544 | ) { |
| 527 | return -EINVAL; | 545 | return -EINVAL; |
| 528 | } | 546 | } |
