示例#1
0
文件: af9015.c 项目: ChineseDr/linux
static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
                             int onoff)
{
    struct dvb_usb_device *d = adap_to_d(adap);
    int ret;
    u8 idx;
    dev_dbg(&d->udev->dev, "%s: index=%d pid=%04x onoff=%d\n",
            __func__, index, pid, onoff);

    ret = af9015_write_reg(d, 0xd505, (pid & 0xff));
    if (ret)
        goto error;

    ret = af9015_write_reg(d, 0xd506, (pid >> 8));
    if (ret)
        goto error;

    idx = ((index & 0x1f) | (1 << 5));
    ret = af9015_write_reg(d, 0xd504, idx);

error:
    return ret;
}
示例#2
0
static int af9015_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
	int onoff)
{
	int ret;
	u8 idx;

	deb_info("%s: set pid filter, index %d, pid %x, onoff %d\n",
		__func__, index, pid, onoff);

	ret = af9015_write_reg(adap->dev, 0xd505, (pid & 0xff));
	if (ret)
		goto error;

	ret = af9015_write_reg(adap->dev, 0xd506, (pid >> 8));
	if (ret)
		goto error;

	idx = ((index & 0x1f) | (1 << 5));
	ret = af9015_write_reg(adap->dev, 0xd504, idx);

error:
	return ret;
}
示例#3
0
static int af9015_init(struct dvb_usb_device *d)
{
	int ret;
	deb_info("%s:\n", __func__);

	/* init RC canary */
	ret = af9015_write_reg(d, 0x98e9, 0xff);
	if (ret)
		goto error;

	ret = af9015_init_endpoint(d);
	if (ret)
		goto error;

error:
	return ret;
}
示例#4
0
文件: af9015.c 项目: ChineseDr/linux
static int af9015_init(struct dvb_usb_device *d)
{
    struct af9015_state *state = d_to_priv(d);
    int ret;
    dev_dbg(&d->udev->dev, "%s:\n", __func__);

    mutex_init(&state->fe_mutex);

    /* init RC canary */
    ret = af9015_write_reg(d, 0x98e9, 0xff);
    if (ret)
        goto error;

    ret = af9015_init_endpoint(d);
    if (ret)
        goto error;

error:
    return ret;
}
示例#5
0
static int af9015_do_reg_bit(struct dvb_usb_device *d, u16 addr, u8 bit, u8 op)
{
	int ret;
	u8 val, mask = 0x01;

	ret = af9015_read_reg(d, addr, &val);
	if (ret)
		return ret;

	mask <<= bit;
	if (op) {
		/* set bit */
		val |= mask;
	} else {
		/* clear bit */
		mask ^= 0xff;
		val &= mask;
	}

	return af9015_write_reg(d, addr, val);
}
示例#6
0
static int af9015_copy_firmware(struct dvb_usb_device *d)
{
	int ret;
	u8 fw_params[4];
	u8 val, i;
	struct req_t req = {COPY_FIRMWARE, 0, 0x5100, 0, 0, sizeof(fw_params),
		fw_params };
	deb_info("%s:\n", __func__);

	fw_params[0] = af9015_config.firmware_size >> 8;
	fw_params[1] = af9015_config.firmware_size & 0xff;
	fw_params[2] = af9015_config.firmware_checksum >> 8;
	fw_params[3] = af9015_config.firmware_checksum & 0xff;

	/* wait 2nd demodulator ready */
	msleep(100);

	ret = af9015_read_reg_i2c(d,
		af9015_af9013_config[1].demod_address, 0x98be, &val);
	if (ret)
		goto error;
	else
		deb_info("%s: firmware status:%02x\n", __func__, val);

	if (val == 0x0c) /* fw is running, no need for download */
		goto exit;

	/* set I2C master clock to fast (to speed up firmware copy) */
	ret = af9015_write_reg(d, 0xd416, 0x04); /* 0x04 * 400ns */
	if (ret)
		goto error;

	msleep(50);

	/* copy firmware */
	ret = af9015_ctrl_msg(d, &req);
	if (ret)
		err("firmware copy cmd failed:%d", ret);
	deb_info("%s: firmware copy done\n", __func__);

	/* set I2C master clock back to normal */
	ret = af9015_write_reg(d, 0xd416, 0x14); /* 0x14 * 400ns */
	if (ret)
		goto error;

	/* request boot firmware */
	ret = af9015_write_reg_i2c(d, af9015_af9013_config[1].demod_address,
		0xe205, 1);
	deb_info("%s: firmware boot cmd status:%d\n", __func__, ret);
	if (ret)
		goto error;

	for (i = 0; i < 15; i++) {
		msleep(100);

		/* check firmware status */
		ret = af9015_read_reg_i2c(d,
			af9015_af9013_config[1].demod_address, 0x98be, &val);
		deb_info("%s: firmware status cmd status:%d fw status:%02x\n",
			__func__, ret, val);
		if (ret)
			goto error;

		if (val == 0x0c || val == 0x04) /* success or fail */
			break;
	}

	if (val == 0x04) {
		err("firmware did not run");
		ret = -1;
	} else if (val != 0x0c) {
		err("firmware boot timeout");
		ret = -1;
	}

error:
exit:
	return ret;
}
示例#7
0
static int af9015_init_endpoint(struct dvb_usb_device *d)
{
	int ret;
	u16 frame_size;
	u8  packet_size;
	deb_info("%s: USB speed:%d\n", __func__, d->udev->speed);

	/* Windows driver uses packet count 21 for USB1.1 and 348 for USB2.0.
	   We use smaller - about 1/4 from the original, 5 and 87. */
#define TS_PACKET_SIZE            188

#define TS_USB20_PACKET_COUNT      87
#define TS_USB20_FRAME_SIZE       (TS_PACKET_SIZE*TS_USB20_PACKET_COUNT)

#define TS_USB11_PACKET_COUNT       5
#define TS_USB11_FRAME_SIZE       (TS_PACKET_SIZE*TS_USB11_PACKET_COUNT)

#define TS_USB20_MAX_PACKET_SIZE  512
#define TS_USB11_MAX_PACKET_SIZE   64

	if (d->udev->speed == USB_SPEED_FULL) {
		frame_size = TS_USB11_FRAME_SIZE/4;
		packet_size = TS_USB11_MAX_PACKET_SIZE/4;
	} else {
		frame_size = TS_USB20_FRAME_SIZE/4;
		packet_size = TS_USB20_MAX_PACKET_SIZE/4;
	}

	ret = af9015_set_reg_bit(d, 0xd507, 2); /* assert EP4 reset */
	if (ret)
		goto error;
	ret = af9015_set_reg_bit(d, 0xd50b, 1); /* assert EP5 reset */
	if (ret)
		goto error;
	ret = af9015_clear_reg_bit(d, 0xdd11, 5); /* disable EP4 */
	if (ret)
		goto error;
	ret = af9015_clear_reg_bit(d, 0xdd11, 6); /* disable EP5 */
	if (ret)
		goto error;
	ret = af9015_set_reg_bit(d, 0xdd11, 5); /* enable EP4 */
	if (ret)
		goto error;
	if (af9015_config.dual_mode) {
		ret = af9015_set_reg_bit(d, 0xdd11, 6); /* enable EP5 */
		if (ret)
			goto error;
	}
	ret = af9015_clear_reg_bit(d, 0xdd13, 5); /* disable EP4 NAK */
	if (ret)
		goto error;
	if (af9015_config.dual_mode) {
		ret = af9015_clear_reg_bit(d, 0xdd13, 6); /* disable EP5 NAK */
		if (ret)
			goto error;
	}
	/* EP4 xfer length */
	ret = af9015_write_reg(d, 0xdd88, frame_size & 0xff);
	if (ret)
		goto error;
	ret = af9015_write_reg(d, 0xdd89, frame_size >> 8);
	if (ret)
		goto error;
	/* EP5 xfer length */
	ret = af9015_write_reg(d, 0xdd8a, frame_size & 0xff);
	if (ret)
		goto error;
	ret = af9015_write_reg(d, 0xdd8b, frame_size >> 8);
	if (ret)
		goto error;
	ret = af9015_write_reg(d, 0xdd0c, packet_size); /* EP4 packet size */
	if (ret)
		goto error;
	ret = af9015_write_reg(d, 0xdd0d, packet_size); /* EP5 packet size */
	if (ret)
		goto error;
	ret = af9015_clear_reg_bit(d, 0xd507, 2); /* negate EP4 reset */
	if (ret)
		goto error;
	if (af9015_config.dual_mode) {
		ret = af9015_clear_reg_bit(d, 0xd50b, 1); /* negate EP5 reset */
		if (ret)
			goto error;
	}

	/* enable / disable mp2if2 */
	if (af9015_config.dual_mode)
		ret = af9015_set_reg_bit(d, 0xd50b, 0);
	else
		ret = af9015_clear_reg_bit(d, 0xd50b, 0);

error:
	if (ret)
		err("endpoint init failed:%d", ret);
	return ret;
}
示例#8
0
static int af9015_rc_query(struct dvb_usb_device *d)
{
	struct af9015_state *priv = d->priv;
	int ret;
	u8 buf[17];

	/* read registers needed to detect remote controller code */
	ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf));
	if (ret)
		goto error;

	/* If any of these are non-zero, assume invalid data */
	if (buf[1] || buf[2] || buf[3])
		return ret;

	/* Check for repeat of previous code */
	if ((priv->rc_repeat != buf[6] || buf[0]) &&
					!memcmp(&buf[12], priv->rc_last, 4)) {
		deb_rc("%s: key repeated\n", __func__);
		rc_keydown(d->rc_dev, priv->rc_keycode, 0);
		priv->rc_repeat = buf[6];
		return ret;
	}

	/* Only process key if canary killed */
	if (buf[16] != 0xff && buf[0] != 0x01) {
		deb_rc("%s: key pressed %02x %02x %02x %02x\n", __func__,
			buf[12], buf[13], buf[14], buf[15]);

		/* Reset the canary */
		ret = af9015_write_reg(d, 0x98e9, 0xff);
		if (ret)
			goto error;

		/* Remember this key */
		memcpy(priv->rc_last, &buf[12], 4);
		if (buf[14] == (u8) ~buf[15]) {
			if (buf[12] == (u8) ~buf[13]) {
				/* NEC */
				priv->rc_keycode = buf[12] << 8 | buf[14];
			} else {
				/* NEC extended*/
				priv->rc_keycode = buf[12] << 16 |
					buf[13] << 8 | buf[14];
			}
		} else {
			/* 32 bit NEC */
			priv->rc_keycode = buf[12] << 24 | buf[13] << 16 |
					buf[14] << 8 | buf[15];
		}
		rc_keydown(d->rc_dev, priv->rc_keycode, 0);
	} else {
		deb_rc("%s: no key press\n", __func__);
		/* Invalidate last keypress */
		/* Not really needed, but helps with debug */
		priv->rc_last[2] = priv->rc_last[3];
	}

	priv->rc_repeat = buf[6];

error:
	if (ret)
		err("%s: failed:%d", __func__, ret);

	return ret;
}
示例#9
0
文件: af9015.c 项目: ChineseDr/linux
static int af9015_copy_firmware(struct dvb_usb_device *d)
{
    struct af9015_state *state = d_to_priv(d);
    int ret;
    u8 fw_params[4];
    u8 val, i;
    struct req_t req = {COPY_FIRMWARE, 0, 0x5100, 0, 0, sizeof(fw_params),
               fw_params
    };
    dev_dbg(&d->udev->dev, "%s:\n", __func__);

    fw_params[0] = state->firmware_size >> 8;
    fw_params[1] = state->firmware_size & 0xff;
    fw_params[2] = state->firmware_checksum >> 8;
    fw_params[3] = state->firmware_checksum & 0xff;

    /* wait 2nd demodulator ready */
    msleep(100);

    ret = af9015_read_reg_i2c(d, state->af9013_config[1].i2c_addr,
                              0x98be, &val);
    if (ret)
        goto error;
    else
        dev_dbg(&d->udev->dev, "%s: firmware status=%02x\n",
                __func__, val);

    if (val == 0x0c) /* fw is running, no need for download */
        goto exit;

    /* set I2C master clock to fast (to speed up firmware copy) */
    ret = af9015_write_reg(d, 0xd416, 0x04); /* 0x04 * 400ns */
    if (ret)
        goto error;

    msleep(50);

    /* copy firmware */
    ret = af9015_ctrl_msg(d, &req);
    if (ret)
        dev_err(&d->udev->dev, "%s: firmware copy cmd failed=%d\n",
                KBUILD_MODNAME, ret);

    dev_dbg(&d->udev->dev, "%s: firmware copy done\n", __func__);

    /* set I2C master clock back to normal */
    ret = af9015_write_reg(d, 0xd416, 0x14); /* 0x14 * 400ns */
    if (ret)
        goto error;

    /* request boot firmware */
    ret = af9015_write_reg_i2c(d, state->af9013_config[1].i2c_addr,
                               0xe205, 1);
    dev_dbg(&d->udev->dev, "%s: firmware boot cmd status=%d\n",
            __func__, ret);
    if (ret)
        goto error;

    for (i = 0; i < 15; i++) {
        msleep(100);

        /* check firmware status */
        ret = af9015_read_reg_i2c(d, state->af9013_config[1].i2c_addr,
                                  0x98be, &val);
        dev_dbg(&d->udev->dev, "%s: firmware status cmd status=%d " \
                "firmware status=%02x\n", __func__, ret, val);
        if (ret)
            goto error;

        if (val == 0x0c || val == 0x04) /* success or fail */
            break;
    }

    if (val == 0x04) {
        dev_err(&d->udev->dev, "%s: firmware did not run\n",
                KBUILD_MODNAME);
        ret = -ETIMEDOUT;
    } else if (val != 0x0c) {
        dev_err(&d->udev->dev, "%s: firmware boot timeout\n",
                KBUILD_MODNAME);
        ret = -ETIMEDOUT;
    }

error:
exit:
    return ret;
}
示例#10
0
文件: af9015.c 项目: ChineseDr/linux
static int af9015_rc_query(struct dvb_usb_device *d)
{
    struct af9015_state *state = d_to_priv(d);
    int ret;
    u8 buf[17];

    /* read registers needed to detect remote controller code */
    ret = af9015_read_regs(d, 0x98d9, buf, sizeof(buf));
    if (ret)
        goto error;

    /* If any of these are non-zero, assume invalid data */
    if (buf[1] || buf[2] || buf[3]) {
        dev_dbg(&d->udev->dev, "%s: invalid data\n", __func__);
        return ret;
    }

    /* Check for repeat of previous code */
    if ((state->rc_repeat != buf[6] || buf[0]) &&
            !memcmp(&buf[12], state->rc_last, 4)) {
        dev_dbg(&d->udev->dev, "%s: key repeated\n", __func__);
        rc_repeat(d->rc_dev);
        state->rc_repeat = buf[6];
        return ret;
    }

    /* Only process key if canary killed */
    if (buf[16] != 0xff && buf[0] != 0x01) {
        dev_dbg(&d->udev->dev, "%s: key pressed %*ph\n",
                __func__, 4, buf + 12);

        /* Reset the canary */
        ret = af9015_write_reg(d, 0x98e9, 0xff);
        if (ret)
            goto error;

        /* Remember this key */
        memcpy(state->rc_last, &buf[12], 4);
        if (buf[14] == (u8) ~buf[15]) {
            if (buf[12] == (u8) ~buf[13]) {
                /* NEC */
                state->rc_keycode = RC_SCANCODE_NEC(buf[12],
                                                    buf[14]);
            } else {
                /* NEC extended*/
                state->rc_keycode = RC_SCANCODE_NECX(buf[12] << 8 |
                                                     buf[13],
                                                     buf[14]);
            }
        } else {
            /* 32 bit NEC */
            state->rc_keycode = RC_SCANCODE_NEC32(buf[12] << 24 |
                                                  buf[13] << 16 |
                                                  buf[14] << 8  |
                                                  buf[15]);
        }
        rc_keydown(d->rc_dev, RC_TYPE_NEC, state->rc_keycode, 0);
    } else {
        dev_dbg(&d->udev->dev, "%s: no key press\n", __func__);
        /* Invalidate last keypress */
        /* Not really needed, but helps with debug */
        state->rc_last[2] = state->rc_last[3];
    }

    state->rc_repeat = buf[6];
    state->rc_failed = false;

error:
    if (ret) {
        dev_warn(&d->udev->dev, "%s: rc query failed=%d\n",
                 KBUILD_MODNAME, ret);

        /* allow random errors as dvb-usb will stop polling on error */
        if (!state->rc_failed)
            ret = 0;

        state->rc_failed = true;
    }

    return ret;
}
示例#11
0
文件: af9015.c 项目: ChineseDr/linux
static int af9015_init_endpoint(struct dvb_usb_device *d)
{
    struct af9015_state *state = d_to_priv(d);
    int ret;
    u16 frame_size;
    u8  packet_size;
    dev_dbg(&d->udev->dev, "%s: USB speed=%d\n", __func__, d->udev->speed);

    if (d->udev->speed == USB_SPEED_FULL) {
        frame_size = TS_USB11_FRAME_SIZE/4;
        packet_size = TS_USB11_MAX_PACKET_SIZE/4;
    } else {
        frame_size = TS_USB20_FRAME_SIZE/4;
        packet_size = TS_USB20_MAX_PACKET_SIZE/4;
    }

    ret = af9015_set_reg_bit(d, 0xd507, 2); /* assert EP4 reset */
    if (ret)
        goto error;
    ret = af9015_set_reg_bit(d, 0xd50b, 1); /* assert EP5 reset */
    if (ret)
        goto error;
    ret = af9015_clear_reg_bit(d, 0xdd11, 5); /* disable EP4 */
    if (ret)
        goto error;
    ret = af9015_clear_reg_bit(d, 0xdd11, 6); /* disable EP5 */
    if (ret)
        goto error;
    ret = af9015_set_reg_bit(d, 0xdd11, 5); /* enable EP4 */
    if (ret)
        goto error;
    if (state->dual_mode) {
        ret = af9015_set_reg_bit(d, 0xdd11, 6); /* enable EP5 */
        if (ret)
            goto error;
    }
    ret = af9015_clear_reg_bit(d, 0xdd13, 5); /* disable EP4 NAK */
    if (ret)
        goto error;
    if (state->dual_mode) {
        ret = af9015_clear_reg_bit(d, 0xdd13, 6); /* disable EP5 NAK */
        if (ret)
            goto error;
    }
    /* EP4 xfer length */
    ret = af9015_write_reg(d, 0xdd88, frame_size & 0xff);
    if (ret)
        goto error;
    ret = af9015_write_reg(d, 0xdd89, frame_size >> 8);
    if (ret)
        goto error;
    /* EP5 xfer length */
    ret = af9015_write_reg(d, 0xdd8a, frame_size & 0xff);
    if (ret)
        goto error;
    ret = af9015_write_reg(d, 0xdd8b, frame_size >> 8);
    if (ret)
        goto error;
    ret = af9015_write_reg(d, 0xdd0c, packet_size); /* EP4 packet size */
    if (ret)
        goto error;
    ret = af9015_write_reg(d, 0xdd0d, packet_size); /* EP5 packet size */
    if (ret)
        goto error;
    ret = af9015_clear_reg_bit(d, 0xd507, 2); /* negate EP4 reset */
    if (ret)
        goto error;
    if (state->dual_mode) {
        ret = af9015_clear_reg_bit(d, 0xd50b, 1); /* negate EP5 reset */
        if (ret)
            goto error;
    }

    /* enable / disable mp2if2 */
    if (state->dual_mode)
        ret = af9015_set_reg_bit(d, 0xd50b, 0);
    else
        ret = af9015_clear_reg_bit(d, 0xd50b, 0);

error:
    if (ret)
        dev_err(&d->udev->dev, "%s: endpoint init failed=%d\n",
                KBUILD_MODNAME, ret);

    return ret;
}