24
25
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
27
struct vp702x_adapter_state {
27
28
int pid_filter_count;
28
29
int pid_filter_can_bypass;
29
30
u8 pid_filter_state;
32
struct vp702x_device_state {
36
/* check for mutex FIXME */
37
int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen)
33
static int vp702x_usb_in_op_unlocked(struct dvb_usb_device *d, u8 req,
34
u16 value, u16 index, u8 *b, int blen)
41
ret = usb_control_msg(d->udev,
42
usb_rcvctrlpipe(d->udev,0),
44
USB_TYPE_VENDOR | USB_DIR_IN,
38
ret = usb_control_msg(d->udev,
39
usb_rcvctrlpipe(d->udev, 0),
41
USB_TYPE_VENDOR | USB_DIR_IN,
42
value, index, b, blen,
49
46
warn("usb in operation failed. (%d)", ret);
61
static int vp702x_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
62
u16 index, u8 *b, int blen)
58
int vp702x_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value,
59
u16 index, u8 *b, int blen)
63
mutex_lock(&d->usb_mutex);
64
ret = vp702x_usb_in_op_unlocked(d, req, value, index, b, blen);
65
mutex_unlock(&d->usb_mutex);
70
int vp702x_usb_out_op_unlocked(struct dvb_usb_device *d, u8 req, u16 value,
71
u16 index, u8 *b, int blen)
65
74
deb_xfer("out: req. %02x, val: %04x, ind: %04x, buffer: ",req,value,index);
89
int vp702x_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
90
u16 index, u8 *b, int blen)
94
mutex_lock(&d->usb_mutex);
95
ret = vp702x_usb_out_op_unlocked(d, req, value, index, b, blen);
96
mutex_unlock(&d->usb_mutex);
80
101
int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int ilen, int msec)
84
105
if ((ret = mutex_lock_interruptible(&d->usb_mutex)))
87
ret = vp702x_usb_out_op(d,REQUEST_OUT,0,0,o,olen);
108
ret = vp702x_usb_out_op_unlocked(d, REQUEST_OUT, 0, 0, o, olen);
89
ret = vp702x_usb_in_op(d,REQUEST_IN,0,0,i,ilen);
110
ret = vp702x_usb_in_op_unlocked(d, REQUEST_IN, 0, 0, i, ilen);
91
112
mutex_unlock(&d->usb_mutex);
96
116
static int vp702x_usb_inout_cmd(struct dvb_usb_device *d, u8 cmd, u8 *o,
97
117
int olen, u8 *i, int ilen, int msec)
119
struct vp702x_device_state *st = d->priv;
105
memcpy(&bout[2],o,olen);
107
ret = vp702x_usb_inout_op(d, bout, olen+2, bin, ilen+1,msec);
122
int buflen = max(olen + 2, ilen + 1);
124
ret = mutex_lock_interruptible(&st->buf_mutex);
128
if (buflen > st->buf_len) {
129
buf = kmalloc(buflen, GFP_KERNEL);
131
mutex_unlock(&st->buf_mutex);
134
info("successfully reallocated a bigger buffer");
137
st->buf_len = buflen;
144
memcpy(&buf[2], o, olen);
146
ret = vp702x_usb_inout_op(d, buf, olen+2, buf, ilen+1, msec);
110
memcpy(i,&bin[1],ilen);
149
memcpy(i, &buf[1], ilen);
150
mutex_unlock(&st->buf_mutex);
115
155
static int vp702x_set_pld_mode(struct dvb_usb_adapter *adap, u8 bypass)
118
return vp702x_usb_in_op(adap->dev, 0xe0, (bypass << 8) | 0x0e, 0, buf, 16);
158
struct vp702x_device_state *st = adap->dev->priv;
161
mutex_lock(&st->buf_mutex);
166
ret = vp702x_usb_in_op(adap->dev, 0xe0, (bypass << 8) | 0x0e,
168
mutex_unlock(&st->buf_mutex);
121
172
static int vp702x_set_pld_state(struct dvb_usb_adapter *adap, u8 state)
124
return vp702x_usb_in_op(adap->dev, 0xe0, (state << 8) | 0x0f, 0, buf, 16);
175
struct vp702x_device_state *st = adap->dev->priv;
178
mutex_lock(&st->buf_mutex);
182
ret = vp702x_usb_in_op(adap->dev, 0xe0, (state << 8) | 0x0f,
185
mutex_unlock(&st->buf_mutex);
127
190
static int vp702x_set_pid(struct dvb_usb_adapter *adap, u16 pid, u8 id, int onoff)
129
struct vp702x_state *st = adap->priv;
192
struct vp702x_adapter_state *st = adap->priv;
193
struct vp702x_device_state *dst = adap->dev->priv;
133
197
st->pid_filter_state |= (1 << id);
139
203
id = 0x10 + id*2;
141
205
vp702x_set_pld_state(adap, st->pid_filter_state);
207
mutex_lock(&dst->buf_mutex);
142
211
vp702x_usb_in_op(adap->dev, 0xe0, (((pid >> 8) & 0xff) << 8) | (id), 0, buf, 16);
143
212
vp702x_usb_in_op(adap->dev, 0xe0, (((pid ) & 0xff) << 8) | (id+1), 0, buf, 16);
214
mutex_unlock(&dst->buf_mutex);
148
220
static int vp702x_init_pid_filter(struct dvb_usb_adapter *adap)
150
struct vp702x_state *st = adap->priv;
222
struct vp702x_adapter_state *st = adap->priv;
223
struct vp702x_device_state *dst = adap->dev->priv;
154
227
st->pid_filter_count = 8;
155
228
st->pid_filter_can_bypass = 1;
156
229
st->pid_filter_state = 0x00;
158
vp702x_set_pld_mode(adap, 1); // bypass
231
vp702x_set_pld_mode(adap, 1); /* bypass */
160
233
for (i = 0; i < st->pid_filter_count; i++)
161
234
vp702x_set_pid(adap, 0xffff, i, 1);
236
mutex_lock(&dst->buf_mutex);
163
239
vp702x_usb_in_op(adap->dev, 0xb5, 3, 0, b, 10);
164
240
vp702x_usb_in_op(adap->dev, 0xb5, 0, 0, b, 10);
165
241
vp702x_usb_in_op(adap->dev, 0xb5, 1, 0, b, 10);
242
mutex_unlock(&dst->buf_mutex);
243
/*vp702x_set_pld_mode(d, 0); // filter */
167
//vp702x_set_pld_mode(d, 0); // filter
182
259
/* remote control stuff (does not work with my box) */
183
260
static int vp702x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
188
265
/* remove the following return to enabled remote querying */
268
key = kmalloc(10, GFP_KERNEL);
191
272
vp702x_usb_in_op(d,READ_REMOTE_REQ,0,0,key,10);
193
274
deb_rc("remote query key: %x %d\n",key[1],key[1]);
195
276
if (key[1] == 0x44) {
196
277
*state = REMOTE_NO_KEY_PRESSED;
203
285
*event = rc_map_vp702x_table[i].keycode;
210
293
static int vp702x_read_mac_addr(struct dvb_usb_device *d,u8 mac[6])
296
struct vp702x_device_state *st = d->priv;
298
mutex_lock(&st->buf_mutex);
213
300
for (i = 6; i < 12; i++)
214
vp702x_usb_in_op(d, READ_EEPROM_REQ, i, 1, &mac[i - 6], 1);
301
vp702x_usb_in_op(d, READ_EEPROM_REQ, i, 1, &buf[i - 6], 1);
304
mutex_unlock(&st->buf_mutex);
222
312
vp702x_usb_out_op(adap->dev, SET_TUNER_POWER_REQ, 0, 7, NULL, 0);
224
if (vp702x_usb_inout_cmd(adap->dev, GET_SYSTEM_STRING, NULL, 0, buf, 10, 10))
314
if (vp702x_usb_inout_cmd(adap->dev, GET_SYSTEM_STRING, NULL, 0,
240
331
static int vp702x_usb_probe(struct usb_interface *intf,
241
332
const struct usb_device_id *id)
243
return dvb_usb_device_init(intf, &vp702x_properties,
244
THIS_MODULE, NULL, adapter_nr);
334
struct dvb_usb_device *d;
335
struct vp702x_device_state *st;
338
ret = dvb_usb_device_init(intf, &vp702x_properties,
339
THIS_MODULE, &d, adapter_nr);
345
st->buf = kmalloc(st->buf_len, GFP_KERNEL);
348
dvb_usb_device_exit(intf);
351
mutex_init(&st->buf_mutex);
358
static void vp702x_usb_disconnect(struct usb_interface *intf)
360
struct dvb_usb_device *d = usb_get_intfdata(intf);
361
struct vp702x_device_state *st = d->priv;
362
mutex_lock(&st->buf_mutex);
364
mutex_unlock(&st->buf_mutex);
365
dvb_usb_device_exit(intf);
247
368
static struct usb_device_id vp702x_usb_table [] = {
307
428
/* usb specific object needed to register this driver with the usb subsystem */
308
429
static struct usb_driver vp702x_usb_driver = {
309
430
.name = "dvb_usb_vp702x",
310
.probe = vp702x_usb_probe,
311
.disconnect = dvb_usb_device_exit,
312
.id_table = vp702x_usb_table,
431
.probe = vp702x_usb_probe,
432
.disconnect = vp702x_usb_disconnect,
433
.id_table = vp702x_usb_table,
315
436
/* module stuff */